lib

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

commit aa75e1b3ad84057b6bad2a76544f9570e36a67fb
parent 2bbf724fcdc3d13497085f587b330cc2cf037617
Author: triesap <tyson@radroots.org>
Date:   Sat, 21 Feb 2026 19:00:00 +0000

events: add full coverage tests for kind and profile helpers


- add direct tests for nip51 kind classification functions
- add request result mapping tests across boundary conditions
- add profile type tag mapping tests including unknown fallback
- refactor ts export test helpers to cover deterministic fallback paths

Diffstat:
Mcrates/events/src/kinds.rs | 77++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
Mcrates/events/src/listing.rs | 50+++++++++++++++++++++++++++++++++++++++++++-------
Mcrates/events/src/profile.rs | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 169 insertions(+), 12 deletions(-)

diff --git a/crates/events/src/kinds.rs b/crates/events/src/kinds.rs @@ -142,8 +142,8 @@ mod kinds_constants_tests { } } - fn ts_export_dir() -> PathBuf { - if let Some(export_dir) = option_env!("TS_RS_EXPORT_DIR") { + fn ts_export_dir_from(export_dir: Option<&str>) -> PathBuf { + if let Some(export_dir) = export_dir { return PathBuf::from(export_dir); } let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); @@ -153,6 +153,10 @@ mod kinds_constants_tests { .join("events") } + fn ts_export_dir() -> PathBuf { + ts_export_dir_from(option_env!("TS_RS_EXPORT_DIR")) + } + const KIND_EXPORTS: &[(&str, u32)] = &[ ("KIND_PROFILE", KIND_PROFILE), ("KIND_POST", KIND_POST), @@ -221,13 +225,76 @@ mod kinds_constants_tests { #[test] fn export_kind_constants() { let path = ts_export_dir().join("kinds.ts"); - if let Some(parent) = path.parent() { - fs::create_dir_all(parent).expect("create ts export dir"); - } + let parent = path.parent().expect("kinds export path has parent"); + fs::create_dir_all(parent).expect("create ts export dir"); let mut content = String::new(); for (name, value) in KIND_EXPORTS { content.push_str(&format!("export const {name} = {value};\n")); } fs::write(&path, content).expect("write kinds"); } + + #[test] + fn classifies_standard_list_kinds() { + assert!(is_nip51_standard_list_kind(KIND_LIST_MUTE)); + assert!(is_nip51_standard_list_kind(KIND_LIST_GOOD_WIKI_RELAYS)); + assert!(!is_nip51_standard_list_kind(KIND_PROFILE)); + } + + #[test] + fn classifies_list_set_kinds() { + assert!(is_nip51_list_set_kind(KIND_LIST_SET_FOLLOW)); + assert!(is_nip51_list_set_kind(KIND_LIST_SET_MEDIA_STARTER_PACK)); + assert!(!is_nip51_list_set_kind(KIND_LIST_MUTE)); + } + + #[test] + fn maps_job_request_and_result_kinds() { + assert!(is_request_kind(KIND_JOB_REQUEST_MIN)); + assert!(is_request_kind(KIND_JOB_REQUEST_MAX)); + assert!(!is_request_kind(KIND_JOB_REQUEST_MIN - 1)); + assert!(!is_request_kind(KIND_JOB_REQUEST_MAX + 1)); + + assert!(is_result_kind(KIND_JOB_RESULT_MIN)); + assert!(is_result_kind(KIND_JOB_RESULT_MAX)); + assert!(!is_result_kind(KIND_JOB_RESULT_MIN - 1)); + assert!(!is_result_kind(KIND_JOB_RESULT_MAX + 1)); + + assert_eq!( + result_kind_for_request_kind(KIND_JOB_REQUEST_MIN), + Some(KIND_JOB_RESULT_MIN) + ); + assert_eq!(result_kind_for_request_kind(KIND_JOB_RESULT_MIN), None); + assert_eq!( + request_kind_for_result_kind(KIND_JOB_RESULT_MIN), + Some(KIND_JOB_REQUEST_MIN) + ); + assert_eq!(request_kind_for_result_kind(KIND_JOB_REQUEST_MIN), None); + } + + #[test] + fn resolves_workspace_root_for_crates_and_non_crates_paths() { + let inside_crates = PathBuf::from("/tmp/radroots/crates/events"); + let non_crates = PathBuf::from("/tmp/radroots/events"); + assert_eq!( + workspace_root(&inside_crates), + PathBuf::from("/tmp/radroots") + ); + assert_eq!(workspace_root(&non_crates), PathBuf::from("/tmp/radroots")); + } + + #[test] + fn resolves_export_dir_for_override_and_fallback() { + let override_dir = PathBuf::from("/tmp/radroots-ts-export"); + assert_eq!( + ts_export_dir_from(Some("/tmp/radroots-ts-export")), + override_dir + ); + + let expected = workspace_root(Path::new(env!("CARGO_MANIFEST_DIR"))) + .join("target") + .join("ts-rs") + .join("events"); + assert_eq!(ts_export_dir_from(None), expected); + } } diff --git a/crates/events/src/listing.rs b/crates/events/src/listing.rs @@ -5,9 +5,9 @@ use radroots_core::{ #[cfg(feature = "ts-rs")] use ts_rs::TS; -use crate::RadrootsNostrEvent; use crate::plot::RadrootsPlotRef; use crate::resource_area::RadrootsResourceAreaRef; +use crate::RadrootsNostrEvent; #[cfg(not(feature = "std"))] use alloc::{string::String, vec::Vec}; @@ -250,7 +250,7 @@ pub struct RadrootsListingImageSize { #[cfg(all(test, feature = "ts-rs", feature = "std"))] mod constants_tests { - use super::RADROOTS_LISTING_PRODUCT_TAG_KEYS; + use super::{RadrootsListingFarmRef, RADROOTS_LISTING_PRODUCT_TAG_KEYS}; use std::{ fs, path::{Path, PathBuf}, @@ -265,8 +265,8 @@ mod constants_tests { } } - fn ts_export_dir() -> PathBuf { - if let Some(export_dir) = option_env!("TS_RS_EXPORT_DIR") { + fn ts_export_dir_from(export_dir: Option<&str>) -> PathBuf { + if let Some(export_dir) = export_dir { return PathBuf::from(export_dir); } let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); @@ -276,6 +276,10 @@ mod constants_tests { .join("events") } + fn ts_export_dir() -> PathBuf { + ts_export_dir_from(option_env!("TS_RS_EXPORT_DIR")) + } + fn listing_product_tag_keys_literal() -> String { let mut out = String::from("["); for (idx, key) in RADROOTS_LISTING_PRODUCT_TAG_KEYS.iter().enumerate() { @@ -293,13 +297,45 @@ mod constants_tests { #[test] fn export_listing_product_tag_keys_const() { let path = ts_export_dir().join("constants.ts"); - if let Some(parent) = path.parent() { - fs::create_dir_all(parent).expect("create ts export dir"); - } + let parent = path.parent().expect("listing export path has parent"); + fs::create_dir_all(parent).expect("create ts export dir"); let keys = listing_product_tag_keys_literal(); let content = format!( "import type {{ RadrootsListingProductTagKeys }} from \"./types.js\";\n\nexport const RADROOTS_LISTING_PRODUCT_TAG_KEYS: RadrootsListingProductTagKeys = {keys};\n" ); fs::write(&path, content).expect("write constants"); } + + #[test] + fn defaults_listing_farm_ref_to_empty_values() { + let farm_ref = RadrootsListingFarmRef::default(); + assert!(farm_ref.pubkey.is_empty()); + assert!(farm_ref.d_tag.is_empty()); + } + + #[test] + fn resolves_workspace_root_for_crates_and_non_crates_paths() { + let inside_crates = PathBuf::from("/tmp/radroots/crates/events"); + let non_crates = PathBuf::from("/tmp/radroots/events"); + assert_eq!( + workspace_root(&inside_crates), + PathBuf::from("/tmp/radroots") + ); + assert_eq!(workspace_root(&non_crates), PathBuf::from("/tmp/radroots")); + } + + #[test] + fn resolves_export_dir_for_override_and_fallback() { + let override_dir = PathBuf::from("/tmp/radroots-events-ts-export"); + assert_eq!( + ts_export_dir_from(Some("/tmp/radroots-events-ts-export")), + override_dir + ); + + let expected = workspace_root(Path::new(env!("CARGO_MANIFEST_DIR"))) + .join("target") + .join("ts-rs") + .join("events"); + assert_eq!(ts_export_dir_from(None), expected); + } } diff --git a/crates/events/src/profile.rs b/crates/events/src/profile.rs @@ -94,3 +94,57 @@ pub struct RadrootsProfile { #[cfg_attr(feature = "ts-rs", ts(optional, type = "string | null"))] pub bot: Option<String>, } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn maps_profile_type_to_tag_value() { + assert_eq!( + radroots_profile_type_tag_value(RadrootsProfileType::Individual), + RADROOTS_PROFILE_TYPE_TAG_INDIVIDUAL + ); + assert_eq!( + radroots_profile_type_tag_value(RadrootsProfileType::Farm), + RADROOTS_PROFILE_TYPE_TAG_FARM + ); + assert_eq!( + radroots_profile_type_tag_value(RadrootsProfileType::Coop), + RADROOTS_PROFILE_TYPE_TAG_COOP + ); + assert_eq!( + radroots_profile_type_tag_value(RadrootsProfileType::Any), + RADROOTS_PROFILE_TYPE_TAG_ANY + ); + assert_eq!( + radroots_profile_type_tag_value(RadrootsProfileType::Radrootsd), + RADROOTS_PROFILE_TYPE_TAG_RADROOTSD + ); + } + + #[test] + fn maps_tag_value_to_profile_type() { + assert_eq!( + radroots_profile_type_from_tag_value(RADROOTS_PROFILE_TYPE_TAG_INDIVIDUAL), + Some(RadrootsProfileType::Individual) + ); + assert_eq!( + radroots_profile_type_from_tag_value(RADROOTS_PROFILE_TYPE_TAG_FARM), + Some(RadrootsProfileType::Farm) + ); + assert_eq!( + radroots_profile_type_from_tag_value(RADROOTS_PROFILE_TYPE_TAG_COOP), + Some(RadrootsProfileType::Coop) + ); + assert_eq!( + radroots_profile_type_from_tag_value(RADROOTS_PROFILE_TYPE_TAG_ANY), + Some(RadrootsProfileType::Any) + ); + assert_eq!( + radroots_profile_type_from_tag_value(RADROOTS_PROFILE_TYPE_TAG_RADROOTSD), + Some(RadrootsProfileType::Radrootsd) + ); + assert_eq!(radroots_profile_type_from_tag_value("unknown"), None); + } +}