use crate::Fixture;
use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;
#[test]
fn passthrough_preserves_chain_block() {
let ept = Fixture::copy("test-data/chain-anchor.ept");
let original = fs::read_to_string(&ept.path).unwrap();
Command::cargo_bin("enprot")
.unwrap()
.arg("passthrough")
.arg(&ept.path)
.assert()
.success();
let after = fs::read_to_string(&ept.path).unwrap();
for fragment in [
"CHAIN",
"parents:575d",
"signer:ed25519:9f3a7b",
"ts:20260725T143000Z",
"mut:encrypt+WORD",
"payload:7a4e9b",
"sig:3045022100",
] {
assert!(
after.contains(fragment),
"expected fragment '{}' in output:\n{}",
fragment,
after
);
}
let _ = original; }
#[test]
fn list_shows_chain_anchor_summary() {
let ept = Fixture::copy("test-data/chain-anchor.ept");
Command::cargo_bin("enprot")
.unwrap()
.arg("list")
.arg(&ept.path)
.assert()
.success()
.stdout(predicate::str::contains("CHAIN"))
.stdout(predicate::str::contains("signer="))
.stdout(predicate::str::contains("payload="));
}
#[test]
fn chain_block_with_unknown_fields_round_trips() {
let tmp = tempfile::tempdir().unwrap();
let path = tmp.path().join("future.ept");
let body = "// <( CHAIN parents:abc123 signer:ed25519:deadbeef future-field:value-42 payload:fedcba sig:999fff )>\n";
fs::write(&path, body).unwrap();
Command::cargo_bin("enprot")
.unwrap()
.arg("passthrough")
.arg(&path)
.assert()
.success();
let after = fs::read_to_string(&path).unwrap();
assert!(
after.contains("future-field:value-42"),
"unknown extfield must round-trip: got {}",
after
);
}
#[test]
fn chain_with_no_extfields_is_a_parse_error() {
let tmp = tempfile::tempdir().unwrap();
let path = tmp.path().join("empty.ept");
fs::write(&path, "// <( CHAIN )>\n").unwrap();
Command::cargo_bin("enprot")
.unwrap()
.arg("passthrough")
.arg(&path)
.assert()
.failure();
}