crtx-store 0.1.1

SQLite persistence: migrations, repositories, transactions.
Documentation
use cortex_store::verify::{
    verify_rollback_fork_refusal, ForkMarker, RollbackForkFailure, RollbackForkState,
    RollbackForkStateLocation,
};

#[test]
fn rollback_fork_missing_metadata_passes() {
    let current = RollbackForkState::default();
    let candidate = RollbackForkState::default();

    let report = verify_rollback_fork_refusal(&current, &candidate);

    assert!(report.is_ok(), "unexpected failures: {report:?}");
}

#[test]
fn rollback_fork_schema_version_rollback_fails_closed() {
    let current = RollbackForkState {
        schema_version: Some(2),
        fork_marker: None,
    };
    let candidate = RollbackForkState {
        schema_version: Some(1),
        fork_marker: None,
    };

    let report = verify_rollback_fork_refusal(&current, &candidate);

    assert_eq!(
        report.failures,
        vec![RollbackForkFailure::SchemaVersionRollback {
            current: 2,
            candidate: 1,
        }]
    );
    assert_eq!(
        report.failures[0].invariant(),
        "rollback.schema_version.not_decreased"
    );
}

#[test]
fn rollback_fork_candidate_fork_marker_fails_closed() {
    let current = RollbackForkState {
        schema_version: Some(2),
        fork_marker: None,
    };
    let candidate = RollbackForkState {
        schema_version: Some(2),
        fork_marker: Some(ForkMarker::new("fork-B")),
    };

    let report = verify_rollback_fork_refusal(&current, &candidate);

    assert_eq!(
        report.failures,
        vec![RollbackForkFailure::ForkMarkerPresent {
            location: RollbackForkStateLocation::Candidate,
            marker: "fork-B".into(),
        }]
    );
    assert_eq!(report.failures[0].invariant(), "fork.marker.absent");
}

#[test]
fn rollback_fork_current_fork_marker_fails_closed() {
    let current = RollbackForkState {
        schema_version: Some(2),
        fork_marker: Some(ForkMarker::new("fork-A")),
    };
    let candidate = RollbackForkState {
        schema_version: Some(2),
        fork_marker: None,
    };

    let report = verify_rollback_fork_refusal(&current, &candidate);

    assert_eq!(
        report.failures,
        vec![RollbackForkFailure::ForkMarkerPresent {
            location: RollbackForkStateLocation::Current,
            marker: "fork-A".into(),
        }]
    );
    assert_eq!(report.failures[0].invariant(), "fork.marker.absent");
}