v0.3.1-pre.006

This commit is contained in:
2026-08-29 09:10:07 +02:00
parent c83e3261d0
commit b76baf6835
19 changed files with 1175 additions and 60 deletions

View File

@@ -0,0 +1,54 @@
// file: crates/ksp-store-api/unit_tests/model/raw_pagination.rs
// version: 1
#[test]
fn page_limit_rejects_only_zero_and_keeps_no_ksp_policy_maximum() {
assert!(crate::RawPageLimit::new(0).is_err());
let maximum = crate::RawPageLimit::new(u64::MAX);
assert!(maximum.is_ok());
let maximum = match maximum {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
assert_eq!(maximum.get(), u64::MAX);
return;
}
#[test]
fn cursor_is_opaque_bounded_and_debug_does_not_render_bytes() {
assert!(crate::RawPageCursor::try_new(std::boxed::Box::new([])).is_err());
assert!(crate::RawPageCursor::try_new(vec![7_u8; crate::MAX_RAW_PAGE_CURSOR_BYTES + 1].into_boxed_slice()).is_err());
let cursor = crate::RawPageCursor::try_new(vec![0xAB_u8; 8].into_boxed_slice());
assert!(cursor.is_ok());
let cursor = match cursor {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let debug = format!("{cursor:?}");
assert!(debug.contains("len"));
assert!(!debug.contains("171"));
return;
}
#[test]
fn transaction_query_preserves_caller_limit_range_direction_and_network() {
let network = match crate::RawNetworkId::new("mainnet-beta".to_owned()) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let slots = match crate::RawSlotRange::new(std::option::Option::Some(10), std::option::Option::Some(20)) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let limit = match crate::RawPageLimit::new(5_000_000) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let query = crate::RawTransactionQuery::new(network, slots, crate::RawSortDirection::Ascending, crate::RawPageRequest::first(limit));
assert_eq!(query.network().as_str(), "mainnet-beta");
assert_eq!(query.slots().start_inclusive(), std::option::Option::Some(10));
assert_eq!(query.page().limit().get(), 5_000_000);
assert_eq!(query.direction(), crate::RawSortDirection::Ascending);
assert!(crate::RawSlotRange::new(std::option::Option::Some(20), std::option::Option::Some(10)).is_err());
return;
}

View File

@@ -0,0 +1,53 @@
// file: crates/ksp-store-api/unit_tests/model/raw_retention.rs
// version: 1
fn reference() -> std::option::Option<crate::RawTransactionReference> {
let network = match crate::RawNetworkId::new("mainnet-beta".to_owned()) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return std::option::Option::None,
};
return std::option::Option::Some(crate::RawTransactionReference::new(network, crate::RawTransactionSignature::new([3_u8; 64])));
}
#[test]
fn retention_transitions_are_forward_only_and_force_rehydrate_is_separate() {
let reference = match reference() {
std::option::Option::Some(value) => value,
std::option::Option::None => return,
};
assert!(crate::RawTransactionRetentionTransition::try_new(reference.clone(), crate::RawRetentionState::Full, crate::RawRetentionState::Compacted).is_ok());
assert!(crate::RawTransactionRetentionTransition::try_new(reference.clone(), crate::RawRetentionState::Full, crate::RawRetentionState::Archived).is_ok());
assert!(
crate::RawTransactionRetentionTransition::try_new(reference.clone(), crate::RawRetentionState::Compacted, crate::RawRetentionState::Archived).is_ok()
);
assert!(crate::RawTransactionRetentionTransition::try_new(reference.clone(), crate::RawRetentionState::Archived, crate::RawRetentionState::Purged).is_ok());
assert!(crate::RawTransactionRetentionTransition::try_new(reference.clone(), crate::RawRetentionState::Purged, crate::RawRetentionState::Full).is_err());
assert!(crate::RawTransactionRetentionTransition::try_new(reference, crate::RawRetentionState::Full, crate::RawRetentionState::Purged).is_err());
return;
}
#[test]
fn tombstone_keeps_minimal_identity_without_raw_payload() {
let reference = match reference() {
std::option::Option::Some(value) => value,
std::option::Option::None => return,
};
let format = match crate::RawFormatId::new("ksp.solana.raw_transaction".to_owned()) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
let tombstone = crate::RawTransactionTombstone::try_new(reference, 99, format, 1, crate::RawContentHash::new([4_u8; 32]));
assert!(tombstone.is_ok());
let tombstone = match tombstone {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
assert_eq!(tombstone.slot(), 99);
assert_eq!(tombstone.format_version(), 1);
let second_format = match crate::RawFormatId::new("ksp.solana.raw_transaction".to_owned()) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return,
};
assert!(crate::RawTransactionTombstone::try_new(tombstone.reference().clone(), tombstone.slot(), second_format, 0, tombstone.content_hash()).is_err());
return;
}