Skip to content

Commit d991e35

Browse files
committed
Fix tests
1 parent 4900aef commit d991e35

4 files changed

Lines changed: 103 additions & 49 deletions

File tree

datajunction-server/tests/api/namespaces_test.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -969,13 +969,12 @@ async def test_create_namespace_auto_creates_owner_role(
969969
3. Assign the role to the creating user
970970
"""
971971
ns_name = unique_namespace("testrbacauto")
972-
child_ns = f"{ns_name}.autorole"
973972

974973
# Create a new namespace with a unique name
975-
response = await client.post(f"/namespaces/{child_ns}")
974+
response = await client.post(f"/namespaces/{ns_name}")
976975
assert response.status_code in (200, 201)
977976

978-
# Verify the owner role was created for the parent namespace
977+
# Verify the owner role was created for the namespace
979978
response = await client.get(f"/roles/{ns_name}-owner")
980979
assert response.status_code == 200
981980
role_data = response.json()
@@ -989,12 +988,6 @@ async def test_create_namespace_auto_creates_owner_role(
989988
assert scope["scope_type"] == "namespace"
990989
assert scope["scope_value"] == ns_name
991990

992-
# Verify the child namespace also got an owner role
993-
response = await client.get(f"/roles/{child_ns}-owner")
994-
assert response.status_code == 200
995-
child_role_data = response.json()
996-
assert child_role_data["name"] == f"{child_ns}-owner"
997-
998991
# Check the role is assigned to the creator
999992
response = await client.get(f"/roles/{ns_name}-owner/assignments")
1000993
assert response.status_code == 200

datajunction-server/tests/api/nodes_test.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6339,11 +6339,15 @@ def track_node(node_name: str):
63396339
"""Track a node's role for cleanup."""
63406340
created_roles.append(f"{node_name}-owner")
63416341

6342+
# Create a simple namespace object with the helper methods
63426343
class NamespaceHelper:
6343-
make = make_namespace
6344-
track_node = staticmethod(track_node)
6344+
pass
63456345

6346-
yield NamespaceHelper
6346+
helper = NamespaceHelper()
6347+
helper.make = make_namespace # type: ignore
6348+
helper.track_node = track_node # type: ignore
6349+
6350+
yield helper
63476351

63486352
# Cleanup after test
63496353
for ns in reversed(created_namespaces):

datajunction-server/tests/api/rbac_test.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,16 @@ async def test_create_role_duplicate_name(client_with_basic: AsyncClient):
9292
@pytest.mark.asyncio
9393
async def test_list_roles(client_with_basic: AsyncClient):
9494
"""Test listing roles."""
95+
import uuid
96+
97+
suffix = uuid.uuid4().hex[:8]
98+
test_role_names = [f"listroles_{suffix}_{i}" for i in range(3)]
99+
95100
# Create several roles
96-
for i in range(3):
101+
for name in test_role_names:
97102
await client_with_basic.post(
98103
"/roles/",
99-
json={"name": f"role-{i}", "description": f"Role {i}"},
104+
json={"name": name, "description": f"Test role {name}"},
100105
)
101106

102107
# List roles
@@ -105,9 +110,13 @@ async def test_list_roles(client_with_basic: AsyncClient):
105110
data = response.json()
106111
assert len(data) >= 3
107112

108-
# Check they're ordered by name
113+
# Check that our created roles are in the list
109114
names = [role["name"] for role in data]
110-
assert sorted(names) == names
115+
for test_name in test_role_names:
116+
assert test_name in names
117+
118+
# Check they're ordered by name (case-sensitive lexicographic sort)
119+
assert names == sorted(names)
111120

112121

113122
@pytest.mark.asyncio

datajunction-server/tests/internal/authorization_test.py

Lines changed: 81 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Tests for RBAC authorization logic."""
22

33
from datetime import datetime, timedelta, timezone
4+
import uuid
45

56
import pytest
67
from 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

Comments
 (0)