50 lines
1.8 KiB
Python
50 lines
1.8 KiB
Python
"""Exercise actual production routes and assets without third-party dependencies."""
|
|
from html import unescape
|
|
import json
|
|
from pathlib import Path
|
|
import re
|
|
import sys
|
|
import urllib.error
|
|
import urllib.request
|
|
import xml.etree.ElementTree as ET
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
def verify(base: str) -> None:
|
|
def get(path: str) -> tuple[bytes, str]:
|
|
with urllib.request.urlopen(base.rstrip("/") + path, timeout=15) as response:
|
|
if response.status != 200:
|
|
raise RuntimeError(f"Unexpected status for {path}: {response.status}")
|
|
return response.read(), response.headers.get("Content-Type", "")
|
|
|
|
health, _ = get("/api/health")
|
|
assert json.loads(health) == {"status": "ok"}
|
|
home, _ = get("/")
|
|
assert b"TABULARIUM" in home
|
|
for file in sorted((ROOT / "content/docs").glob("*.md")):
|
|
page, _ = get(f"/docs/{file.stem}")
|
|
title = re.search(r"^# (.+)$", file.read_text(), re.M)
|
|
assert title is not None
|
|
text = unescape(re.sub(r"<[^>]+>", "", page.decode()))
|
|
assert title.group(1) in text, file.name
|
|
assets = set(re.findall(r'(?:src|href)="(/_next/static/[^" ]+)"', home.decode()))
|
|
assert assets, "No generated JavaScript/CSS assets found"
|
|
for asset in assets:
|
|
get(unescape(asset))
|
|
for file in sorted((ROOT / "apps/docs/public/figures").glob("*.svg")):
|
|
data, kind = get(f"/figures/{file.name}")
|
|
assert "image/svg+xml" in kind
|
|
assert ET.fromstring(data).tag.endswith("svg")
|
|
try:
|
|
get("/docs/this-document-does-not-exist")
|
|
except urllib.error.HTTPError as error:
|
|
assert error.code == 404
|
|
else:
|
|
raise RuntimeError("Unknown document did not return 404")
|
|
print(f"Smoke passed: {base} (health, documents, JS/CSS, SVG, 404)", flush=True)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
verify(sys.argv[1])
|