#![cfg(feature = "persist")]
use kevy_embedded::{Config, Store};
#[test]
fn a_fresh_directory_is_not_downgradeable() {
let dir = kevy_tmpdir::TmpDir::new("aoffmt-fresh");
let store = Store::open(Config::default().with_persist(dir.path())).expect("open");
store.set(b"k", b"v").expect("set");
assert_eq!(store.downgradeable_to_v3(), Some(false), "new files speak v2");
}
#[test]
fn a_memory_store_answers_none() {
let store = Store::open(Config::default()).expect("open");
assert_eq!(store.downgradeable_to_v3(), None);
}
#[test]
fn a_v1_directory_is_downgradeable_until_the_first_rewrite() {
let dir = kevy_tmpdir::TmpDir::new("aoffmt-v1");
let v1 = {
let mut f = b"KEVYAOF1\n".to_vec();
f.extend_from_slice(b"*3\r\n$3\r\nSET\r\n$1\r\nk\r\n$1\r\nv\r\n");
f
};
std::fs::write(dir.path().join("aof-0.aof"), &v1).expect("plant the 3.x file");
let store = Store::open(
Config::default().with_persist(dir.path()).with_shards(1),
)
.expect("a 3.x directory opens on 4.x — the UPGRADING promise");
assert_eq!(store.get(b"k").expect("get").as_deref(), Some(&b"v"[..]), "replayed");
assert_eq!(
store.downgradeable_to_v3(),
Some(true),
"appends stay v1: the window is open and now visibly so"
);
store.set(b"k2", b"v2").expect("append");
assert_eq!(store.downgradeable_to_v3(), Some(true));
store.rewrite_aof().expect("rewrite");
assert_eq!(
store.downgradeable_to_v3(),
Some(false),
"the rewrite upgraded the file; the window is closed and says so"
);
}