diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index d58154861..77a45cbc9 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -1369,7 +1369,8 @@ class BulkEditSerializer( return bulk_edit.delete_pages elif method == "edit_pdf": return bulk_edit.edit_pdf - else: + else: # pragma: no cover + # This will never happen as it is handled by the ChoiceField raise serializers.ValidationError("Unsupported method.") def _validate_parameters_tags(self, parameters): diff --git a/src/documents/tests/test_api_bulk_edit.py b/src/documents/tests/test_api_bulk_edit.py index 33f1e9bec..7e636b0c7 100644 --- a/src/documents/tests/test_api_bulk_edit.py +++ b/src/documents/tests/test_api_bulk_edit.py @@ -1393,6 +1393,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase): self.assertEqual(kwargs["user"], self.user) def test_edit_pdf_invalid_params(self): + # multiple documents response = self.client.post( "/api/documents/bulk_edit/", json.dumps( @@ -1404,10 +1405,10 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase): ), content_type="application/json", ) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertIn(b"Edit PDF method only supports one document", response.content) + # no operations specified response = self.client.post( "/api/documents/bulk_edit/", json.dumps( @@ -1419,10 +1420,141 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase): ), content_type="application/json", ) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertIn(b"operations not specified", response.content) + # operations not a list + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [self.doc2.id], + "method": "edit_pdf", + "parameters": {"operations": "not_a_list"}, + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn(b"operations must be a list", response.content) + + # invalid operation + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [self.doc2.id], + "method": "edit_pdf", + "parameters": {"operations": ["invalid_operation"]}, + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn(b"invalid operation entry", response.content) + + # page not an int + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [self.doc2.id], + "method": "edit_pdf", + "parameters": {"operations": [{"page": "not_an_int"}]}, + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn(b"page must be an integer", response.content) + + # rotate not an int + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [self.doc2.id], + "method": "edit_pdf", + "parameters": {"operations": [{"page": 1, "rotate": "not_an_int"}]}, + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn(b"rotate must be an integer", response.content) + + # doc not an int + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [self.doc2.id], + "method": "edit_pdf", + "parameters": {"operations": [{"page": 1, "doc": "not_an_int"}]}, + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn(b"doc must be an integer", response.content) + + # update_document not a boolean + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [self.doc2.id], + "method": "edit_pdf", + "parameters": { + "update_document": "not_a_bool", + "operations": [{"page": 1}], + }, + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn(b"update_document must be a boolean", response.content) + + # include_metadata not a boolean + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [self.doc2.id], + "method": "edit_pdf", + "parameters": { + "include_metadata": "not_a_bool", + "operations": [{"page": 1}], + }, + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn(b"include_metadata must be a boolean", response.content) + + # update_document True but output would be multiple documents + response = self.client.post( + "/api/documents/bulk_edit/", + json.dumps( + { + "documents": [self.doc2.id], + "method": "edit_pdf", + "parameters": { + "update_document": True, + "operations": [{"page": 1, "doc": 1}, {"page": 2, "doc": 2}], + }, + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertIn( + b"update_document only allowed with a single output document", + response.content, + ) + @override_settings(AUDIT_LOG_ENABLED=True) def test_bulk_edit_audit_log_enabled_simple_field(self): """