11"""Tests for RBAC authorization logic."""
22
33from datetime import datetime , timedelta , timezone
4+ import uuid
45
56import pytest
67from sqlalchemy .ext .asyncio import AsyncSession
@@ -1279,12 +1280,21 @@ class TestAuthContext:
12791280
12801281 async def test_auth_context_from_user_direct_assignments_only (
12811282 self ,
1282- default_user : User ,
12831283 session : AsyncSession ,
12841284 ):
12851285 """AuthContext includes user's direct role assignments."""
1286+ # Create a fresh user with no pre-existing assignments
1287+ suffix = uuid .uuid4 ().hex [:8 ]
1288+ fresh_user = User (
1289+ username = f"authctx_user_{ suffix } " ,
1290+ email = f"authctx_{ suffix } @example.com" ,
1291+ oauth_provider = "basic" ,
1292+ )
1293+ session .add (fresh_user )
1294+ await session .flush ()
1295+
12861296 # Create role and assign to user
1287- role = Role (name = "test-role" , created_by_id = default_user .id )
1297+ role = Role (name = f "test-role- { suffix } " , created_by_id = fresh_user .id )
12881298 session .add (role )
12891299 await session .flush ()
12901300
@@ -1297,33 +1307,45 @@ async def test_auth_context_from_user_direct_assignments_only(
12971307 session .add (scope )
12981308
12991309 assignment = RoleAssignment (
1300- principal_id = default_user .id ,
1310+ principal_id = fresh_user .id ,
13011311 role_id = role .id ,
1302- granted_by_id = default_user .id ,
1312+ granted_by_id = fresh_user .id ,
13031313 )
13041314 session .add (assignment )
13051315 await session .commit ()
13061316
13071317 # Reload user with assignments
1308- user = await get_user (username = default_user .username , session = session )
1318+ user = await get_user (username = fresh_user .username , session = session )
13091319
13101320 # Build AuthContext
13111321 auth_context = await AuthContext .from_user (session , user )
13121322
13131323 assert auth_context .user_id == user .id
13141324 assert auth_context .username == user .username
13151325 assert len (auth_context .role_assignments ) == 1
1316- assert auth_context .role_assignments [0 ].role .name == "test-role"
1326+ assert auth_context .role_assignments [0 ].role .name == f "test-role- { suffix } "
13171327
13181328 async def test_auth_context_includes_group_assignments (
13191329 self ,
1320- default_user : User ,
13211330 session : AsyncSession ,
13221331 ):
13231332 """AuthContext flattens user's + groups' assignments."""
1333+ import uuid
1334+
1335+ suffix = uuid .uuid4 ().hex [:8 ]
1336+
1337+ # Create a fresh user with no pre-existing assignments
1338+ fresh_user = User (
1339+ username = f"authctx_grp_user_{ suffix } " ,
1340+ email = f"authctx_grp_{ suffix } @example.com" ,
1341+ oauth_provider = "basic" ,
1342+ )
1343+ session .add (fresh_user )
1344+ await session .flush ()
1345+
13241346 # Create a group
13251347 group = User (
1326- username = "finance-team" ,
1348+ username = f "finance-team- { suffix } " ,
13271349 kind = PrincipalKind .GROUP ,
13281350 oauth_provider = "basic" ,
13291351 )
@@ -1333,12 +1355,12 @@ async def test_auth_context_includes_group_assignments(
13331355 # Add user to group
13341356 membership = GroupMember (
13351357 group_id = group .id ,
1336- member_id = default_user .id ,
1358+ member_id = fresh_user .id ,
13371359 )
13381360 session .add (membership )
13391361
13401362 # Create role for user (direct)
1341- user_role = Role (name = "user-role" , created_by_id = default_user .id )
1363+ user_role = Role (name = f "user-role- { suffix } " , created_by_id = fresh_user .id )
13421364 session .add (user_role )
13431365 await session .flush ()
13441366
@@ -1351,14 +1373,14 @@ async def test_auth_context_includes_group_assignments(
13511373 session .add (user_scope )
13521374
13531375 user_assignment = RoleAssignment (
1354- principal_id = default_user .id ,
1376+ principal_id = fresh_user .id ,
13551377 role_id = user_role .id ,
1356- granted_by_id = default_user .id ,
1378+ granted_by_id = fresh_user .id ,
13571379 )
13581380 session .add (user_assignment )
13591381
13601382 # Create role for group
1361- group_role = Role (name = "group-role" , created_by_id = default_user .id )
1383+ group_role = Role (name = f "group-role- { suffix } " , created_by_id = fresh_user .id )
13621384 session .add (group_role )
13631385 await session .flush ()
13641386
@@ -1373,13 +1395,13 @@ async def test_auth_context_includes_group_assignments(
13731395 group_assignment = RoleAssignment (
13741396 principal_id = group .id ,
13751397 role_id = group_role .id ,
1376- granted_by_id = default_user .id ,
1398+ granted_by_id = fresh_user .id ,
13771399 )
13781400 session .add (group_assignment )
13791401 await session .commit ()
13801402
13811403 # Reload user
1382- user = await get_user (username = default_user .username , session = session )
1404+ user = await get_user (username = fresh_user .username , session = session )
13831405
13841406 # Build AuthContext (should include both)
13851407 auth_context = await AuthContext .from_user (session , user )
@@ -1388,36 +1410,49 @@ async def test_auth_context_includes_group_assignments(
13881410 assert len (auth_context .role_assignments ) == 2 # User's + group's
13891411
13901412 role_names = {a .role .name for a in auth_context .role_assignments }
1391- assert role_names == {"user-role" , "group-role" }
1413+ assert f"user-role-{ suffix } " in role_names
1414+ assert f"group-role-{ suffix } " in role_names
13921415
13931416 async def test_auth_context_with_multiple_groups (
13941417 self ,
1395- default_user : User ,
13961418 session : AsyncSession ,
13971419 ):
13981420 """User in multiple groups gets all group assignments."""
1421+ import uuid
1422+
1423+ suffix = uuid .uuid4 ().hex [:8 ]
1424+
1425+ # Create a fresh user with no pre-existing assignments
1426+ fresh_user = User (
1427+ username = f"authctx_multi_grp_{ suffix } " ,
1428+ email = f"authctx_multi_grp_{ suffix } @example.com" ,
1429+ oauth_provider = "basic" ,
1430+ )
1431+ session .add (fresh_user )
1432+ await session .flush ()
1433+
13991434 # Create two groups
14001435 group1 = User (
1401- username = "finance-team" ,
1436+ username = f "finance-team- { suffix } " ,
14021437 kind = PrincipalKind .GROUP ,
14031438 oauth_provider = "basic" ,
14041439 )
14051440 group2 = User (
1406- username = "data-eng-team" ,
1441+ username = f "data-eng-team- { suffix } " ,
14071442 kind = PrincipalKind .GROUP ,
14081443 oauth_provider = "basic" ,
14091444 )
14101445 session .add_all ([group1 , group2 ])
14111446 await session .flush ()
14121447
14131448 # Add user to both groups
1414- membership1 = GroupMember (group_id = group1 .id , member_id = default_user .id )
1415- membership2 = GroupMember (group_id = group2 .id , member_id = default_user .id )
1449+ membership1 = GroupMember (group_id = group1 .id , member_id = fresh_user .id )
1450+ membership2 = GroupMember (group_id = group2 .id , member_id = fresh_user .id )
14161451 session .add_all ([membership1 , membership2 ])
14171452
14181453 # Give each group a role
1419- role1 = Role (name = "finance-role" , created_by_id = default_user .id )
1420- role2 = Role (name = "data-eng-role" , created_by_id = default_user .id )
1454+ role1 = Role (name = f "finance-role- { suffix } " , created_by_id = fresh_user .id )
1455+ role2 = Role (name = f "data-eng-role- { suffix } " , created_by_id = fresh_user .id )
14211456 session .add_all ([role1 , role2 ])
14221457 await session .flush ()
14231458
@@ -1438,26 +1473,27 @@ async def test_auth_context_with_multiple_groups(
14381473 assignment1 = RoleAssignment (
14391474 principal_id = group1 .id ,
14401475 role_id = role1 .id ,
1441- granted_by_id = default_user .id ,
1476+ granted_by_id = fresh_user .id ,
14421477 )
14431478 assignment2 = RoleAssignment (
14441479 principal_id = group2 .id ,
14451480 role_id = role2 .id ,
1446- granted_by_id = default_user .id ,
1481+ granted_by_id = fresh_user .id ,
14471482 )
14481483 session .add_all ([assignment1 , assignment2 ])
14491484 await session .commit ()
14501485
14511486 # Reload user
1452- user = await get_user (username = default_user .username , session = session )
1487+ user = await get_user (username = fresh_user .username , session = session )
14531488
14541489 # Build AuthContext
14551490 auth_context = await AuthContext .from_user (session , user )
14561491
14571492 # Should have assignments from both groups
14581493 assert len (auth_context .role_assignments ) == 2
14591494 role_names = {a .role .name for a in auth_context .role_assignments }
1460- assert role_names == {"finance-role" , "data-eng-role" }
1495+ assert f"finance-role-{ suffix } " in role_names
1496+ assert f"data-eng-role-{ suffix } " in role_names
14611497
14621498
14631499@pytest .mark .asyncio
@@ -1707,12 +1743,24 @@ class TestGetEffectiveAssignments:
17071743
17081744 async def test_effective_assignments_user_only (
17091745 self ,
1710- default_user : User ,
17111746 session : AsyncSession ,
17121747 ):
17131748 """User with no groups gets only direct assignments."""
1749+ import uuid
1750+
1751+ suffix = uuid .uuid4 ().hex [:8 ]
1752+
1753+ # Create a fresh user with no pre-existing assignments
1754+ fresh_user = User (
1755+ username = f"eff_assign_user_{ suffix } " ,
1756+ email = f"eff_assign_{ suffix } @example.com" ,
1757+ oauth_provider = "basic" ,
1758+ )
1759+ session .add (fresh_user )
1760+ await session .flush ()
1761+
17141762 # Give user a direct assignment
1715- role = Role (name = "personal-role" , created_by_id = default_user .id )
1763+ role = Role (name = f "personal-role- { suffix } " , created_by_id = fresh_user .id )
17161764 session .add (role )
17171765 await session .flush ()
17181766
@@ -1725,20 +1773,20 @@ async def test_effective_assignments_user_only(
17251773 session .add (scope )
17261774
17271775 assignment = RoleAssignment (
1728- principal_id = default_user .id ,
1776+ principal_id = fresh_user .id ,
17291777 role_id = role .id ,
1730- granted_by_id = default_user .id ,
1778+ granted_by_id = fresh_user .id ,
17311779 )
17321780 session .add (assignment )
17331781 await session .commit ()
17341782
1735- user = await get_user (username = default_user .username , session = session )
1783+ user = await get_user (username = fresh_user .username , session = session )
17361784
17371785 # Get effective assignments
17381786 assignments = await AuthContext .get_effective_assignments (session , user )
17391787
17401788 assert len (assignments ) == 1
1741- assert assignments [0 ].role .name == "personal-role"
1789+ assert assignments [0 ].role .name == f "personal-role- { suffix } "
17421790
17431791 async def test_effective_assignments_with_postgres_groups (
17441792 self ,
0 commit comments