carepath-api / interpreter /tests /test_package_data.py
tranth3truong's picture
Deploy CP-UX-17: public demo hub, same-origin API, one design world
aacc29a
Raw
History Blame Contribute Delete
2.78 kB
"""Every runtime data file must be declared as package data.
The Docker image installs this package for real (`pip install ./interpreter`),
not editable, so a data file that is not declared simply does not exist in
production. Tests run from the source tree and cannot see the difference.
That is not hypothetical: `providers/demo_scenario.json` was undeclared, so
`PROVIDER_MODE=demo` and the public demo's scripted sample both returned 502 on
the deployed Space while every local test passed.
"""
from __future__ import annotations
import fnmatch
import tomllib
import unittest
from pathlib import Path
PACKAGE_ROOT = Path(__file__).resolve().parents[1]
APP_DIR = PACKAGE_ROOT / "app"
PYPROJECT = PACKAGE_ROOT / "pyproject.toml"
# Not read at runtime, so not required in the wheel.
IGNORED_SUFFIXES = {".py", ".pyc", ".pyo"}
IGNORED_PARTS = {"__pycache__", ".pytest_cache"}
def _declared_globs() -> list[str]:
config = tomllib.loads(PYPROJECT.read_text(encoding="utf-8"))
return config["tool"]["setuptools"]["package-data"]["app"]
def _runtime_data_files() -> list[str]:
files = []
for path in sorted(APP_DIR.rglob("*")):
if not path.is_file():
continue
if path.suffix in IGNORED_SUFFIXES:
continue
if IGNORED_PARTS & set(path.relative_to(APP_DIR).parts):
continue
files.append(path.relative_to(APP_DIR).as_posix())
return files
class PackageDataTests(unittest.TestCase):
def test_every_data_file_is_declared(self) -> None:
globs = _declared_globs()
undeclared = [
name
for name in _runtime_data_files()
if not any(fnmatch.fnmatch(name, pattern) for pattern in globs)
]
self.assertEqual(
undeclared,
[],
"these files ship in the source tree but not in the installed "
f"package; add a glob to [tool.setuptools.package-data] in {PYPROJECT.name}",
)
def test_the_demo_scenario_is_declared(self) -> None:
"""Named explicitly: this is the one that broke production."""
globs = _declared_globs()
self.assertTrue(
any(fnmatch.fnmatch("providers/demo_scenario.json", g) for g in globs)
)
def test_every_declared_glob_still_matches_something(self) -> None:
"""A glob that matches nothing is a rename waiting to be noticed late."""
names = _runtime_data_files()
for pattern in _declared_globs():
with self.subTest(pattern=pattern):
self.assertTrue(
any(fnmatch.fnmatch(name, pattern) for name in names),
f"{pattern} matches no file under app/",
)
if __name__ == "__main__":
unittest.main()