feat(v3): simplify the project to contain only required tools
This commit is contained in:
@@ -50,6 +50,140 @@ class ApiTests(TestCase):
|
||||
)
|
||||
self.assertEqual(processed.status_code, 400)
|
||||
|
||||
def test_operations_are_core_slide_set(self):
|
||||
response = self.client.get("/api/operations/")
|
||||
self.assertEqual(response.status_code, 200)
|
||||
operation_ids = {item["id"] for item in response.data["operations"]}
|
||||
operations = {item["id"]: item for item in response.data["operations"]}
|
||||
self.assertIn("histeq", operation_ids)
|
||||
self.assertIn("box_filter", operation_ids)
|
||||
self.assertIn("median_filter", operation_ids)
|
||||
self.assertIn("noise_filter", operation_ids)
|
||||
self.assertIn("rgb_to_gray", operation_ids)
|
||||
self.assertEqual(operations["histeq"]["params"], {})
|
||||
self.assertEqual(operations["noise_filter"]["label"], "Noise Filter")
|
||||
self.assertEqual(operations["box_filter"]["label"], "Average / Box Filter")
|
||||
self.assertEqual(operations["gaussian_filter"]["label"], "Gaussian Filter")
|
||||
self.assertFalse(operations["negative"]["repeatable"])
|
||||
self.assertFalse(operations["rgb_to_gray"]["repeatable"])
|
||||
self.assertEqual(operations["rgb_to_gray"]["params"]["red_weight"]["default"], 0.299)
|
||||
self.assertEqual(operations["rgb_to_gray"]["params"]["green_weight"]["default"], 0.587)
|
||||
self.assertEqual(operations["rgb_to_gray"]["params"]["blue_weight"]["default"], 0.114)
|
||||
self.assertNotIn("crop", operation_ids)
|
||||
self.assertNotIn("identity", operation_ids)
|
||||
self.assertNotIn("threshold", operation_ids)
|
||||
self.assertNotIn("hist_match", operation_ids)
|
||||
self.assertNotIn("convolution", operation_ids)
|
||||
self.assertNotIn("bone_scan_workflow", operation_ids)
|
||||
self.assertNotIn("gaussian_noise", operation_ids)
|
||||
self.assertNotIn("salt_pepper_noise", operation_ids)
|
||||
self.assertNotIn("speckle_noise", operation_ids)
|
||||
self.assertNotIn("hsi_view", operation_ids)
|
||||
self.assertNotIn("hsi_intensity_filter", operation_ids)
|
||||
self.assertNotIn("frequency_filter", operation_ids)
|
||||
self.assertNotIn("frequency_laplacian", operation_ids)
|
||||
self.assertNotIn("pseudo_color_slices", operation_ids)
|
||||
self.assertNotIn("gray_to_color_transform", operation_ids)
|
||||
|
||||
def test_upload_compacts_large_image(self):
|
||||
with override_settings(IMAGE_WORKSPACE_MAX_DIMENSION=4):
|
||||
upload = self.client.post("/api/images/", {"image": png_upload(size=(8, 4))}, format="multipart")
|
||||
self.assertEqual(upload.status_code, 201)
|
||||
self.assertEqual(upload.data["width"], 4)
|
||||
self.assertEqual(upload.data["height"], 2)
|
||||
|
||||
def test_state_delete_removes_non_s0_and_keeps_children(self):
|
||||
upload = self.client.post("/api/images/", {"image": png_upload()}, format="multipart")
|
||||
s0_id = upload.data["states"][0]["state_id"]
|
||||
first = self.client.post(
|
||||
f"/api/states/{s0_id}/operations/",
|
||||
{"operation": "negative", "params": {}},
|
||||
format="json",
|
||||
)
|
||||
second = self.client.post(
|
||||
f"/api/states/{first.data['state_id']}/operations/",
|
||||
{"operation": "gamma", "params": {"gamma": 1, "c": 1}},
|
||||
format="json",
|
||||
)
|
||||
image_path = Path(self.tmp.name) / first.data["image_path"]
|
||||
self.assertTrue(image_path.exists())
|
||||
|
||||
deleted = self.client.delete(f"/api/states/{first.data['state_id']}/")
|
||||
self.assertEqual(deleted.status_code, 204)
|
||||
self.assertFalse(image_path.exists())
|
||||
|
||||
states = self.client.get(f"/api/sessions/{upload.data['session_id']}/states/")
|
||||
child = next(item for item in states.data["states"] if item["state_id"] == second.data["state_id"])
|
||||
self.assertIsNone(child["parent_state_id"])
|
||||
|
||||
def test_state_numbering_does_not_reuse_deleted_sequence(self):
|
||||
upload = self.client.post("/api/images/", {"image": png_upload()}, format="multipart")
|
||||
s0_id = upload.data["states"][0]["state_id"]
|
||||
first = self.client.post(
|
||||
f"/api/states/{s0_id}/operations/",
|
||||
{"operation": "negative", "params": {}},
|
||||
format="json",
|
||||
)
|
||||
second = self.client.post(
|
||||
f"/api/states/{first.data['state_id']}/operations/",
|
||||
{"operation": "gamma", "params": {"gamma": 1, "c": 1}},
|
||||
format="json",
|
||||
)
|
||||
self.assertEqual(first.data["sequence"], 1)
|
||||
self.assertEqual(second.data["sequence"], 2)
|
||||
|
||||
deleted = self.client.delete(f"/api/states/{first.data['state_id']}/")
|
||||
self.assertEqual(deleted.status_code, 204)
|
||||
|
||||
third = self.client.post(
|
||||
f"/api/states/{second.data['state_id']}/operations/",
|
||||
{"operation": "negative", "params": {}},
|
||||
format="json",
|
||||
)
|
||||
self.assertEqual(third.data["sequence"], 3)
|
||||
self.assertTrue(third.data["label"].startswith("S3 "))
|
||||
|
||||
def test_state_delete_blocks_s0(self):
|
||||
upload = self.client.post("/api/images/", {"image": png_upload()}, format="multipart")
|
||||
s0_id = upload.data["states"][0]["state_id"]
|
||||
response = self.client.delete(f"/api/states/{s0_id}/")
|
||||
self.assertEqual(response.status_code, 400)
|
||||
|
||||
def test_single_image_operation_uses_repeat_count(self):
|
||||
upload = self.client.post("/api/images/", {"image": png_upload()}, format="multipart")
|
||||
s0_id = upload.data["states"][0]["state_id"]
|
||||
response = self.client.post(
|
||||
f"/api/states/{s0_id}/operations/",
|
||||
{"operation": "box_filter", "params": {"_repeat": 2, "K": 3}},
|
||||
format="json",
|
||||
)
|
||||
self.assertEqual(response.status_code, 201)
|
||||
self.assertEqual(response.data["params"]["_repeat"], 2)
|
||||
self.assertEqual(response.data["operation"], "box_filter")
|
||||
|
||||
def test_merged_noise_filter_creates_state(self):
|
||||
upload = self.client.post("/api/images/", {"image": png_upload()}, format="multipart")
|
||||
s0_id = upload.data["states"][0]["state_id"]
|
||||
response = self.client.post(
|
||||
f"/api/states/{s0_id}/operations/",
|
||||
{"operation": "noise_filter", "params": {"kind": "salt_pepper", "amount": 0.1, "salt_ratio": 0.5}},
|
||||
format="json",
|
||||
)
|
||||
self.assertEqual(response.status_code, 201)
|
||||
self.assertEqual(response.data["operation"], "noise_filter")
|
||||
self.assertEqual(response.data["params"]["kind"], "salt_pepper")
|
||||
|
||||
def test_grayscale_operation_creates_state(self):
|
||||
upload = self.client.post("/api/images/", {"image": png_upload()}, format="multipart")
|
||||
s0_id = upload.data["states"][0]["state_id"]
|
||||
gray = self.client.post(
|
||||
f"/api/states/{s0_id}/operations/",
|
||||
{"operation": "rgb_to_gray", "params": {"red_weight": 0.299, "green_weight": 0.587, "blue_weight": 0.114}},
|
||||
format="json",
|
||||
)
|
||||
self.assertEqual(gray.status_code, 201)
|
||||
self.assertEqual(gray.data["operation"], "rgb_to_gray")
|
||||
|
||||
@patch("processing.services.run_batch_job.delay")
|
||||
def test_batch_returns_job_id(self, delay):
|
||||
first = self.client.post("/api/images/", {"image": png_upload(name="a.png")}, format="multipart")
|
||||
|
||||
Reference in New Issue
Block a user