"""FE/BE enum contract — guards against the field/enum drift class. FabledCurator's frontend is plain JS (no TS codegen), so the frontend re-declares a few backend enum value-sets by hand: - download-event statuses → frontend/src/utils/downloadStatus.js - platform keys → frontend/src/utils/platformColor.js If either side edits its list without the other, the UI silently mislabels rows or drops a platform (the `last_verified_at`-style drift). These tests parse the JS mirrors and assert they equal the backend's canonical definitions, so any divergence fails CI on whichever side moved. The backend definitions are the source of truth; update the JS to match. """ import re from pathlib import Path from backend.app.api.downloads import _ALLOWED_STATUSES from backend.app.services.platforms import known_platform_keys _FRONTEND = Path(__file__).resolve().parents[1] / "frontend" / "src" / "utils" def _read(name: str) -> str: return (_FRONTEND / name).read_text(encoding="utf-8") def test_download_status_values_match_backend() -> None: # downloadStatus.js: each entry is `{ value: 'pending', ... }` fe_values = set(re.findall(r"value:\s*'([a-z]+)'", _read("downloadStatus.js"))) assert fe_values == set(_ALLOWED_STATUSES), ( "downloadStatus.js DOWNLOAD_STATUSES is out of sync with backend " "downloads._ALLOWED_STATUSES" ) def test_platform_keys_match_backend() -> None: # platformColor.js ICONS: each entry is `patreon: 'mdi-patreon',` fe_keys = set(re.findall(r"^\s*(\w+):\s*'mdi-", _read("platformColor.js"), re.M)) assert fe_keys == set(known_platform_keys()), ( "platformColor.js ICONS is out of sync with backend " "platforms.known_platform_keys()" )