Files
govoplan-organizations/tests/test_settings_routes.py

114 lines
3.9 KiB
Python

from __future__ import annotations
import unittest
from types import SimpleNamespace
from sqlalchemy import create_engine
from sqlalchemy.orm import Session, sessionmaker
from govoplan_core.core.change_sequence import ChangeSequenceEntry
from govoplan_core.db.base import Base
from govoplan_organizations.backend.api.v1.routes import (
get_organization_settings,
update_organization_settings,
)
from govoplan_organizations.backend.api.v1.schemas import (
OrganizationSettingsUpdateRequest,
)
from govoplan_organizations.backend.db.models import OrganizationTenantSettings
class OrganizationSettingsRouteTests(unittest.TestCase):
def setUp(self) -> None:
self.engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(
self.engine,
tables=[
ChangeSequenceEntry.__table__,
OrganizationTenantSettings.__table__,
],
)
self.Session = sessionmaker(bind=self.engine, expire_on_commit=False)
self.session: Session = self.Session()
def tearDown(self) -> None:
self.session.close()
Base.metadata.drop_all(
self.engine,
tables=[
OrganizationTenantSettings.__table__,
ChangeSequenceEntry.__table__,
],
)
self.engine.dispose()
@staticmethod
def _principal(tenant_id: str) -> object:
return SimpleNamespace(tenant_id=tenant_id)
def test_missing_settings_row_returns_tenant_defaults(self) -> None:
result = get_organization_settings(
session=self.session,
principal=self._principal("tenant-1"),
)
self.assertEqual(result.tenant_id, "tenant-1")
self.assertTrue(result.allow_tenant_model_customization)
self.assertFalse(result.require_model_change_requests)
self.assertEqual(result.audit_detail_level, "standard")
self.assertIsNone(result.change_retention_days)
self.assertEqual(result.settings, {})
self.assertEqual(self.session.query(OrganizationTenantSettings).count(), 0)
def test_first_update_creates_only_the_active_tenant_settings(self) -> None:
result = update_organization_settings(
OrganizationSettingsUpdateRequest(
allow_tenant_model_customization=False,
require_model_change_requests=True,
audit_detail_level="full",
change_retention_days=365,
settings={"template": {"id": "municipality", "version": "2"}},
),
session=self.session,
principal=self._principal("tenant-1"),
)
self.assertEqual(result.tenant_id, "tenant-1")
self.assertFalse(result.allow_tenant_model_customization)
self.assertTrue(result.require_model_change_requests)
self.assertEqual(result.change_retention_days, 365)
self.assertEqual(
result.settings,
{"template": {"id": "municipality", "version": "2"}},
)
self.assertIsNone(
self.session.query(OrganizationTenantSettings)
.filter(OrganizationTenantSettings.tenant_id == "tenant-2")
.one_or_none()
)
def test_settings_reads_are_tenant_isolated(self) -> None:
self.session.add(
OrganizationTenantSettings(
tenant_id="tenant-1",
allow_tenant_model_customization=False,
require_model_change_requests=True,
audit_detail_level="detailed",
settings={"private": "tenant-1"},
)
)
self.session.commit()
other = get_organization_settings(
session=self.session,
principal=self._principal("tenant-2"),
)
self.assertEqual(other.tenant_id, "tenant-2")
self.assertTrue(other.allow_tenant_model_customization)
self.assertEqual(other.settings, {})
if __name__ == "__main__":
unittest.main()