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 }