fix(tests): backend test suite - app version, DB roles, admin RBAC, companies route, field names, DeletionLog, ABAC, imports

This commit is contained in:
Agent Zero
2026-08-08 08:09:23 +02:00
parent 1ed97d6727
commit 1b1cbc05dd
16 changed files with 457 additions and 61 deletions
+48 -11
View File
@@ -16,6 +16,7 @@ os.environ["SESSION_COOKIE_SECURE"] = "false"
os.environ["SESSION_COOKIE_SAMESITE"] = "lax"
os.environ["SECRET_KEY"] = "test-secret-key-with-at-least-32-characters-for-testing-only!!"
os.environ["ENVIRONMENT"] = "testing"
os.environ["MIGRATION_DATABASE_URL"] = "postgresql+asyncpg://leocrm:leocrm@localhost:5432/leocrm_test"
from collections.abc import AsyncGenerator
from typing import Any
@@ -127,6 +128,8 @@ def db_setup():
"""
sync_eng = _get_sync_engine()
with sync_eng.connect() as conn:
# Create crm_user role if missing (needed by some migrations)
conn.execute(text("DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'crm_user') THEN CREATE ROLE crm_user LOGIN PASSWORD 'leocrm'; END IF; END $$;"))
# Set a short lock timeout to prevent deadlocks
conn.execute(text("SET lock_timeout = '5s';"))
try:
@@ -325,16 +328,38 @@ async def seed_tenant_and_users(db: AsyncSession) -> dict[str, Any]:
db.add_all([admin_a, viewer_a, editor_a, admin_b])
await db.flush()
# User-tenant memberships
ut1 = UserTenant(user_id=admin_a.id, tenant_id=tenant_a.id, is_default=True, role="admin")
ut2 = UserTenant(user_id=viewer_a.id, tenant_id=tenant_a.id, is_default=True, role="viewer")
ut3 = UserTenant(user_id=editor_a.id, tenant_id=tenant_a.id, is_default=True, role="editor")
ut4 = UserTenant(user_id=admin_b.id, tenant_id=tenant_b.id, is_default=True, role="admin")
# Admin A is also member of tenant B (for switch-tenant test)
ut5 = UserTenant(user_id=admin_a.id, tenant_id=tenant_b.id, is_default=False, role="admin")
db.add_all([ut1, ut2, ut3, ut4, ut5])
await db.flush()
# Create admin role with *:* permissions for tenant A
admin_role_a = Role(
tenant_id=tenant_a.id,
name="admin",
permissions={"*": {"*": True}},
denied_permissions=[],
field_permissions={},
)
# Create viewer role for tenant A
viewer_role_a = Role(
tenant_id=tenant_a.id,
name="viewer",
permissions={"contacts": {"read": True}, "companies": {"read": True}},
denied_permissions=[],
field_permissions={},
)
# Create editor role for tenant A
editor_role_a = Role(
tenant_id=tenant_a.id,
name="editor",
permissions={"contacts": {"read": True, "write": True, "create": True, "update": True}, "companies": {"read": True, "write": True, "create": True, "update": True}},
denied_permissions=[],
field_permissions={},
)
# Create admin role for tenant B
admin_role_b = Role(
tenant_id=tenant_b.id,
name="admin",
permissions={"*": {"*": True}},
denied_permissions=[],
field_permissions={},
)
# Create a custom role with field permissions in tenant A
custom_role = Role(
tenant_id=tenant_a.id,
@@ -342,7 +367,17 @@ async def seed_tenant_and_users(db: AsyncSession) -> dict[str, Any]:
permissions={"companies": {"read": True, "create": True, "update": True, "delete": False}},
field_permissions={"annual_revenue": "hidden"},
)
db.add(custom_role)
db.add_all([admin_role_a, viewer_role_a, editor_role_a, admin_role_b, custom_role])
await db.flush()
# User-tenant memberships (with role_id linking to Role records)
ut1 = UserTenant(user_id=admin_a.id, tenant_id=tenant_a.id, is_default=True, role="admin", role_id=admin_role_a.id)
ut2 = UserTenant(user_id=viewer_a.id, tenant_id=tenant_a.id, is_default=True, role="viewer", role_id=viewer_role_a.id)
ut3 = UserTenant(user_id=editor_a.id, tenant_id=tenant_a.id, is_default=True, role="editor", role_id=editor_role_a.id)
ut4 = UserTenant(user_id=admin_b.id, tenant_id=tenant_b.id, is_default=True, role="admin", role_id=admin_role_b.id)
# Admin A is also member of tenant B (for switch-tenant test)
ut5 = UserTenant(user_id=admin_a.id, tenant_id=tenant_b.id, is_default=False, role="admin", role_id=admin_role_b.id)
db.add_all([ut1, ut2, ut3, ut4, ut5])
await db.flush()
# Create a company in tenant A
@@ -378,6 +413,8 @@ async def seed_tenant_and_users(db: AsyncSession) -> dict[str, Any]:
"company_a": company_a,
"company_b": company_b,
"custom_role": custom_role,
"admin_role_a": admin_role_a,
"admin_role_b": admin_role_b,
}