diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 1a491c5a4..69766f41c 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -1675,6 +1675,22 @@ class MergeDocumentsSerializer(DocumentListSerializer, SourceModeValidationMixin from_webui = serializers.BooleanField(required=False, default=False) +class MergeDocumentsAsVersionsSerializer(DocumentListSerializer): + root_document_id = serializers.IntegerField(required=True) + + def validate(self, attrs): + documents = attrs["documents"] + if len(documents) < 2: + raise serializers.ValidationError( + "At least two documents are required.", + ) + if attrs["root_document_id"] not in documents: + raise serializers.ValidationError( + "root_document_id must be one of the selected documents.", + ) + return attrs + + class EditPdfDocumentsSerializer(DocumentListSerializer, SourceModeValidationMixin): operations = serializers.ListField(required=True) delete_original = serializers.BooleanField(required=False, default=False) diff --git a/src/documents/tests/test_merge_documents_as_versions.py b/src/documents/tests/test_merge_documents_as_versions.py new file mode 100644 index 000000000..12ff16ae3 --- /dev/null +++ b/src/documents/tests/test_merge_documents_as_versions.py @@ -0,0 +1,67 @@ +from django.test import TestCase + +from documents.models import Document +from documents.serialisers import MergeDocumentsAsVersionsSerializer + + +class TestMergeDocumentsAsVersionsSerializer(TestCase): + def setUp(self) -> None: + self.doc1 = Document.objects.create(checksum="A", title="A") + self.doc2 = Document.objects.create(checksum="B", title="B") + self.doc3 = Document.objects.create(checksum="C", title="C") + + def test_accepts_selected_root_document(self) -> None: + serializer = MergeDocumentsAsVersionsSerializer( + data={ + "documents": [self.doc1.id, self.doc2.id, self.doc3.id], + "root_document_id": self.doc2.id, + }, + ) + + self.assertTrue(serializer.is_valid(), serializer.errors) + self.assertEqual( + serializer.validated_data, + { + "documents": [self.doc1.id, self.doc2.id, self.doc3.id], + "root_document_id": self.doc2.id, + }, + ) + + def test_requires_at_least_two_documents(self) -> None: + serializer = MergeDocumentsAsVersionsSerializer( + data={ + "documents": [self.doc1.id], + "root_document_id": self.doc1.id, + }, + ) + + self.assertFalse(serializer.is_valid()) + self.assertEqual( + serializer.errors["non_field_errors"][0], + "At least two documents are required.", + ) + + def test_requires_root_document_to_be_selected(self) -> None: + serializer = MergeDocumentsAsVersionsSerializer( + data={ + "documents": [self.doc1.id, self.doc2.id], + "root_document_id": self.doc3.id, + }, + ) + + self.assertFalse(serializer.is_valid()) + self.assertEqual( + serializer.errors["non_field_errors"][0], + "root_document_id must be one of the selected documents.", + ) + + def test_rejects_duplicate_documents(self) -> None: + serializer = MergeDocumentsAsVersionsSerializer( + data={ + "documents": [self.doc1.id, self.doc1.id], + "root_document_id": self.doc1.id, + }, + ) + + self.assertFalse(serializer.is_valid()) + self.assertIn("documents", serializer.errors)