railiance-platform/tests/test_factory_audit_delivery.py
codex 44314cad37
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
feat: deliver approved factory audit sender custody
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a07ff8-19d0-7820-b4d0-1353833cb7fc
2026-09-11 09:38:27 +02:00

70 lines
4.5 KiB
Python

"""Delivery refuses custody/projection drift before changing a live receiver."""
import base64
import copy
import json
from pathlib import Path
import subprocess
import sys
import tempfile
import unittest
from unittest.mock import patch
sys.path.insert(0,str(Path(__file__).resolve().parents[1]/'scripts'))
import factory_audit_delivery as delivery
class DeliveryContracts(unittest.TestCase):
def setUp(self):
self.lane=delivery.contracts()[0]
self.value='fixture_only_'+('x'*51)
self.raw={'metadata':{'version':1},'data':{'AUDIT_TOKEN':self.value,'CUSTODY_REQUEST':self.lane['ccr']}}
def test_version_one_exact_provenance_is_required(self):
self.assertEqual(delivery.custody_value(self.lane,self.raw),self.value)
for raw in [dict(self.raw,metadata={'version':2}),dict(self.raw,data=dict(self.raw['data'],CUSTODY_REQUEST='different-request')),dict(self.raw,data=dict(self.raw['data'],extra='unexpected'))]:
with self.assertRaisesRegex(delivery.LaneError,'custody_provenance_mismatch'):delivery.custody_value(self.lane,raw)
def test_bad_token_shape_never_appears_in_the_diagnostic(self):
raw=copy.deepcopy(self.raw);raw['data']['AUDIT_TOKEN']='sensitive fixture with spaces'
with self.assertRaisesRegex(delivery.LaneError,'^custody_token_shape$'):delivery.custody_value(self.lane,raw)
def test_projection_must_match_value_and_controller(self):
es={'metadata':{'uid':'expected-controller'}}
secret={'data':{self.lane['secret_key']:base64.b64encode(self.value.encode()).decode()},'metadata':{'ownerReferences':[{'uid':'expected-controller','controller':True}]}}
delivery.projection_matches(secret,es,self.lane,self.value)
with self.assertRaisesRegex(delivery.LaneError,'projection_value_mismatch'):delivery.projection_matches(secret,es,self.lane,'wrong-value')
secret['metadata']['ownerReferences'][0]['controller']=False
with self.assertRaisesRegex(delivery.LaneError,'projection_owner_mismatch'):delivery.projection_matches(secret,es,self.lane,self.value)
def test_manifest_byte_change_refuses_before_apply(self):
path,objects=delivery.guarded_manifest();self.assertEqual(len(objects),4)
with tempfile.TemporaryDirectory() as d:
target=Path(d)/'manifests';target.mkdir();(target/path.name).write_bytes(path.read_bytes()+b'\n')
with patch.object(delivery,'ROOT',Path(d)):
with self.assertRaisesRegex(delivery.LaneError,'reviewed_manifest_changed'):delivery.guarded_manifest()
def test_existing_projection_must_not_be_redirected(self):
_,objects=delivery.guarded_manifest();expected=objects[1];actual=copy.deepcopy(expected)
actual['spec']['secretStoreRef']['name']='unrelated-store'
def result(argv, **kwargs):return subprocess.CompletedProcess(argv,0,json.dumps(actual).encode(),b'')
with patch.object(delivery,'command',side_effect=result) as command:
with self.assertRaisesRegex(delivery.LaneError,'existing_projection_drift'):delivery.preflight_projection(['kubectl'],[expected])
self.assertTrue(all('apply' not in call.args[0] for call in command.call_args_list))
def test_presence_errors_are_not_treated_as_absence(self):
_,objects=delivery.guarded_manifest()
with patch.object(delivery,'command',return_value=subprocess.CompletedProcess([],1,b'',b'Forbidden')):
with self.assertRaisesRegex(delivery.LaneError,'projection_presence_unknown'):delivery.preflight_projection(['kubectl'],objects)
def test_unexpected_reader_grant_is_revoked_and_not_used(self):
lanes=delivery.contracts();lane=lanes[0]
def read(path):
if path.startswith('sys/policies'):return {'policy':lane['hcl']}
return {}
auth={'auth':{'client_token':'test-reader','token_policies':['root'],'lease_duration':900}}
with patch.object(delivery,'read_optional',side_effect=read),patch.object(delivery,'role_matches',return_value=True),patch.object(delivery,'command',return_value=subprocess.CompletedProcess([],0,b'fixture-jwt',b'')),patch.object(delivery,'bao',return_value=subprocess.CompletedProcess([],0,json.dumps(auth).encode(),b'')) as bao,patch.object(delivery,'revoke') as revoke:
with self.assertRaisesRegex(delivery.LaneError,'reader_scope_or_ttl_mismatch'):delivery.verify_readers(['kubectl'],lanes,{'lanes':[{} for x in lanes]},lambda:None)
revoke.assert_called_once_with('test-reader')
self.assertEqual(bao.call_count,1)
if __name__=='__main__':unittest.main()