app_data.rs (4654B)
1 use radroots_events::{ 2 app_data::{KIND_APP_DATA, RadrootsAppData}, 3 kinds::KIND_POST, 4 }; 5 use radroots_events_codec::app_data::decode::{ 6 app_data_from_tags, data_from_event, parsed_from_event, 7 }; 8 use radroots_events_codec::app_data::encode::{ 9 app_data_build_tags, to_wire_parts, to_wire_parts_with_kind, 10 }; 11 use radroots_events_codec::error::{EventEncodeError, EventParseError}; 12 13 #[test] 14 fn app_data_build_tags_requires_d_tag() { 15 let app_data = RadrootsAppData { 16 d_tag: " ".to_string(), 17 content: "payload".to_string(), 18 }; 19 20 let err = app_data_build_tags(&app_data).unwrap_err(); 21 assert!(matches!(err, EventEncodeError::EmptyRequiredField("d_tag"))); 22 } 23 24 #[test] 25 fn app_data_to_wire_parts_sets_kind_tags_content() { 26 let app_data = RadrootsAppData { 27 d_tag: "radroots.app".to_string(), 28 content: "payload".to_string(), 29 }; 30 31 let parts = to_wire_parts(&app_data).unwrap(); 32 assert_eq!(parts.kind, KIND_APP_DATA); 33 assert_eq!(parts.content, "payload"); 34 assert_eq!( 35 parts.tags, 36 vec![vec!["d".to_string(), "radroots.app".to_string()]] 37 ); 38 } 39 40 #[test] 41 fn app_data_to_wire_parts_propagates_tag_build_errors() { 42 let app_data = RadrootsAppData { 43 d_tag: " ".to_string(), 44 content: "payload".to_string(), 45 }; 46 let err = to_wire_parts(&app_data).unwrap_err(); 47 assert!(matches!(err, EventEncodeError::EmptyRequiredField("d_tag"))); 48 } 49 50 #[test] 51 fn app_data_to_wire_parts_with_kind_rejects_wrong_kind() { 52 let app_data = RadrootsAppData { 53 d_tag: "radroots.app".to_string(), 54 content: "payload".to_string(), 55 }; 56 let err = to_wire_parts_with_kind(&app_data, KIND_POST).unwrap_err(); 57 assert!(matches!(err, EventEncodeError::InvalidKind(KIND_POST))); 58 } 59 60 #[test] 61 fn app_data_from_tags_requires_kind() { 62 let tags = vec![vec!["d".to_string(), "radroots.app".to_string()]]; 63 let err = app_data_from_tags(KIND_POST, &tags, "payload").unwrap_err(); 64 assert!(matches!( 65 err, 66 EventParseError::InvalidKind { 67 expected: "30078", 68 got: KIND_POST 69 } 70 )); 71 } 72 73 #[test] 74 fn app_data_from_tags_requires_d_tag() { 75 let err = app_data_from_tags(KIND_APP_DATA, &[], "payload").unwrap_err(); 76 assert!(matches!(err, EventParseError::MissingTag("d"))); 77 } 78 79 #[test] 80 fn app_data_roundtrip_from_tags() { 81 let tags = vec![vec!["d".to_string(), "radroots.app".to_string()]]; 82 let app_data = app_data_from_tags(KIND_APP_DATA, &tags, "payload").unwrap(); 83 84 assert_eq!(app_data.d_tag, "radroots.app"); 85 assert_eq!(app_data.content, "payload"); 86 } 87 88 #[test] 89 fn app_data_from_tags_rejects_invalid_d_tag_shape() { 90 let err = app_data_from_tags(KIND_APP_DATA, &[vec!["d".to_string()]], "payload").unwrap_err(); 91 assert!(matches!(err, EventParseError::InvalidTag("d"))); 92 93 let err = app_data_from_tags( 94 KIND_APP_DATA, 95 &[vec!["d".to_string(), " ".to_string()]], 96 "payload", 97 ) 98 .unwrap_err(); 99 assert!(matches!(err, EventParseError::InvalidTag("d"))); 100 } 101 102 #[test] 103 fn app_data_metadata_and_index_from_event_roundtrip() { 104 let tags = vec![vec!["d".to_string(), "radroots.app".to_string()]]; 105 let metadata = data_from_event( 106 "id".to_string(), 107 "author".to_string(), 108 42, 109 KIND_APP_DATA, 110 "payload".to_string(), 111 tags.clone(), 112 ) 113 .unwrap(); 114 assert_eq!(metadata.id, "id"); 115 assert_eq!(metadata.author, "author"); 116 assert_eq!(metadata.published_at, 42); 117 assert_eq!(metadata.kind, KIND_APP_DATA); 118 assert_eq!(metadata.data.d_tag, "radroots.app"); 119 assert_eq!(metadata.data.content, "payload"); 120 121 let index = parsed_from_event( 122 "id".to_string(), 123 "author".to_string(), 124 42, 125 KIND_APP_DATA, 126 "payload".to_string(), 127 tags, 128 "sig".to_string(), 129 ) 130 .unwrap(); 131 assert_eq!(index.event.id, "id"); 132 assert_eq!(index.event.author, "author"); 133 assert_eq!(index.event.created_at, 42); 134 assert_eq!(index.event.kind, KIND_APP_DATA); 135 assert_eq!(index.event.content, "payload"); 136 assert_eq!(index.event.sig, "sig"); 137 assert_eq!(index.data.data.d_tag, "radroots.app"); 138 } 139 140 #[test] 141 fn app_data_index_from_event_propagates_parse_errors() { 142 let err = parsed_from_event( 143 "id".to_string(), 144 "author".to_string(), 145 42, 146 KIND_POST, 147 "payload".to_string(), 148 Vec::new(), 149 "sig".to_string(), 150 ) 151 .unwrap_err(); 152 assert!(matches!( 153 err, 154 EventParseError::InvalidKind { 155 expected: "30078", 156 got: KIND_POST 157 } 158 )); 159 }