from __future__ import annotations import unittest from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from govoplan_access.backend.api.v1.admin_common import ( _accounts_by_user_id, _group_member_ids_by_group_id, _groups_by_user_id, _roles_by_group_id, _roles_by_user_id, _tenant_role_assignment_counts, ) from govoplan_access.backend.db.models import Account, Group, GroupRoleAssignment, Role, User, UserGroupMembership, UserRoleAssignment from govoplan_core.db.base import Base class AdminBatchHelperTests(unittest.TestCase): def setUp(self) -> None: self.engine = create_engine("sqlite:///:memory:") Base.metadata.create_all(bind=self.engine) self.Session = sessionmaker(bind=self.engine) def tearDown(self) -> None: Base.metadata.drop_all(bind=self.engine) def test_access_admin_batch_maps_related_rows(self) -> None: session = self.Session() account = Account(id="account-1", email="ada@example.test", normalized_email="ada@example.test") user = User(id="user-1", tenant_id="tenant-1", account_id=account.id, email=account.email) group = Group(id="group-1", tenant_id="tenant-1", slug="clerks", name="Clerks") role = Role(id="role-1", tenant_id="tenant-1", slug="reader", name="Reader", permissions=["admin:users:read"]) session.add_all([account, user, group, role]) session.flush() session.add(UserGroupMembership(tenant_id="tenant-1", user_id=user.id, group_id=group.id)) session.add(UserRoleAssignment(tenant_id="tenant-1", user_id=user.id, role_id=role.id)) session.add(GroupRoleAssignment(tenant_id="tenant-1", group_id=group.id, role_id=role.id)) session.commit() accounts_by_user = _accounts_by_user_id(session, [user.id]) group_member_ids = _group_member_ids_by_group_id(session, tenant_id="tenant-1", group_ids=[group.id]) groups_by_user = _groups_by_user_id(session, tenant_id="tenant-1", user_ids=[user.id]) roles_by_group = _roles_by_group_id(session, tenant_id="tenant-1", group_ids=[group.id]) roles_by_user = _roles_by_user_id(session, tenant_id="tenant-1", user_ids=[user.id]) role_counts = _tenant_role_assignment_counts(session, [role.id]) self.assertEqual(accounts_by_user[user.id].id, account.id) self.assertEqual(group_member_ids, {group.id: [user.id]}) self.assertEqual([item.id for item in groups_by_user[user.id]], [group.id]) self.assertEqual([item.id for item in roles_by_group[group.id]], [role.id]) self.assertEqual([item.id for item in roles_by_user[user.id]], [role.id]) self.assertEqual(role_counts, {role.id: (1, 1)}) if __name__ == "__main__": unittest.main()