93 test files read a single frontend source and asserted identifiers in it. The
MapWorkspace split showed what that costs: 24 tests went red for a move that
changed no behaviour at all. A contract belongs to the feature — a container,
its hooks, its domain layer — not to whichever file currently holds it.
232 read sites now resolve through read_feature(). The distinction that makes
this safe is direction: a *positive* contract ("this is wired") may widen,
because the identifier must still exist somewhere in the feature; a *negative*
one ("this component performs no transport") is a statement about one file, and
widening it would quietly weaken the check. The 73 single-file reads that
remain are exactly those, and a guard now enforces the rule for new tests.
Verified rather than assumed: of the 732 migrated positive assertions, 644 still
match exactly one module — as specific as before — and the other 86 already
spanned a container and its hook by nature. Two apparent misses are an artefact
of the checking regex reading an escaped newline literally.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
71 lines
3.0 KiB
Python
71 lines
3.0 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
from tests.frontend_contract import read_feature
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
|
|
|
|
def test_app_uses_dataset_workflow_hook() -> None:
|
|
app = (ROOT / "frontend" / "src" / "App.tsx").read_text(encoding="utf-8")
|
|
|
|
assert "useDatasetWorkflow" in app
|
|
assert "from './hooks/useDatasetWorkflow'" in app
|
|
assert "datasetsApi.upload" not in app
|
|
assert "jobsApi" not in app
|
|
assert "datasetsApi.vectorClip" not in app
|
|
assert "datasetsApi.rasterTile" not in app
|
|
|
|
|
|
def test_dataset_workflow_hook_owns_dataset_api_calls() -> None:
|
|
hook = read_feature("datasets")
|
|
|
|
assert "datasetsApi.upload" in hook
|
|
assert "datasetsApi.getContent" in hook
|
|
assert "datasetsApi.vectorSummary" in hook
|
|
assert "datasetsApi.vectorClip" in hook
|
|
assert "datasetsApi.vectorBuffer" in hook
|
|
assert "datasetsApi.vectorIntersect" in hook
|
|
assert "datasetsApi.inspectRaster" in hook
|
|
assert "datasetsApi.rasterPreview" in hook
|
|
assert "datasetsApi.rasterStats" in hook
|
|
assert "datasetsApi.rasterReproject" in hook
|
|
assert "datasetsApi.rasterClip" in hook
|
|
assert "datasetsApi.rasterTile" in hook
|
|
assert "datasetsApi.rasterNdvi" in hook
|
|
assert "datasetsApi.rasterNdwi" in hook
|
|
assert "datasetsApi.rasterNdbi" in hook
|
|
assert "datasetsApi.refreshMetadata" in hook
|
|
assert "jobsApi.list" in hook
|
|
|
|
|
|
def test_app_still_wires_dataset_ui_callbacks() -> None:
|
|
app = (ROOT / "frontend" / "src" / "App.tsx").read_text(encoding="utf-8")
|
|
dataset_panel = read_feature("datasets")
|
|
detail_panel = read_feature("datasets")
|
|
|
|
assert "<DatasetPanel" in app
|
|
assert "onUploadDataset={uploadDataset}" in app
|
|
assert "onLoadDatasetDetails={loadDatasetDetails}" in app
|
|
assert "onRefreshMetadata={refreshMetadata}" in app
|
|
assert "<WorkbenchInspector" in app
|
|
assert "datasetDetailProps={{" in app
|
|
assert "onRunRasterInspect: runRasterInspect" in app
|
|
assert "onRunRasterPreview: runRasterPreview" in app
|
|
assert "onRunRasterStats: runRasterStats" in app
|
|
assert "onRunRasterReproject: runRasterReproject" in app
|
|
assert "onRunRasterClip: runRasterClip" in app
|
|
assert "onRunRasterTile: runRasterTile" in app
|
|
assert "onRunRasterNdvi: runRasterNdvi" in app
|
|
assert "onRunRasterNdwi: runRasterNdwi" in app
|
|
assert "onRunRasterNdbi: runRasterNdbi" in app
|
|
assert "onRunVectorClip: runVectorClip" in app
|
|
assert "onRunVectorBuffer: runVectorBuffer" in app
|
|
assert "onRunVectorIntersect: () => runVectorIntersect(availableVectorTargets)" in app
|
|
assert '<form className="dataset-upload-form" onSubmit={onUploadDataset}' in dataset_panel
|
|
assert "onClick={() => onLoadDatasetDetails(selectedProjectId ?? '', dataset)}" in dataset_panel
|
|
assert "onClick={() => onRefreshMetadata(dataset.id)}" in dataset_panel
|
|
assert "onRunRasterInspect={onRunRasterInspect}" in detail_panel
|
|
assert "onRunVectorIntersect={onRunVectorIntersect}" in detail_panel
|