lib

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

mod.rs (8425B)


      1 pub mod decode;
      2 pub mod encode;
      3 
      4 #[cfg(test)]
      5 mod tests {
      6     use crate::error::EventEncodeError;
      7     use crate::plot::encode::{plot_address, plot_build_tags};
      8     use radroots_events::{
      9         farm::{
     10             RadrootsFarmRef, RadrootsGcsLocation, RadrootsGeoJsonPoint, RadrootsGeoJsonPolygon,
     11         },
     12         plot::{RadrootsPlot, RadrootsPlotLocation},
     13     };
     14 
     15     #[test]
     16     fn plot_tags_include_farm_address() {
     17         let plot = RadrootsPlot {
     18             d_tag: "AAAAAAAAAAAAAAAAAAAAAQ".to_string(),
     19             farm: RadrootsFarmRef {
     20                 pubkey: "farm_pubkey".to_string(),
     21                 d_tag: "AAAAAAAAAAAAAAAAAAAAAA".to_string(),
     22             },
     23             name: "Orchard".to_string(),
     24             about: None,
     25             location: Some(RadrootsPlotLocation {
     26                 primary: None,
     27                 city: None,
     28                 region: None,
     29                 country: None,
     30                 gcs: RadrootsGcsLocation {
     31                     lat: 37.0,
     32                     lng: -122.0,
     33                     geohash: "9q8yy".to_string(),
     34                     point: RadrootsGeoJsonPoint {
     35                         r#type: "Point".to_string(),
     36                         coordinates: [-122.0, 37.0],
     37                     },
     38                     polygon: RadrootsGeoJsonPolygon {
     39                         r#type: "Polygon".to_string(),
     40                         coordinates: vec![vec![
     41                             [-122.0, 37.0],
     42                             [-122.0, 37.0001],
     43                             [-122.0001, 37.0001],
     44                             [-122.0, 37.0],
     45                         ]],
     46                     },
     47                     accuracy: None,
     48                     altitude: None,
     49                     tag_0: None,
     50                     label: None,
     51                     area: None,
     52                     elevation: None,
     53                     soil: None,
     54                     climate: None,
     55                     gc_id: None,
     56                     gc_name: None,
     57                     gc_admin1_id: None,
     58                     gc_admin1_name: None,
     59                     gc_country_id: None,
     60                     gc_country_name: None,
     61                 },
     62             }),
     63             tags: Some(vec!["orchard".to_string()]),
     64         };
     65 
     66         let tags = plot_build_tags(&plot).expect("tags");
     67         let has_a = tags
     68             .iter()
     69             .any(|tag| tag.get(0).map(|v| v.as_str()) == Some("a"));
     70         let has_p = tags
     71             .iter()
     72             .any(|tag| tag.get(0).map(|v| v.as_str()) == Some("p"));
     73         assert!(has_a);
     74         assert!(has_p);
     75     }
     76 
     77     #[test]
     78     fn plot_tags_allow_missing_optional_fields() {
     79         let plot = RadrootsPlot {
     80             d_tag: "AAAAAAAAAAAAAAAAAAAAAQ".to_string(),
     81             farm: RadrootsFarmRef {
     82                 pubkey: "farm_pubkey".to_string(),
     83                 d_tag: "AAAAAAAAAAAAAAAAAAAAAA".to_string(),
     84             },
     85             name: "Orchard".to_string(),
     86             about: None,
     87             location: None,
     88             tags: None,
     89         };
     90 
     91         let tags = plot_build_tags(&plot).expect("tags without optional fields");
     92         assert!(
     93             tags.iter()
     94                 .any(|tag| tag.get(0).map(|v| v.as_str()) == Some("d"))
     95         );
     96         assert!(
     97             tags.iter()
     98                 .any(|tag| tag.get(0).map(|v| v.as_str()) == Some("a"))
     99         );
    100         assert!(
    101             tags.iter()
    102                 .any(|tag| tag.get(0).map(|v| v.as_str()) == Some("p"))
    103         );
    104         assert!(
    105             !tags
    106                 .iter()
    107                 .any(|tag| tag.get(0).map(|v| v.as_str()) == Some("t"))
    108         );
    109         assert!(
    110             !tags
    111                 .iter()
    112                 .any(|tag| tag.get(0).map(|v| v.as_str()) == Some("g"))
    113         );
    114     }
    115 
    116     #[test]
    117     fn plot_build_tags_rejects_invalid_plot_and_farm_d_tag() {
    118         let mut plot = RadrootsPlot {
    119             d_tag: "AAAAAAAAAAAAAAAAAAAAAQ".to_string(),
    120             farm: RadrootsFarmRef {
    121                 pubkey: "farm_pubkey".to_string(),
    122                 d_tag: "AAAAAAAAAAAAAAAAAAAAAA".to_string(),
    123             },
    124             name: "Orchard".to_string(),
    125             about: None,
    126             location: None,
    127             tags: None,
    128         };
    129 
    130         plot.d_tag = "invalid".to_string();
    131         let err = plot_build_tags(&plot).expect_err("invalid plot d_tag");
    132         assert!(matches!(err, EventEncodeError::InvalidField("d_tag")));
    133 
    134         plot.d_tag = "AAAAAAAAAAAAAAAAAAAAAQ".to_string();
    135         plot.farm.d_tag = "invalid".to_string();
    136         let err = plot_build_tags(&plot).expect_err("invalid farm d_tag");
    137         assert!(matches!(err, EventEncodeError::InvalidField("farm.d_tag")));
    138     }
    139 
    140     #[test]
    141     fn plot_encode_rejects_empty_required_fields() {
    142         let mut plot = RadrootsPlot {
    143             d_tag: "AAAAAAAAAAAAAAAAAAAAAQ".to_string(),
    144             farm: RadrootsFarmRef {
    145                 pubkey: "farm_pubkey".to_string(),
    146                 d_tag: "AAAAAAAAAAAAAAAAAAAAAA".to_string(),
    147             },
    148             name: "Orchard".to_string(),
    149             about: None,
    150             location: Some(RadrootsPlotLocation {
    151                 primary: None,
    152                 city: None,
    153                 region: None,
    154                 country: None,
    155                 gcs: RadrootsGcsLocation {
    156                     lat: 37.0,
    157                     lng: -122.0,
    158                     geohash: "9q8yy".to_string(),
    159                     point: RadrootsGeoJsonPoint {
    160                         r#type: "Point".to_string(),
    161                         coordinates: [-122.0, 37.0],
    162                     },
    163                     polygon: RadrootsGeoJsonPolygon {
    164                         r#type: "Polygon".to_string(),
    165                         coordinates: vec![vec![
    166                             [-122.0, 37.0],
    167                             [-122.0, 37.0001],
    168                             [-122.0001, 37.0001],
    169                             [-122.0, 37.0],
    170                         ]],
    171                     },
    172                     accuracy: None,
    173                     altitude: None,
    174                     tag_0: None,
    175                     label: None,
    176                     area: None,
    177                     elevation: None,
    178                     soil: None,
    179                     climate: None,
    180                     gc_id: None,
    181                     gc_name: None,
    182                     gc_admin1_id: None,
    183                     gc_admin1_name: None,
    184                     gc_country_id: None,
    185                     gc_country_name: None,
    186                 },
    187             }),
    188             tags: None,
    189         };
    190 
    191         let err =
    192             plot_address(" ", "AAAAAAAAAAAAAAAAAAAAAQ").expect_err("expected empty author pubkey");
    193         assert!(matches!(
    194             err,
    195             EventEncodeError::EmptyRequiredField("plot.author_pubkey")
    196         ));
    197 
    198         let err = plot_address("farm_pubkey", " ").expect_err("expected empty plot d_tag");
    199         assert!(matches!(
    200             err,
    201             EventEncodeError::EmptyRequiredField("plot.d_tag")
    202         ));
    203 
    204         plot.d_tag = " ".to_string();
    205         let err = plot_build_tags(&plot).expect_err("expected empty d_tag");
    206         assert!(matches!(err, EventEncodeError::EmptyRequiredField("d_tag")));
    207 
    208         plot.d_tag = "AAAAAAAAAAAAAAAAAAAAAQ".to_string();
    209         plot.name = " ".to_string();
    210         let err = plot_build_tags(&plot).expect_err("expected empty name");
    211         assert!(matches!(err, EventEncodeError::EmptyRequiredField("name")));
    212 
    213         plot.name = "Orchard".to_string();
    214         plot.farm.pubkey = " ".to_string();
    215         let err = plot_build_tags(&plot).expect_err("expected empty farm pubkey");
    216         assert!(matches!(
    217             err,
    218             EventEncodeError::EmptyRequiredField("farm.pubkey")
    219         ));
    220 
    221         plot.farm.pubkey = "farm_pubkey".to_string();
    222         plot.farm.d_tag = " ".to_string();
    223         let err = plot_build_tags(&plot).expect_err("expected empty farm d_tag");
    224         assert!(matches!(
    225             err,
    226             EventEncodeError::EmptyRequiredField("farm.d_tag")
    227         ));
    228 
    229         plot.farm.d_tag = "AAAAAAAAAAAAAAAAAAAAAA".to_string();
    230         plot.location.as_mut().expect("location").gcs.geohash = " ".to_string();
    231         let err = plot_build_tags(&plot).expect_err("expected empty geohash");
    232         assert!(matches!(
    233             err,
    234             EventEncodeError::EmptyRequiredField("location.gcs.geohash")
    235         ));
    236     }
    237 }