lib

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

commit e34c6db884b3f8d03b716adb503b184059421102
parent 0ecda3d80cb128fd88dc12a4a79e694d7972e220
Author: triesap <tyson@radroots.org>
Date:   Sun, 21 Jun 2026 20:40:48 +0000

events-codec: expand social helper coverage

- Cover HTTP URL validation, detailed date shape failures, date range validation, and parse-date success paths.

- Exercise empty and populated location, farm anchor, participant, dimension, and thumbnail helper branches.

- Validate filtered social_helpers tests, full radroots_events_codec tests, crate check, diff check, and refreshed coverage run.

Diffstat:
Mcrates/events_codec/src/social_helpers.rs | 179+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 179 insertions(+), 0 deletions(-)

diff --git a/crates/events_codec/src/social_helpers.rs b/crates/events_codec/src/social_helpers.rs @@ -214,11 +214,44 @@ mod tests { fn validates_dates_and_ordered_time_ranges() { assert!(is_date("2026-06-20")); assert!(!is_date("2026-6-20")); + for invalid in [ + "x026-06-20", + "2x26-06-20", + "20x6-06-20", + "202x-06-20", + "2026/06-20", + "2026-x6-20", + "2026-0x-20", + "2026-06/20", + "2026-06-x0", + "2026-06-2x", + ] { + assert!(!is_date(invalid)); + } + assert!(validate_http_url("https://example.test/file", "url").is_ok()); + assert!(validate_http_url("http://example.test/file", "url").is_ok()); + assert!(matches!( + validate_http_url("ftp://example.test/file", "url"), + Err(EventEncodeError::InvalidField("url")) + )); + assert!(validate_date("2026-06-20", "date").is_ok()); + assert!(matches!( + validate_date("bad", "date"), + Err(EventEncodeError::InvalidField("date")) + )); + assert!(validate_date_tag("2026-06-20", "start").is_ok()); assert!(validate_end_after_start(10, Some(10), "end").is_ok()); + assert!(validate_end_after_start(10, None, "end").is_ok()); assert!(matches!( validate_end_after_start(10, Some(9), "end"), Err(EventEncodeError::InvalidField("end")) )); + assert!(validate_date_end_after_start("2026-06-20", None, "end").is_ok()); + assert!(validate_date_end_after_start("2026-06-20", Some("2026-06-20"), "end").is_ok()); + assert!(matches!( + validate_date_end_after_start("2026-06-20", Some("2026-06-19"), "end"), + Err(EventEncodeError::InvalidField("end")) + )); assert!(matches!( validate_date_tag("bad", "start"), Err(EventParseError::InvalidTag("start")) @@ -251,11 +284,157 @@ mod tests { assert_eq!(participants[0].pubkey, "crew_pubkey"); assert_eq!(participants[0].role.as_deref(), Some("participant")); + let mut empty_tags = Vec::new(); + push_location_tags( + &mut empty_tags, + &RadrootsSocialLocation { + name: Some(" ".to_string()), + geohash: Some(" ".to_string()), + }, + ); + assert!(empty_tags.is_empty()); + assert_eq!(location_from_tags(&empty_tags), None); + assert_eq!( + first_tag_value(&[vec!["location".to_string()]], "location"), + None + ); + assert_eq!( + first_tag_value(&[vec!["location".to_string(), " ".to_string()]], "location"), + None + ); + + let mut anchor_tags = Vec::new(); + push_farm_anchor( + &mut anchor_tags, + &RadrootsSocialFarmAnchor { + farm: radroots_events::farm::RadrootsFarmRef { + pubkey: " ".to_string(), + d_tag: "farm-d-tag".to_string(), + }, + relays: None, + }, + ); + push_farm_anchor( + &mut anchor_tags, + &RadrootsSocialFarmAnchor { + farm: radroots_events::farm::RadrootsFarmRef { + pubkey: "farm_pubkey".to_string(), + d_tag: "farm-d-tag".to_string(), + }, + relays: None, + }, + ); + assert_eq!( + anchor_tags, + vec![vec![ + "a".to_string(), + "30340:farm_pubkey:farm-d-tag".to_string() + ]] + ); + + assert_eq!(participants_from_tags(&[]), None); + let participants = participants_from_tags(&[ + vec!["p".to_string()], + vec!["p".to_string(), " ".to_string()], + vec![ + "p".to_string(), + "crew_pubkey".to_string(), + "wss://relay.example.test".to_string(), + "host".to_string(), + ], + ]) + .expect("participants"); + assert_eq!(participants.len(), 1); + assert_eq!( + participants[0].relay.as_deref(), + Some("wss://relay.example.test") + ); + assert_eq!(participants[0].role.as_deref(), Some("host")); + + let mut participant_tags = Vec::new(); + push_participants(&mut participant_tags, None); + push_participants( + &mut participant_tags, + Some(&vec![ + RadrootsCalendarParticipant { + pubkey: " ".to_string(), + relay: None, + role: None, + }, + RadrootsCalendarParticipant { + pubkey: "crew_pubkey".to_string(), + relay: Some("wss://relay.example.test".to_string()), + role: Some("host".to_string()), + }, + ]), + ); + assert_eq!( + participant_tags, + vec![vec![ + "p".to_string(), + "crew_pubkey".to_string(), + "wss://relay.example.test".to_string(), + "host".to_string() + ]] + ); + let dimensions = parse_dimensions_tag("1200x800", "dim").unwrap(); assert_eq!(dimensions_tag(&dimensions), "1200x800"); assert!(matches!( parse_dimensions_tag("0x800", "dim"), Err(EventParseError::InvalidTag("dim")) )); + assert!(matches!( + parse_dimensions_tag("1200x0", "dim"), + Err(EventParseError::InvalidTag("dim")) + )); + assert!(matches!( + parse_dimensions_tag("badx800", "dim"), + Err(EventParseError::InvalidNumber("dim", _)) + )); + assert!(matches!( + parse_dimensions_tag("1200xbad", "dim"), + Err(EventParseError::InvalidNumber("dim", _)) + )); + + let mut thumbnail_tags = Vec::new(); + push_thumbnail( + &mut thumbnail_tags, + &RadrootsSocialMediaThumbnail { + url: " ".to_string(), + dimensions: None, + }, + ); + push_thumbnail( + &mut thumbnail_tags, + &RadrootsSocialMediaThumbnail { + url: "https://media.example.test/thumb.jpg".to_string(), + dimensions: None, + }, + ); + push_thumbnail( + &mut thumbnail_tags, + &RadrootsSocialMediaThumbnail { + url: "https://media.example.test/thumb-large.jpg".to_string(), + dimensions: Some(RadrootsSocialMediaDimensions { + width: 320, + height: 240, + }), + }, + ); + assert_eq!( + thumbnail_tags, + vec![ + vec![ + "thumb".to_string(), + "https://media.example.test/thumb.jpg".to_string() + ], + vec![ + "thumb".to_string(), + "https://media.example.test/thumb-large.jpg".to_string(), + "320x240".to_string() + ], + ] + ); } }