//! Checks `kv_sync::replay` against the shared decision table (kestrove-spec/vectors/item_replay.json). use kv_sync::replay::{check_pulled, next_version, Base}; use serde_json::Value; use uuid::Uuid; fn vectors() -> Value { serde_json::from_str(include_str!("vectors/item_replay.json")).unwrap() } fn base(v: &Value) -> Base<'_> { if v.is_null() { Base::None } else if v["legacy_tombstone"] == Value::Bool(true) { Base::LegacyTombstone } else { Base::Sealed(&v["plaintext"]) } } #[test] fn check_table() { let v = vectors(); let id = Uuid::parse_str(v["item_id"].as_str().unwrap()).unwrap(); for case in v["check"].as_array().unwrap() { let record = &case["record"]; let plaintext = Some(&record["plaintext"]).filter(|p| !p.is_null()); let got = check_pulled(base(&case["base"]), id, record["deleted"].as_bool().unwrap(), plaintext); let want = case["result"].as_str().unwrap(); assert_eq!(if got.is_ok() { "accept" } else { "alarm" }, want, "{}: {got:?}", case["name"]); } } #[test] fn next_version_table() { for case in vectors()["next_version"].as_array().unwrap() { let local = Some(&case["local"]).filter(|v| !v.is_null()); let seq = next_version(local, base(&case["base"])); assert_eq!(Some(seq), case["seq"].as_u64(), "{}", case["name"]); } } #[test] fn spec_copy_is_identical() { let spec = concat!(env!("CARGO_MANIFEST_DIR"), "/../../../kestrove-spec/vectors/item_replay.json"); if let Ok(s) = std::fs::read_to_string(spec) { assert_eq!(s, include_str!("vectors/item_replay.json"), "kestrove-spec copy differs"); } }