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.editorial_routes import ArticleIn, ContentBlock, TransitionIn, _slug
from app.main import app


class H10EditorialContractTests(unittest.TestCase):
    def test_public_and_admin_routes_are_registered(self):
        paths = {route.path for route in app.routes}
        expected = {
            "/api/v1/portal/editorial/categories",
            "/api/v1/portal/editorial/{tipo}",
            "/api/v1/portal/editorial/{tipo}/item/{slug}",
            "/api/v1/portal/editorial/media/{media_uuid}",
            "/api/v1/panel/admin/editorial",
            "/api/v1/panel/admin/editorial/articles",
            "/api/v1/panel/admin/editorial/articles/{article_id}",
            "/api/v1/panel/admin/editorial/articles/{article_id}/transition",
            "/api/v1/panel/admin/editorial/media",
        }
        self.assertTrue(expected.issubset(paths), expected - paths)

    def test_slug_normalizes_chilean_spanish(self):
        self.assertEqual(_slug("  Inscripción y Posesión Efectiva  "), "inscripcion-y-posesion-efectiva")

    def test_content_blocks_are_allowlisted(self):
        self.assertEqual(ContentBlock(tipo="parrafo", texto="Contenido").tipo, "PARRAFO")
        with self.assertRaises(ValidationError):
            ContentBlock(tipo="HTML", texto="<script>alert(1)</script>")

    def test_article_requires_valid_taxonomy_and_seo(self):
        article = ArticleIn(
            tipo="AYUDA", categoria_id=1, titulo="Cómo iniciar una solicitud",
            bajada="Una explicación clara para iniciar una solicitud.",
            contenido=[{"tipo": "PARRAFO", "texto": "Primero selecciona el servicio."}],
            meta_titulo="Cómo iniciar una solicitud en Documenta",
            meta_descripcion="Conoce los pasos necesarios para iniciar una solicitud en Documenta.",
        )
        self.assertEqual(article.tipo, "AYUDA")
        with self.assertRaises(ValidationError):
            TransitionIn(accion="BORRAR")


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