generated from coulomb/repo-seed
feat: add durable store record serialization
This commit is contained in:
93
tests/test_store_records.py
Normal file
93
tests/test_store_records.py
Normal file
@@ -0,0 +1,93 @@
|
||||
import json
|
||||
import unittest
|
||||
|
||||
from user_engine.adapters.local import InMemoryUserEngineStore
|
||||
from user_engine.migrations import USER_ENGINE_STORE_RECORD_TYPES
|
||||
from user_engine.store_records import (
|
||||
StoreRecord,
|
||||
domain_record_from_store_record,
|
||||
store_record_for,
|
||||
validate_store_record_codecs,
|
||||
)
|
||||
from user_engine.testing.store_conformance import (
|
||||
PROFILE_SECRET_VALUE,
|
||||
RAW_FACTOR_VALUE,
|
||||
TENANT,
|
||||
USER_ID,
|
||||
reference_store_records,
|
||||
)
|
||||
|
||||
|
||||
class StoreRecordSerializationTests(unittest.TestCase):
|
||||
def test_codecs_cover_migration_manifest_record_types(self):
|
||||
self.assertEqual(validate_store_record_codecs(), ())
|
||||
|
||||
def test_reference_records_round_trip_through_json_safe_payloads(self):
|
||||
store = InMemoryUserEngineStore()
|
||||
store.migrate()
|
||||
records = reference_store_records(store)
|
||||
expected_types = set(USER_ENGINE_STORE_RECORD_TYPES)
|
||||
|
||||
encoded_types = set()
|
||||
for value in records.values():
|
||||
record = store_record_for(value)
|
||||
encoded_types.add(record.record_type)
|
||||
json.dumps(record.payload)
|
||||
decoded = domain_record_from_store_record(
|
||||
StoreRecord(
|
||||
record_type=record.record_type,
|
||||
record_key=record.record_key,
|
||||
payload=json.loads(json.dumps(record.payload)),
|
||||
tenant=record.tenant,
|
||||
user_id=record.user_id,
|
||||
application_id=record.application_id,
|
||||
scope_type=record.scope_type,
|
||||
scope_id=record.scope_id,
|
||||
)
|
||||
)
|
||||
self.assertEqual(decoded, value)
|
||||
|
||||
self.assertEqual(encoded_types, expected_types)
|
||||
|
||||
def test_record_metadata_supports_provider_indexes(self):
|
||||
store = InMemoryUserEngineStore()
|
||||
store.migrate()
|
||||
records = reference_store_records(store)
|
||||
|
||||
tenant_account = store_record_for(records["tenant_account"])
|
||||
active_context = store_record_for(records["access_context"])
|
||||
profile_value = store_record_for(records["profile_value"])
|
||||
factor = store_record_for(records["factor"])
|
||||
|
||||
self.assertEqual(tenant_account.record_key, f'["{TENANT}","{USER_ID}"]')
|
||||
self.assertEqual(tenant_account.tenant, TENANT)
|
||||
self.assertEqual(tenant_account.user_id, USER_ID)
|
||||
self.assertEqual(active_context.tenant, TENANT)
|
||||
self.assertEqual(active_context.user_id, USER_ID)
|
||||
self.assertEqual(active_context.scope_type, "tenant")
|
||||
self.assertEqual(profile_value.scope_type, "global")
|
||||
self.assertEqual(factor.user_id, USER_ID)
|
||||
|
||||
def test_durable_payloads_are_raw_state_not_diagnostics(self):
|
||||
store = InMemoryUserEngineStore()
|
||||
store.migrate()
|
||||
records = reference_store_records(store)
|
||||
|
||||
factor = store_record_for(records["factor"])
|
||||
access_profile = store_record_for(records["access_profile"])
|
||||
|
||||
self.assertIn(RAW_FACTOR_VALUE, json.dumps(factor.payload))
|
||||
self.assertIn(PROFILE_SECRET_VALUE, json.dumps(access_profile.payload))
|
||||
|
||||
def test_unknown_record_type_fails_closed(self):
|
||||
with self.assertRaises(ValueError):
|
||||
domain_record_from_store_record(
|
||||
StoreRecord(record_type="unknown", record_key="1", payload={})
|
||||
)
|
||||
|
||||
with self.assertRaises(TypeError):
|
||||
store_record_for(object())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user