radrootsd

JSON-RPC bridge for Radroots event publishing
git clone https://radroots.dev/git/radrootsd.git
Log | Files | Refs | README | LICENSE

commit cc9a808ffe1f28fa6ff8ff601ed165b42ef661d3
parent 429ba5ec8a93a493a29c592383a3d3cad80b9135
Author: triesap <triesap@radroots.dev>
Date:   Tue,  6 Jan 2026 15:05:33 +0000

tests: add nip46 coverage scaffolding

- add metadata parsing tests for bunker/nostrconnect URLs
- add connect response validation tests
- document auth_url gap via ignored test
- keep nip46 coverage focused on helpers

Diffstat:
Msrc/api/jsonrpc/methods/nip46/connect.rs | 39+++++++++++++++++++++++++++++++++++++++
Msrc/nip46/connection.rs | 24++++++++++++++++++++++++
2 files changed, 63 insertions(+), 0 deletions(-)

diff --git a/src/api/jsonrpc/methods/nip46/connect.rs b/src/api/jsonrpc/methods/nip46/connect.rs @@ -256,3 +256,42 @@ fn validate_connect_response( "nip46 connect unexpected result: {result}" ))) } + +#[cfg(test)] +mod tests { + use super::validate_connect_response; + use nostr::nips::nip46::{NostrConnectMessage, NostrConnectResponse, ResponseResult}; + + #[test] + fn validate_connect_response_accepts_ack() { + let message = NostrConnectMessage::response( + "1", + NostrConnectResponse::with_result(ResponseResult::Ack), + ); + validate_connect_response(&message, None).expect("ack"); + } + + #[test] + fn validate_connect_response_accepts_secret_match() { + let message = NostrConnectMessage::Response { + id: "1".to_string(), + result: Some("secret".to_string()), + error: None, + }; + validate_connect_response(&message, Some("secret")).expect("secret"); + + let err = validate_connect_response(&message, Some("other")).expect_err("mismatch"); + let msg = format!("{err}"); + assert!(msg.contains("unexpected result")); + } + + #[test] + #[ignore = "auth_url handling not implemented"] + fn validate_connect_response_accepts_auth_url() { + let message = NostrConnectMessage::response( + "1", + NostrConnectResponse::with_result(ResponseResult::AuthUrl), + ); + validate_connect_response(&message, None).expect("auth_url"); + } +} diff --git a/src/nip46/connection.rs b/src/nip46/connection.rs @@ -184,4 +184,28 @@ mod tests { assert_eq!(info.secret.as_deref(), Some("token")); assert_eq!(info.perms.len(), 2); } + + #[test] + fn parse_bunker_with_metadata() { + let url = format!("bunker://{HEX_PUBKEY}?relay=wss%3A%2F%2Frelay.example.com&name=Radroots&url=https%3A%2F%2Fradroots.org&image=https%3A%2F%2Fradroots.org%2Flogo.png"); + let info = parse_connect_url(&url).expect("info"); + assert_eq!(info.mode, Nip46ConnectMode::Bunker); + assert_eq!(info.remote_signer_pubkey.as_deref(), Some(HEX_PUBKEY)); + assert_eq!(info.relays, vec!["wss://relay.example.com"]); + assert_eq!(info.name.as_deref(), Some("Radroots")); + assert_eq!(info.url.as_deref(), Some("https://radroots.org")); + assert_eq!(info.image.as_deref(), Some("https://radroots.org/logo.png")); + } + + #[test] + fn parse_nostrconnect_with_metadata() { + let url = format!("nostrconnect://{HEX_PUBKEY}?relay=wss%3A%2F%2Frelay.example.com&secret=token&name=Radroots&url=https%3A%2F%2Fradroots.org"); + let info = parse_connect_url(&url).expect("info"); + assert_eq!(info.mode, Nip46ConnectMode::Nostrconnect); + assert_eq!(info.client_pubkey.as_deref(), Some(HEX_PUBKEY)); + assert_eq!(info.relays, vec!["wss://relay.example.com"]); + assert_eq!(info.secret.as_deref(), Some("token")); + assert_eq!(info.name.as_deref(), Some("Radroots")); + assert_eq!(info.url.as_deref(), Some("https://radroots.org")); + } }