From c3edf9d4137e83bb5c2f097acb8b27024fb5be4e Mon Sep 17 00:00:00 2001 From: adlee-was-taken Date: Mon, 20 Apr 2026 18:39:13 -0400 Subject: [PATCH] test(cli): vault_dir detection (L8) + v1 vault rejection Co-Authored-By: Claude Sonnet 4.6 --- crates/relicario-cli/tests/vault_detection.rs | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 crates/relicario-cli/tests/vault_detection.rs diff --git a/crates/relicario-cli/tests/vault_detection.rs b/crates/relicario-cli/tests/vault_detection.rs new file mode 100644 index 0000000..c25071e --- /dev/null +++ b/crates/relicario-cli/tests/vault_detection.rs @@ -0,0 +1,59 @@ +mod common; + +use assert_cmd::cargo::CommandCargoExt; +use std::process::Command; +use tempfile::TempDir; + +#[test] +fn list_refuses_without_vault_marker() { + let dir = TempDir::new().unwrap(); + // No .relicario/ in dir — list should bail with a friendly error. + let mut cmd = Command::cargo_bin("relicario").unwrap(); + let out = cmd.current_dir(dir.path()) + .env("RELICARIO_TEST_PASSPHRASE", "foo") + .arg("list") + .output() + .unwrap(); + assert!(!out.status.success()); + let stderr = String::from_utf8(out.stderr).unwrap(); + assert!(stderr.contains(".relicario"), "expected marker hint: {stderr}"); +} + +#[test] +fn get_finds_vault_in_parent_dir() { + let v = common::TestVault::init(); + v.run(&["add", "login", "--title", "parent-test", + "--username", "u", "--password", "p"]); + + // Create a nested subdir and run `list` from inside it. + let nested = v.path().join("a/b/c"); + std::fs::create_dir_all(&nested).unwrap(); + + let mut cmd = Command::cargo_bin("relicario").unwrap(); + cmd.current_dir(&nested) + .env("RELICARIO_IMAGE", &v.reference_image) + .env("RELICARIO_TEST_PASSPHRASE", &v.passphrase) + .arg("list"); + let out = cmd.output().unwrap(); + assert!(out.status.success(), "list from nested dir failed: {:?}", out); + assert!(String::from_utf8(out.stdout).unwrap().contains("parent-test")); +} + +#[test] +fn v1_vault_is_rejected_with_clear_error() { + // Synthesize an on-disk v1 vault: .idfoto/ dir with old params.json. + // Since vault_dir detection uses .relicario/, the pre-rename dir name is + // naturally rejected without any compat shim. Confirm that. + let dir = TempDir::new().unwrap(); + std::fs::create_dir(dir.path().join(".idfoto")).unwrap(); + + let mut cmd = Command::cargo_bin("relicario").unwrap(); + let out = cmd.current_dir(dir.path()) + .env("RELICARIO_TEST_PASSPHRASE", "foo") + .arg("list") + .output() + .unwrap(); + assert!(!out.status.success()); + let stderr = String::from_utf8(out.stderr).unwrap(); + assert!(stderr.contains(".relicario"), "expected relicario marker demand: {stderr}"); +}