| | |
| | | import importlib.util |
| | | import io |
| | | import sys |
| | | import tempfile |
| | | import unittest |
| | | from pathlib import Path |
| | | |
| | |
| | | with self.assertRaises(MODULE.ApiError): |
| | | handler.read_json_body() |
| | | |
| | | def test_large_tiff_upload_limits_allow_one_gibibyte_files(self) -> None: |
| | | self.assertEqual(MODULE.MAX_FILE_BYTES, 1024 * 1024 * 1024) |
| | | self.assertEqual(MODULE.MAX_REQUEST_BYTES, 3072 * 1024 * 1024) |
| | | |
| | | def test_binary_change_upload_preserves_original_bytes(self) -> None: |
| | | with tempfile.TemporaryDirectory() as temp_dir: |
| | | handler = object.__new__(MODULE.WorkbenchConsoleHandler) |
| | | handler.directory = temp_dir |
| | | handler.path = "/api/change-detection/uploads/0123456789abcdef0123456789abcdef?role=before" |
| | | handler.headers = {"Content-Length": "13", "X-Upload-Name": "../1.tif"} |
| | | handler.rfile = io.BytesIO(b"raw-tif-bytes") |
| | | result = handler.receive_change_upload("/api/change-detection/uploads/0123456789abcdef0123456789abcdef") |
| | | staged = Path(temp_dir) / "shared" / "data" / "raw" / "00-change-detection" / "uploads" / result["uploadId"] / "before.tif" |
| | | self.assertEqual(staged.read_bytes(), b"raw-tif-bytes") |
| | | self.assertEqual(result["name"], "1.tif") |
| | | |
| | | def test_script_failure_becomes_a_useful_api_error(self) -> None: |
| | | handler = self.make_handler() |
| | | with self.assertRaisesRegex(MODULE.ApiError, "Processing failed"): |
| | |
| | | with self.assertRaisesRegex(MODULE.ApiError, "must be a number"): |
| | | handler.create_change_run({**payload, "threshold": "0.5"}) |
| | | |
| | | def test_change_resolution_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 512 and 4096"): |
| | | handler.create_change_run({**payload, "maxDimension": 256}) |
| | | with self.assertRaisesRegex(MODULE.ApiError, "must be an integer"): |
| | | handler.create_change_run({**payload, "maxDimension": "2048"}) |
| | | |
| | | def test_change_processing_mode_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, "auto, image, or geotiff"): |
| | | handler.create_change_run({**payload, "processingMode": "wrong"}) |
| | | |
| | | 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)) |