use super::workspace::*;
#[test]
fn delete_without_yes_prints_warning() {
let dir = tempfile::tempdir().unwrap();
let root = dir.path();
let state_base = root.join("state");
std::fs::create_dir_all(&state_base).unwrap();
workspace_new_in(root, &state_base, "deletable").unwrap();
let result = workspace_delete_in(root, &state_base, "deletable", false);
assert!(result.is_ok());
assert!(state_base.join("deletable").exists());
}
#[test]
fn new_duplicate_workspace() {
let dir = tempfile::tempdir().unwrap();
let root = dir.path();
let state_base = root.join("state");
std::fs::create_dir_all(&state_base).unwrap();
workspace_new_in(root, &state_base, "dup").unwrap();
let result = workspace_new_in(root, &state_base, "dup");
assert!(result.is_err());
assert!(result.unwrap_err().contains("already exists"));
}
#[test]
fn select_nonexistent_workspace() {
let dir = tempfile::tempdir().unwrap();
let root = dir.path();
let state_base = root.join("state");
std::fs::create_dir_all(&state_base).unwrap();
let result = workspace_select_in(root, &state_base, "ghost");
assert!(result.is_err());
assert!(result.unwrap_err().contains("does not exist"));
}
#[test]
fn delete_active_workspace_clears_selection() {
let dir = tempfile::tempdir().unwrap();
let root = dir.path();
let state_base = root.join("state");
std::fs::create_dir_all(&state_base).unwrap();
workspace_new_in(root, &state_base, "active-ws").unwrap();
assert_eq!(current_workspace_in(root).as_deref(), Some("active-ws"));
workspace_delete_in(root, &state_base, "active-ws", true).unwrap();
assert!(current_workspace_in(root).is_none());
}
#[test]
fn list_with_only_files_no_dirs() {
let dir = tempfile::tempdir().unwrap();
let root = dir.path();
let state_base = root.join("state");
std::fs::create_dir_all(&state_base).unwrap();
std::fs::write(state_base.join("somefile.txt"), "data").unwrap();
let result = workspace_list_in(root, &state_base);
assert!(result.is_ok());
}
#[test]
fn resolve_state_dir_no_flag_no_current() {
let dir = std::path::Path::new("/tmp/forjar-state-test");
let resolved = resolve_state_dir(dir, None);
assert_eq!(resolved, dir.to_path_buf());
}
#[test]
fn inject_without_flag_defaults_to_default() {
let yaml = "version: '1'\nname: test\nmachines: {}\nresources: {}\n";
let mut config: crate::core::types::ForjarConfig = serde_yaml_ng::from_str(yaml).unwrap();
inject_workspace_param(&mut config, None);
let ws = config.params.get("workspace").unwrap();
assert!(ws.as_str().is_some());
}
#[test]
fn new_creates_metadata_dir() {
let dir = tempfile::tempdir().unwrap();
let root = dir.path();
let state_base = root.join("state");
workspace_new_in(root, &state_base, "test-ws").unwrap();
assert!(root.join(".forjar").exists());
assert!(root.join(".forjar/workspace").exists());
let content = std::fs::read_to_string(root.join(".forjar/workspace")).unwrap();
assert_eq!(content, "test-ws");
}
#[test]
fn list_no_state_base() {
let dir = tempfile::tempdir().unwrap();
let root = dir.path();
let state_base = root.join("nonexistent-state");
let result = workspace_list_in(root, &state_base);
assert!(result.is_ok());
}
#[test]
fn list_with_active_workspace() {
let dir = tempfile::tempdir().unwrap();
let root = dir.path();
let state_base = root.join("state");
std::fs::create_dir_all(&state_base).unwrap();
workspace_new_in(root, &state_base, "ws-a").unwrap();
workspace_new_in(root, &state_base, "ws-b").unwrap();
workspace_select_in(root, &state_base, "ws-a").unwrap();
let result = workspace_list_in(root, &state_base);
assert!(result.is_ok());
}
#[test]
fn delete_nonexistent_workspace() {
let dir = tempfile::tempdir().unwrap();
let root = dir.path();
let state_base = root.join("state");
std::fs::create_dir_all(&state_base).unwrap();
let result = workspace_delete_in(root, &state_base, "ghost", true);
assert!(result.is_err());
assert!(result.unwrap_err().contains("does not exist"));
}
#[test]
fn resolve_with_workspace_flag() {
let dir = std::path::Path::new("/tmp/forjar-resolve-test");
let resolved = resolve_state_dir(dir, Some("prod"));
assert_eq!(resolved, dir.join("prod"));
}
#[test]
fn inject_with_flag() {
let yaml = "version: '1'\nname: test\nmachines: {}\nresources: {}\n";
let mut config: crate::core::types::ForjarConfig = serde_yaml_ng::from_str(yaml).unwrap();
inject_workspace_param(&mut config, Some("staging"));
let ws = config.params.get("workspace").unwrap();
assert_eq!(ws.as_str().unwrap(), "staging");
}
#[test]
fn current_workspace_empty_file() {
let dir = tempfile::tempdir().unwrap();
let root = dir.path();
let meta = root.join(".forjar");
std::fs::create_dir_all(&meta).unwrap();
std::fs::write(meta.join("workspace"), "").unwrap();
assert!(current_workspace_in(root).is_none());
}
#[test]
fn current_workspace_whitespace_only() {
let dir = tempfile::tempdir().unwrap();
let root = dir.path();
let meta = root.join(".forjar");
std::fs::create_dir_all(&meta).unwrap();
std::fs::write(meta.join("workspace"), " \n ").unwrap();
assert!(current_workspace_in(root).is_none());
}
#[test]
fn list_empty_state_dir() {
let dir = tempfile::tempdir().unwrap();
let root = dir.path();
let state_base = root.join("state");
std::fs::create_dir_all(&state_base).unwrap();
let result = workspace_list_in(root, &state_base);
assert!(result.is_ok());
}