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:
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);
+ }
+}