@ 261101.7
current
"""Each file in cases/ names the decision it checks and the pages that hold it."""

import re
import shutil
import tempfile
import tomllib
from pathlib import Path

import pytest

import harness

CASES = Path(__file__).parent / "cases"


def requests():
    for file in sorted(CASES.glob("*.toml")):
        case = tomllib.loads(file.read_text())
        for req in case["request"]:
            for form in req.get("servers", case["servers"]):
                yield pytest.param(form, req, id=f"{file.stem}-{form}-{req['path']}")


@pytest.fixture(scope="session")
def servers():
    """One server of each form, started when a case first asks for it."""
    running = {}
    homes = []

    def get(form):
        if form not in running:
            home = Path(tempfile.mkdtemp(prefix="blackbox-"))
            homes.append(home)
            try:
                running[form] = harness.start(form, home)
            except OSError as err:
                pytest.skip(f"{form}: {err}")
        return running[form]

    yield get
    for server in running.values():
        server.stop()
    for home in homes:
        shutil.rmtree(home, ignore_errors=True)


def visible(html):
    """The page without its script and style, whose words a reader never sees."""
    return re.sub(r"<(script|style)\b.*?</\1>", "", html, flags=re.S | re.I)


@pytest.mark.parametrize("form, req", requests())
def test_page(servers, form, req):
    page = servers(form).get(req["path"])
    text = visible(page.text)
    assert page.status_code == req["status"], text
    for want in req.get("contains", []):
        assert want in text
    for ban in req.get("absent", []):
        assert ban.lower() not in text.lower()