import importlib.util import json from argparse import Namespace from pathlib import Path SPEC = importlib.util.spec_from_file_location( "audit_core_e2_runner", Path("runners/audit_core_e2.py") ) runner = importlib.util.module_from_spec(SPEC) assert SPEC.loader is not None SPEC.loader.exec_module(runner) def test_equivalent_denial_includes_digest(): base = { "status": 404, "content_type": "application/json", "count": 1, "schema": ["$", "$.error:str"], "run_digest": "same", } assert runner.equivalent(base, dict(base)) changed = dict(base, run_digest="different") assert not runner.equivalent(base, changed) def test_event_is_synthetic_and_correlation_bound(): payload = runner.event("event-a", "tenant-a", "corr", "2026-08-21T23:00:00Z") assert payload["id"] == payload["data"]["fixture_id"] assert payload["tenant"] == "tenant-a" assert payload["correlation_id"] == "corr" assert payload["occurred_at"] == "2026-08-21T23:00:00Z" def test_p95_is_conservative_for_small_runs(): assert runner._p95([10, 20, 30]) == 30 def test_post_headers_bind_idempotency_key_to_event_id(): headers = runner.request_headers( "secret-not-rendered", "eng-1", "corr-1", {"id": "event-1"} ) assert headers["Idempotency-Key"] == "event-1" assert headers["User-Agent"] == "whitehat-security/eng-1" def test_get_headers_have_no_idempotency_key(): headers = runner.request_headers("secret", "eng-1", "corr-1", None) assert "Idempotency-Key" not in headers def test_invocation_fixture_set_is_declared_by_current_engagement(): engagement = json.loads( Path("engagements/2026-08-22-audit-core-e2.json").read_text() ) args = Namespace( tenant_a="tenant:trial:whitehat-a-20260822", tenant_b="tenant:trial:whitehat-b-20260822", event_a="whitehat-e2-event-a-20260822", event_b="whitehat-e2-event-b-20260822", absent_event="whitehat-e2-absent-20260822", forged_event="whitehat-e2-forged-b-20260822", correlation="whitehat-e2-correlation-20260822", ) assert runner.invocation_fixture_ids(args) <= set(engagement["fixture_ids"]) def test_retry_invocation_fixture_set_is_declared_and_distinct(): previous = json.loads( Path("engagements/2026-08-22-audit-core-e2.json").read_text() ) engagement = json.loads( Path("engagements/2026-08-22-audit-core-e2-02.json").read_text() ) args = Namespace( tenant_a="tenant:trial:whitehat-a-20260822-02", tenant_b="tenant:trial:whitehat-b-20260822-02", event_a="whitehat-e2-event-a-20260822-02", event_b="whitehat-e2-event-b-20260822-02", absent_event="whitehat-e2-absent-20260822-02", forged_event="whitehat-e2-forged-b-20260822-02", correlation="whitehat-e2-correlation-20260822-02", ) fixtures = runner.invocation_fixture_ids(args) assert fixtures <= set(engagement["fixture_ids"]) assert fixtures.isdisjoint(previous["fixture_ids"]) assert engagement["engagement_id"] != previous["engagement_id"] def test_report_uses_supplied_authorization_id(): args = Namespace( engagement_id="WH-ENG-EXAMPLE", authorization_id="operator-session-example", target_revision="sha256:" + "a" * 64, ) report = runner.build_report( args, started="2026-08-22T22:00:00Z", outcome="pass", attempted_operations=9, results=[], limitations=[], ) assert report["authorization_id"] == "operator-session-example" assert report["engagement_id"] == "WH-ENG-EXAMPLE" assert report["attempted_operations"] == 9 def test_third_attempt_fixtures_are_new_and_complete(): previous = json.loads( Path("engagements/2026-08-22-audit-core-e2-02.json").read_text() ) engagement = json.loads( Path("engagements/2026-08-22-audit-core-e2-03.json").read_text() ) args = Namespace( tenant_a="tenant:trial:whitehat-a-20260822-03", tenant_b="tenant:trial:whitehat-b-20260822-03", event_a="whitehat-e2-event-a-20260822-03", event_b="whitehat-e2-event-b-20260822-03", absent_event="whitehat-e2-absent-20260822-03", forged_event="whitehat-e2-forged-b-20260822-03", correlation="whitehat-e2-correlation-20260822-03", ) fixtures = runner.invocation_fixture_ids(args) assert fixtures <= set(engagement["fixture_ids"]) assert fixtures.isdisjoint(previous["fixture_ids"]) assert engagement["engagement_id"] != previous["engagement_id"]