diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/DateConverter.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/DateConverter.java index af27e007db7a9f7cf6e530ab0be9442a0af1f6fd..bce094fc04399c0c5202ada3250837afdaf7b38e 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/DateConverter.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/DateConverter.java @@ -46,6 +46,10 @@ public class DateConverter { return null; } + public static XMLGregorianCalendar createEmpty() { + return DateConverter.createDatatypeFactory().newXMLGregorianCalendar(); + } + static DatatypeFactory createDatatypeFactory() { try { return DatatypeFactory.newInstance(); diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/PrimaerdokumentTypeBuilder.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/PrimaerdokumentTypeBuilder.java index ac48de62dda65cb160e37d62a03be7583ff7ab37..b97093224e299529603354f5f9a2d03172753cd6 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/PrimaerdokumentTypeBuilder.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/PrimaerdokumentTypeBuilder.java @@ -35,11 +35,15 @@ public class PrimaerdokumentTypeBuilder { throw new IllegalStateException("Can not build Primaerdokument when ozg file is null"); } - var primaerdokumentType = new PrimaerdokumentType(); - primaerdokumentType.setDateiname(ExportFilenameGenerator.generateExportFilename(ozgFile)); - primaerdokumentType.setDateinameOriginal(ozgFile.getName()); - primaerdokumentType.setErsteller(ersteller); - primaerdokumentType.setDatumUhrzeit(DateConverter.toXmlGregorianCalendar(createdAt)); - return primaerdokumentType; + var primaerdokument = new PrimaerdokumentType(); + primaerdokument.setDateiname(ExportFilenameGenerator.generateExportFilename(ozgFile)); + primaerdokument.setDateinameOriginal(ozgFile.getName()); + primaerdokument.setErsteller(ersteller); + if (createdAt != null) { + primaerdokument.setDatumUhrzeit(DateConverter.toXmlGregorianCalendar(createdAt)); + } else { + primaerdokument.setDatumUhrzeit(DateConverter.createEmpty()); + } + return primaerdokument; } } diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportService.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportService.java index efc201e0be72099cfa5f53361e6cfa038b41875f..95015618af8cf272e6a03120e4890a5304adf5cd 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportService.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportService.java @@ -18,6 +18,7 @@ import org.springframework.stereotype.Service; import de.ozgcloud.alfa.common.ExportFilenameGenerator; import de.ozgcloud.alfa.common.file.OzgFile; import de.ozgcloud.alfa.file.ExportFileService; +import de.ozgcloud.alfa.kommentar.ExportKommentarService; import de.ozgcloud.alfa.vorgang.Eingang; import de.ozgcloud.alfa.vorgang.EingangHeader; import de.ozgcloud.alfa.vorgang.ExportVorgangService; @@ -38,6 +39,7 @@ class ExportService { private final ExportFileService exportFileService; private final ExportVorgangService exportVorgangService; + private final ExportKommentarService exportKommentarService; public void writeExport(String vorgangId, String filenameId, OutputStream out) { var exportData = collectExportData(vorgangId, filenameId); @@ -56,6 +58,7 @@ class ExportService { .withAktenzeichen(exportVorgangService.createAkteType(vorgang)) .withRepresentations(exportFileService.createDokumentTypes(representations, formEngineName).toList()) .withAttachments(exportFileService.createDokumentTypes(attachments, formEngineName).toList()) + .withKommentare(exportKommentarService.createDokumentTypes(vorgang).toList()) .build(); var exportFiles = Stream.concat(representations.stream(), attachments.stream()).toList(); return ExportData.builder().abgabe(abgabe).exportFilename(buildXmlFilename(filenameId)).exportFiles(exportFiles).build(); diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilder.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilder.java index 50adf69cc56c4f60726e072cdd6ac09e278f473e..1f0e6db45378dda2b1e8a2d07d99a071f03fb821 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilder.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilder.java @@ -1,5 +1,6 @@ package de.ozgcloud.alfa.export; +import java.util.Collections; import java.util.List; import de.xoev.xdomea.AbgabeAbgabe0401; @@ -16,8 +17,9 @@ class XdomeaNachrichtBuilder { private VorgangType vorgang; private NkAbgabeType kopf; - private List<DokumentType> representations = List.of(); - private List<DokumentType> attachments = List.of(); + private List<DokumentType> representations = Collections.emptyList(); + private List<DokumentType> attachments = Collections.emptyList(); + private List<DokumentType> kommentare = Collections.emptyList(); private AkteType aktenzeichen; public static XdomeaNachrichtBuilder builder() { @@ -49,6 +51,11 @@ class XdomeaNachrichtBuilder { return this; } + public XdomeaNachrichtBuilder withKommentare(List<DokumentType> kommentare) { + this.kommentare = kommentare; + return this; + } + public AbgabeAbgabe0401 build() { var schriftgutobjekt = createSchriftgutobjekt(); addVorgangDokumente(); @@ -69,6 +76,7 @@ class XdomeaNachrichtBuilder { void addVorgangDokumente() { representations.forEach(vorgang.getDokument()::add); attachments.forEach(vorgang.getDokument()::add); + kommentare.forEach(vorgang.getDokument()::add); } } diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/DateiformatCode.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/DateiformatCode.java similarity index 89% rename from alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/DateiformatCode.java rename to alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/DateiformatCode.java index b68bc80926cd283240a9f08a60ecfcfab2e8f285..2a86aaf9795820d72912c9fe063464fea282a4fe 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/common/DateiformatCode.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/DateiformatCode.java @@ -1,4 +1,4 @@ -package de.ozgcloud.alfa.common; +package de.ozgcloud.alfa.file; import de.xoev.xdomea.DateiformatCodeType; import lombok.Getter; @@ -6,7 +6,7 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @Getter -public enum DateiformatCode { +enum DateiformatCode { PDF("vCBzR", "018"); static final String LIST_URI = "urn:xoev-de:xdomea:codeliste:dateiformat"; diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/DokumentTypeBuilder.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/DokumentTypeBuilder.java index 625313a85d2365950b6e7d0295bc8bb520b9ff72..e927b380f5a9ea4731a30347a20091404f23a0aa 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/DokumentTypeBuilder.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/file/DokumentTypeBuilder.java @@ -2,7 +2,6 @@ package de.ozgcloud.alfa.file; import org.apache.commons.lang3.StringUtils; -import de.ozgcloud.alfa.common.DateiformatCode; import de.ozgcloud.alfa.common.PrimaerdokumentTypeBuilder; import de.ozgcloud.alfa.common.UUIDConverter; import de.ozgcloud.alfa.common.file.OzgFile; diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DateiformatCode.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DateiformatCode.java new file mode 100644 index 0000000000000000000000000000000000000000..e1ad860eaea329cfadb1e112eab9f5a8cbb357b1 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DateiformatCode.java @@ -0,0 +1,84 @@ +package de.ozgcloud.alfa.kommentar; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import org.apache.commons.lang3.StringUtils; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class DateiformatCode { + + static final String SONSTIGES_CODE = "100"; + + // MIME type -> file extension -> xdomea code + private static final Map<String, Map<String, String>> mimeTypesMapping = new HashMap<>(); + + static { + mimeTypesMapping.put("image/bmp", Map.of("bmp", "001")); + mimeTypesMapping.put("text/csv", Map.of("csv", "002")); + mimeTypesMapping.put("application/msword", Map.of("doc", "003", "dot", "032")); + mimeTypesMapping.put("message/rfc822", Map.of("eml", "006")); + mimeTypesMapping.put("text/html", Map.of("htm", "007", "html", "008")); + mimeTypesMapping.put("image/jpeg", Map.of("jpe", "009", "jpeg", "010", "jpg", "011")); + mimeTypesMapping.put("application/vnd.ms-outlook", Map.of("msg", "012")); + mimeTypesMapping.put("application/vnd.oasis.opendocument.presentation", Map.of("odp", "013")); + mimeTypesMapping.put("application/vnd.oasis.opendocument.spreadsheet", Map.of("ods", "014")); + mimeTypesMapping.put("application/vnd.oasis.opendocument.text", Map.of("odt", "015")); + mimeTypesMapping.put("application/vnd.oasis.opendocument.presentation-template", Map.of("otp", "016")); + mimeTypesMapping.put("application/vnd.oasis.opendocument.spreadsheet-template", Map.of("ots", "017")); + mimeTypesMapping.put("application/pdf", Map.of("pdf", "018")); + mimeTypesMapping.put("image/png", Map.of("png", "019")); + mimeTypesMapping.put("application/vnd.ms-powerpoint", Map.of("ppt", "020", "pot", "033")); + mimeTypesMapping.put("application/postscript", Map.of("ps", "021")); + mimeTypesMapping.put("application/rtf", Map.of("rtf", "022")); + mimeTypesMapping.put("image/tiff", Map.of("tif", "023", "tiff", "024")); + mimeTypesMapping.put("application/vnd.ms-works", Map.of("wps", "025")); + mimeTypesMapping.put("application/vnd.ms-excel", Map.of("xlc", "026", "xlm", "027", "xls", "028", "xlw", "029", "xlt", "034")); + mimeTypesMapping.put("application/xml", Map.of("xml", "030", "xsd", "031")); + mimeTypesMapping.put("application/vnd.openxmlformats-officedocument.wordprocessingml.document", Map.of("docx", "035")); + mimeTypesMapping.put("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", Map.of("xlsx", "036")); + mimeTypesMapping.put("application/vnd.openxmlformats-officedocument.presentationml.presentation", Map.of("pptx", "037")); + mimeTypesMapping.put("application/vnd.openxmlformats-officedocument.wordprocessingml.template", Map.of("dotx", "038")); + mimeTypesMapping.put("application/vnd.openxmlformats-officedocument.spreadsheetml.template", Map.of("xltx", "039")); + mimeTypesMapping.put("application/vnd.openxmlformats-officedocument.presentationml.template", Map.of("potx", "040")); + mimeTypesMapping.put("application/xml-dtd", Map.of("dtd", "041")); + mimeTypesMapping.put("application/vnd.ms-project", Map.of("mpp", "042")); + mimeTypesMapping.put("application/vnd.oasis.opendocument.text-template", Map.of("ott", "043")); + mimeTypesMapping.put("text/plain", Map.of("txt", "045")); + mimeTypesMapping.put("application/x-pkcs7-certificates", Map.of("p7b", "046")); + mimeTypesMapping.put("application/pkcs7-mime", Map.of("p7c", "047", "p7m", "048")); + mimeTypesMapping.put("application/pkcs7-signature", Map.of("p7s", "049")); + mimeTypesMapping.put("application/vnd.etsi.asic-s+zip", Map.of("asics", "050")); + mimeTypesMapping.put("application/scvp-cv-response", Map.of("scs", "051")); + } + + public static String getXdomeaCode(String mimeType, String extension) { + var fileExtensionToCodeMapping = getFileExtensionToCodeMapping(mimeType); + if (hasSingleExtensionMapping(fileExtensionToCodeMapping)) { + return getCodeOrDefault(fileExtensionToCodeMapping); + } + return getCodeForExtensionOrDefault(extension, fileExtensionToCodeMapping); + } + + private static Map<String, String> getFileExtensionToCodeMapping(String mimeType) { + return mimeTypesMapping.getOrDefault(Objects.requireNonNullElse(mimeType, StringUtils.EMPTY), Collections.emptyMap()); + } + + private static boolean hasSingleExtensionMapping(Map<String, String> fileExtensionToCodeMapping) { + return fileExtensionToCodeMapping.entrySet().size() == 1; + } + + private static String getCodeOrDefault(Map<String, String> fileExtensionToCodeMapping) { + return fileExtensionToCodeMapping.values().stream().findFirst().orElse(SONSTIGES_CODE); + } + + private static String getCodeForExtensionOrDefault(String extension, Map<String, String> fileExtensionToCodeMapping) { + return fileExtensionToCodeMapping.getOrDefault(Objects.requireNonNullElse(extension, StringUtils.EMPTY), SONSTIGES_CODE); + } + +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..3e3fea0fdc91ea49cf2b4d3efd1386c94b460952 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilder.java @@ -0,0 +1,96 @@ +package de.ozgcloud.alfa.kommentar; + +import java.util.Collections; +import java.util.List; + +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.StringUtils; + +import de.ozgcloud.alfa.common.PrimaerdokumentTypeBuilder; +import de.ozgcloud.alfa.common.UUIDConverter; +import de.ozgcloud.alfa.common.file.OzgFile; +import de.xoev.xdomea.AnlageDokumentType; +import de.xoev.xdomea.DateiformatCodeType; +import de.xoev.xdomea.DokumentType; +import de.xoev.xdomea.FormatType; +import de.xoev.xdomea.IdentifikationObjektType; +import de.xoev.xdomea.VersionType; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +class DokumentTypeBuilder { + + static final String VERSION_NUMMER = "1"; + static final String TYP = "Notiz"; + static final String DATEI_FORMAT_LIST_URI = "urn:xoev-de:xdomea:codeliste:dateiformat"; + + private Kommentar kommentar; + private List<OzgFile> kommentarAttachments = Collections.emptyList(); + + public static DokumentTypeBuilder builder() { + return new DokumentTypeBuilder(); + } + + public DokumentTypeBuilder withKommentar(Kommentar kommentar) { + this.kommentar = kommentar; + return this; + } + + public DokumentTypeBuilder withKommentarAttachments(List<OzgFile> kommentarAttachments) { + this.kommentarAttachments = kommentarAttachments; + return this; + } + + public DokumentType build() { + var dokumentType = new DokumentType(); + dokumentType.setIdentifikation(createKommentarIdentifikation()); + dokumentType.setTyp(TYP); + kommentarAttachments.stream().map(this::createAnlage).forEach(dokumentType.getAnlage()::add); + return dokumentType; + } + + IdentifikationObjektType createKommentarIdentifikation() { + var identifikation = new IdentifikationObjektType(); + identifikation.setID(UUIDConverter.fromObjectId(kommentar.getId())); + return identifikation; + } + + AnlageDokumentType createAnlage(OzgFile ozgFile) { + var anlage = new AnlageDokumentType(); + anlage.setIdentifikation(createKommentarAttachmentIdentifikation(ozgFile)); + anlage.getVersion().add(createVersionType(ozgFile)); + return anlage; + } + + IdentifikationObjektType createKommentarAttachmentIdentifikation(OzgFile attachment) { + var identifikation = new IdentifikationObjektType(); + identifikation.setID(UUIDConverter.fromObjectId(attachment.getId().toString())); + return identifikation; + } + + VersionType createVersionType(OzgFile ozgFile) { + var versionType = new VersionType(); + versionType.setNummer(VERSION_NUMMER); + versionType.getFormat().add(createFormatType(ozgFile)); + return versionType; + } + + FormatType createFormatType(OzgFile ozgFile) { + var formatType = new FormatType(); + formatType.setName(createDateiformatCodeType(ozgFile)); + formatType.setVersion(StringUtils.EMPTY); + formatType.setPrimaerdokument(PrimaerdokumentTypeBuilder.builder() + .withOzgFile(ozgFile) + .build()); + return formatType; + } + + DateiformatCodeType createDateiformatCodeType(OzgFile ozgFile) { + var dateiformatCode = new DateiformatCodeType(); + dateiformatCode.setCode(DateiformatCode.getXdomeaCode(ozgFile.getContentType(), FilenameUtils.getExtension(ozgFile.getName()))); + dateiformatCode.setListURI(DATEI_FORMAT_LIST_URI); + return dateiformatCode; + } + +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/ExportKommentarService.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/ExportKommentarService.java new file mode 100644 index 0000000000000000000000000000000000000000..c4729eaee8a153c3d472af9d4c00e56d88e30a10 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/kommentar/ExportKommentarService.java @@ -0,0 +1,27 @@ +package de.ozgcloud.alfa.kommentar; + +import java.util.stream.Stream; + +import org.springframework.stereotype.Service; + +import de.ozgcloud.alfa.common.binaryfile.BinaryFileService; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.xoev.xdomea.DokumentType; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Service +public class ExportKommentarService { + + private final KommentarService kommentarService; + private final BinaryFileService binaryFileService; + + public Stream<DokumentType> createDokumentTypes(VorgangWithEingang vorgang) { + return kommentarService.findByVorgangId(vorgang.getId()) + .map(kommentar -> DokumentTypeBuilder.builder() + .withKommentarAttachments(binaryFileService.getFiles(kommentar.getAttachments()).toList()) + .withKommentar(kommentar) + .build()); + } + +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/DateiformatCodeTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/DateiformatCodeTypeTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..299391ad928a9c7bacba0101e474592f55874c8a --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/DateiformatCodeTypeTestFactory.java @@ -0,0 +1,11 @@ +package de.ozgcloud.alfa.common; + +import de.xoev.xdomea.DateiformatCodeType; + +public class DateiformatCodeTypeTestFactory { + + public static DateiformatCodeType create() { + return new DateiformatCodeType(); + } + +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/FormTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/FormatTypeTestFactory.java similarity index 78% rename from alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/FormTypeTestFactory.java rename to alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/FormatTypeTestFactory.java index da7e15a4d08aa00085d957dc7b4b24a80568014f..ea0393aea974a6b7f00fad540c30e630d9e6e520 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/FormTypeTestFactory.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/FormatTypeTestFactory.java @@ -2,7 +2,7 @@ package de.ozgcloud.alfa.common; import de.xoev.xdomea.FormatType; -public class FormTypeTestFactory { +public class FormatTypeTestFactory { public static FormatType create() { return new FormatType(); diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/PrimaerdokumentTypeBuilderTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/PrimaerdokumentTypeBuilderTest.java index 51447d711d95bd24c947899d9339d36b03e548c1..7aaed847f38d88d37475f545f0bae44fda467aaf 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/PrimaerdokumentTypeBuilderTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/PrimaerdokumentTypeBuilderTest.java @@ -92,12 +92,14 @@ class PrimaerdokumentTypeBuilderTest { void shouldNotHaveDatumUhrzeit() { var primaerdokumentType = builder.build(); - assertThat(primaerdokumentType.getDatumUhrzeit()).isNull(); + assertThat(primaerdokumentType.getDatumUhrzeit().getYear()).isNegative(); } @Test void shouldThrowIllegalgStateException() { - assertThatThrownBy(() -> builder.withOzgFile(null).build()).isInstanceOf(IllegalStateException.class); + builder.withOzgFile(null); + + assertThatThrownBy(builder::build).isInstanceOf(IllegalStateException.class); } } diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/VersionTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/VersionTypeTestFactory.java index 8baf8b26e6691208b3c292c1189a4d04a34bab87..f2fcd270fad8435d51170bd8963b3883baf7aa27 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/VersionTypeTestFactory.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/VersionTypeTestFactory.java @@ -6,7 +6,7 @@ public class VersionTypeTestFactory { public static VersionType create() { var versionType = new VersionType(); - versionType.getFormat().add(FormTypeTestFactory.create()); + versionType.getFormat().add(FormatTypeTestFactory.create()); return versionType; } } diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceITCase.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceITCase.java index de5eb64ef80434dd12d08b42bae0f0e8008c9bb9..5707c63e0fcb2168c4b5792be7ec6de3c40482ad 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceITCase.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceITCase.java @@ -14,12 +14,14 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.SpyBean; import de.ozgcloud.alfa.common.binaryfile.FileId; import de.ozgcloud.alfa.common.file.OzgFile; import de.ozgcloud.alfa.common.file.OzgFileTestFactory; import de.ozgcloud.alfa.file.ExportFileService; +import de.ozgcloud.alfa.kommentar.ExportKommentarService; import de.ozgcloud.alfa.vorgang.ExportVorgangService; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; @@ -33,6 +35,8 @@ class ExportServiceITCase { private ExportFileService exportFileService; @SpyBean private ExportVorgangService exportVorgangService; + @MockBean + private ExportKommentarService exportKommentarService; @Autowired private ExportService exportService; @@ -47,6 +51,7 @@ class ExportServiceITCase { doReturn(Stream.of(createOzgFile())).when(exportFileService).getRepresentations(vorgang); doReturn(Stream.of(createOzgFile())).when(exportFileService).getAttachments(vorgang); doNothing().when(exportFileService).writeOzgFile(any(), any()); + when(exportKommentarService.createDokumentTypes(vorgang)).thenReturn(Stream.empty()); } @Test diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java index d1e6e41a4bc5354cd9891f94900baef47c35d54d..ff7fb7bdd34403759f8ca946d467d3b59ba1654e 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportServiceTest.java @@ -31,6 +31,7 @@ import de.ozgcloud.alfa.common.TestUtils; import de.ozgcloud.alfa.common.file.OzgFile; import de.ozgcloud.alfa.common.file.OzgFileTestFactory; import de.ozgcloud.alfa.file.ExportFileService; +import de.ozgcloud.alfa.kommentar.ExportKommentarService; import de.ozgcloud.alfa.vorgang.EingangHeaderTestFactory; import de.ozgcloud.alfa.vorgang.EingangTestFactory; import de.ozgcloud.alfa.vorgang.ExportVorgangService; @@ -57,9 +58,10 @@ class ExportServiceTest { @Mock private ExportFileService exportFileService; - @Mock private ExportVorgangService exportVorgangService; + @Mock + private ExportKommentarService exportKommentarService; @DisplayName("Write exportToXdomea") @Nested @@ -121,6 +123,7 @@ class ExportServiceTest { private final List<OzgFile> attachments = List.of(OzgFileTestFactory.create()); private final List<DokumentType> representationsDokumentTypes = List.of(DokumentTypeTestFactory.create()); private final List<DokumentType> attachmentsDokumentTypes = List.of(DokumentTypeTestFactory.create()); + private final List<DokumentType> kommentareDokumentTypes = List.of(DokumentTypeTestFactory.create()); @Mock private XdomeaNachrichtBuilder xdomeaNachrichtBuilder; @@ -150,6 +153,7 @@ class ExportServiceTest { when(xdomeaNachrichtBuilder.withAktenzeichen(akteType)).thenReturn(xdomeaNachrichtBuilder); when(xdomeaNachrichtBuilder.withRepresentations(representationsDokumentTypes)).thenReturn(xdomeaNachrichtBuilder); when(xdomeaNachrichtBuilder.withAttachments(attachmentsDokumentTypes)).thenReturn(xdomeaNachrichtBuilder); + when(xdomeaNachrichtBuilder.withKommentare(kommentareDokumentTypes)).thenReturn(xdomeaNachrichtBuilder); xdomeaNachrichtBuilderMockedStatic.when(XdomeaNachrichtBuilder::builder).thenReturn(xdomeaNachrichtBuilder); when(xdomeaNachrichtBuilder.build()).thenReturn(abgabe); } @@ -163,6 +167,7 @@ class ExportServiceTest { .thenReturn(stream)); mockStreamToList(attachmentsDokumentTypes, stream -> when(exportFileService.createDokumentTypes(attachments, EingangHeaderTestFactory.FORM_ENGINE_NAME)).thenReturn(stream)); + mockStreamToList(kommentareDokumentTypes, stream -> when(exportKommentarService.createDokumentTypes(vorgang)).thenReturn(stream)); } @AfterEach @@ -297,7 +302,13 @@ class ExportServiceTest { .hasSize(2) .containsAll(representations) .containsAll(attachments); + } + + @Test + void shouldExportKommentare() { + callService(); + verify(exportKommentarService).createDokumentTypes(vorgang); } private ExportData callService() { diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java index e68698cd40f973d31472f1388373e50c531a3b52..9a71c4d90605dc701a3d044fcaa954e7022abefb 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XdomeaNachrichtBuilderTest.java @@ -17,6 +17,7 @@ class XdomeaNachrichtBuilderTest { private final VorgangType vorgangType = VorgangTypeTestFactory.create(); private final List<DokumentType> representations = List.of(DokumentTypeTestFactory.create(), DokumentTypeTestFactory.create()); private final List<DokumentType> attachments = List.of(DokumentTypeTestFactory.create(), DokumentTypeTestFactory.create()); + private final List<DokumentType> kommentare = List.of(DokumentTypeTestFactory.create(), DokumentTypeTestFactory.create()); private final XdomeaNachrichtBuilder builder = XdomeaNachrichtBuilder.builder().withVorgang(vorgangType); @Test @@ -53,4 +54,11 @@ class XdomeaNachrichtBuilderTest { assertThat(abgabeType.getSchriftgutobjekt().get(0).getVorgang().getDokument()).isEqualTo(attachments); } + + @Test + void shouldAddKommentare() { + var abgabeType = builder.withKommentare(kommentare).build(); + + assertThat(abgabeType.getSchriftgutobjekt().get(0).getVorgang().getDokument()).isEqualTo(kommentare); + } } diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/DateiformatCodeTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/file/DateiformatCodeTest.java similarity index 96% rename from alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/DateiformatCodeTest.java rename to alfa-xdomea/src/test/java/de/ozgcloud/alfa/file/DateiformatCodeTest.java index 1046b0606bee88d99e2d7856ae8df31aa37534d1..2bc5492714bb1ee3a0e19d9e237624ec16d382c8 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/common/DateiformatCodeTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/file/DateiformatCodeTest.java @@ -1,4 +1,4 @@ -package de.ozgcloud.alfa.common; +package de.ozgcloud.alfa.file; import static org.assertj.core.api.Assertions.*; diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/file/DokumentTypeBuilderTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/file/DokumentTypeBuilderTest.java index 332cfc515421594b8613b79ce54b31effcf7ec04..1a7988fe6f09396cbbeb0068ff87ca5455b3a0f2 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/file/DokumentTypeBuilderTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/file/DokumentTypeBuilderTest.java @@ -11,9 +11,9 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockedStatic; +import org.mockito.Spy; -import de.ozgcloud.alfa.common.DateiformatCode; -import de.ozgcloud.alfa.common.FormTypeTestFactory; +import de.ozgcloud.alfa.common.FormatTypeTestFactory; import de.ozgcloud.alfa.common.PrimaerdokumentTypeBuilder; import de.ozgcloud.alfa.common.PrimaerdokumentTypeTestFactory; import de.ozgcloud.alfa.common.TestUtils; @@ -35,10 +35,11 @@ class DokumentTypeBuilderTest { private static final String FORM_ENGINE_NAME = "DUMMY_NAME"; private final OzgFile ozgFile = OzgFileTestFactory.create(); - private final DokumentTypeBuilder builder = spy(DokumentTypeBuilder.builder() + @Spy + private final DokumentTypeBuilder builder = DokumentTypeBuilder.builder() .withOzgFile(ozgFile) .withFormEngineName(FORM_ENGINE_NAME) - .withOrdinalNumber(DOKUMENT_ORDINAL_NUMBER)); + .withOrdinalNumber(DOKUMENT_ORDINAL_NUMBER); private MockedStatic<UUIDConverter> uuidConverter; @@ -220,7 +221,7 @@ class DokumentTypeBuilderTest { @Nested class CreateVersionType { - private final FormatType formatType = FormTypeTestFactory.create(); + private final FormatType formatType = FormatTypeTestFactory.create(); @BeforeEach void setUp() { @@ -297,7 +298,7 @@ class DokumentTypeBuilderTest { void shouldReturnBuildPrimaerdokument() { var primaerdokument = builder.createPrimaerdokument(); - assertThat(primaerdokument).isEqualTo(primaerdokument); + assertThat(primaerdokument).isEqualTo(primaerdokumentType); } } diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/AnlageDokumentTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/AnlageDokumentTypeTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..96b3a7117bdd5383ff7faade939ba52c5c958f8c --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/AnlageDokumentTypeTestFactory.java @@ -0,0 +1,11 @@ +package de.ozgcloud.alfa.kommentar; + +import de.xoev.xdomea.AnlageDokumentType; + +class AnlageDokumentTypeTestFactory { + + public static AnlageDokumentType create() { + return new AnlageDokumentType(); + } + +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DateiformatCodeTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DateiformatCodeTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0eabf7f3eae85bd16d2ad5af6dce9e2f01e012e7 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DateiformatCodeTest.java @@ -0,0 +1,61 @@ +package de.ozgcloud.alfa.kommentar; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; + +class DateiformatCodeTest { + + @Nested + class TestGetXdomeaCode { + + @Test + void shouldReturnCode() { + var code = DateiformatCode.getXdomeaCode("application/pdf", "pdf"); + + assertThat(code).isEqualTo("018"); + } + + @Test + void shouldReturnSonstiges() { + var code = DateiformatCode.getXdomeaCode("abc", "abc"); + + assertThat(code).isEqualTo(DateiformatCode.SONSTIGES_CODE); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldReturnCodeOnSingleFileExtensionMapping(String extension) { + var code = DateiformatCode.getXdomeaCode("application/pdf", extension); + + assertThat(code).isEqualTo("018"); + } + + @Test + void shouldReturnCodeOnMultipleFileExtensionMapping() { + var code = DateiformatCode.getXdomeaCode("image/jpeg", "jpg"); + + assertThat(code).isEqualTo("011"); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldReturnSonstigesOnMultipleFileExtensionMapping(String extension) { + var code = DateiformatCode.getXdomeaCode("image/jpeg", extension); + + assertThat(code).isEqualTo(DateiformatCode.SONSTIGES_CODE); + } + + @ParameterizedTest + @NullAndEmptySource + void shouldReturnSonstigesOnEmptyMimeType(String mimeType) { + var code = DateiformatCode.getXdomeaCode(mimeType, "pdf"); + + assertThat(code).isEqualTo(DateiformatCode.SONSTIGES_CODE); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilderTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilderTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ffdbfe13311c17991ca085411d3d45f95ffea397 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/DokumentTypeBuilderTest.java @@ -0,0 +1,338 @@ +package de.ozgcloud.alfa.kommentar; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.List; + +import org.apache.commons.io.FilenameUtils; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Spy; + +import de.ozgcloud.alfa.common.DateiformatCodeTypeTestFactory; +import de.ozgcloud.alfa.common.FormatTypeTestFactory; +import de.ozgcloud.alfa.common.PrimaerdokumentTypeBuilder; +import de.ozgcloud.alfa.common.UUIDConverter; +import de.ozgcloud.alfa.common.VersionTypeTestFactory; +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.common.file.OzgFileTestFactory; +import de.ozgcloud.alfa.export.IdentifikationObjektTypeTestFactory; +import de.xoev.xdomea.AnlageDokumentType; +import de.xoev.xdomea.DateiformatCodeType; +import de.xoev.xdomea.FormatType; +import de.xoev.xdomea.IdentifikationObjektType; +import de.xoev.xdomea.VersionType; + +class DokumentTypeBuilderTest { + + @Spy + private DokumentTypeBuilder builder = DokumentTypeBuilder.builder(); + + @Nested + class TestBuild { + + private final IdentifikationObjektType identifikationObjektType = IdentifikationObjektTypeTestFactory.create(); + private final OzgFile ozgFile = OzgFileTestFactory.create(); + private final AnlageDokumentType anlageDokumentType = AnlageDokumentTypeTestFactory.create(); + + @BeforeEach + void setUp() { + doReturn(identifikationObjektType).when(builder).createKommentarIdentifikation(); + } + + @Test + void shouldCreateIdentifikation() { + builder.build(); + + verify(builder).createKommentarIdentifikation(); + } + + @Nested + class WithoutKommentareAttachments { + + @Test + void shouldHaveIdentifikation() { + var dokumentType = builder.build(); + + assertThat(dokumentType.getIdentifikation()).isEqualTo(identifikationObjektType); + } + + @Test + void shouldHaveTypNotiz() { + var dokumentType = builder.build(); + + assertThat(dokumentType.getTyp()).isEqualTo(DokumentTypeBuilder.TYP); + } + } + + @Nested + class WithKommentareAttachments { + + @BeforeEach + void setUp() { + doReturn(anlageDokumentType).when(builder).createAnlage(ozgFile); + } + + @Test + void shouldCreateAnlagenForKommentarAttachments() { + builder.withKommentarAttachments(List.of(ozgFile)).build(); + + verify(builder).createAnlage(ozgFile); + } + + @Test + void shouldHaveAnlagen() { + var dokumentType = builder.withKommentarAttachments(List.of(ozgFile)).build(); + + assertThat(dokumentType.getAnlage()).contains(anlageDokumentType); + } + } + } + + @Nested + class TestCreateKommentarIdentifikation { + + private MockedStatic<UUIDConverter> uuidConverterMockedStatic; + + @BeforeEach + void setUp() { + uuidConverterMockedStatic = mockStatic(UUIDConverter.class); + uuidConverterMockedStatic.when(() -> UUIDConverter.fromObjectId(KommentarTestFactory.ID)) + .thenReturn(IdentifikationObjektTypeTestFactory.ID); + } + + @AfterEach + void tearDown() { + uuidConverterMockedStatic.close(); + } + + @Test + void shouldConvertKommentarId() { + builder.withKommentar(KommentarTestFactory.create()).createKommentarIdentifikation(); + + uuidConverterMockedStatic.verify(() -> UUIDConverter.fromObjectId(KommentarTestFactory.ID)); + } + + @Test + void shouldHaveId() { + var identifikation = builder.withKommentar(KommentarTestFactory.create()).createKommentarIdentifikation(); + + assertThat(identifikation.getID()).isEqualTo(IdentifikationObjektTypeTestFactory.ID); + } + } + + @Nested + class TestCreateKommentarAttachmentIdentifikation { + + private MockedStatic<UUIDConverter> uuidConverterMockedStatic; + + @BeforeEach + void setUp() { + uuidConverterMockedStatic = mockStatic(UUIDConverter.class); + uuidConverterMockedStatic.when(() -> UUIDConverter.fromObjectId(OzgFileTestFactory.ID.toString())) + .thenReturn(IdentifikationObjektTypeTestFactory.ID); + } + + @AfterEach + void tearDown() { + uuidConverterMockedStatic.close(); + } + + @Test + void shouldConvertOzgFileId() { + builder.createKommentarAttachmentIdentifikation(OzgFileTestFactory.create()); + + uuidConverterMockedStatic.verify(() -> UUIDConverter.fromObjectId(OzgFileTestFactory.ID.toString())); + } + + @Test + void shouldHaveId() { + var identifikation = builder.createKommentarAttachmentIdentifikation(OzgFileTestFactory.create()); + + assertThat(identifikation.getID()).isEqualTo(IdentifikationObjektTypeTestFactory.ID); + } + } + + @Nested + class TestCreateAnlage { + + private final IdentifikationObjektType identifikationObjektType = IdentifikationObjektTypeTestFactory.create(); + private final OzgFile ozgFile = OzgFileTestFactory.create(); + private final VersionType version = VersionTypeTestFactory.create(); + + @BeforeEach + void setUp() { + doReturn(identifikationObjektType).when(builder).createKommentarAttachmentIdentifikation(ozgFile); + doReturn(version).when(builder).createVersionType(ozgFile); + } + + @Test + void shouldCreateIdentifikation() { + builder.createAnlage(ozgFile); + + verify(builder).createKommentarAttachmentIdentifikation(ozgFile); + } + + @Test + void shouldHaveIdentifikation() { + var anlage = builder.createAnlage(ozgFile); + + assertThat(anlage.getIdentifikation()).isEqualTo(identifikationObjektType); + } + + @Test + void shouldCreateVersion() { + builder.createAnlage(ozgFile); + + verify(builder).createVersionType(ozgFile); + } + + @Test + void shouldHaveVersion() { + var anlage = builder.createAnlage(ozgFile); + + assertThat(anlage.getVersion()).contains(version); + } + } + + @Nested + class TestCreateFormatType { + + private MockedStatic<PrimaerdokumentTypeBuilder> primaerdokumentTypeBuilderMockedStatic; + @Mock + private PrimaerdokumentTypeBuilder primaerdokumentTypeBuilder; + + private final OzgFile ozgFile = OzgFileTestFactory.create(); + private final DateiformatCodeType dateiformatCodeType = DateiformatCodeTypeTestFactory.create(); + + @BeforeEach + void setUp() { + primaerdokumentTypeBuilderMockedStatic = mockStatic(PrimaerdokumentTypeBuilder.class); + primaerdokumentTypeBuilderMockedStatic.when(PrimaerdokumentTypeBuilder::builder).thenReturn(primaerdokumentTypeBuilder); + when(primaerdokumentTypeBuilder.withOzgFile(ozgFile)).thenReturn(primaerdokumentTypeBuilder); + doReturn(dateiformatCodeType).when(builder).createDateiformatCodeType(ozgFile); + } + + @AfterEach + void tearDown() { + primaerdokumentTypeBuilderMockedStatic.close(); + } + + @Test + void shouldBuildPrimaerdokument() { + builder.createFormatType(ozgFile); + + verify(primaerdokumentTypeBuilder).build(); + } + + @Test + void shouldSetOzgFile() { + builder.createFormatType(ozgFile); + + verify(primaerdokumentTypeBuilder).withOzgFile(ozgFile); + } + + @Test + void shouldSetDatumUhrzeit() { + var formatType = builder.createFormatType(ozgFile); + + assertThat(formatType.getVersion()).isEmpty(); + } + + @Test + void shouldCreateDateiformatCode() { + builder.createFormatType(ozgFile); + + verify(builder).createDateiformatCodeType(ozgFile); + } + + @Test + void shouldHaveName() { + var formatType = builder.createFormatType(ozgFile); + + assertThat(formatType.getName()).isEqualTo(dateiformatCodeType); + } + } + + @Nested + class TestCreateVersionType { + + private final OzgFile ozgFile = OzgFileTestFactory.create(); + private final FormatType formatType = FormatTypeTestFactory.create(); + + @BeforeEach + void setUp() { + doReturn(formatType).when(builder).createFormatType(ozgFile); + } + + @Test + void shouldHaveNummer() { + var version = builder.createVersionType(ozgFile); + + assertThat(version.getNummer()).isEqualTo(DokumentTypeBuilder.VERSION_NUMMER); + } + + @Test + void shouldCreateFormaType() { + builder.createVersionType(ozgFile); + + verify(builder).createFormatType(ozgFile); + } + + @Test + void shouldHaveFormatType() { + var version = builder.createVersionType(ozgFile); + + assertThat(version.getFormat()).contains(formatType); + } + } + + @Nested + class TestCreateDateiformatCodeType { + + private static final String CODE = "111"; + + private MockedStatic<DateiformatCode> dateiformatCodeMockedStatic; + + @BeforeEach + void setUp() { + dateiformatCodeMockedStatic = mockStatic(DateiformatCode.class); + dateiformatCodeMockedStatic.when( + () -> DateiformatCode.getXdomeaCode(OzgFileTestFactory.CONTENT_TYPE, FilenameUtils.getExtension(OzgFileTestFactory.NAME))) + .thenReturn(CODE); + } + + @AfterEach + void tearDown() { + dateiformatCodeMockedStatic.close(); + } + + @Test + void shouldHaveListURI() { + var dateiformatCode = builder.createDateiformatCodeType(OzgFileTestFactory.create()); + + assertThat(dateiformatCode.getListURI()).isEqualTo(DokumentTypeBuilder.DATEI_FORMAT_LIST_URI); + } + + @Test + void shouldGetXdomeaCode() { + builder.createDateiformatCodeType(OzgFileTestFactory.create()); + + dateiformatCodeMockedStatic.verify( + () -> DateiformatCode.getXdomeaCode(OzgFileTestFactory.CONTENT_TYPE, FilenameUtils.getExtension(OzgFileTestFactory.NAME))); + } + + @Test + void shouldHaveCode() { + var dateiformatCode = builder.createDateiformatCodeType(OzgFileTestFactory.create()); + + assertThat(dateiformatCode.getCode()).isEqualTo(CODE); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/ExportKommentarServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/ExportKommentarServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..529d4d332ff9fa266e5d3022b3d8fc53b8191e2f --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/kommentar/ExportKommentarServiceTest.java @@ -0,0 +1,101 @@ +package de.ozgcloud.alfa.kommentar; + +import static de.ozgcloud.alfa.common.TestUtils.*; +import static org.mockito.Mockito.*; + +import java.util.List; +import java.util.stream.Stream; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockedStatic; + +import de.ozgcloud.alfa.common.binaryfile.BinaryFileService; +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.common.file.OzgFileTestFactory; +import de.ozgcloud.alfa.export.DokumentTypeTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; +import de.xoev.xdomea.DokumentType; + +class ExportKommentarServiceTest { + + @InjectMocks + private ExportKommentarService service; + + @Mock + private KommentarService kommentarService; + @Mock + private BinaryFileService binaryFileService; + + @Nested + class TestCreateDokumentTypes { + + private MockedStatic<DokumentTypeBuilder> dokumentTypeBuilderMockedStatic; + + private final Kommentar kommentar = KommentarTestFactory.create(); + private final List<OzgFile> ozgFiles = List.of(OzgFileTestFactory.create()); + private final DokumentType dokumentType = DokumentTypeTestFactory.create(); + + @Mock + private DokumentTypeBuilder dokumentTypeBuilder; + + @BeforeEach + void setUp() { + when(kommentarService.findByVorgangId(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(kommentar)); + + dokumentTypeBuilderMockedStatic = mockStatic(DokumentTypeBuilder.class); + dokumentTypeBuilderMockedStatic.when(DokumentTypeBuilder::builder).thenReturn(dokumentTypeBuilder); + when(dokumentTypeBuilder.withKommentarAttachments(ozgFiles)).thenReturn(dokumentTypeBuilder); + when(dokumentTypeBuilder.withKommentar(kommentar)).thenReturn(dokumentTypeBuilder); + when(dokumentTypeBuilder.build()).thenReturn(dokumentType); + + mockStreamToList(ozgFiles, stream -> when(binaryFileService.getFiles(KommentarTestFactory.ATTACHMENTS)).thenReturn(stream)); + } + + @AfterEach + void tearDown() { + dokumentTypeBuilderMockedStatic.close(); + } + + @Test + void shouldLoadKommentare() { + service.createDokumentTypes(VorgangWithEingangTestFactory.create()).toList(); + + verify(kommentarService).findByVorgangId(VorgangHeaderTestFactory.ID); + } + + @Test + void shouldLoadOzgFilesForKommentareAttachments() { + service.createDokumentTypes(VorgangWithEingangTestFactory.create()).toList(); + + verify(binaryFileService).getFiles(KommentarTestFactory.ATTACHMENTS); + } + + @Test + void shouldBuildDokumentType() { + service.createDokumentTypes(VorgangWithEingangTestFactory.create()).toList(); + + verify(dokumentTypeBuilder).build(); + } + + @Test + void shouldSetOzgFile() { + service.createDokumentTypes(VorgangWithEingangTestFactory.create()).toList(); + + verify(dokumentTypeBuilder).withKommentarAttachments(ozgFiles); + } + + @Test + void shouldSetKommentar() { + service.createDokumentTypes(VorgangWithEingangTestFactory.create()).toList(); + + verify(dokumentTypeBuilder).withKommentar(kommentar); + } + } + +} \ No newline at end of file