#![allow(clippy::expect_used, clippy::indexing_slicing, clippy::unwrap_used)]
use std::process::Output;
mod support;
const MAINTAINER_PUBLIC_KEY_HEX: &str =
"a00899dfd3357aee69729405913f9324dfc033cec04a2215239eda64ae6d9d91";
const MAINTAINER_SEED_HEX: &str =
"111122223333444455556666777788889999aaaabbbbccccddddeeeeffff0000";
const AUTHOR_SEED_HEX: &str = "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff";
fn fail(output: &Output, what: &str) {
assert!(
!output.status.success(),
"{what} unexpectedly succeeded\nstdout: {}\nstderr: {}",
String::from_utf8_lossy(&output.stdout),
String::from_utf8_lossy(&output.stderr),
);
}
#[test]
fn tutorial_sequence_runs_exactly_as_the_page_shows_it() {
let repo = support::unique_repo("beginners-tutorial");
support::init(&repo);
std::fs::write(repo.join("readme.txt"), b"hello prikk\n").unwrap();
let out = support::prikk(&repo)
.args(["commit", "-m", "genesis"])
.output()
.unwrap();
fail(&out, "commit with no author key");
assert!(
String::from_utf8_lossy(&out.stderr).contains(
"error: author signing is required: set PRIKK_AUTHOR_KEY_ID (no signing key configured)"
),
"tutorial quotes this exact refusal: {}",
String::from_utf8_lossy(&out.stderr)
);
let out = support::prikk(&repo)
.env("PRIKK_AUTHOR_KEY_ID", "dev-author")
.env("PRIKK_AUTHOR_SEED", AUTHOR_SEED_HEX)
.args(["commit", "-m", "genesis"])
.output()
.unwrap();
support::ok(&out, "commit with author key configured");
assert!(
String::from_utf8_lossy(&out.stdout).contains("create-file readme.txt"),
"tutorial quotes this line of commit's own output: {}",
String::from_utf8_lossy(&out.stdout)
);
let out = support::prikk(&repo)
.args(["seal", "--allow-no-audit"])
.output()
.unwrap();
fail(&out, "seal with no maintainer key");
assert!(
String::from_utf8_lossy(&out.stderr).contains(
"error: maintainer signing is required: set PRIKK_MAINTAINER_KEY_ID (no signing key configured)"
),
"tutorial quotes this exact refusal: {}",
String::from_utf8_lossy(&out.stderr)
);
let out = support::prikk(&repo)
.env("PRIKK_MAINTAINER_KEY_ID", "dev-maintainer")
.env("PRIKK_MAINTAINER_SEED", MAINTAINER_SEED_HEX)
.args(["seal", "--allow-no-audit"])
.output()
.unwrap();
fail(&out, "seal with an untrusted maintainer key");
assert!(
String::from_utf8_lossy(&out.stderr)
.contains("error: integrity error: publication trust policy is missing or unreadable"),
"tutorial quotes this exact refusal: {}",
String::from_utf8_lossy(&out.stderr)
);
let out = support::prikk(&repo)
.args([
"trust",
"maintainer",
"add",
"--key-id",
"dev-maintainer",
"--public-key",
MAINTAINER_PUBLIC_KEY_HEX,
])
.output()
.unwrap();
support::ok(&out, "trust maintainer add");
assert!(
String::from_utf8_lossy(&out.stdout).contains("trusted maintainer key: dev-maintainer"),
"tutorial quotes this line: {}",
String::from_utf8_lossy(&out.stdout)
);
let out = support::prikk(&repo)
.env("PRIKK_MAINTAINER_KEY_ID", "dev-maintainer")
.env("PRIKK_MAINTAINER_SEED", MAINTAINER_SEED_HEX)
.args(["seal", "--allow-no-audit"])
.output()
.unwrap();
support::ok(&out, "seal");
assert!(
String::from_utf8_lossy(&out.stdout).contains("sealed active WAL into block"),
"tutorial quotes this line: {}",
String::from_utf8_lossy(&out.stdout)
);
let out = support::prikk(&repo).arg("log").output().unwrap();
support::ok(&out, "log");
let log_stdout = String::from_utf8_lossy(&out.stdout);
assert!(
log_stdout.contains("Root"),
"tutorial quotes a Root block: {log_stdout}"
);
assert!(
log_stdout.contains("update-seq: 1"),
"tutorial quotes update-seq 1: {log_stdout}"
);
let out = support::prikk(&repo).arg("verify").output().unwrap();
support::ok(&out, "verify");
assert!(
String::from_utf8_lossy(&out.stdout).contains("checked blocks: 1"),
"tutorial quotes this verify line: {}",
String::from_utf8_lossy(&out.stdout)
);
let out = support::prikk(&repo).arg("doctor").output().unwrap();
support::ok(&out, "doctor");
assert!(
String::from_utf8_lossy(&out.stdout)
.contains("issue summary: errors=0, warnings=0, info=1"),
"tutorial quotes this doctor summary line: {}",
String::from_utf8_lossy(&out.stdout)
);
let _ = std::fs::remove_dir_all(&repo);
}