lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

mod.rs (8449B)


      1 #![forbid(unsafe_code)]
      2 
      3 pub mod decode;
      4 pub mod encode;
      5 pub mod list_sets;
      6 
      7 #[cfg(test)]
      8 mod tests {
      9     use crate::error::EventEncodeError;
     10     use crate::resource_area::encode::{resource_area_build_tags, resource_area_ref_tags};
     11     use crate::resource_area::list_sets::{
     12         resource_area_members_farms_list_set, resource_area_members_plots_list_set,
     13         resource_area_stewards_list_set,
     14     };
     15     use radroots_event::farm::FarmRef;
     16     use radroots_event::farm::change_set::{GcsLocation, GeoJsonPoint, GeoJsonPolygon};
     17     use radroots_event::farm::plot::PlotRef;
     18     use radroots_event::farm::resource_area::{
     19         ResourceArea, ResourceAreaLocation, ResourceAreaRef,
     20     };
     21 
     22     fn sample_location() -> ResourceAreaLocation {
     23         ResourceAreaLocation {
     24             primary: None,
     25             city: None,
     26             region: None,
     27             country: None,
     28             gcs: GcsLocation {
     29                 lat: -4.527,
     30                 lng: 129.898,
     31                 geohash: "pmb5v".to_string(),
     32                 point: GeoJsonPoint {
     33                     r#type: "Point".to_string(),
     34                     coordinates: [129.898, -4.527],
     35                 },
     36                 polygon: GeoJsonPolygon {
     37                     r#type: "Polygon".to_string(),
     38                     coordinates: vec![vec![
     39                         [129.898, -4.527],
     40                         [129.899, -4.527],
     41                         [129.899, -4.528],
     42                         [129.898, -4.527],
     43                     ]],
     44                 },
     45                 accuracy: None,
     46                 altitude: None,
     47                 tag_0: None,
     48                 label: None,
     49                 area: None,
     50                 elevation: None,
     51                 soil: None,
     52                 climate: None,
     53                 gc_id: None,
     54                 gc_name: None,
     55                 gc_admin1_id: None,
     56                 gc_admin1_name: None,
     57                 gc_country_id: None,
     58                 gc_country_name: None,
     59             },
     60         }
     61     }
     62 
     63     #[test]
     64     fn resource_area_tags_include_required_fields() {
     65         let area = ResourceArea {
     66             d_tag: "AAAAAAAAAAAAAAAAAAAAAw".to_string(),
     67             name: "Banda Grove".to_string(),
     68             about: None,
     69             location: sample_location(),
     70             tags: Some(vec!["nutmeg".to_string()]),
     71         };
     72 
     73         let tags = resource_area_build_tags(&area).expect("tags");
     74         assert!(
     75             tags.iter()
     76                 .any(|tag| tag.first().map(|v| v.as_str()) == Some("d"))
     77         );
     78         assert!(
     79             tags.iter()
     80                 .any(|tag| tag.first().map(|v| v.as_str()) == Some("g"))
     81         );
     82         assert!(
     83             tags.iter()
     84                 .any(|tag| tag.first().map(|v| v.as_str()) == Some("t"))
     85         );
     86     }
     87 
     88     #[test]
     89     fn resource_area_tags_allow_missing_optional_fields() {
     90         let area = ResourceArea {
     91             d_tag: "AAAAAAAAAAAAAAAAAAAAAw".to_string(),
     92             name: "Banda Grove".to_string(),
     93             about: None,
     94             location: sample_location(),
     95             tags: None,
     96         };
     97 
     98         let tags = resource_area_build_tags(&area).expect("tags without optional fields");
     99         assert!(
    100             tags.iter()
    101                 .any(|tag| tag.first().map(|v| v.as_str()) == Some("d"))
    102         );
    103         assert!(
    104             tags.iter()
    105                 .any(|tag| tag.first().map(|v| v.as_str()) == Some("g"))
    106         );
    107         assert!(
    108             !tags
    109                 .iter()
    110                 .any(|tag| tag.first().map(|v| v.as_str()) == Some("t"))
    111         );
    112     }
    113 
    114     #[test]
    115     fn resource_area_ref_tags_include_p_and_a() {
    116         let area_ref = ResourceAreaRef {
    117             pubkey: "area_pubkey".to_string(),
    118             d_tag: "AAAAAAAAAAAAAAAAAAAAAw".to_string(),
    119         };
    120 
    121         let tags = resource_area_ref_tags(&area_ref).expect("ref tags");
    122         assert!(
    123             tags.iter()
    124                 .any(|tag| tag.first().map(|v| v.as_str()) == Some("p"))
    125         );
    126         assert!(
    127             tags.iter()
    128                 .any(|tag| tag.first().map(|v| v.as_str()) == Some("a"))
    129         );
    130 
    131         let err = resource_area_ref_tags(&ResourceAreaRef {
    132             pubkey: "area_pubkey".to_string(),
    133             d_tag: "invalid".to_string(),
    134         })
    135         .expect_err("expected invalid resource_area.d_tag");
    136         assert!(matches!(
    137             err,
    138             EventEncodeError::InvalidField("resource_area.d_tag")
    139         ));
    140     }
    141 
    142     #[test]
    143     fn resource_area_build_tags_rejects_invalid_d_tag() {
    144         let area = ResourceArea {
    145             d_tag: "invalid".to_string(),
    146             name: "Banda Grove".to_string(),
    147             about: None,
    148             location: sample_location(),
    149             tags: None,
    150         };
    151 
    152         let err = resource_area_build_tags(&area).expect_err("expected invalid d_tag");
    153         assert!(matches!(err, EventEncodeError::InvalidField("d_tag")));
    154     }
    155 
    156     #[test]
    157     fn resource_area_encode_rejects_empty_required_fields() {
    158         let mut area = ResourceArea {
    159             d_tag: "AAAAAAAAAAAAAAAAAAAAAw".to_string(),
    160             name: "Banda Grove".to_string(),
    161             about: None,
    162             location: sample_location(),
    163             tags: None,
    164         };
    165 
    166         area.d_tag = " ".to_string();
    167         let err = resource_area_build_tags(&area).expect_err("expected empty d_tag");
    168         assert!(matches!(err, EventEncodeError::EmptyRequiredField("d_tag")));
    169 
    170         area.d_tag = "AAAAAAAAAAAAAAAAAAAAAw".to_string();
    171         area.name = " ".to_string();
    172         let err = resource_area_build_tags(&area).expect_err("expected empty name");
    173         assert!(matches!(err, EventEncodeError::EmptyRequiredField("name")));
    174 
    175         area.name = "Banda Grove".to_string();
    176         area.location.gcs.geohash = " ".to_string();
    177         let err = resource_area_build_tags(&area).expect_err("expected empty geohash");
    178         assert!(matches!(
    179             err,
    180             EventEncodeError::EmptyRequiredField("location.gcs.geohash")
    181         ));
    182 
    183         let err = resource_area_ref_tags(&ResourceAreaRef {
    184             pubkey: " ".to_string(),
    185             d_tag: "AAAAAAAAAAAAAAAAAAAAAw".to_string(),
    186         })
    187         .expect_err("expected empty resource_area.pubkey");
    188         assert!(matches!(
    189             err,
    190             EventEncodeError::EmptyRequiredField("resource_area.pubkey")
    191         ));
    192 
    193         let err = resource_area_ref_tags(&ResourceAreaRef {
    194             pubkey: "area_pubkey".to_string(),
    195             d_tag: " ".to_string(),
    196         })
    197         .expect_err("expected empty resource_area.d_tag");
    198         assert!(matches!(
    199             err,
    200             EventEncodeError::EmptyRequiredField("resource_area.d_tag")
    201         ));
    202     }
    203 
    204     #[test]
    205     fn resource_area_list_sets_include_expected_tags() {
    206         let farms = resource_area_members_farms_list_set(
    207             "AAAAAAAAAAAAAAAAAAAAAw",
    208             [FarmRef {
    209                 pubkey: "farm_pubkey".to_string(),
    210                 d_tag: "AAAAAAAAAAAAAAAAAAAAAA".to_string(),
    211             }],
    212         )
    213         .expect("farm members");
    214         assert_eq!(farms.d_tag, "resource:AAAAAAAAAAAAAAAAAAAAAw:members.farms");
    215         assert!(farms.entries.iter().any(|entry| entry.tag == "a"));
    216         assert!(farms.entries.iter().any(|entry| entry.tag == "p"));
    217 
    218         let plots = resource_area_members_plots_list_set(
    219             "AAAAAAAAAAAAAAAAAAAAAw",
    220             [PlotRef {
    221                 pubkey: "farm_pubkey".to_string(),
    222                 d_tag: "AAAAAAAAAAAAAAAAAAAAAQ".to_string(),
    223             }],
    224         )
    225         .expect("plot members");
    226         assert_eq!(plots.d_tag, "resource:AAAAAAAAAAAAAAAAAAAAAw:members.plots");
    227         assert!(plots.entries.iter().any(|entry| entry.tag == "a"));
    228         assert!(plots.entries.iter().any(|entry| entry.tag == "p"));
    229 
    230         let stewards =
    231             resource_area_stewards_list_set("AAAAAAAAAAAAAAAAAAAAAw", ["steward_pubkey"])
    232                 .expect("stewards");
    233         assert_eq!(
    234             stewards.d_tag,
    235             "resource:AAAAAAAAAAAAAAAAAAAAAw:members.stewards"
    236         );
    237         assert!(stewards.entries.iter().any(|entry| entry.tag == "p"));
    238 
    239         let err = resource_area_stewards_list_set("AAAAAAAAAAAAAAAAAAAAAw", [" "])
    240             .expect_err("expected invalid steward entry");
    241         assert!(matches!(
    242             err,
    243             EventEncodeError::EmptyRequiredField("entry.values")
    244         ));
    245     }
    246 }