import unittest

from sqlalchemy import JSON, create_engine
from sqlalchemy.orm import Session

from app.core.database import Base
from app.core.models import Tenant, User, UserRole


class UserPermissionsContractTests(unittest.TestCase):
    def test_user_model_supports_viewer_and_permission_overrides(self):
        self.assertEqual("viewer", UserRole.viewer.value)

        columns = User.__table__.c
        for column_name in (
            "allowed_permissions_json",
            "denied_permissions_json",
            "allowed_routes_json",
        ):
            column = columns[column_name]
            self.assertTrue(column.nullable)
            self.assertIsInstance(column.type, JSON)

    def test_permission_override_lists_track_in_place_mutations(self):
        engine = create_engine("sqlite:///:memory:")
        Base.metadata.create_all(engine, tables=[Tenant.__table__, User.__table__])

        with Session(engine) as session:
            session.add(Tenant(id=1, company_code="test", name="Test"))
            session.commit()
            user = User(
                tenant_id=1,
                username="viewer_contract",
                password_hash="hash",
                role=UserRole.viewer,
                allowed_permissions_json=["customers.read"],
                denied_permissions_json=["customers.write"],
                allowed_routes_json=["Dashboard"],
            )
            session.add(user)
            session.commit()

            user.allowed_permissions_json.append("invoices.read")
            user.denied_permissions_json.append("invoices.write")
            user.allowed_routes_json.append("Invoices")

            self.assertTrue(session.is_modified(user))


if __name__ == "__main__":
    unittest.main()
