| | |
| | | Path(handler.translate_path("/shared/data/raw/02-semantic-mapping/sample.tif")), |
| | | ROOT / "shared" / "data" / "raw" / "02-semantic-mapping" / "sample.tif", |
| | | ) |
| | | self.assertEqual( |
| | | Path(handler.translate_path("/shared/data/raw/00-change-detection/sample.jpg")), |
| | | ROOT / "shared" / "data" / "raw" / "00-change-detection" / "sample.jpg", |
| | | ) |
| | | |
| | | def test_upload_name_is_sanitized_and_extension_is_allowlisted(self) -> None: |
| | | self.assertEqual(MODULE.safe_file_name("../../unsafe name.JPG", {".jpg"}), "unsafe_name.jpg") |
| | |
| | | runs = MODULE.semantic_runs(ROOT) |
| | | self.assertTrue(any(item["id"] == "validation-20260817" for item in runs)) |
| | | |
| | | def test_spatial_measurement_run_is_discovered(self) -> None: |
| | | runs = MODULE.measurement_runs(ROOT) |
| | | validation = next(item for item in runs if item["id"] == "validation-normal-20260817-v4") |
| | | self.assertTrue(validation["artifactRoot"].startswith("shared/outputs/04-spatial-measurement/")) |
| | | |
| | | def test_change_run_requires_both_allowlisted_images(self) -> None: |
| | | handler = self.make_handler() |
| | | with self.assertRaisesRegex(MODULE.ApiError, "name and Base64"): |
| | | handler.create_change_run({"files": {"before": {"name": "before.jpg", "content": "eA=="}}}) |
| | | |
| | | def test_change_threshold_is_validated(self) -> None: |
| | | handler = self.make_handler() |
| | | payload = {"files": {"before": {"name": "before.jpg", "content": "eA=="}, "after": {"name": "after.jpg", "content": "eA=="}}} |
| | | with self.assertRaisesRegex(MODULE.ApiError, "between 0.01 and 0.99"): |
| | | handler.create_change_run({**payload, "threshold": 1.0}) |
| | | with self.assertRaisesRegex(MODULE.ApiError, "must be a number"): |
| | | handler.create_change_run({**payload, "threshold": "0.5"}) |
| | | |
| | | def test_change_validation_run_is_discovered_without_fake_crs(self) -> None: |
| | | runs = MODULE.change_runs(ROOT) |
| | | self.assertTrue(any(item["id"].startswith("validation-real-") for item in runs)) |
| | | |
| | | def test_semantic_task_catalog_only_enables_verified_baseline(self) -> None: |
| | | tasks = MODULE.semantic_tasks(ROOT) |
| | | self.assertEqual(len(tasks), 5) |