lenso-service 0.1.24

Public contracts for Lenso Providers and Autonomous Services.
Documentation
use chrono::Utc;
use lenso_service::system_plane::{
    RUNTIME_OBSERVABILITY_PROTOCOL, RuntimeObservabilityMessage, RuntimeObservabilitySnapshot,
    RuntimeObservabilityStatus, RuntimeObservationContinuity, RuntimeObservationEvidenceGap,
    RuntimeObservationFeed, RuntimeObservationGapReason, RuntimeQueueKind, RuntimeQueueSummary,
    runtime_observability_schema, runtime_observability_schema_digest,
};

fn snapshot() -> RuntimeObservabilitySnapshot {
    RuntimeObservabilitySnapshot {
        protocol: RUNTIME_OBSERVABILITY_PROTOCOL.to_owned(),
        service_id: "support".to_owned(),
        service_revision: "release:sha256:0123456789abcdef".to_owned(),
        snapshot_revision: format!("sha256:{}", "a".repeat(64)),
        schema_digest: format!("sha256:{}", "b".repeat(64)),
        next_cursor: "opaque-snapshot-cursor".to_owned(),
        observed_at: Utc::now(),
        status: RuntimeObservabilityStatus::Healthy,
        queues: vec![RuntimeQueueSummary {
            queue: RuntimeQueueKind::Outbox,
            pending: 0,
            active: 0,
            completed: 12,
            failed: 0,
            dead: 0,
            oldest_pending_age_seconds: None,
            oldest_failed_age_seconds: None,
        }],
    }
}

#[test]
fn runtime_observability_snapshot_is_a_strict_ui_neutral_wire_contract() {
    let mut value = serde_json::to_value(snapshot()).unwrap();

    assert_eq!(value["protocol"], RUNTIME_OBSERVABILITY_PROTOCOL);
    assert_eq!(value["queues"][0]["queue"], "outbox");
    assert!(value["queues"][0].get("pageRoute").is_none());
    value["workspace"] = serde_json::json!("runtime");
    assert!(serde_json::from_value::<RuntimeObservabilitySnapshot>(value).is_err());
}

#[test]
fn schema_and_digest_validate_the_exact_snapshot_shape() {
    let schema = runtime_observability_schema();
    let validator = jsonschema::validator_for(&schema).unwrap();

    assert!(validator.is_valid(
        &serde_json::to_value(RuntimeObservabilityMessage::Snapshot(snapshot())).unwrap()
    ));
    assert!(
        runtime_observability_schema_digest()
            .strip_prefix("sha256:")
            .is_some_and(|digest| digest.len() == 64)
    );
    assert_eq!(
        schema["$defs"]["RuntimeObservabilitySnapshot"]["properties"]["protocol"]["const"],
        RUNTIME_OBSERVABILITY_PROTOCOL
    );
}

#[test]
fn recovery_feed_makes_loss_of_continuity_explicit() {
    let feed = RuntimeObservationFeed {
        protocol: RUNTIME_OBSERVABILITY_PROTOCOL.to_owned(),
        service_id: "support".to_owned(),
        service_revision: "release:sha256:0123456789abcdef".to_owned(),
        schema_digest: format!("sha256:{}", "b".repeat(64)),
        collected_at: Utc::now(),
        continuity: RuntimeObservationContinuity::ResetRequired,
        evidence_gap: Some(RuntimeObservationEvidenceGap {
            reason: RuntimeObservationGapReason::RetentionLost,
            message: "Required changes were pruned.".to_owned(),
            required_action: "fetch_fresh_runtime_observability_snapshot".to_owned(),
        }),
        changes: Vec::new(),
        next_cursor: String::new(),
        has_more: false,
    };
    let value = serde_json::to_value(RuntimeObservabilityMessage::Feed(feed)).unwrap();

    assert!(
        jsonschema::validator_for(&runtime_observability_schema())
            .unwrap()
            .is_valid(&value)
    );
    assert_eq!(value["document"]["continuity"], "reset_required");
    assert_eq!(value["document"]["evidenceGap"]["reason"], "retention_lost");
}