cargo-allow 0.1.1

Source-tree exception ledger and policy scanner for Rust repositories.
use crate::artifact_schema_support::{parse_schema, required_schema_pointer};
use serde_json::Value;

#[test]
fn schema_source_location_fields_are_one_based_when_present() {
    let common = parse_schema(
        "common",
        include_str!("../../../docs/schemas/common.v1.json"),
    );
    for pointer in [
        "/$defs/finding/properties/line",
        "/$defs/structural_identity/properties/line_hint",
        "/$defs/structural_identity/properties/column_hint",
        "/$defs/selector/properties/line_hint",
    ] {
        assert_schema_minimum("common", &common, pointer, 1);
    }

    let add = parse_schema("add", include_str!("../../../docs/schemas/add.schema.json"));
    for pointer in [
        "/$defs/selector/properties/line_hint",
        "/$defs/span/properties/line",
        "/$defs/span/properties/column",
        "/$defs/finding/properties/line",
        "/$defs/finding/properties/column",
        "/$defs/structural_identity/properties/line_hint",
        "/$defs/structural_identity/properties/column_hint",
    ] {
        assert_schema_minimum("add", &add, pointer, 1);
    }

    let explain = parse_schema(
        "explain",
        include_str!("../../../docs/schemas/explain.schema.json"),
    );
    for pointer in [
        "/$defs/selector/properties/line_hint",
        "/$defs/current_finding/properties/line",
        "/$defs/current_finding/properties/column",
        "/$defs/structural_identity/properties/line_hint",
        "/$defs/structural_identity/properties/column_hint",
        "/$defs/span/properties/line",
        "/$defs/span/properties/column",
    ] {
        assert_schema_minimum("explain", &explain, pointer, 1);
    }

    let report = parse_schema(
        "report",
        include_str!("../../../docs/schemas/report.schema.json"),
    );
    assert_schema_minimum("report", &report, "/$defs/finding/properties/line", 1);
}

fn assert_schema_minimum(name: &str, schema: &Value, pointer: &str, expected: u64) {
    assert_eq!(
        required_schema_pointer(name, schema, pointer)
            .get("minimum")
            .and_then(Value::as_u64),
        Some(expected),
        "{name} {pointer} minimum"
    );
}