mod common;
use predicates::prelude::PredicateBooleanExt;
use std::fs;
use tempfile::tempdir;
fn extract_code(stderr: &str) -> String {
let marker = "LADE_APPROVE=";
let start = stderr.find(marker).expect("approval code in message") + marker.len();
stderr[start..]
.chars()
.take_while(|c| c.is_ascii_hexdigit())
.collect()
}
#[test]
fn test_disclaimer_hook_flow() {
let dir = tempdir().unwrap();
let home = tempdir().unwrap();
fs::write(
dir.path().join("lade.yml"),
"\"deploy\":\n \".\":\n disclaimer: \"Danger!\"\n SECRET: val\n",
)
.unwrap();
let out = common::lade(home.path())
.current_dir(dir.path())
.args(["set", "deploy"])
.output()
.unwrap();
assert!(!out.status.success());
let stdout = String::from_utf8_lossy(&out.stdout);
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(stdout.contains("unset -v LADE_PENDING"));
assert!(stdout.contains("export LADE_PENDING='v1:"));
assert!(stderr.contains("Disclaimer required to uncover the secrets"));
assert!(stderr.contains("> Danger!"));
assert!(!stderr.contains("could not get secrets"));
let code = extract_code(&stderr);
common::lade(home.path())
.current_dir(dir.path())
.env("LADE_APPROVE", &code)
.args(["set", "deploy"])
.assert()
.success()
.stdout(predicates::str::contains("export SECRET='val'"));
common::lade(home.path())
.current_dir(dir.path())
.env("LADE_APPROVE", "1")
.args(["set", "deploy"])
.assert()
.failure();
common::lade(home.path())
.current_dir(dir.path())
.args(["approve", "zzzzz"])
.assert()
.failure()
.stderr(predicates::str::contains("no disclaimer is pending"))
.stderr(predicates::str::contains("Caused by").not());
}
#[test]
fn test_disclaimer_inject_fail_closed() {
let dir = tempdir().unwrap();
let home = tempdir().unwrap();
fs::write(
dir.path().join("lade.yml"),
"\"^echo\":\n \".\":\n disclaimer: \"Danger!\"\n SECRET: val\n",
)
.unwrap();
let out = common::lade(home.path())
.current_dir(dir.path())
.args(["inject", "echo hi"])
.output()
.unwrap();
assert_eq!(out.status.code(), Some(3));
let stderr = String::from_utf8_lossy(&out.stderr);
assert!(stderr.contains("Danger!"));
let code = extract_code(&stderr);
common::lade(home.path())
.current_dir(dir.path())
.env("LADE_APPROVE", &code)
.args(["inject", "echo hi"])
.assert()
.success()
.stdout(predicates::str::contains("hi"));
}