// file: crates/ksp-store-api/unit_tests/model/raw_retention.rs // version: 3 fn reference() -> std::option::Option { let network = match crate::RawNetworkId::new("mainnet".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; } #[test] fn retention_outcome_distinguishes_target_idempotence_from_lost_compare_and_transition() { assert_ne!(crate::RawRetentionWriteOutcome::AlreadyAtTarget, crate::RawRetentionWriteOutcome::ExpectedStateMismatch); assert_ne!(crate::RawRetentionWriteOutcome::Applied, crate::RawRetentionWriteOutcome::ExpectedStateMismatch); return; }