Vendor whynot-design Layer 1 (tokens, CSS) and Layer 2 (<wn-*> components) via scripts/sync-whynot-design.sh with a pinned ref. Migrate the observatory shell to canonical web components, keep observatory-specific layout in styles.css, and add vendor integrity tests plus correct JS MIME types on the dev server.
62 lines
No EOL
1.9 KiB
Python
62 lines
No EOL
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
import importlib
|
|
import threading
|
|
from http.server import HTTPServer
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent
|
|
VENDOR = ROOT / "ui" / "vendor" / "whynot-design"
|
|
|
|
REQUIRED_VENDOR_FILES = [
|
|
VENDOR / ".whynot-design-ref",
|
|
VENDOR / "colors_and_type.css",
|
|
VENDOR / "components.css",
|
|
VENDOR / "index.js",
|
|
VENDOR / "elements" / "atoms.js",
|
|
VENDOR / "elements" / "chrome.js",
|
|
VENDOR / "elements" / "form.js",
|
|
VENDOR / "elements" / "layout.js",
|
|
VENDOR / "elements" / "icons.js",
|
|
VENDOR / "elements" / "_styles.js",
|
|
VENDOR / "tokens" / "colors.json",
|
|
]
|
|
|
|
|
|
def test_vendor_tree_is_complete() -> None:
|
|
missing = [path for path in REQUIRED_VENDOR_FILES if not path.exists()]
|
|
assert not missing, f"Missing vendored whynot-design files: {missing}"
|
|
|
|
|
|
def test_vendor_ref_is_pinned() -> None:
|
|
ref = (VENDOR / ".whynot-design-ref").read_text(encoding="utf-8").strip()
|
|
assert len(ref) == 40
|
|
|
|
|
|
def test_server_serves_vendor_modules() -> None:
|
|
server_module = importlib.import_module("observatory.server")
|
|
handler = server_module.ObservatoryHandler
|
|
handler.data_dir = ROOT / "data"
|
|
|
|
httpd = HTTPServer(("127.0.0.1", 0), handler)
|
|
port = httpd.server_address[1]
|
|
thread = threading.Thread(target=httpd.serve_forever, daemon=True)
|
|
thread.start()
|
|
|
|
try:
|
|
import urllib.request
|
|
|
|
index = urllib.request.urlopen(f"http://127.0.0.1:{port}/", timeout=2)
|
|
assert "wn-top-nav" in index.read().decode("utf-8")
|
|
|
|
module = urllib.request.urlopen(
|
|
f"http://127.0.0.1:{port}/ui/vendor/whynot-design/index.js",
|
|
timeout=2,
|
|
)
|
|
assert module.headers["Content-Type"].startswith("application/javascript")
|
|
assert "defineAtoms" in module.read().decode("utf-8")
|
|
finally:
|
|
httpd.shutdown()
|
|
thread.join(timeout=2) |