from dataclasses import replace import json import os from pathlib import Path import time import pytest from informed_decision.disposition import Verb from informed_decision.policy import build_request from informed_decision.runtime import AuditPump from informed_decision.web import SESSION_COOKIE from test_browser_auth import call, signing_key from test_approval_component import component from test_review_controller import review, opened from test_durable_component import receiver from review_components import flex_component @pytest.fixture def pdp(tmp_path,signing_key): binary=os.environ.get('INFD_FLEX_AUTH_BINARY') if not binary:pytest.skip('set INFD_FLEX_AUTH_BINARY to test the actual evaluator and caller boundary') assert Path(binary).is_file() with flex_component(binary,tmp_path,signing_key) as value:yield value def test_actual_pdp_enrichment_and_workload_caller_boundary(pdp,review): client,calls=pdp;controller,session,_,memo,*_=review request=build_request(session,memo,'read',client.version) observation=client.check(request);assert observation.outcome=='allow',observation decision=json.loads(observation.decision_json) assert decision['binding']['request_digest']!=decision['binding']['submitted_request_digest'] assert calls[-1]=={'known':True,'audiences':['flex-auth']} client.token_provider=lambda:'synthetic-wrong-caller' assert client.check(request).outcome=='caller_refused' client.token_provider=lambda:session.access_token assert client.check(request).outcome=='caller_refused' # Browser JWT is never a workload credential. def test_actual_request_digest_handles_go_string_escaping(pdp,review): client,_=pdp;_,session,_,memo,*_=review session=replace(session,roles=('Reviewer & ΓΌ \u2028 \u2029',)) observation=client.check(build_request(session,memo,'read',client.version)) assert observation.outcome=='allow',observation def test_actual_policy_engine_and_independent_audit_receive_browser_act(pdp,review,receiver): controller,session,app,memo,engine,transport=review;controller.policy=pdp[0] page=opened(review);p=page.presentation controller.acknowledge(session,p.id,['h-1']) controller.act(session,p.id,Verb.ACCEPT,operation_id='real-component-click') assert len(engine.get('fixture').entries)==1 sink,receiver_transport,_=receiver pump=AuditPump(controller.store,sink);pump.tick();assert pump.ready() assert all(row['state']=='delivered' for row in controller.store.outbox()) observations=controller.store.policy_observations() assert len(observations)==3 and all(row['outcome']=='allow' and row['decision_attributable']==0 for row in observations) response=call(app,'/presentations/'+p.id,cookie=SESSION_COOKIE+'=fixture-session') assert 'Approval entry recorded.' in response['body'] event=controller.store.evidence()[0] status,body=receiver_transport.request('GET','https://audit.test/v1/events/'+event['id'],headers={'Authorization':'Bearer synthetic-auditor-token'}) assert status==200 and body['details']['data']['view_hash']==p.view_hash assert 'private-brief-sentinel' not in json.dumps(body) report=json.loads((controller.store.path.parent/'audit-reconciliation.json').read_text()) assert report['source_time_basis']=='occurred_at' and report['receiver_time_basis']=='accepted_at' assert not report['completeness_proven'] and not report['automatic_loss_finding'] def test_actual_policy_refusal_prevents_content_and_engine_read(pdp,review): controller,session,app,memo,engine,transport=review;controller.policy=pdp[0] controller.store.save_memo(replace(memo,id='not-assigned-in-fixture')) before=len(transport.calls) response=call(app,'/review',query='memo_id=not-assigned-in-fixture',cookie=SESSION_COOKIE+'=fixture-session') assert response['status']==403 and 'private-brief-sentinel' not in response['body'] assert len(transport.calls)==before and controller.store.evidence()==[]