Skip to content

Platform Integration Test

Status & scope

  • Module: tests/test_platform_integration.py
  • Milestone: Phase 3

Purpose

End-to-end test proving prism (the cost-lens engine; axonis-prism, ex-axonis-lens) runs through the platform stack. Stubbed ES replaces UDS. Validates: parse → resolve sources → run_lens → evidence block → serialization → block schema compliance.

Test Architecture

test_platform_integration.py
  ├── StubUDSAdapter          ← returns canned data for uds:// sources
  ├── test_traversal_e2e      ← lens YAML → route → evidence
  ├── test_threat_e2e         ← lens YAML → risk surface → evidence
  ├── test_observation_e2e    ← lens YAML → coverage → evidence
  ├── test_temporal_e2e       ← lens YAML → action windows → evidence
  ├── test_entity_output_compose ← correlation:// (parallax entity output) → cost layer → evidence
  ├── test_composition_e2e    ← threat → traversal composition → evidence
  ├── test_coa_comparison     ← 3 COAs → comparison → ranked → evidence
  ├── test_evidence_schema    ← evidence block matches DES block schema
  └── test_serialization_rt   ← LensResult → JSON → LensResult roundtrip

StubUDSAdapter

class StubUDSAdapter(SourceAdapter):
    """Returns canned data for uds:// sources. No ES required."""

    def __init__(self, fixture_dir: str):
        self.fixtures = load_fixtures(fixture_dir)

    def resolve(self, uri: str) -> Any:
        # uds://bio_case → fixtures/bio_case.json
        key = uri.replace("uds://", "")
        return self.fixtures[key]

Test Fixtures

tests/fixtures/platform/
  traversal_lens.yaml       ← Lens spec for route
  threat_lens.yaml          ← Lens spec for risk surface
  observation_lens.yaml     ← Lens spec for coverage
  temporal_lens.yaml        ← Lens spec for action windows
  compose_entity_lens.yaml  ← cost lens with a correlation:// layer (consumes entity output)
  stub_data/
    road_graph.json         ← Small graph (20 nodes)
    threat_overlay.json     ← 10x10 risk grid
    tle_subset.json         ← 3 satellite TLEs
    entity_output.json      ← canned parallax entity-lens result for the correlation source

What This Proves

Assertion Why It Matters
run_lens() accepts pack-parsed specs Cortex can call it
Stubbed sources work identically Can test without ES
Evidence blocks have valid hashes DES block schema compliance
Serialization roundtrips cleanly REST transport works
All 4 cost lens types execute Cost-lens engine covers its full type set (entity lenses are parallax's)
Entity output composes as a cost layer The sanctioned cross-engine seam (correlation source) works
Composition resolves and executes Multi-lens scenarios work
COA comparison ranks correctly Decision support works

File Layout

tests/
  test_platform_integration.py
  fixtures/platform/
    *.yaml, stub_data/*.json

DO NOT

  • Require ES, Cortex, or any platform service to run
  • Test cortex or beacon code — this tests prism (the cost-lens engine) only
  • Skip evidence validation — every test verifies hashes

Depends on: component.prism.packaging, component.prism.source-adapters

Required by: component.prism.platform-integration