diff --git a/markbase-core/src/vfs/local_fs.rs b/markbase-core/src/vfs/local_fs.rs index 75092a6..651ea99 100644 --- a/markbase-core/src/vfs/local_fs.rs +++ b/markbase-core/src/vfs/local_fs.rs @@ -771,3 +771,118 @@ impl VfsAclMeta { } } } + +#[cfg(test)] +mod tests { + use super::*; + use std::fs; + use std::time::Duration; + use tempfile::TempDir; + + fn setup_snapshots(base_dir: &Path, snapshot_name: &str) -> PathBuf { + let snapshots_dir = base_dir.join(".snapshots"); + let snapshot_path = snapshots_dir.join(snapshot_name); + + fs::create_dir_all(&snapshot_path).unwrap(); + + let meta = VfsSnapshotMeta { + name: snapshot_name.to_string(), + created: SystemTime::now(), + source_path: base_dir.to_string_lossy().to_string(), + }; + + let meta_file = snapshot_path.join(".meta"); + let meta_json = serde_json::to_string(&meta).unwrap(); + fs::write(&meta_file, &meta_json).unwrap(); + + snapshot_path + } + + #[test] + fn test_list_previous_versions_with_snapshot() { + let temp_dir = TempDir::new().unwrap(); + let fs_backend = LocalFs::new(); + + setup_snapshots(temp_dir.path(), "snapshot_1"); + + let versions = fs_backend.list_previous_versions(temp_dir.path()).unwrap(); + assert_eq!(versions.len(), 1); + + let version = &versions[0]; + assert_eq!(version.snapshot_name, "snapshot_1"); + assert!(version.gmt_token.starts_with("@GMT-")); + } + + #[test] + fn test_list_previous_versions_multiple() { + let temp_dir = TempDir::new().unwrap(); + let fs_backend = LocalFs::new(); + + setup_snapshots(temp_dir.path(), "snapshot_1"); + std::thread::sleep(Duration::from_secs(2)); + setup_snapshots(temp_dir.path(), "snapshot_2"); + + let versions = fs_backend.list_previous_versions(temp_dir.path()).unwrap(); + assert_eq!(versions.len(), 2); + } + + #[test] + fn test_open_previous_version_not_found() { + let temp_dir = TempDir::new().unwrap(); + let fs_backend = LocalFs::new(); + + let result = fs_backend.open_previous_version(temp_dir.path(), "@GMT-2021.01.01-00.00.00"); + assert!(result.is_err()); + } + + #[test] + fn test_list_previous_versions_empty() { + let temp_dir = TempDir::new().unwrap(); + let fs_backend = LocalFs::new(); + + let versions = fs_backend.list_previous_versions(temp_dir.path()).unwrap(); + assert_eq!(versions.len(), 0); + } + + #[test] + fn test_gmt_token_unique() { + let temp_dir = TempDir::new().unwrap(); + + setup_snapshots(temp_dir.path(), "snapshot_1"); + std::thread::sleep(Duration::from_secs(2)); + setup_snapshots(temp_dir.path(), "snapshot_2"); + + let fs_backend = LocalFs::new(); + let versions = fs_backend.list_previous_versions(temp_dir.path()).unwrap(); + + let gmt_tokens: Vec<&str> = versions.iter().map(|v| v.gmt_token.as_str()).collect(); + assert_ne!(gmt_tokens[0], gmt_tokens[1]); + } + + #[test] + fn test_skip_hidden_snapshots() { + let temp_dir = TempDir::new().unwrap(); + let fs_backend = LocalFs::new(); + + setup_snapshots(temp_dir.path(), "snapshot_1"); + + let hidden_snapshot_path = temp_dir.path().join(".snapshots").join(".hidden"); + fs::create_dir_all(&hidden_snapshot_path).unwrap(); + + let versions = fs_backend.list_previous_versions(temp_dir.path()).unwrap(); + assert_eq!(versions.len(), 1); + } + + #[test] + fn test_snapshot_meta_parse() { + let temp_dir = TempDir::new().unwrap(); + + let snapshot_path = setup_snapshots(temp_dir.path(), "test_snapshot"); + + let meta_file = snapshot_path.join(".meta"); + let meta_json = fs::read_to_string(&meta_file).unwrap(); + let meta: VfsSnapshotMeta = serde_json::from_str(&meta_json).unwrap(); + + assert_eq!(meta.name, "test_snapshot"); + } +}