relay_url.rs (4482B)
1 use radroots_local_events::{RelayUrlValidationError, normalize_relay_url, normalize_relay_urls}; 2 3 #[test] 4 fn relay_url_error_display_is_stable() { 5 assert_eq!( 6 RelayUrlValidationError::Empty.to_string(), 7 "relay url must not be empty" 8 ); 9 assert_eq!( 10 RelayUrlValidationError::UnsupportedScheme("https://relay.example".to_owned()).to_string(), 11 "relay url must use ws or wss, got `https://relay.example`" 12 ); 13 assert_eq!( 14 RelayUrlValidationError::MissingHost("wss://".to_owned()).to_string(), 15 "relay url must include a host, got `wss://`" 16 ); 17 assert_eq!( 18 RelayUrlValidationError::InvalidAuthority("wss://user@relay.example".to_owned()) 19 .to_string(), 20 "relay url authority is invalid, got `wss://user@relay.example`" 21 ); 22 assert_eq!( 23 RelayUrlValidationError::InvalidPort("wss://relay.example:abc".to_owned()).to_string(), 24 "relay url port is invalid, got `wss://relay.example:abc`" 25 ); 26 } 27 28 #[test] 29 fn relay_url_normalization_trims_and_dedupes() { 30 let relays = normalize_relay_urls([ 31 " wss://relay-a.example ", 32 "wss://relay-a.example", 33 "ws://127.0.0.1:8080/nostr", 34 ]) 35 .expect("normalize relays"); 36 37 assert_eq!( 38 relays, 39 vec![ 40 "wss://relay-a.example".to_owned(), 41 "ws://127.0.0.1:8080/nostr".to_owned() 42 ] 43 ); 44 } 45 46 #[test] 47 fn relay_url_validation_rejects_empty_values() { 48 assert_eq!( 49 normalize_relay_url(" "), 50 Err(RelayUrlValidationError::Empty) 51 ); 52 } 53 54 #[test] 55 fn relay_url_validation_rejects_non_websocket_schemes() { 56 assert_eq!( 57 normalize_relay_url("https://relay.example"), 58 Err(RelayUrlValidationError::UnsupportedScheme( 59 "https://relay.example".to_owned() 60 )) 61 ); 62 } 63 64 #[test] 65 fn relay_url_validation_rejects_hostless_values() { 66 assert_eq!( 67 normalize_relay_url("wss://"), 68 Err(RelayUrlValidationError::MissingHost("wss://".to_owned())) 69 ); 70 assert_eq!( 71 normalize_relay_url("wss:///relay"), 72 Err(RelayUrlValidationError::MissingHost( 73 "wss:///relay".to_owned() 74 )) 75 ); 76 assert_eq!( 77 normalize_relay_url("ws://:8080"), 78 Err(RelayUrlValidationError::MissingHost( 79 "ws://:8080".to_owned() 80 )) 81 ); 82 } 83 84 #[test] 85 fn relay_url_validation_rejects_malformed_authority() { 86 assert_eq!( 87 normalize_relay_url("wss://user@relay.example"), 88 Err(RelayUrlValidationError::InvalidAuthority( 89 "wss://user@relay.example".to_owned() 90 )) 91 ); 92 assert_eq!( 93 normalize_relay_url("wss://relay example"), 94 Err(RelayUrlValidationError::InvalidAuthority( 95 "wss://relay example".to_owned() 96 )) 97 ); 98 assert_eq!( 99 normalize_relay_url("wss://2001:db8::1"), 100 Err(RelayUrlValidationError::InvalidAuthority( 101 "wss://2001:db8::1".to_owned() 102 )) 103 ); 104 assert_eq!( 105 normalize_relay_url("wss://[2001:db8::1"), 106 Err(RelayUrlValidationError::InvalidAuthority( 107 "wss://[2001:db8::1".to_owned() 108 )) 109 ); 110 assert_eq!( 111 normalize_relay_url("wss://[]"), 112 Err(RelayUrlValidationError::MissingHost("wss://[]".to_owned())) 113 ); 114 assert_eq!( 115 normalize_relay_url("wss://[2001:db8::1]extra"), 116 Err(RelayUrlValidationError::InvalidAuthority( 117 "wss://[2001:db8::1]extra".to_owned() 118 )) 119 ); 120 } 121 122 #[test] 123 fn relay_url_validation_rejects_invalid_ports() { 124 assert_eq!( 125 normalize_relay_url("wss://relay.example:"), 126 Err(RelayUrlValidationError::InvalidPort( 127 "wss://relay.example:".to_owned() 128 )) 129 ); 130 assert_eq!( 131 normalize_relay_url("wss://relay.example:abc"), 132 Err(RelayUrlValidationError::InvalidPort( 133 "wss://relay.example:abc".to_owned() 134 )) 135 ); 136 assert_eq!( 137 normalize_relay_url("wss://[2001:db8::1]:abc"), 138 Err(RelayUrlValidationError::InvalidPort( 139 "wss://[2001:db8::1]:abc".to_owned() 140 )) 141 ); 142 } 143 144 #[test] 145 fn relay_url_validation_accepts_bracketed_ipv6() { 146 assert_eq!( 147 normalize_relay_url("wss://[2001:db8::1]:8080/nostr").expect("ipv6 relay"), 148 "wss://[2001:db8::1]:8080/nostr" 149 ); 150 assert_eq!( 151 normalize_relay_url("wss://[2001:db8::1]").expect("ipv6 relay without port"), 152 "wss://[2001:db8::1]" 153 ); 154 }