mod support;
use support::Test;
#[test]
fn test_init_creates_default_vault() {
let t = Test::new();
let output = t.init_cmd("alice");
assert!(output.status.success());
assert!(t.dir.path().join(".dugout.toml").exists());
}
#[test]
fn test_init_creates_named_vault() {
let t = Test::new();
let output = t.init_vault("alice", "dev");
assert!(output.status.success());
assert!(t.dir.path().join(".dugout.dev.toml").exists());
assert!(!t.dir.path().join(".dugout.toml").exists());
}
#[test]
fn test_vault_isolation() {
let t = Test::new();
t.init_cmd("alice");
t.init_vault("alice", "dev");
t.set_vault("default", "PROD_SECRET", "prod_value");
t.set_vault("dev", "DEV_SECRET", "dev_value");
let prod_get = t.get_vault("default", "PROD_SECRET");
assert!(prod_get.status.success());
assert!(String::from_utf8_lossy(&prod_get.stdout).contains("prod_value"));
let dev_get = t.get_vault("dev", "DEV_SECRET");
assert!(dev_get.status.success());
assert!(String::from_utf8_lossy(&dev_get.stdout).contains("dev_value"));
let cross_get = t.get_vault("dev", "PROD_SECRET");
assert!(!cross_get.status.success());
}
#[test]
fn test_vault_list_shows_all_vaults() {
let t = Test::new();
t.init_cmd("alice");
t.init_vault("alice", "dev");
t.init_vault("alice", "prod");
t.set("SECRET", "value");
t.set_vault("dev", "SECRET", "value");
let output = t.vault_list();
assert!(output.status.success());
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(stdout.contains("default"));
assert!(stdout.contains("dev"));
assert!(stdout.contains("prod"));
}
#[test]
fn test_single_vault_no_flag_needed() {
let t = Test::new();
t.init_cmd("alice");
let set = t.set("KEY", "value");
assert!(set.status.success());
let get = t.get("KEY");
assert!(get.status.success());
}
#[test]
fn test_multiple_vaults_requires_flag() {
let t = Test::new();
t.init_cmd("alice");
t.init_vault("alice", "dev");
let get = t.cmd().args(["get", "KEY"]).output().unwrap();
assert!(!get.status.success());
let stderr = String::from_utf8_lossy(&get.stderr);
assert!(stderr.contains("multiple vaults"));
assert!(stderr.contains("--vault"));
}
#[test]
fn test_env_var_selects_vault() {
let t = Test::new();
t.init_cmd("alice");
t.init_vault("alice", "dev");
t.set("DEFAULT_KEY", "default_value");
t.set_vault("dev", "DEV_KEY", "dev_value");
let get = t
.cmd()
.env("DUGOUT_VAULT", "dev")
.args(["get", "DEV_KEY"])
.output()
.unwrap();
assert!(get.status.success());
assert!(String::from_utf8_lossy(&get.stdout).contains("dev_value"));
}
#[test]
fn test_env_var_isolates_vault() {
let t = Test::new();
t.init_cmd("alice");
t.init_vault("alice", "dev");
t.set_vault("default", "DEFAULT_KEY", "default_value");
t.set_vault("dev", "DEV_KEY", "dev_value");
let get = t
.cmd()
.env("DUGOUT_VAULT", "dev")
.args(["get", "DEFAULT_KEY"])
.output()
.unwrap();
assert!(!get.status.success());
}
#[test]
fn test_flag_overrides_env_var() {
let t = Test::new();
t.init_cmd("alice");
t.init_vault("alice", "dev");
t.set_vault("default", "DEFAULT_KEY", "default_value");
t.set_vault("dev", "DEV_KEY", "dev_value");
let get = t
.cmd()
.env("DUGOUT_VAULT", "dev")
.args(["--vault", "default", "get", "DEFAULT_KEY"])
.output()
.unwrap();
assert!(get.status.success());
assert!(String::from_utf8_lossy(&get.stdout).contains("default_value"));
}
#[test]
fn test_dot_uses_default_vault() {
let t = Test::new();
t.init_cmd("alice");
t.init_vault("alice", "dev");
std::fs::write(
t.dir.path().join("package.json"),
r#"{"scripts":{"dev":"echo ok"}}"#,
)
.unwrap();
t.set("SECRET", "value");
let dot = t.cmd().arg(".").output().unwrap();
let stderr = String::from_utf8_lossy(&dot.stderr);
assert!(!stderr.contains("multiple vaults"));
}
#[test]
fn test_legacy_request_migration() {
let t = Test::new();
t.init_cmd("alice");
let legacy_dir = t.dir.path().join(".dugout/requests");
std::fs::create_dir_all(&legacy_dir).unwrap();
let legacy_file = legacy_dir.join("bob.pub");
std::fs::write(&legacy_file, "age1testpubkey123").unwrap();
assert!(legacy_file.exists());
let output = t.cmd().args(["pending"]).output().unwrap();
assert!(output.status.success());
let new_file = t.dir.path().join(".dugout/requests/default/bob.pub");
assert!(
new_file.exists(),
"Request file should be migrated to new location"
);
assert!(
!legacy_file.exists(),
"Legacy request file should be removed after migration"
);
}