#![allow(unused_imports)]
use super::lock_chain::*;
use super::lock_merge::cmd_lock_sign;
#[cfg(test)]
mod tests {
use super::*;
use std::path::Path;
fn state_lock_yaml() -> &'static str {
"schema: \"1\"\nmachine: web\nhostname: web\ngenerated_at: \"2026-02-28T00:00:00Z\"\ngenerator: forjar\nblake3_version: \"1.8\"\nresources: {}\n"
}
fn make_dir() -> tempfile::TempDir {
let dir = tempfile::tempdir().unwrap();
std::fs::create_dir_all(dir.path().join("web")).unwrap();
std::fs::write(dir.path().join("web/state.lock.yaml"), state_lock_yaml()).unwrap();
dir
}
fn sign(dir: &Path, key: &str) {
assert!(cmd_lock_sign(dir, key, false).is_ok());
}
#[test]
fn test_sign_then_verify_chain() {
let d = make_dir();
sign(d.path(), "k");
assert!(cmd_lock_verify_chain(d.path(), Some("k"), false, false).is_ok());
}
#[test]
fn test_sign_then_verify_chain_json() {
let d = make_dir();
sign(d.path(), "k");
assert!(cmd_lock_verify_chain(d.path(), Some("k"), false, true).is_ok());
}
#[test]
fn test_sign_then_verify_chain_wrong_key() {
let d = make_dir();
sign(d.path(), "right");
assert!(cmd_lock_verify_chain(d.path(), Some("wrong"), false, false).is_err());
}
#[test]
fn test_lock_verify_chain_unsigned_lock_fails() {
let d = make_dir();
assert!(cmd_lock_verify_chain(d.path(), None, true, false).is_err());
}
#[test]
fn test_lock_verify_chain_unsigned_lock_fails_json() {
let d = make_dir();
assert!(cmd_lock_verify_chain(d.path(), None, true, true).is_err());
}
#[test]
fn test_lock_verify_chain_plain() {
let dir = make_dir();
assert!(cmd_lock_verify_chain(dir.path(), None, true, false).is_err());
}
#[test]
fn test_lock_verify_chain_json() {
let dir = make_dir();
assert!(cmd_lock_verify_chain(dir.path(), None, true, true).is_err());
}
#[test]
fn test_lock_verify_chain_without_key_refuses() {
let dir = make_dir();
assert!(cmd_lock_verify_chain(dir.path(), None, false, false).is_err());
}
#[test]
fn test_lock_verify_chain_key_and_presence_only_conflict() {
let dir = make_dir();
assert!(cmd_lock_verify_chain(dir.path(), Some("k"), true, false).is_err());
}
#[test]
fn test_lock_verify_chain_signed_verifies() {
let dir = make_dir();
sign(dir.path(), "k");
assert!(cmd_lock_verify_chain(dir.path(), Some("k"), false, false).is_ok());
assert!(cmd_lock_verify_chain(dir.path(), Some("k"), false, true).is_ok());
}
#[test]
fn test_lock_verify_chain_wrong_key_fails() {
let dir = make_dir();
sign(dir.path(), "right");
assert!(cmd_lock_verify_chain(dir.path(), Some("wrong"), false, false).is_err());
}
#[test]
fn test_lock_verify_chain_tampered_lock_fails() {
let dir = make_dir();
sign(dir.path(), "k");
std::fs::write(
dir.path().join("web/state.lock.yaml"),
format!("{}# tampered\n", state_lock_yaml()),
)
.unwrap();
assert!(cmd_lock_verify_chain(dir.path(), Some("k"), false, false).is_err());
}
#[test]
fn test_lock_verify_chain_orphan_signature_fails() {
let dir = make_dir();
sign(dir.path(), "k");
std::fs::remove_file(dir.path().join("web/state.lock.yaml")).unwrap();
assert!(cmd_lock_verify_chain(dir.path(), None, true, false).is_err());
}
#[test]
fn test_lock_verify_chain_multibyte_signature_does_not_panic() {
let dir = make_dir();
std::fs::write(dir.path().join("web/lock.sig"), "☃".repeat(10)).unwrap();
assert!(cmd_lock_verify_chain(dir.path(), None, true, false).is_err());
}
#[test]
fn test_lock_verify_chain_absent_and_empty_state_dirs_fail() {
let dir = tempfile::tempdir().unwrap();
let absent = dir.path().join("nope");
assert!(cmd_lock_verify_chain(&absent, None, true, false).is_err());
assert!(cmd_lock_verify_chain(dir.path(), None, true, false).is_err());
}
}