use super::*;
#[test]
fn propose_json_renderer_records_options_summary_and_defaults() {
let report = ProposeReport {
inventory: InventoryContext::source_syntax(
"git_tracked",
Some("H:/Code/Rust/cargo-allow"),
Some(76),
),
kind: Some("panic"),
expires: "2026-08-02",
policy_output: Some("target/cargo-allow/proposed.toml"),
force: true,
findings_scanned: 54,
baseline_debt_entries_proposed: 2,
unsafe_baseline_debt_entries_proposed: 1,
};
let json = render_propose_json(report);
assert!(json.contains("\"schema_id\": \"cargo-allow.propose.v1\""));
assert!(json.contains("\"command\": \"propose\""));
assert!(json.contains("\"source\": \"git_tracked\""));
assert!(json.contains("\"files_scanned\": 76"));
assert!(json.contains("\"kind\": \"panic\""));
assert!(json.contains("\"expires\": \"2026-08-02\""));
assert!(json.contains("\"policy_output\": \"target/cargo-allow/proposed.toml\""));
assert!(json.contains("\"force\": true"));
assert!(json.contains("\"findings_scanned\": 54"));
assert!(json.contains("\"baseline_debt_entries_proposed\": 2"));
assert!(json.contains("\"unsafe_baseline_debt_entries_proposed\": 1"));
assert!(json.contains("\"owner\": \"unowned\""));
assert!(json.contains("\"classification\": \"baseline_debt\""));
let expected = format!(
r#"{{
"schema_version": 1,
"schema_id": "cargo-allow.propose.v1",
"tool": "cargo-allow",
"command": "propose",
"claim_boundary": {},
"scanner_limitations": {},
"inventory": {{
"scope": "source_tree",
"scanner": "source_syntax",
"source": "git_tracked",
"root": "H:/Code/Rust/cargo-allow",
"files_scanned": 76
}},
"options": {{
"kind": "panic",
"expires": "2026-08-02",
"policy_output": "target/cargo-allow/proposed.toml",
"force": true
}},
"summary": {{
"findings_scanned": 54,
"baseline_debt_entries_proposed": 2,
"unsafe_baseline_debt_entries_proposed": 1
}},
"generated_entry_defaults": {{
"owner": "unowned",
"classification": "baseline_debt",
"reason": "Generated by cargo-allow propose; requires human review.",
"expires": "2026-08-02"
}}
}}
"#,
render_claim_boundary_json(),
render_scanner_limitations_json()
);
assert_eq!(json, expected);
let text = render_propose_human(report);
assert!(text.contains("cargo-allow propose summary"));
assert!(
text.contains("inventory: source_tree/source_syntax via git_tracked; files scanned: 76")
);
assert!(text.contains("source_tree_root: H:/Code/Rust/cargo-allow"));
assert!(text.contains("kind filter: panic"));
assert!(text.contains("findings scanned: 54"));
assert!(text.contains("baseline_debt entries proposed: 2"));
assert!(text.contains("unsafe baseline_debt entries proposed: 1"));
assert!(text.contains("owner: unowned"));
assert!(text.contains("classification: baseline_debt"));
assert!(text.contains("expires: 2026-08-02"));
assert!(text.contains("output: target/cargo-allow/proposed.toml"));
assert!(text.contains("generated debt still requires human review"));
assert!(text.contains("Claim boundary: scanned source-tree/source syntax only"));
}