mod.rs (5719B)
1 pub mod decode; 2 pub mod encode; 3 4 #[cfg(test)] 5 mod tests { 6 use radroots_event::{envelope::kind::KIND_POST, social::relay_auth::RelayAuth}; 7 8 use crate::error::{EventEncodeError, EventParseError}; 9 use crate::relay_auth::decode::{data_from_event, parsed_from_event, relay_auth_from_event}; 10 use crate::relay_auth::encode::{ 11 relay_auth_build_tags, to_wire_parts, to_wire_parts_with_kind, 12 }; 13 14 const EVENT_ID: &str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 15 const AUTHOR: &str = crate::test_fixtures::FIXTURE_ALICE_PUBLIC_KEY_HEX; 16 const EVENT_SIG: &str = concat!( 17 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", 18 "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" 19 ); 20 21 #[test] 22 fn relay_auth_encodes_and_decodes_nip42_event() { 23 let auth = sample_auth(); 24 let parts = to_wire_parts(&auth).expect("relay auth wire parts"); 25 26 assert_eq!(parts.kind, 22242); 27 assert_eq!(parts.content, ""); 28 assert!(parts.tags.contains(&tag("relay", auth.relay.as_str()))); 29 assert!( 30 parts 31 .tags 32 .contains(&tag("challenge", auth.challenge.as_str())) 33 ); 34 35 let decoded = 36 relay_auth_from_event(parts.kind, &parts.tags, &parts.content).expect("decode"); 37 assert_eq!(decoded, auth); 38 } 39 40 #[test] 41 fn relay_auth_rejects_missing_challenge_non_empty_content_and_wrong_kind() { 42 let parts = to_wire_parts(&sample_auth()).expect("relay auth wire parts"); 43 let without_relay = parts 44 .tags 45 .iter() 46 .filter(|tag| tag.first().map(|value| value.as_str()) != Some("relay")) 47 .cloned() 48 .collect::<Vec<_>>(); 49 let missing_relay = 50 relay_auth_from_event(parts.kind, &without_relay, &parts.content).unwrap_err(); 51 assert!(matches!( 52 missing_relay, 53 EventParseError::MissingTag("relay") 54 )); 55 56 let without_challenge = parts 57 .tags 58 .iter() 59 .filter(|tag| tag.first().map(|value| value.as_str()) != Some("challenge")) 60 .cloned() 61 .collect::<Vec<_>>(); 62 let missing = 63 relay_auth_from_event(parts.kind, &without_challenge, &parts.content).unwrap_err(); 64 assert!(matches!(missing, EventParseError::MissingTag("challenge"))); 65 66 let content_err = relay_auth_from_event(parts.kind, &parts.tags, "not empty").unwrap_err(); 67 assert!(matches!( 68 content_err, 69 EventParseError::InvalidJson("content") 70 )); 71 72 let wrong_kind = to_wire_parts_with_kind(&sample_auth(), KIND_POST).unwrap_err(); 73 assert!(matches!( 74 wrong_kind, 75 EventEncodeError::InvalidKind(KIND_POST) 76 )); 77 78 let decode_wrong_kind = relay_auth_from_event(KIND_POST, &parts.tags, "").unwrap_err(); 79 assert!(matches!( 80 decode_wrong_kind, 81 EventParseError::InvalidKind { 82 expected: "22242", 83 got: KIND_POST 84 } 85 )); 86 } 87 88 #[test] 89 fn relay_auth_rejects_empty_required_fields() { 90 let mut auth = sample_auth(); 91 auth.relay.clear(); 92 let relay_err = relay_auth_build_tags(&auth).unwrap_err(); 93 assert!(matches!( 94 relay_err, 95 EventEncodeError::EmptyRequiredField("relay") 96 )); 97 98 let mut auth = sample_auth(); 99 auth.challenge.clear(); 100 let challenge_err = relay_auth_build_tags(&auth).unwrap_err(); 101 assert!(matches!( 102 challenge_err, 103 EventEncodeError::EmptyRequiredField("challenge") 104 )); 105 106 let parts = to_wire_parts(&sample_auth()).expect("relay auth wire parts"); 107 let mut empty_relay = parts.tags.clone(); 108 replace_tag_value(&mut empty_relay, "relay", " "); 109 let relay_tag_err = relay_auth_from_event(parts.kind, &empty_relay, "").unwrap_err(); 110 assert!(matches!( 111 relay_tag_err, 112 EventParseError::InvalidTag("relay") 113 )); 114 } 115 116 #[test] 117 fn relay_auth_wrappers_preserve_event_metadata() { 118 let auth = sample_auth(); 119 let parts = to_wire_parts(&auth).expect("relay auth wire parts"); 120 121 let data = data_from_event( 122 EVENT_ID.to_string(), 123 AUTHOR.to_string(), 124 99, 125 parts.kind, 126 parts.content.clone(), 127 parts.tags.clone(), 128 ) 129 .expect("parsed data"); 130 assert_eq!(data.id, EVENT_ID); 131 assert_eq!(data.author, AUTHOR); 132 assert_eq!(data.published_at, 99); 133 assert_eq!(data.data, auth); 134 135 let parsed = parsed_from_event( 136 EVENT_ID.to_string(), 137 AUTHOR.to_string(), 138 99, 139 parts.kind, 140 parts.content, 141 parts.tags, 142 EVENT_SIG.to_string(), 143 ) 144 .expect("parsed event"); 145 assert_eq!(parsed.event.signature_hex(), EVENT_SIG); 146 assert_eq!(parsed.data.data, auth); 147 } 148 149 fn sample_auth() -> RelayAuth { 150 RelayAuth { 151 relay: "wss://relay.example.invalid/farm/field-group".to_string(), 152 challenge: "relay-provided-challenge".to_string(), 153 } 154 } 155 156 fn tag(key: &str, value: &str) -> Vec<String> { 157 vec![key.to_string(), value.to_string()] 158 } 159 160 fn replace_tag_value(tags: &mut [Vec<String>], key: &str, value: &str) { 161 let tag = tags 162 .iter_mut() 163 .find(|tag| tag.first().map(String::as_str) == Some(key)) 164 .expect("tag"); 165 tag[1] = value.to_string(); 166 } 167 }