# Copyright (c) 2026 Krzysztof Rudnicki. MIT licence. """Serving the built page, and saying so plainly when it is not built.""" from __future__ import annotations from typing import TYPE_CHECKING from signal_bot.manage import assets from tests.manage_fixture import client_for, deps_at if TYPE_CHECKING: from pathlib import Path def test_the_page_is_served_once_it_has_been_built(tmp_path: Path) -> None: with client_for(deps_at(tmp_path, built=True)) as client: answer = client.get("/") assert answer.status_code == 200 assert "built" in answer.text def test_hashed_assets_are_served_from_their_own_mount(tmp_path: Path) -> None: with client_for(deps_at(tmp_path, built=True)) as client: answer = client.get("/assets/app.js") assert answer.status_code == 200 assert "// built" in answer.text def test_a_client_routed_path_falls_through_to_the_page(tmp_path: Path) -> None: # A reload on a sub-view asks this server for a path only the browser # knows about, so the catch-all has to answer with the page itself. with client_for(deps_at(tmp_path, built=True)) as client: assert "built" in client.get("/config").text def test_an_unbuilt_page_names_the_command_instead_of_crashing( tmp_path: Path, ) -> None: # StaticFiles raises at construction on a missing directory, so mounting # it unconditionally would take the whole app down on a fresh clone -- # and in CI, where pytest runs without ever calling pnpm build. with client_for(deps_at(tmp_path)) as client: answer = client.get("/") assert answer.status_code == 503 assert assets.BUILD_COMMAND in answer.text def test_a_half_built_directory_counts_as_not_built(tmp_path: Path) -> None: # index.html without assets/ would raise from the mount exactly the way # a missing dist/ does. dist = tmp_path / "dist" dist.mkdir() (dist / "index.html").write_text("half", encoding="utf-8") assert assets.is_built(dist) is False def test_the_api_is_not_shadowed_by_the_catch_all(tmp_path: Path) -> None: # /{path:path} would swallow every route registered after it, which is # why the assets go on last. with client_for(deps_at(tmp_path, built=True)) as client: assert client.get("/api/status").json()["reachable"] is True