From d857b98578eb377da7cc36f653455fc5f916a9cd Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Tue, 18 Aug 2026 17:25:06 +0800
Subject: [PATCH] feat:变化检测优化

---
 tests/test_serve_workbench_console.py |   31 +++++++++++++++++++++++++++++++
 1 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/tests/test_serve_workbench_console.py b/tests/test_serve_workbench_console.py
index 1125594..a487e87 100644
--- a/tests/test_serve_workbench_console.py
+++ b/tests/test_serve_workbench_console.py
@@ -3,6 +3,7 @@
 import importlib.util
 import io
 import sys
+import tempfile
 import unittest
 from pathlib import Path
 
@@ -56,6 +57,22 @@
         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"):
@@ -83,6 +100,20 @@
         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))

--
Gitblit v1.9.3