2026-07-27 22:45:42 +02:00
|
|
|
import unittest
|
|
|
|
|
|
|
|
|
|
from user_engine.adapters import VerifiedIdentityClaimsAdapter
|
|
|
|
|
from user_engine.errors import ValidationError
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VerifiedIdentityClaimsAdapterTests(unittest.TestCase):
|
|
|
|
|
def setUp(self):
|
|
|
|
|
self.adapter = VerifiedIdentityClaimsAdapter(
|
|
|
|
|
expected_issuer="https://kc.example",
|
|
|
|
|
expected_audience="user-engine",
|
|
|
|
|
)
|
|
|
|
|
self.claims = {
|
|
|
|
|
"iss": "https://kc.example/",
|
|
|
|
|
"sub": "person-1",
|
|
|
|
|
"aud": ["user-engine"],
|
|
|
|
|
"tenant": "tenant:friendly:binky",
|
|
|
|
|
"principal_type": "human",
|
|
|
|
|
"roles": ["tenant-admin"],
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def test_normalizes_verified_claims(self):
|
|
|
|
|
actor = self.adapter.normalize(self.claims)
|
|
|
|
|
self.assertEqual("person-1", actor.subject)
|
|
|
|
|
self.assertEqual(("tenant-admin",), actor.roles)
|
2026-08-19 09:51:08 +02:00
|
|
|
self.assertEqual((), actor.tenant_roles)
|
|
|
|
|
|
|
|
|
|
def test_optional_tenant_roles_are_preserved_without_local_authorization(self):
|
|
|
|
|
actor = self.adapter.normalize({**self.claims, "tenant_roles": ["CUS", "VEN"]})
|
|
|
|
|
self.assertEqual(("CUS", "VEN"), actor.tenant_roles)
|
|
|
|
|
self.assertEqual(("tenant-admin",), actor.roles)
|
2026-07-27 22:45:42 +02:00
|
|
|
|
|
|
|
|
def test_rejects_wrong_issuer_and_audience(self):
|
|
|
|
|
with self.assertRaises(ValidationError):
|
|
|
|
|
self.adapter.normalize({**self.claims, "iss": "https://evil.example"})
|
|
|
|
|
with self.assertRaises(ValidationError):
|
|
|
|
|
self.adapter.normalize({**self.claims, "aud": ["other"]})
|