Many test helpers removed their temp dir only before the test, or only on pass, so runs left them behind: 117,000 filled /tmp (RAM here) and stopped a mutation run. Each now holds a guard that removes the dir on drop, unwind included; servers started on a test dir hold its guard until they stop. A full cargo test --workspace leaves 0 dirs (859 before). just sweep-test-tmp stays for runs killed mid-test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01T3gXMVt7XJPi6ens1or9Dj
86 lines
3.0 KiB
Rust
86 lines
3.0 KiB
Rust
//! The viewer's command line: `--vault-key-file` names the vault key and
|
|
//! wins over a settings file's `[vault] key_file`, as it does for the
|
|
//! server; an unknown argument stops the viewer with status 2. (Its own
|
|
//! test binary: the key file is named once per process.)
|
|
|
|
use ledger_core::{Role, TinFacts, TinType};
|
|
use ledger_gui::{Source, data};
|
|
use ledger_store::Store;
|
|
use ledger_vault::{Tin, Vault};
|
|
|
|
const SSN: &str = "123-45-6789";
|
|
|
|
/// A test's dir, removed when the test ends, pass or panic.
|
|
struct TestDir(std::path::PathBuf);
|
|
|
|
impl Drop for TestDir {
|
|
fn drop(&mut self) {
|
|
let _ = std::fs::remove_dir_all(&self.0);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn the_key_named_on_the_command_line_wins() {
|
|
let root = std::env::temp_dir().join(format!("ledger-gui-key-flag-{}", std::process::id()));
|
|
let _ = std::fs::remove_dir_all(&root);
|
|
let _cleanup = TestDir(root.clone());
|
|
let books = root.join("books");
|
|
let key = root.join("keys/vault.key");
|
|
std::fs::create_dir_all(&books).unwrap();
|
|
let mut s = Store::create(&books.join("books-data"), ledger_core::Currency::USD).unwrap();
|
|
let party = s.add_party("Pat Lee", &[Role::Member]).unwrap();
|
|
let v = Vault::open(&books.join("vault"), &key, true).unwrap();
|
|
let hash = v
|
|
.put_tin(party, &Tin::new(SSN, ledger_vault::TinType::Ssn).unwrap())
|
|
.unwrap();
|
|
s.set_party_tin(
|
|
party,
|
|
Some(TinFacts {
|
|
tin_type: TinType::Ssn,
|
|
last4: "6789".into(),
|
|
vault_record: Some(hash),
|
|
purged: None,
|
|
}),
|
|
)
|
|
.unwrap();
|
|
drop(s);
|
|
|
|
// Named first, so the default key location is never consulted.
|
|
assert_eq!(ledger_gui::vault_key_file(), None);
|
|
ledger_gui::set_vault_key_file(key.clone());
|
|
assert_eq!(ledger_gui::vault_key_file(), Some(key.clone()));
|
|
// Named once: a second naming changes nothing.
|
|
ledger_gui::set_vault_key_file(root.join("elsewhere.key"));
|
|
assert_eq!(ledger_gui::vault_key_file(), Some(key.clone()));
|
|
|
|
let mut b = data::load_once(&Source {
|
|
data_dir: books.join("books-data"),
|
|
books_toml: None,
|
|
today: Some(chrono::NaiveDate::from_ymd_opt(2026, 10, 17).unwrap()),
|
|
})
|
|
.unwrap();
|
|
// The settings name a key that isn't there; the command line wins.
|
|
b.settings.vault_key_file = Some(root.join("missing/vault.key"));
|
|
assert_eq!(b.tin_from_vault(party).unwrap(), SSN);
|
|
}
|
|
|
|
#[test]
|
|
fn an_unknown_argument_stops_the_viewer() {
|
|
let out = std::process::Command::new(env!("CARGO_BIN_EXE_ledger-gui"))
|
|
.arg("--no-such-flag")
|
|
.output()
|
|
.unwrap();
|
|
assert_eq!(out.status.code(), Some(2));
|
|
assert!(
|
|
String::from_utf8_lossy(&out.stderr).contains("unknown argument --no-such-flag"),
|
|
"{}",
|
|
String::from_utf8_lossy(&out.stderr)
|
|
);
|
|
let help = std::process::Command::new(env!("CARGO_BIN_EXE_ledger-gui"))
|
|
.arg("--help")
|
|
.output()
|
|
.unwrap();
|
|
assert!(help.status.success());
|
|
assert!(String::from_utf8_lossy(&help.stdout).contains("--vault-key-file PATH"));
|
|
}
|