diff --git a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java index b12dfc7a99548a5868891da6608dab10242e64d2..f4b42d22220e907979e96ccdc21b684084ef0ac7 100644 --- a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java +++ b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java @@ -71,8 +71,8 @@ class DepositDataMapper { } public FormData mapToFormData(DepositData depositData) { - Map<String, IncomingFile> incomingFileMap = mapDepositAttachmentsToIncomingFiles(depositData); - Document document = parsePrimaryXmlRepresentation(depositData, incomingFileMap); + var incomingFileMap = mapDepositAttachmentsToSortedIncomingFiles(depositData); + var document = parsePrimaryXmlRepresentation(depositData, incomingFileMap); var attachmentGroups = findAttachmentGroups(document); return mapToFormDataWithRepresentationsAndAttachments( @@ -99,7 +99,14 @@ class DepositDataMapper { .build(); } - Map<String, IncomingFile> mapDepositAttachmentsToIncomingFiles(DepositData depositData) { + Map<String, IncomingFile> mapDepositAttachmentsToSortedIncomingFiles(DepositData depositData) { + var incomingFilesMap = mapDepositAttachmentsToIncomingFiles(depositData); + var primaryId = depositData.getPrimaryDataAttachmentId(); + incomingFilesMap.putFirst(primaryId, getIncomingFileById(primaryId, incomingFilesMap)); + return incomingFilesMap; + } + + private LinkedHashMap<String, IncomingFile> mapDepositAttachmentsToIncomingFiles(DepositData depositData) { return depositData.getAttachments() .stream() .collect(Collectors.toMap( diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/AttachmentTestFactory.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/AttachmentTestFactory.java index 0bc63fd67c648f3a51d7a57942cd5414a3293262..a2157603218be1f371cd3d516e93640ba2bb5703 100644 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/AttachmentTestFactory.java +++ b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/AttachmentTestFactory.java @@ -54,6 +54,8 @@ public class AttachmentTestFactory { </myForm>"""; public static final String XML_CONTENT = XML_CONTENT_STRING; public static final String XML_ATTACHMENT_ID = "myForm-xml"; + public static final String XML_ROHFORM_ATTACHMENT_ID = "myForm-xml-rohform"; + public static final String XML_ORIGINALFORM_ATTACHMENT_ID = "myForm-xml-originalform"; public static final String XML_NAME = "XML-Daten.xml"; public static final String PDF_ATTACHMENT_CONTENT_TYPE = "application/pdf"; @@ -114,7 +116,7 @@ public class AttachmentTestFactory { .build()); } - private static Attachment createAttachment(MetaAttachment metaAttachment) { + public static Attachment createAttachment(MetaAttachment metaAttachment) { var attachment = new Attachment(); attachment.getAttributes().add(createAttributesEntry()); attachment.setContent(metaAttachment.content.getBytes()); @@ -147,7 +149,22 @@ public class AttachmentTestFactory { ); return Stream.concat( - Stream.of(createXmlDatenWithContent(xmlFormString)), + Stream.of( + createAttachment(MetaAttachment.builder() + .id(XML_ROHFORM_ATTACHMENT_ID) + .name("XML-Daten (Rohform).xml") + .contentType(XML_CONTENT_TYPE) + .content(xmlFormString) + .build() + ), + createAttachment(MetaAttachment.builder() + .id(XML_ORIGINALFORM_ATTACHMENT_ID) + .name("XML-Daten (Originalform).xml") + .contentType(XML_CONTENT_TYPE) + .content(xmlFormString) + .build() + ), + createXmlDatenWithContent(xmlFormString)), metaAttachments.stream().map(AttachmentTestFactory::createAttachment) ).toList(); } @@ -163,7 +180,7 @@ public class AttachmentTestFactory { } @Builder - private record MetaAttachment(String id, String name, String contentType, String content, String templateId) { + public record MetaAttachment(String id, String name, String contentType, String content, String templateId) { } private static List<MetaAttachment> arrayToMetaAttachments(String[] array) { diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataMapperTest.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataMapperTest.java index 53aa6003c9e0595b8df9e4f534ca82c2f0e91b6e..14e6051660099f272547fd68a7ec71fe265422e5 100644 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataMapperTest.java +++ b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataMapperTest.java @@ -25,13 +25,13 @@ package de.ozgcloud.eingang.intelliform; import static de.ozgcloud.eingang.intelliform.AttachmentTestFactory.*; import static de.ozgcloud.eingang.intelliform.DepositDataTestFactory.*; +import static java.util.Collections.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import java.io.IOException; import java.io.StringReader; import java.nio.charset.Charset; -import java.util.Collections; import java.util.List; import javax.xml.parsers.DocumentBuilderFactory; @@ -208,7 +208,11 @@ class DepositDataMapperTest { var incomingFileIds = formData.getRepresentations().stream() .map(IncomingFile::getVendorId) .toList(); - assertThat(incomingFileIds).containsExactly(XML_ATTACHMENT_ID); + assertThat(incomingFileIds).containsExactly( + XML_ATTACHMENT_ID, + XML_ROHFORM_ATTACHMENT_ID, + XML_ORIGINALFORM_ATTACHMENT_ID + ); } @DisplayName("should return with attachment groups") @@ -244,7 +248,7 @@ class DepositDataMapperTest { @DisplayName("should throw technical exception") @Test void shouldThrowTechnicalException() { - depositData = DepositDataTestFactory.create(Collections.emptyList()); + depositData = DepositDataTestFactory.create(emptyList()); assertThatThrownBy(TestMapToFormData.this::doMapping) .isInstanceOf(TechnicalException.class); @@ -257,20 +261,53 @@ class DepositDataMapperTest { } - @DisplayName("map deposit attachments to incoming files") + @DisplayName("map deposit attachments to sorted incoming files") @Nested - class TestMapDepositAttachmentsToIncomingFiles { + class TestMapDepositAttachmentsToSortedIncomingFiles { + + @DisplayName("should fail without primaryDataAttachmentId attachment") + @Test + void shouldFailWithoutPrimaryDataAttachmentIdAttachment() { + var depositData = DepositDataTestFactory.create(emptyList()); + + assertThatThrownBy(() -> mapper.mapDepositAttachmentsToSortedIncomingFiles(depositData)) + .isInstanceOf(TechnicalException.class); + } + @DisplayName("should keep entry order") @Test void shouldKeepEntryOrder() { var depositData = DepositDataTestFactory.create(ATTACHMENTS); - var incomingFileMap = mapper.mapDepositAttachmentsToIncomingFiles(depositData); + var incomingFileMap = mapper.mapDepositAttachmentsToSortedIncomingFiles(depositData); var keys = incomingFileMap.keySet().stream().toList(); assertThat(keys).containsExactly(XML_ATTACHMENT_ID, PDF_ATTACHMENT_ID, PNG_ATTACHMENT_ID); } + @DisplayName("should move primary attachment id to first position") + @Test + void shouldMovePrimaryAttachmentIdToFirstPosition() { + var rohformId = "XML-daten-rohform"; + var depositData = DepositDataTestFactory.create(List.of( + AttachmentTestFactory.createAttachment(MetaAttachment.builder() + .id(rohformId) + .name("XML-Daten (Rohform).xml") + .contentType(XML_CONTENT_TYPE) + .content("abc") + .build() + ), + AttachmentTestFactory.createPdf(), + AttachmentTestFactory.createXmlDaten(), + AttachmentTestFactory.createPng() + )); + + var incomingFileMap = mapper.mapDepositAttachmentsToSortedIncomingFiles(depositData); + + var keys = incomingFileMap.keySet().stream().toList(); + assertThat(keys).containsExactly(XML_ATTACHMENT_ID, rohformId, PDF_ATTACHMENT_ID, PNG_ATTACHMENT_ID); + } + @DisplayName("should keep last entry for duplicate key") @Test void shouldKeepLastEntryForDuplicateKey() { @@ -280,7 +317,7 @@ class DepositDataMapperTest { AttachmentTestFactory.createXmlDaten() )); - var incomingFileMap = mapper.mapDepositAttachmentsToIncomingFiles(depositData); + var incomingFileMap = mapper.mapDepositAttachmentsToSortedIncomingFiles(depositData); var keys = incomingFileMap.keySet().stream().toList(); assertThat(keys).containsExactly(XML_ATTACHMENT_ID, PDF_ATTACHMENT_ID); diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointITCase.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointITCase.java index 524f388ca41061d7abcfe8b535d4f78853df2081..17c560fb68e7670a05e0dd8feb2102cbc15fd609 100644 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointITCase.java +++ b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointITCase.java @@ -142,16 +142,20 @@ class FormDataEndpointITCase { return grpcEingangCaptor.getValue().getAntragsteller(); } - @DisplayName("should have one representation") + @DisplayName("should have representations") @Test - void shouldHaveOneRepresentation() { + void shouldHaveRepresentations() { sendDepositAndCaptureCreateVorgang(); var eingang = grpcEingangCaptor.getValue(); var representationVendorIds = eingang.getRepresentationsList().stream() .map(GrpcIncomingFile::getVendorId) .toList(); - assertThat(representationVendorIds).containsExactly(XML_ATTACHMENT_ID); + assertThat(representationVendorIds).containsExactly( + XML_ATTACHMENT_ID, + XML_ROHFORM_ATTACHMENT_ID, + XML_ORIGINALFORM_ATTACHMENT_ID + ); } @DisplayName("should have attachments")