chio-kernel 0.1.2

Chio runtime kernel: capability validation, guard evaluation, receipt signing
Documentation
use chio_credit::ExposureLedgerCurrencyPosition;
use chio_kernel::operator_report::{
    ComptrollerDecisionSummary, ComptrollerSurfaceReport, ComptrollerSurfaceSourceRefs,
    COMPTROLLER_SURFACE_REPORT_SCHEMA,
};
use chio_test_support::prelude::*;

const SCHEMA_JSON: &str = include_str!(concat!(
    env!("CARGO_MANIFEST_DIR"),
    "/../../../spec/schemas/chio-comptroller/v1/surface-report.schema.json"
));

fn sample() -> ComptrollerSurfaceReport {
    ComptrollerSurfaceReport {
        schema: COMPTROLLER_SURFACE_REPORT_SCHEMA.to_string(),
        generated_at: 1_700_000_000,
        filters: chio_kernel::operator_report::OperatorReportQuery::default(),
        exposure_positions: vec![ExposureLedgerCurrencyPosition {
            currency: "USD".to_string(),
            governed_max_exposure_units: 4200,
            reserved_units: 1000,
            settled_units: 200,
            pending_units: 100,
            failed_units: 0,
            provisional_loss_units: 0,
            recovered_units: 0,
            quoted_premium_units: 0,
            active_quoted_premium_units: 0,
        }],
        decision_summary: ComptrollerDecisionSummary {
            allow_count: 1,
            deny_count: 1,
            cancelled_count: 0,
            incomplete_count: 0,
        },
        settlement_reconciliation: Default::default(),
        budget_utilization: Default::default(),
        source_refs: ComptrollerSurfaceSourceRefs::default(),
        execution_nonce_ref: None,
        hold_ref: None,
    }
}

fn schema_value() -> serde_json::Value {
    serde_json::from_str(SCHEMA_JSON).test_expect("schema parses")
}

#[test]
fn positive_sample_validates_against_published_schema() {
    let schema = schema_value();
    let validator = jsonschema::validator_for(&schema).test_expect("compile schema");
    let instance = serde_json::to_value(sample()).test_expect("serialize sample");
    assert!(
        validator.is_valid(&instance),
        "serialized sample must satisfy the published schema"
    );
}

#[test]
fn extra_top_level_field_is_rejected() {
    let schema = schema_value();
    let validator = jsonschema::validator_for(&schema).test_expect("compile schema");
    let mut instance = serde_json::to_value(sample()).test_expect("serialize sample");
    instance["unexpectedField"] = serde_json::json!("nope");
    assert!(
        !validator.is_valid(&instance),
        "additionalProperties:false must reject extra fields"
    );
}

#[test]
fn missing_required_field_is_rejected() {
    let schema = schema_value();
    let validator = jsonschema::validator_for(&schema).test_expect("compile schema");
    let mut instance = serde_json::to_value(sample()).test_expect("serialize sample");
    instance
        .as_object_mut()
        .test_expect("object")
        .remove("exposurePositions");
    assert!(
        !validator.is_valid(&instance),
        "missing required field must be rejected"
    );
}

#[test]
fn wrong_schema_const_is_rejected() {
    let schema = schema_value();
    let validator = jsonschema::validator_for(&schema).test_expect("compile schema");
    let mut instance = serde_json::to_value(sample()).test_expect("serialize sample");
    instance["schema"] = serde_json::json!("chio.comptroller.surface-report.v9");
    assert!(
        !validator.is_valid(&instance),
        "wrong schema const must be rejected"
    );
}