import os
import unittest


os.environ.setdefault("DATABASE_URL", "mysql+pymysql://test:test@127.0.0.1/documenta")
os.environ.setdefault("REDIS_URL", "redis://127.0.0.1:6379/0")
os.environ.setdefault("APP_ENCRYPTION_KEY", "test-encryption-key")
os.environ.setdefault("PII_HMAC_KEY", "test-pii-key")
os.environ.setdefault("ACCESS_TOKEN_HMAC_KEY", "test-access-key")

from pydantic import ValidationError

from app.api.persona_routes import ShareIn
from app.core.config import get_settings
from app.main import app


class H8PersonPortalContractTests(unittest.TestCase):
    def test_persona_routes_are_registered(self):
        paths = {route.path for route in app.routes}
        expected = {
            "/api/v1/personas",
            "/api/v1/personas/profile",
            "/api/v1/personas/requests",
            "/api/v1/personas/requests/{request_id}",
            "/api/v1/personas/payments",
            "/api/v1/personas/documents",
            "/api/v1/personas/documents/{request_id}/read",
            "/api/v1/personas/documents/{request_id}/accept",
            "/api/v1/personas/documents/{request_id}/download",
            "/api/v1/personas/documents/{request_id}/share",
            "/api/v1/personas/shares/{access_id}",
            "/api/v1/personas/notifications",
            "/api/v1/personas/notifications/{notification_id}/read",
            "/api/v1/personas/privacy",
        }
        self.assertTrue(expected.issubset(paths), expected - paths)

    def test_share_permission_is_normalized_and_restricted(self):
        self.assertEqual(
            ShareIn(email="persona@example.cl", permiso="aceptacion").permiso,
            "ACEPTACION",
        )
        with self.assertRaises(ValidationError):
            ShareIn(email="persona@example.cl", permiso="ADMIN")

    def test_personas_domain_is_trusted(self):
        settings = get_settings()
        self.assertIn("personas.documenta.cl", settings.hosts)
        self.assertIn("https://personas.documenta.cl", settings.origins)
        self.assertEqual(settings.session_cookie_domain, "")

if __name__ == "__main__":
    unittest.main()
