Skip to content

Commit b959ff0

Browse files
Passing tests for utils/db.py helpers
1 parent f99af68 commit b959ff0

File tree

3 files changed

+187
-1
lines changed

3 files changed

+187
-1
lines changed

tests/conftest.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from sqlmodel import create_engine, Session, delete
44
from fastapi.testclient import TestClient
55
from utils.db import get_connection_url, set_up_db, tear_down_db, get_session
6-
from utils.models import User, PasswordResetToken
6+
from utils.models import User, PasswordResetToken, Organization
77
from utils.auth import get_password_hash, create_access_token, create_refresh_token
88
from main import app
99

@@ -107,3 +107,12 @@ def get_session_override():
107107

108108
yield client
109109
app.dependency_overrides.clear()
110+
111+
112+
@pytest.fixture
113+
def test_organization(session: Session):
114+
"""Create a test organization for use in tests"""
115+
organization = Organization(name="Test Organization")
116+
session.add(organization)
117+
session.commit()
118+
return organization

tests/test_db.py

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
from sqlmodel import Session, select
2+
from utils.db import (
3+
get_connection_url,
4+
assign_permissions_to_role,
5+
create_default_roles,
6+
create_permissions,
7+
)
8+
from utils.models import Role, Permission, Organization, RolePermissionLink, ValidPermissions
9+
10+
11+
def test_get_connection_url():
12+
"""Test that get_connection_url returns a valid URL object"""
13+
url = get_connection_url()
14+
assert url.drivername == "postgresql"
15+
assert url.database is not None
16+
17+
18+
def test_create_permissions(session: Session):
19+
"""Test that create_permissions creates all ValidPermissions"""
20+
# Clear existing permissions
21+
existing_permissions = session.exec(select(Permission)).all()
22+
for permission in existing_permissions:
23+
session.delete(permission)
24+
session.commit()
25+
26+
create_permissions(session)
27+
session.commit()
28+
29+
# Check all permissions were created
30+
db_permissions = session.exec(select(Permission)).all()
31+
assert len(db_permissions) == len(ValidPermissions)
32+
assert {p.name for p in db_permissions} == {p for p in ValidPermissions}
33+
34+
35+
def test_create_default_roles(session: Session, test_organization: Organization):
36+
"""Test that create_default_roles creates expected roles with correct permissions"""
37+
# Create permissions first
38+
create_permissions(session)
39+
session.commit()
40+
41+
# Create roles for test organization
42+
roles = create_default_roles(session, test_organization.id)
43+
session.commit()
44+
45+
# Verify roles were created
46+
assert len(roles) == 3 # Owner, Administrator, Member
47+
48+
# Check Owner role permissions
49+
owner_role = next(r for r in roles if r.name == "Owner")
50+
owner_permissions = session.exec(
51+
select(Permission)
52+
.join(RolePermissionLink)
53+
.where(RolePermissionLink.role_id == owner_role.id)
54+
).all()
55+
assert len(owner_permissions) == len(ValidPermissions)
56+
57+
# Check Administrator role permissions
58+
admin_role = next(r for r in roles if r.name == "Administrator")
59+
admin_permissions = session.exec(
60+
select(Permission)
61+
.join(RolePermissionLink)
62+
.where(RolePermissionLink.role_id == admin_role.id)
63+
).all()
64+
# Admin should have all permissions except DELETE_ORGANIZATION
65+
assert len(admin_permissions) == len(ValidPermissions) - 1
66+
assert ValidPermissions.DELETE_ORGANIZATION not in {
67+
p.name for p in admin_permissions}
68+
69+
70+
def test_assign_permissions_to_role(session: Session, test_organization: Organization):
71+
"""Test that assign_permissions_to_role correctly assigns permissions"""
72+
# Create a test role with the organization from fixture
73+
role = Role(name="Test Role", organization_id=test_organization.id)
74+
session.add(role)
75+
76+
# Create test permissions
77+
perm1 = Permission(name=ValidPermissions.CREATE_ROLE)
78+
perm2 = Permission(name=ValidPermissions.DELETE_ROLE)
79+
session.add(perm1)
80+
session.add(perm2)
81+
session.commit()
82+
83+
# Assign permissions
84+
permissions = [perm1, perm2]
85+
assign_permissions_to_role(session, role, permissions)
86+
session.commit()
87+
88+
# Verify assignments
89+
db_permissions = session.exec(
90+
select(Permission)
91+
.join(RolePermissionLink)
92+
.where(RolePermissionLink.role_id == role.id)
93+
).all()
94+
95+
assert len(db_permissions) == 2
96+
assert {p.name for p in db_permissions} == {
97+
ValidPermissions.CREATE_ROLE, ValidPermissions.DELETE_ROLE}
98+
99+
100+
def test_assign_permissions_to_role_duplicate_check(session: Session, test_organization: Organization):
101+
"""Test that assign_permissions_to_role doesn't create duplicates"""
102+
# Create a test role with the organization from fixture
103+
role = Role(name="Test Role", organization_id=test_organization.id)
104+
perm = Permission(name=ValidPermissions.CREATE_ROLE)
105+
session.add(role)
106+
session.add(perm)
107+
session.commit()
108+
109+
# Assign same permission twice
110+
assign_permissions_to_role(session, role, [perm], check_first=True)
111+
assign_permissions_to_role(session, role, [perm], check_first=True)
112+
session.commit()
113+
114+
# Verify only one assignment exists
115+
link_count = session.exec(
116+
select(RolePermissionLink)
117+
.where(
118+
RolePermissionLink.role_id == role.id,
119+
RolePermissionLink.permission_id == perm.id
120+
)
121+
).all()
122+
assert len(link_count) == 1

tests/test_models.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import pytest
2+
from sqlmodel import select, Session
3+
from utils.models import (
4+
Permission,
5+
Role,
6+
RolePermissionLink,
7+
Organization,
8+
ValidPermissions,
9+
)
10+
11+
12+
def test_permissions_persist_after_role_deletion(session: Session):
13+
"""
14+
Test that permissions are not deleted when a related Role is deleted.
15+
"""
16+
# Create an organization
17+
organization = Organization(name="Test Organization")
18+
session.add(organization)
19+
session.commit()
20+
session.refresh(organization)
21+
22+
# Create permissions
23+
permission1 = Permission(name=ValidPermissions.DELETE_ORGANIZATION)
24+
permission2 = Permission(name=ValidPermissions.EDIT_ORGANIZATION)
25+
session.add_all([permission1, permission2])
26+
session.commit()
27+
28+
# Create a role and link permissions
29+
role = Role(name="Test Role", organization_id=organization.id)
30+
session.add(role)
31+
session.commit()
32+
session.refresh(role)
33+
34+
role_permission_link1 = RolePermissionLink(
35+
role_id=role.id, permission_id=permission1.id
36+
)
37+
role_permission_link2 = RolePermissionLink(
38+
role_id=role.id, permission_id=permission2.id
39+
)
40+
session.add_all([role_permission_link1, role_permission_link2])
41+
session.commit()
42+
43+
# Delete the role
44+
session.delete(role)
45+
session.commit()
46+
47+
# Verify that permissions still exist
48+
remaining_permissions = session.exec(select(Permission)).all()
49+
assert len(remaining_permissions) == 2
50+
assert permission1 in remaining_permissions
51+
assert permission2 in remaining_permissions
52+
53+
# Verify that RolePermissionLinks are deleted
54+
remaining_role_permissions = session.exec(select(RolePermissionLink)).all()
55+
assert len(remaining_role_permissions) == 0

0 commit comments

Comments
 (0)