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 }