wrongmove/tests/unit/test_frontend_build_config.py

55 lines
2.1 KiB
Python
Raw Normal View History

"""Regression tests for frontend build configuration.
Prevents re-introducing JS obfuscation plugins that break vendor libraries
(e.g., Mapbox GL WebGL shaders corrupted by string encoding/splitting).
"""
import json
from pathlib import Path
import pytest
FRONTEND_DIR = Path(__file__).resolve().parents[2] / "frontend"
_skip_no_frontend = pytest.mark.skipif(
not FRONTEND_DIR.is_dir(),
reason="frontend/ directory not present (e.g. backend-only Docker build)",
)
@_skip_no_frontend
class TestViteConfig:
"""Validate vite.config.ts doesn't contain dangerous build plugins."""
def test_no_obfuscator_plugin_in_vite_config(self) -> None:
"""JS obfuscation breaks Mapbox GL's WebGL shaders and must not be used.
vite-plugin-obfuscator processes ALL output chunks (including vendor
libraries) and corrupts string literals used for WebGL shader source,
causing the map to render as a blank screen.
"""
config = (FRONTEND_DIR / "vite.config.ts").read_text()
assert "obfuscat" not in config.lower(), (
"vite.config.ts must not use JS obfuscation plugins — "
"they corrupt Mapbox GL's WebGL shaders and break the map"
)
def test_no_obfuscator_in_package_json(self) -> None:
"""Ensure obfuscator packages are not listed as dependencies."""
pkg = json.loads((FRONTEND_DIR / "package.json").read_text())
all_deps = {
**pkg.get("dependencies", {}),
**pkg.get("devDependencies", {}),
}
for dep_name in all_deps:
assert "obfuscat" not in dep_name.lower(), (
f"package.json must not include obfuscator packages (found {dep_name})"
)
def test_source_maps_disabled(self) -> None:
"""Production builds must not emit source maps."""
config = (FRONTEND_DIR / "vite.config.ts").read_text()
assert "sourcemap: false" in config or "sourcemap:false" in config, (
"vite.config.ts must have sourcemap: false to prevent "
"shipping .map files in production"
)