60 lines
2.5 KiB
Python
60 lines
2.5 KiB
Python
"""Local source-backed snapshot proof; no PostgreSQL/Docker imports or calls."""
|
|
import ast
|
|
import json
|
|
from pathlib import Path
|
|
import sys
|
|
import unittest
|
|
|
|
HERE = Path(__file__).resolve().parent
|
|
sys.path[:0] = [str(HERE.parent / 'postimage/identity-provisioner'), str(HERE)]
|
|
from test_service_groups import Directory, req
|
|
|
|
|
|
def snapshot_from(path):
|
|
source = ast.parse(path.read_text())
|
|
selected = [node for node in source.body if isinstance(node, ast.FunctionDef) and node.name in {'require', 'snapshot'}]
|
|
namespace = {}
|
|
exec(compile(ast.Module(body=selected, type_ignores=[]), str(path), 'exec'), namespace)
|
|
return namespace['snapshot']
|
|
|
|
|
|
class SnapshotTests(unittest.TestCase):
|
|
def test_frozen_fixture_changes_saved_prestate_and_keeps_deleted_backing_sets(self):
|
|
old = snapshot_from(HERE / 'revisions/r4/probe.py')
|
|
d = Directory()
|
|
before = old(d)
|
|
d.ensure_service_groups(req())
|
|
self.assertIn('forge-coulomb-owners', before['groups'])
|
|
d.revoke_service_groups(req(ensure_idempotency_key=req()['idempotency_key'],
|
|
ensure_correlation_id=req()['correlation_id'], delete_if_empty=True))
|
|
orphan_ids = set(d.members) - set(d.groups.values())
|
|
self.assertEqual({4, 5}, orphan_ids)
|
|
self.assertTrue(all(not d.members[gid] for gid in orphan_ids))
|
|
visible = {row['id'] for row in d._directory(d._login())[1]}
|
|
self.assertTrue(orphan_ids.isdisjoint(visible))
|
|
self.assertNotEqual(before, old(d))
|
|
d.storage.cleanup()
|
|
|
|
def test_snapshot_is_detached_and_complete_prestate_survives_ensure_revoke(self):
|
|
snapshot = snapshot_from(HERE / 'probe.py')
|
|
d = Directory()
|
|
d.members[3].add('tegwick')
|
|
before = snapshot(d)
|
|
frozen = json.dumps(before, sort_keys=True)
|
|
d.ensure_service_groups(req())
|
|
self.assertEqual(frozen, json.dumps(before, sort_keys=True))
|
|
self.assertNotEqual(before, snapshot(d))
|
|
d.revoke_service_groups(req(ensure_idempotency_key=req()['idempotency_key'],
|
|
ensure_correlation_id=req()['correlation_id'], delete_if_empty=True))
|
|
self.assertEqual(before, snapshot(d))
|
|
for mutate in (lambda: d.members[3].add('agent-codex'), lambda: d.members[4].add('agent-codex')):
|
|
mutate()
|
|
if d.members[4]:
|
|
with self.assertRaises(RuntimeError): snapshot(d)
|
|
else:
|
|
self.assertNotEqual(before, snapshot(d))
|
|
d.storage.cleanup()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|