harn-cli 0.10.113

CLI for the Harn programming language — run, test, REPL, format, and lint
use super::*;

#[test]
fn generated_rust_external_action_activity_round_trips() {
    use generated_rust_binding::{
        HarnActivityKind, HarnExternalActionActivityRecord, HarnExternalActionActivityStatus,
        HarnExternalActionDecider, HarnExternalActionDecisionOutcome,
        HarnExternalActionProtectedFieldClass,
    };

    let fixture = json!({
        "schema": "harn.external_action_activity.v1",
        "kind": "external_action",
        "id": "activity_abc123",
        "action_id": "action_abc123",
        "effect_fingerprint": "sha256:effect123",
        "intent_fingerprint": "sha256:abc123",
        "provider": "duffel",
        "capability": "flights",
        "operation": "create_order",
        "environment": "test",
        "summary": "Create one test flight order",
        "external_spend": {"currency": "USD", "amount_minor": 28381},
        "status": "confirmed",
        "updated_at_ms": 1_788_000_000_000_i64,
        "requester": {
            "actor": {"kind": "user", "id": "local-user"},
            "agent_id": "assistant",
            "model_provider": "openai",
            "model_id": "test-model",
            "session_id": "session-1",
            "run_id": "run-1"
        },
        "policy_evaluations": [{
            "layer": "managed_policy",
            "outcome": "allowed",
            "reason_code": "test_mode_allowed",
            "policy_id": "managed-default"
        }],
        "decision": {
            "outcome": "approved",
            "decider": "person",
            "decided_at_ms": 1_788_000_000_000_i64,
            "reason_code": "approved_exact_action",
            "actor": {"kind": "user", "id": "local-user"}
        },
        "authorization": {
            "method": "manual",
            "authentication_assurance": "session",
            "issued_at_ms": 1_788_000_000_000_i64,
            "expires_at_ms": 1_788_000_300_000_i64
        },
        "disclosure": {
            "recipient": "Duffel test mode",
            "purpose": "Create one test flight order",
            "field_classes": ["legal_identity", "birth_date"],
            "source": "fictional_test_fixture",
            "authentication_assurance": "session"
        },
        "dispatch": {"attempted": true, "adapter_id": "duffel-test-v1"},
        "reconciliation": {"attempted": false, "status": "not_needed"},
        "retry": {
            "schema": "harn.external_action_retry_link.v1",
            "previous_action_id": "action_denied",
            "previous_receipt_id": "receipt_denied"
        },
        "receipt": {
            "schema": "harn.external_action_receipt.v1",
            "id": "receipt-1",
            "action_id": "action_abc123",
            "effect_fingerprint": "sha256:effect123",
            "intent_fingerprint": "sha256:abc123",
            "idempotency_key": "idempotency-1",
            "provider": "duffel",
            "capability": "flights",
            "operation": "create_order",
            "environment": "test",
            "adapter_id": "duffel-test-v1",
            "outcome": "confirmed",
            "status": "confirmed",
            "next_action": "none",
            "dispatch_attempted": true,
            "recorded_at_ms": 1_788_000_000_000_i64,
            "provider_action_id": "ord_test_1",
            "evidence_refs": ["provider:order:ord_test_1"],
            "retry": {
                "schema": "harn.external_action_retry_link.v1",
                "previous_action_id": "action_denied",
                "previous_receipt_id": "receipt_denied"
            },
            "disclosure": {
                "recipient": "Duffel test mode",
                "purpose": "Create one test flight order",
                "field_classes": ["legal_identity", "birth_date"],
                "source": "fictional_test_fixture",
                "authentication_assurance": "session"
            }
        }
    });

    let decoded: HarnExternalActionActivityRecord =
        serde_json::from_value(fixture.clone()).expect("generated activity DTO decodes");
    assert_eq!(decoded.kind, HarnActivityKind::ExternalAction);
    assert_eq!(decoded.status, HarnExternalActionActivityStatus::Confirmed);
    assert_eq!(
        decoded.retry.as_ref().expect("retry").previous_receipt_id,
        "receipt_denied"
    );
    assert_eq!(
        decoded
            .receipt
            .as_ref()
            .expect("receipt")
            .effect_fingerprint
            .as_deref(),
        Some("sha256:effect123")
    );
    assert_eq!(
        decoded.decision.as_ref().expect("decision").outcome,
        HarnExternalActionDecisionOutcome::Approved
    );
    assert_eq!(
        decoded.decision.as_ref().expect("decision").decider,
        HarnExternalActionDecider::Person
    );
    assert_eq!(
        decoded
            .disclosure
            .as_ref()
            .expect("disclosure")
            .field_classes,
        [
            HarnExternalActionProtectedFieldClass::LegalIdentity,
            HarnExternalActionProtectedFieldClass::BirthDate,
        ]
    );
    assert_eq!(
        serde_json::to_value(decoded).expect("generated activity DTO encodes"),
        fixture
    );
}