lib

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

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 }