use super::*;
use crate::types::{PackageProgress, PackageState, Registry};
use chrono::Utc;
use std::collections::BTreeMap;
use std::path::PathBuf;
use tempfile::tempdir;
fn sample_state() -> ExecutionState {
let mut packages = BTreeMap::new();
packages.insert(
"demo@0.1.0".to_string(),
PackageProgress {
name: "demo".to_string(),
version: "0.1.0".to_string(),
attempts: 1,
state: PackageState::Pending,
last_updated_at: Utc::now(),
},
);
ExecutionState {
state_version: crate::state::execution_state::CURRENT_STATE_VERSION.to_string(),
plan_id: "p1".to_string(),
registry: Registry::crates_io(),
created_at: Utc::now(),
updated_at: Utc::now(),
packages,
}
}
#[test]
fn file_store_path_with_spaces() {
let td = tempdir().expect("tempdir");
let dir = td.path().join("my state dir");
std::fs::create_dir_all(&dir).expect("mkdir");
let store = FileStore::new(dir.clone());
store.save_state(&sample_state()).expect("save");
let loaded = store.load_state().expect("load");
assert!(loaded.is_some());
assert_eq!(loaded.unwrap().plan_id, "p1");
}
#[test]
fn file_store_path_with_unicode() {
let td = tempdir().expect("tempdir");
let dir = td.path().join("日本語パス");
std::fs::create_dir_all(&dir).expect("mkdir");
let store = FileStore::new(dir);
store.save_state(&sample_state()).expect("save");
let loaded = store.load_state().expect("load");
assert!(loaded.is_some());
}
#[test]
fn file_store_path_with_emoji() {
let td = tempdir().expect("tempdir");
let dir = td.path().join("📦release");
std::fs::create_dir_all(&dir).expect("mkdir");
let store = FileStore::new(dir);
store.save_state(&sample_state()).expect("save");
let loaded = store.load_state().expect("load");
assert!(loaded.is_some());
}
#[test]
fn file_store_deeply_nested_path() {
let td = tempdir().expect("tempdir");
let dir = td.path().join("a").join("b").join("c").join("d").join("e");
std::fs::create_dir_all(&dir).expect("mkdir");
let store = FileStore::new(dir);
store.save_state(&sample_state()).expect("save");
let loaded = store.load_state().expect("load");
assert!(loaded.is_some());
}
#[test]
fn file_store_load_nonexistent_dir_returns_none() {
let td = tempdir().expect("tempdir");
let dir = td.path().join("does_not_exist");
let store = FileStore::new(dir);
let loaded = store.load_state().expect("load");
assert!(loaded.is_none());
}
#[test]
fn file_store_clear_empty_dir_succeeds() {
let td = tempdir().expect("tempdir");
let store = FileStore::new(td.path().to_path_buf());
store.clear().expect("clear on empty dir should succeed");
}
#[test]
fn file_store_state_dir_accessor() {
let dir = PathBuf::from("some/path with spaces/dir");
let store = FileStore::new(dir.clone());
assert_eq!(store.state_dir(), &dir);
}