from types import SimpleNamespace import unittest from govoplan_core.core.principal_helpers import principal_actor_ids, principal_user_first_actor class PrincipalHelperTests(unittest.TestCase): def test_contracts_keep_their_distinct_precedence_and_whitespace(self) -> None: principal = SimpleNamespace(account_id=" account ", identity_id=" identity ", membership_id=" membership ", user=SimpleNamespace(id=" user ")) self.assertEqual((" account ", " identity ", " membership ", " user "), principal_actor_ids(principal)) self.assertEqual("user", principal_user_first_actor(principal)) self.assertEqual(" account ", principal.account_id) self.assertEqual(" user ", principal.user.id) def test_duplicate_ids_are_removed_in_stable_order_without_normalizing(self) -> None: principal = SimpleNamespace(account_id="same", identity_id=" same ", membership_id="same", user=SimpleNamespace(id="same")) self.assertEqual(("same", " same "), principal_actor_ids(principal)) self.assertEqual("same", principal_user_first_actor(principal)) def test_missing_blank_and_service_only_principals_remain_unattributed(self) -> None: for principal in ( object(), None, SimpleNamespace(), SimpleNamespace(service_account_id="service"), SimpleNamespace(account_id=0, identity_id=False, membership_id="\t", user=SimpleNamespace(id="\u00a0")), ): with self.subTest(principal=principal): self.assertEqual((), principal_actor_ids(principal)) self.assertIsNone(principal_user_first_actor(principal)) def test_fallback_and_existing_string_coercion_are_unchanged(self) -> None: for values, expected_ids, expected_actor in ( ({"account_id": 17, "identity_id": "identity"}, ("17", "identity"), "17"), ({"identity_id": " identity ", "membership_id": "member"}, (" identity ", "member"), "identity"), ({"membership_id": " member "}, (" member ",), "member"), ({"user": SimpleNamespace(id=" user ")}, (" user ",), "user"), ): with self.subTest(values=values): principal = SimpleNamespace(**values) self.assertEqual(expected_ids, principal_actor_ids(principal)) self.assertEqual(expected_actor, principal_user_first_actor(principal)) if __name__ == "__main__": unittest.main()