"""robots.txt and sitemap.xml. The load-bearing property is that crawlers are kept OFF the interactive routes. /seance provisions a guest account on arrival (the open door), so a crawler wandering in would create real user rows for visitors who never existed — these tests pin that it stays disallowed and unlisted. """ import xml.etree.ElementTree as ET import pytest from app.routes.seo import DISALLOWED SITEMAP_NS = {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"} @pytest.mark.asyncio async def test_robots_is_plain_text_and_not_the_spa(client): response = await client.get("/robots.txt") assert response.status_code == 200 assert response.headers["content-type"].startswith("text/plain") # If the SPA catch-all had won the route we'd get HTML instead. assert "