import gzip import re import shutil from pathlib import Path import pytest from src.frontend_bundle import build_frontend from src.views import dashboard, runtime_bundle, service_worker FRONTEND = Path(__file__).resolve().parents[1] / "frontend" PAGE_SCRIPT = re.compile(r'') def test_page_runtime_is_one_deterministic_content_addressed_bundle(tmp_path): first = build_frontend(FRONTEND) second = build_frontend(FRONTEND) assert first.runtime_name == second.runtime_name assert first.runtime_bytes == second.runtime_bytes assert PAGE_SCRIPT.findall(first.dashboard_html) == [] assert first.dashboard_html.count("' in first.dashboard_html assert first.runtime_name.startswith("runtime-") assert first.runtime_name.endswith(".js") assert len(gzip.compress(first.runtime_bytes, mtime=0)) <= 100 * 1024 changed_frontend = tmp_path / "frontend" shutil.copytree(FRONTEND, changed_frontend) (changed_frontend / "widgets.js").write_text( (changed_frontend / "widgets.js").read_text() + "\n// changed\n" ) changed = build_frontend(changed_frontend) assert changed.runtime_name != first.runtime_name assert changed.runtime_bytes != first.runtime_bytes def test_offline_shell_precaches_exact_runtime_without_superseded_page_modules(): build = build_frontend(FRONTEND) assert f"BASE + '{build.runtime_name}'" in build.service_worker_source for source in build.page_sources: if source == "static/background-issue-sync.js": continue assert f"BASE + '{source}'" not in build.service_worker_source @pytest.mark.anyio async def test_runtime_asset_is_immutable_while_html_and_worker_revalidate(): build = build_frontend(FRONTEND) html = await dashboard() bundle = await runtime_bundle(build.runtime_digest) worker = await service_worker() assert build.runtime_name in html assert bundle.body == build.runtime_bytes assert bundle.headers["cache-control"] == "public, max-age=31536000, immutable" assert worker.headers["cache-control"] == "no-cache" assert build.runtime_name.encode() in worker.body