Files
orion/tests/unit/models/database/test_team.py
Samir Boulahtit d7a0ff8818 refactor: complete module-driven architecture migration
This commit completes the migration to a fully module-driven architecture:

## Models Migration
- Moved all domain models from models/database/ to their respective modules:
  - tenancy: User, Admin, Vendor, Company, Platform, VendorDomain, etc.
  - cms: MediaFile, VendorTheme
  - messaging: Email, VendorEmailSettings, VendorEmailTemplate
  - core: AdminMenuConfig
- models/database/ now only contains Base and TimestampMixin (infrastructure)

## Schemas Migration
- Moved all domain schemas from models/schema/ to their respective modules:
  - tenancy: company, vendor, admin, team, vendor_domain
  - cms: media, image, vendor_theme
  - messaging: email
- models/schema/ now only contains base.py and auth.py (infrastructure)

## Routes Migration
- Moved admin routes from app/api/v1/admin/ to modules:
  - menu_config.py -> core module
  - modules.py -> tenancy module
  - module_config.py -> tenancy module
- app/api/v1/admin/ now only aggregates auto-discovered module routes

## Menu System
- Implemented module-driven menu system with MenuDiscoveryService
- Extended FrontendType enum: PLATFORM, ADMIN, VENDOR, STOREFRONT
- Added MenuItemDefinition and MenuSectionDefinition dataclasses
- Each module now defines its own menu items in definition.py
- MenuService integrates with MenuDiscoveryService for template rendering

## Documentation
- Updated docs/architecture/models-structure.md
- Updated docs/architecture/menu-management.md
- Updated architecture validation rules for new exceptions

## Architecture Validation
- Updated MOD-019 rule to allow base.py in models/schema/
- Created core module exceptions.py and schemas/ directory
- All validation errors resolved (only warnings remain)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 21:02:56 +01:00

183 lines
5.2 KiB
Python

# tests/unit/models/database/test_team.py
"""Unit tests for VendorUser and Role database models."""
import pytest
from app.modules.tenancy.models import Role, Vendor, VendorUser
@pytest.mark.unit
@pytest.mark.database
class TestRoleModel:
"""Test Role model."""
def test_role_creation(self, db, test_vendor):
"""Test Role model creation."""
role = Role(
vendor_id=test_vendor.id,
name="Manager",
permissions=["products.create", "orders.view"],
)
db.add(role)
db.commit()
db.refresh(role)
assert role.id is not None
assert role.vendor_id == test_vendor.id
assert role.name == "Manager"
assert "products.create" in role.permissions
assert "orders.view" in role.permissions
def test_role_default_permissions(self, db, test_vendor):
"""Test Role model with default empty permissions."""
role = Role(
vendor_id=test_vendor.id,
name="Viewer",
)
db.add(role)
db.commit()
db.refresh(role)
assert role.permissions == [] or role.permissions is None
def test_role_vendor_relationship(self, db, test_vendor):
"""Test Role-Vendor relationship."""
role = Role(
vendor_id=test_vendor.id,
name="Admin",
permissions=["*"],
)
db.add(role)
db.commit()
db.refresh(role)
assert role.vendor is not None
assert role.vendor.id == test_vendor.id
@pytest.mark.unit
@pytest.mark.database
class TestVendorUserModel:
"""Test VendorUser model."""
def test_vendor_user_creation(self, db, test_vendor, test_user):
"""Test VendorUser model for team management."""
# Create a role
role = Role(
vendor_id=test_vendor.id,
name="Manager",
permissions=["products.create", "orders.view"],
)
db.add(role)
db.commit()
# Create vendor user
vendor_user = VendorUser(
vendor_id=test_vendor.id,
user_id=test_user.id,
role_id=role.id,
is_active=True,
)
db.add(vendor_user)
db.commit()
db.refresh(vendor_user)
assert vendor_user.id is not None
assert vendor_user.vendor_id == test_vendor.id
assert vendor_user.user_id == test_user.id
assert vendor_user.role.name == "Manager"
assert "products.create" in vendor_user.role.permissions
def test_vendor_user_multiple_vendors(
self, db, test_vendor, test_user, other_company
):
"""Test same user can be added to multiple vendors."""
# Create another vendor
other_vendor = Vendor(
company_id=other_company.id,
vendor_code="OTHER_VENDOR",
subdomain="othervendor",
name="Other Vendor",
)
db.add(other_vendor)
db.commit()
role1 = Role(
vendor_id=test_vendor.id,
name="Editor1",
permissions=["products.view"],
)
role2 = Role(
vendor_id=other_vendor.id,
name="Editor2",
permissions=["products.view"],
)
db.add_all([role1, role2])
db.commit()
# Same user can be added to different vendors
vendor_user1 = VendorUser(
vendor_id=test_vendor.id,
user_id=test_user.id,
role_id=role1.id,
)
vendor_user2 = VendorUser(
vendor_id=other_vendor.id,
user_id=test_user.id,
role_id=role2.id,
)
db.add_all([vendor_user1, vendor_user2])
db.commit()
assert vendor_user1.vendor_id != vendor_user2.vendor_id
assert vendor_user1.user_id == vendor_user2.user_id
def test_vendor_user_relationships(self, db, test_vendor, test_user):
"""Test VendorUser relationships."""
role = Role(
vendor_id=test_vendor.id,
name="Staff",
permissions=["orders.view"],
)
db.add(role)
db.commit()
vendor_user = VendorUser(
vendor_id=test_vendor.id,
user_id=test_user.id,
role_id=role.id,
is_active=True,
)
db.add(vendor_user)
db.commit()
db.refresh(vendor_user)
assert vendor_user.vendor is not None
assert vendor_user.user is not None
assert vendor_user.role is not None
assert vendor_user.vendor.vendor_code == test_vendor.vendor_code
assert vendor_user.user.email == test_user.email
def test_vendor_user_with_active_flag(self, db, test_vendor, test_user):
"""Test VendorUser is_active field."""
role = Role(
vendor_id=test_vendor.id,
name="Default",
permissions=[],
)
db.add(role)
db.commit()
# Create with explicit is_active=True
vendor_user = VendorUser(
vendor_id=test_vendor.id,
user_id=test_user.id,
role_id=role.id,
is_active=True,
)
db.add(vendor_user)
db.commit()
db.refresh(vendor_user)
assert vendor_user.is_active is True