use guardy::{
config::{CONFIG, sync::RepoConfig},
sync::manager::SyncManager,
};
#[tokio::test]
async fn test_sync_manager_uses_config() {
let manager = SyncManager::new().expect("Failed to create SyncManager");
let expected_cache = std::env::current_dir()
.expect("Failed to get current dir")
.join(&CONFIG.sync.cache_dir);
assert_eq!(
manager
.get_cache_dir()
.canonicalize()
.unwrap_or_else(|_| manager.get_cache_dir().clone()),
expected_cache.canonicalize().unwrap_or(expected_cache),
"SyncManager should use cache_dir from config"
);
}
#[test]
fn test_repo_name_extraction() {
let manager = SyncManager::new().expect("Failed to create SyncManager");
assert_eq!(
manager.extract_repo_name("https://github.com/user/repo.git"),
"repo"
);
assert_eq!(
manager.extract_repo_name("https://github.com/user/repo"),
"repo"
);
assert_eq!(
manager.extract_repo_name("git@github.com:user/repo.git"),
"repo" );
assert_eq!(
manager.extract_repo_name("https://gitlab.com/group/subgroup/project"),
"project"
);
}
#[tokio::test]
async fn test_sync_status_no_config() {
if !CONFIG.sync.repolist.is_empty() {
return;
}
let manager = SyncManager::new().expect("Failed to create SyncManager");
let status = manager
.check_sync_status()
.expect("Failed to check sync status");
matches!(status, guardy::sync::SyncStatus::NotConfigured);
}
#[test]
fn test_repo_config_structure() {
let repo_config = RepoConfig {
name: "test-repo".into(),
repo: "https://github.com/user/test-repo.git".into(),
version: "main".into(),
source_path: "configs".into(),
dest_path: ".".into(),
include: vec!["*.yaml".to_string(), "*.toml".to_string()],
exclude: vec!["*.tmp".to_string()],
protected: true,
};
let json = serde_json::to_string(&repo_config).expect("Failed to serialize RepoConfig");
let deserialized: RepoConfig =
serde_json::from_str(&json).expect("Failed to deserialize RepoConfig");
assert_eq!(repo_config.name, deserialized.name);
assert_eq!(repo_config.repo, deserialized.repo);
assert_eq!(repo_config.version, deserialized.version);
assert_eq!(repo_config.source_path, deserialized.source_path);
assert_eq!(repo_config.dest_path, deserialized.dest_path);
assert_eq!(repo_config.include, deserialized.include);
assert_eq!(repo_config.exclude, deserialized.exclude);
assert_eq!(repo_config.protected, deserialized.protected);
}
#[test]
fn test_repo_config_defaults() {
let minimal_json = r#"{
"name": "test",
"repo": "https://github.com/user/test.git",
"version": "main",
"source_path": "src",
"dest_path": "."
}"#;
let config: RepoConfig =
serde_json::from_str(minimal_json).expect("Failed to parse minimal RepoConfig");
assert!(
config.include.is_empty(),
"include should default to empty vec"
);
assert!(
config.exclude.is_empty(),
"exclude should default to empty vec"
);
assert!(!config.protected, "protected should default to false");
}