allow-report 0.1.9

Report and receipt rendering for cargo-allow source exception scans.
Documentation
use super::*;

#[test]
fn list_json_renderer_records_filters_context_and_rows() {
    let rows = vec![ListRow {
        id: "allow-json",
        status: "baseline_debt",
        matches: 1,
        kind: "panic",
        family: Some("unwrap"),
        owner: "parser",
        classification: "baseline_debt",
        scope: "crates/parser/src/lib.rs",
        source_package: Some("parser"),
        evidence_count: 2,
        broken_evidence_references: 1,
        weak_evidence_references: 1,
        selector_precision: 42,
        broad_scope: true,
        review_after: Some("2026-07-01"),
        expires: None,
        reason: "generated baseline",
    }];

    let json = render_list_json(
        &rows,
        ListFilters {
            kind: Some("panic"),
            family: Some("unwrap"),
            owner: Some("parser"),
            allow_id: Some("allow-json"),
            baseline_debt: true,
            broken_evidence: true,
            weak_evidence: true,
            ..ListFilters::default()
        },
        InventoryContext::source_syntax("git_tracked", Some("H:/Code/Rust/cargo-allow"), Some(46)),
    );

    assert!(json.contains("\"schema_id\": \"cargo-allow.list.v1\""));
    assert!(json.contains("\"command\": \"list\""));
    assert!(json.contains("\"source\": \"git_tracked\""));
    assert!(json.contains("\"root\": \"H:/Code/Rust/cargo-allow\""));
    assert!(json.contains("\"files_scanned\": 46"));
    assert!(json.contains("\"kind\": \"panic\""));
    assert!(json.contains("\"family\": \"unwrap\""));
    assert!(json.contains("\"owner\": \"parser\""));
    assert!(json.contains("\"allow_id\": \"allow-json\""));
    assert!(json.contains("\"baseline_debt\": true"));
    assert!(json.contains("\"broken_evidence\": true"));
    assert!(json.contains("\"weak_evidence\": true"));
    assert!(json.contains("\"allow_entries\": 1"));
    assert!(json.contains("\"id\": \"allow-json\""));
    assert!(json.contains("\"source_package\": \"parser\""));
    assert!(json.contains("\"broken_evidence_references\": 1"));
    assert!(json.contains("\"weak_evidence_references\": 1"));
    assert!(json.contains("\"selector_precision\": 42"));
    assert!(json.contains("\"broad_scope\": true"));
    assert!(json.contains("\"review_after\": \"2026-07-01\""));
    assert!(json.contains("\"expires\": null"));
    let expected = format!(
        r#"{{
  "schema_version": 1,
  "schema_id": "cargo-allow.list.v1",
  "tool": "cargo-allow",
  "command": "list",
  "claim_boundary": {},
  "scanner_limitations": {},
  "inventory": {{
    "scope": "source_tree",
    "scanner": "source_syntax",
    "source": "git_tracked",
    "root": "H:/Code/Rust/cargo-allow",
    "files_scanned": 46
  }},
  "filters": {{
    "kind": "panic",
    "family": "unwrap",
    "owner": "parser",
    "classification": null,
    "path": null,
    "source_package": null,
    "allow_id": "allow-json",
    "status": null,
    "expired": false,
    "review_due": false,
    "stale": false,
    "baseline_debt": true,
    "broad_scope": false,
    "missing_evidence": false,
    "broken_evidence": true,
    "weak_evidence": true
  }},
  "summary": {{
    "allow_entries": 1
  }},
  "allow_entries": [
    {{
      "id": "allow-json",
      "status": "baseline_debt",
      "matches": 1,
      "kind": "panic",
      "family": "unwrap",
      "owner": "parser",
      "classification": "baseline_debt",
      "scope": "crates/parser/src/lib.rs",
      "source_package": "parser",
      "evidence_count": 2,
      "broken_evidence_references": 1,
      "weak_evidence_references": 1,
      "selector_precision": 42,
      "broad_scope": true,
      "review_after": "2026-07-01",
      "expires": null,
      "reason": "generated baseline"
    }}
  ]
}}
"#,
        render_claim_boundary_json(),
        render_scanner_limitations_json()
    );
    assert_eq!(json, expected);

    let text = render_list_human(
        &rows,
        InventoryContext::source_syntax("git_tracked", Some("H:/Code/Rust/cargo-allow"), Some(46)),
    );

    assert!(
        text.contains("inventory: source_tree/source_syntax via git_tracked; files scanned: 46")
    );
    assert!(text.contains("source_tree_root: H:/Code/Rust/cargo-allow"));
    assert!(text.contains("id\tstatus\tmatches\tkind\tfamily"));
    assert!(text.contains(
            "allow-json\tbaseline_debt\t1\tpanic\tunwrap\tparser\tbaseline_debt\tcrates/parser/src/lib.rs\tparser\t2\t1\t1\t42\ttrue\t2026-07-01\t-\tgenerated baseline"
        ));
    assert!(text.contains(CLAIM_BOUNDARY_TEXT));
}