v0.3.3-pre.007

This commit is contained in:
2026-08-30 13:37:22 +02:00
parent 10996f11f7
commit aa56a12846
13 changed files with 683 additions and 41 deletions

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs
// version: 3
// version: 4
fn network() -> ksp_store_api::RawNetworkId {
return match ksp_store_api::RawNetworkId::new("devnet") {
@@ -458,3 +458,114 @@ fn pre_006_page_limit_exposes_only_the_real_postgres_limit_plus_one_boundary() {
assert_eq!(rejected.map(|value| return value.kind()), Some(crate::PostgresBackendErrorKind::PageLimitUnsupported));
return;
}
#[test]
fn pre_007_retention_transition_decision_matches_compare_and_transition_contract() {
assert_eq!(
super::retention_transition_decision(
ksp_store_api::RawRetentionState::Full,
ksp_store_api::RawRetentionState::Full,
ksp_store_api::RawRetentionState::Archived,
),
std::result::Result::Ok(super::RetentionTransitionDecision::Archive),
);
assert_eq!(
super::retention_transition_decision(
ksp_store_api::RawRetentionState::Archived,
ksp_store_api::RawRetentionState::Full,
ksp_store_api::RawRetentionState::Archived,
),
std::result::Result::Ok(super::RetentionTransitionDecision::AlreadyAtTarget),
);
assert_eq!(
super::retention_transition_decision(
ksp_store_api::RawRetentionState::Archived,
ksp_store_api::RawRetentionState::Archived,
ksp_store_api::RawRetentionState::Purged,
),
std::result::Result::Ok(super::RetentionTransitionDecision::Purge),
);
assert_eq!(
super::retention_transition_decision(
ksp_store_api::RawRetentionState::Purged,
ksp_store_api::RawRetentionState::Archived,
ksp_store_api::RawRetentionState::Purged,
),
std::result::Result::Ok(super::RetentionTransitionDecision::AlreadyAtTarget),
);
assert_eq!(
super::retention_transition_decision(
ksp_store_api::RawRetentionState::Full,
ksp_store_api::RawRetentionState::Archived,
ksp_store_api::RawRetentionState::Purged,
),
std::result::Result::Ok(super::RetentionTransitionDecision::ExpectedStateMismatch),
);
return;
}
#[test]
fn pre_007_compacted_transitions_are_rejected_by_the_pre_io_guard() {
let backend_network = network();
let reference = ksp_store_api::RawTransactionReference::new(backend_network.clone(), ksp_store_api::RawTransactionSignature::new([5; 64]));
let compact = match ksp_store_api::RawTransactionRetentionTransition::try_new(
reference.clone(),
ksp_store_api::RawRetentionState::Full,
ksp_store_api::RawRetentionState::Compacted,
) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid logical compact transition rejected by API: {error:?}"),
};
let compact_error = super::ensure_retention_transition_inputs(&backend_network, &compact).err();
assert_eq!(
compact_error.as_ref().map(|value| return value.kind()),
std::option::Option::Some(crate::PostgresBackendErrorKind::RetentionCompactionUnsupported),
);
assert_eq!(compact_error.as_ref().map(|value| return value.phase()), std::option::Option::Some("raw_retention_compaction"));
let compact_to_archive = match ksp_store_api::RawTransactionRetentionTransition::try_new(
reference,
ksp_store_api::RawRetentionState::Compacted,
ksp_store_api::RawRetentionState::Archived,
) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid logical compacted archive transition rejected by API: {error:?}"),
};
let compact_to_archive_error = super::ensure_retention_transition_inputs(&backend_network, &compact_to_archive).err();
assert_eq!(
compact_to_archive_error.as_ref().map(|value| return value.kind()),
std::option::Option::Some(crate::PostgresBackendErrorKind::RetentionCompactionUnsupported),
);
return;
}
#[test]
fn pre_007_retention_transition_pre_io_guard_rejects_wrong_network() {
let backend_network = network();
let other_network = match ksp_store_api::RawNetworkId::new("mainnet-beta") {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid alternate network rejected: {error:?}"),
};
let reference = ksp_store_api::RawTransactionReference::new(other_network, ksp_store_api::RawTransactionSignature::new([6; 64]));
let transition = match ksp_store_api::RawTransactionRetentionTransition::try_new(
reference,
ksp_store_api::RawRetentionState::Full,
ksp_store_api::RawRetentionState::Archived,
) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid retention transition rejected by API: {error:?}"),
};
let rejected = super::ensure_retention_transition_inputs(&backend_network, &transition);
assert_eq!(rejected.err().map(|value| return value.kind()), std::option::Option::Some(crate::PostgresBackendErrorKind::WrongNetwork));
return;
}
#[test]
fn pre_007_retained_payload_shape_rejects_empty_and_oversized_bytes() {
assert!(super::validate_retained_payload_bytes(&[1], "test_retention_payload").is_ok());
let empty = super::validate_retained_payload_bytes(&[], "test_retention_payload");
assert_eq!(empty.err().map(|value| return value.kind()), std::option::Option::Some(crate::PostgresBackendErrorKind::DataInvalid));
let oversized = vec![0; ksp_store_api::MAX_RAW_PAYLOAD_BYTES + 1];
let oversized = super::validate_retained_payload_bytes(oversized.as_slice(), "test_retention_payload");
assert_eq!(oversized.err().map(|value| return value.kind()), std::option::Option::Some(crate::PostgresBackendErrorKind::DataInvalid));
return;
}