lib

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

commit 47a14597e40cb01c862a526061dd767803594ce5
parent 32292836b46e6175bb2b26ff52aa9317633033b5
Author: triesap <tyson@radroots.org>
Date:   Sun, 22 Feb 2026 04:41:05 +0000

coverage: raise `radroots-events-indexed` to strict 100 gates

Diffstat:
Mcrates/events-indexed/src/checkpoint.rs | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcrates/events-indexed/src/manifest.rs | 52++++++++++++++++++++++++++++++++++++++++++++++++++--
Mcrates/events-indexed/src/types.rs | 27+++++++++++++++++++++++++++
3 files changed, 135 insertions(+), 2 deletions(-)

diff --git a/crates/events-indexed/src/checkpoint.rs b/crates/events-indexed/src/checkpoint.rs @@ -45,3 +45,61 @@ impl RadrootsEventsIndexedIndexCheckpoint { } } } + +#[cfg(test)] +mod tests { + use super::{RadrootsEventsIndexedIndexCheckpoint, RadrootsEventsIndexedShardCheckpoint}; + use crate::types::RadrootsEventsIndexedShardId; + #[cfg(not(feature = "std"))] + use alloc::{string::String, vec, vec::Vec}; + #[cfg(feature = "std")] + use std::{string::String, vec::Vec}; + + fn checkpoint( + shard_id: &str, + last_created_at: u32, + last_event_id: Option<&str>, + ) -> RadrootsEventsIndexedShardCheckpoint { + RadrootsEventsIndexedShardCheckpoint { + shard_id: RadrootsEventsIndexedShardId(String::from(shard_id)), + last_created_at, + last_event_id: last_event_id.map(String::from), + cursor: None, + } + } + + #[test] + fn get_returns_none_for_unknown_shard() { + let cp = RadrootsEventsIndexedIndexCheckpoint { + generated_at: 1, + shards: vec![checkpoint("us-1", 10, Some("a"))], + }; + let missing = cp.get(&RadrootsEventsIndexedShardId(String::from("us-2"))); + assert!(missing.is_none()); + } + + #[test] + fn upsert_inserts_and_updates_shards() { + let mut cp = RadrootsEventsIndexedIndexCheckpoint { + generated_at: 2, + shards: Vec::new(), + }; + + cp.upsert(checkpoint("us-1", 10, Some("a"))); + assert_eq!(cp.shards.len(), 1); + assert_eq!( + cp.get(&RadrootsEventsIndexedShardId(String::from("us-1"))) + .expect("inserted shard") + .last_created_at, + 10 + ); + + cp.upsert(checkpoint("us-1", 11, Some("b"))); + assert_eq!(cp.shards.len(), 1); + let updated = cp + .get(&RadrootsEventsIndexedShardId(String::from("us-1"))) + .expect("updated shard"); + assert_eq!(updated.last_created_at, 11); + assert_eq!(updated.last_event_id.as_deref(), Some("b")); + } +} diff --git a/crates/events-indexed/src/manifest.rs b/crates/events-indexed/src/manifest.rs @@ -90,9 +90,9 @@ mod tests { RadrootsEventsIndexedShardMetadata, validate_manifest, }; #[cfg(not(feature = "std"))] - use alloc::{string::String, vec, vec::Vec}; + use alloc::{format, string::String, vec, vec::Vec}; #[cfg(feature = "std")] - use std::{string::String, vec::Vec}; + use std::{format, string::String, vec::Vec}; fn shard(file: &str, count: u32, sha256: &str) -> RadrootsEventsIndexedShardMetadata { RadrootsEventsIndexedShardMetadata { @@ -154,6 +154,15 @@ mod tests { } #[test] + fn validate_manifest_rejects_invalid_sha256_with_valid_length() { + let mut m = base_manifest(); + m.shards[0].sha256 = + String::from("g123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"); + let err = validate_manifest(&m).unwrap_err(); + assert_eq!(err, RadrootsEventsIndexedManifestError::InvalidSha256(0)); + } + + #[test] fn validate_manifest_rejects_total_overflow() { let m = RadrootsEventsIndexedManifest { country: String::from("us"), @@ -190,4 +199,43 @@ mod tests { let err = validate_manifest(&m).unwrap_err(); assert_eq!(err, RadrootsEventsIndexedManifestError::InconsistentTotals); } + + #[test] + fn validate_manifest_rejects_mismatched_total_without_overflow() { + let mut m = base_manifest(); + m.total = 2; + let err = validate_manifest(&m).unwrap_err(); + assert_eq!(err, RadrootsEventsIndexedManifestError::InconsistentTotals); + } + + #[test] + fn validate_manifest_accepts_consistent_totals() { + let m = base_manifest(); + let result = validate_manifest(&m); + assert!(result.is_ok()); + } + + #[test] + fn manifest_error_display_messages_are_stable() { + assert_eq!( + format!("{}", RadrootsEventsIndexedManifestError::EmptyCountry), + "country is empty" + ); + assert_eq!( + format!("{}", RadrootsEventsIndexedManifestError::EmptyShards), + "no shards in manifest" + ); + assert_eq!( + format!("{}", RadrootsEventsIndexedManifestError::EmptyFile(3)), + "shard 3 has empty file name" + ); + assert_eq!( + format!("{}", RadrootsEventsIndexedManifestError::InvalidSha256(4)), + "shard 4 has invalid sha256" + ); + assert_eq!( + format!("{}", RadrootsEventsIndexedManifestError::InconsistentTotals), + "total does not match sum of shard counts" + ); + } } diff --git a/crates/events-indexed/src/types.rs b/crates/events-indexed/src/types.rs @@ -74,4 +74,31 @@ mod tests { }; assert!(range.is_valid()); } + + #[test] + fn id_range_rejects_empty_bounds() { + let range = RadrootsEventsIndexedIdRange { + start: String::new(), + end: String::from("0f"), + }; + assert!(!range.is_valid()); + } + + #[test] + fn id_range_rejects_empty_end() { + let range = RadrootsEventsIndexedIdRange { + start: String::from("0f"), + end: String::new(), + }; + assert!(!range.is_valid()); + } + + #[test] + fn id_range_rejects_non_hex_end() { + let range = RadrootsEventsIndexedIdRange { + start: String::from("0f"), + end: String::from("zz"), + }; + assert!(!range.is_valid()); + } }