diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReportTemplateController.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReportTemplateController.java index 026ba049b..89903e147 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReportTemplateController.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/controller/ReportTemplateController.java @@ -1,7 +1,20 @@ package com.iqser.red.service.peristence.v1.server.controller; +import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; + +import java.io.IOException; +import java.util.List; +import java.util.UUID; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + import com.iqser.red.service.peristence.v1.server.utils.StorageIdUtils; import com.iqser.red.service.persistence.management.v1.processor.entity.dossier.ReportTemplateEntity; +import com.iqser.red.service.persistence.management.v1.processor.exception.BadRequestException; import com.iqser.red.service.persistence.management.v1.processor.exception.ConflictException; import com.iqser.red.service.persistence.management.v1.processor.exception.NotFoundException; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.ReportTemplatePersistenceService; @@ -11,17 +24,9 @@ import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.Re import com.iqser.red.service.persistence.service.v1.api.resources.ReportTemplateResource; import com.iqser.red.storage.commons.exception.StorageObjectDoesNotExist; import com.iqser.red.storage.commons.service.StorageService; + +import lombok.NonNull; import lombok.RequiredArgsConstructor; -import org.apache.commons.io.IOUtils; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import java.io.IOException; -import java.util.List; -import java.util.UUID; - -import static com.iqser.red.service.persistence.management.v1.processor.utils.MagicConverter.convert; @RestController @RequiredArgsConstructor @@ -33,18 +38,17 @@ public class ReportTemplateController implements ReportTemplateResource { public ReportTemplate uploadTemplate(@RequestBody ReportTemplateUploadRequest reportTemplateUploadRequest) { + String fileName = parseFileName(reportTemplateUploadRequest); + List reportTemplates = reportTemplatePersistenceService.findByDossierTemplateId(reportTemplateUploadRequest.getDossierTemplateId()); - for (ReportTemplateEntity reportTemplate : reportTemplates) { - if (reportTemplate.getFileName().equals(reportTemplateUploadRequest.getFileName())) { - throw new ConflictException("Template already exists."); - } + if (doesFileNameExists(reportTemplates, fileName)) { + throw new ConflictException("Template already exists."); } - String storageId = StorageIdUtils.getReportStorageId(reportTemplateUploadRequest.getDossierTemplateId(), reportTemplateUploadRequest - .getFileName()); + + String storageId = StorageIdUtils.getReportStorageId(reportTemplateUploadRequest.getDossierTemplateId(), fileName); storageService.storeObject(storageId, reportTemplateUploadRequest.getTemplate()); String templateId = UUID.randomUUID().toString(); - reportTemplatePersistenceService.insert(reportTemplateUploadRequest.getDossierTemplateId(), templateId, storageId, reportTemplateUploadRequest - .getFileName(), reportTemplateUploadRequest.isMultiFileReport(), reportTemplateUploadRequest.isActiveByDefault()); + reportTemplatePersistenceService.insert(reportTemplateUploadRequest.getDossierTemplateId(), templateId, storageId, fileName, reportTemplateUploadRequest.isMultiFileReport(), reportTemplateUploadRequest.isActiveByDefault()); return convert(reportTemplatePersistenceService.find(templateId), ReportTemplate.class); @@ -87,4 +91,29 @@ public class ReportTemplateController implements ReportTemplateResource { } + + private boolean doesFileNameExists(List reportTemplates, String fileName) { + + for (ReportTemplateEntity reportTemplate : reportTemplates) { + if (reportTemplate.getFileName().equals(fileName)) { + return true; + } + } + return false; + } + + + private String parseFileName(@NonNull ReportTemplateUploadRequest reportTemplateUploadRequest) { + + String fileName = reportTemplateUploadRequest.getFileName(); + if (reportTemplateUploadRequest.isMultiFileReport()) { + String[] splitFileName = StringUtils.split(fileName, "."); + if (splitFileName.length != 2) { + throw new BadRequestException("FileName is not correct."); + } + fileName = splitFileName[0] + "(multifile)." + splitFileName[1]; + } + return fileName; + } + } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java index 66f46ddc1..6b4d82c63 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/ReportTemplateTest.java @@ -1,13 +1,15 @@ package com.iqser.red.service.peristence.v1.server.integration.tests; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.catchThrowable; + +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + import com.iqser.red.service.peristence.v1.server.integration.client.ReportTemplateClient; import com.iqser.red.service.peristence.v1.server.integration.service.DossierTemplateTesterAndProvider; import com.iqser.red.service.peristence.v1.server.integration.utils.AbstractPersistenceServerServiceTest; import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.ReportTemplateUploadRequest; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import static org.assertj.core.api.Assertions.assertThat; public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { @@ -17,38 +19,407 @@ public class ReportTemplateTest extends AbstractPersistenceServerServiceTest { @Autowired private ReportTemplateClient reportTemplateClient; + + /* + * Upload report, verify it exist and delete afterwards + */ @Test public void testReportTemplate() { + // Arrange + String fileName = "report.xlsx"; var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + // Act & Assert var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isEmpty(); reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() .activeByDefault(true) .dossierTemplateId(dossierTemplate.getId()) - .multiFileReport(true) - .fileName("test.docx") - .template(new byte[]{1, 2, 3, 4}).build()); - + .multiFileReport(false) + .fileName(fileName) + .template(new byte[]{1, 2, 3, 4}) + .build()); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isNotEmpty(); - - var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator().next().getTemplateId()); + var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator() + .next() + .getTemplateId()); assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); - + assertThat(firstTemplate.getFileName()).isEqualTo(fileName); var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); assertThat(download.getFile().length).isEqualTo(4); - reportTemplateClient.deleteTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); assertThat(availableTemplates).isEmpty(); } + + + /* + * Upload multiFile report, verify it exist with correct fileName and delete afterwards + */ + @Test + public void testMultiFileReportTemplate() { + + // Arrange + String fileName = "report.xlsx"; + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + // Act & Assert + var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isEmpty(); + + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .activeByDefault(true) + .dossierTemplateId(dossierTemplate.getId()) + .multiFileReport(true) + .fileName(fileName) + .template(new byte[]{1, 2, 3, 4}) + .build()); + + availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isNotEmpty(); + + var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator() + .next() + .getTemplateId()); + assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); + assertThat(firstTemplate.getFileName()).isEqualTo("report(multifile).xlsx"); + + var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); + assertThat(download.getFile().length).isEqualTo(4); + + reportTemplateClient.deleteTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); + + availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isEmpty(); + + } + + + /* + * Try to upload template two times + */ + @Test + public void testReportTemplateTwoTimes() { + + // Arrange + String fileName = "report.xlsx"; + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + // Act & Assert + var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isEmpty(); + + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .activeByDefault(true) + .dossierTemplateId(dossierTemplate.getId()) + .multiFileReport(false) + .fileName(fileName) + .template(new byte[]{1, 2, 3, 4}) + .build()); + + availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isNotEmpty(); + + final Throwable thrown = catchThrowable(() -> { + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .activeByDefault(true) + .dossierTemplateId(dossierTemplate.getId()) + .multiFileReport(false) + .fileName(fileName) + .template(new byte[]{1, 2, 3, 4}) + .build()); + }); + + assertThat(thrown.getMessage()).contains("Template already exists"); + + } + + + /* + * Try to upload multi file template two times + */ + @Test + public void testMultiFileReportTemplateTwoTimes() { + + // Arrange + String fileName = "report.xlsx"; + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + // Act & Assert + var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isEmpty(); + + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .activeByDefault(true) + .dossierTemplateId(dossierTemplate.getId()) + .multiFileReport(true) + .fileName(fileName) + .template(new byte[]{1, 2, 3, 4}) + .build()); + + availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isNotEmpty(); + + final Throwable thrown = catchThrowable(() -> { + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .activeByDefault(true) + .dossierTemplateId(dossierTemplate.getId()) + .multiFileReport(true) + .fileName(fileName) + .template(new byte[]{1, 2, 3, 4}) + .build()); + }); + + assertThat(thrown.getMessage()).contains("Template already exists"); + + } + + + /* + * Upload template file and then multi file template with the same name + */ + @Test + public void testReportTemplateAndThenMultiFileReportTemple() { + + // Arrange + String fileName = "report.xlsx"; + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + // Act & Assert + var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isEmpty(); + + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .activeByDefault(true) + .dossierTemplateId(dossierTemplate.getId()) + .multiFileReport(false) + .fileName(fileName) + .template(new byte[]{1, 2, 3, 4}) + .build()); + + availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isNotEmpty(); + + var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator() + .next() + .getTemplateId()); + assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); + assertThat(firstTemplate.getFileName()).isEqualTo(fileName); + + var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); + assertThat(download.getFile().length).isEqualTo(4); + + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .activeByDefault(true) + .dossierTemplateId(dossierTemplate.getId()) + .multiFileReport(true) + .fileName(fileName) + .template(new byte[]{1, 2, 3, 4}) + .build()); + + availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isNotEmpty(); + assertThat(availableTemplates.size()).isEqualTo(2); + + var secondTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.get(1) + .getTemplateId()); + assertThat(availableTemplates.get(1)).isEqualTo(secondTemplate); + assertThat(secondTemplate.getFileName()).isEqualTo("report(multifile).xlsx"); + + } + + + /* + * Upload multi file template and then template file with the same name + */ + @Test + public void testMultiFileReportTemplateAndThenReportTemple() { + + // Arrange + String fileName = "report.xlsx"; + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + // Act & Assert + var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isEmpty(); + + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .activeByDefault(true) + .dossierTemplateId(dossierTemplate.getId()) + .multiFileReport(true) + .fileName(fileName) + .template(new byte[]{1, 2, 3, 4}) + .build()); + + availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isNotEmpty(); + + var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator() + .next() + .getTemplateId()); + assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); + assertThat(firstTemplate.getFileName()).isEqualTo("report(multifile).xlsx"); + + var download = reportTemplateClient.downloadReportTemplate(firstTemplate.getDossierTemplateId(), firstTemplate.getTemplateId()); + assertThat(download.getFile().length).isEqualTo(4); + + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .activeByDefault(true) + .dossierTemplateId(dossierTemplate.getId()) + .multiFileReport(false) + .fileName(fileName) + .template(new byte[]{1, 2, 3, 4}) + .build()); + + availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isNotEmpty(); + assertThat(availableTemplates.size()).isEqualTo(2); + + var secondTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.get(1) + .getTemplateId()); + assertThat(availableTemplates.get(1)).isEqualTo(secondTemplate); + assertThat(secondTemplate.getFileName()).isEqualTo(fileName); + + } + + + /* + * Upload MF with ending xlsx + */ + @Test + public void testMultiFileReportTemplateAsExcel() { + // Arrange + String fileName = "report with really_weird~Name(567) [}=§$783 XYz&"; + String fileEnding = ".xlsx"; + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + // Act & Assert + var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isEmpty(); + + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .activeByDefault(true) + .dossierTemplateId(dossierTemplate.getId()) + .multiFileReport(true) + .fileName(fileName + fileEnding) + .template(new byte[]{1, 2, 3, 4}) + .build()); + + availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isNotEmpty(); + + var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator() + .next() + .getTemplateId()); + assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); + assertThat(firstTemplate.getFileName()).isEqualTo(fileName + "(multifile)" + fileEnding); + + } + + + /* + * Upload MF with ending docx + */ + @Test + public void testMultiFileReportTemplateAsWord() { + // Arrange + String fileName = "report with really_weird~Name(567) [}=§$783 XYz&"; + String fileEnding = ".docx"; + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + // Act & Assert + var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isEmpty(); + + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .activeByDefault(true) + .dossierTemplateId(dossierTemplate.getId()) + .multiFileReport(true) + .fileName(fileName + fileEnding) + .template(new byte[]{1, 2, 3, 4}) + .build()); + + availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isNotEmpty(); + + var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator() + .next() + .getTemplateId()); + assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); + assertThat(firstTemplate.getFileName()).isEqualTo(fileName + "(multifile)" + fileEnding); + + } + + + /* + * Upload multiFile report with fantasy fileEnding + */ + @Test + public void testMultiFileReportTemplateWithFantasyName() { + // Arrange + String fileName = "report with really_weird~Name(567) [}=§$783 XYz&"; + String fileEnding = ".fantasyEnding"; + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + // Act & Assert + var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isEmpty(); + + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .activeByDefault(true) + .dossierTemplateId(dossierTemplate.getId()) + .multiFileReport(true) + .fileName(fileName + fileEnding) + .template(new byte[]{1, 2, 3, 4}) + .build()); + + availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isNotEmpty(); + + var firstTemplate = reportTemplateClient.getReportTemplate(dossierTemplate.getId(), availableTemplates.iterator() + .next() + .getTemplateId()); + assertThat(availableTemplates.iterator().next()).isEqualTo(firstTemplate); + assertThat(firstTemplate.getFileName()).isEqualTo(fileName + "(multifile)" + fileEnding); + + } + + + /* + * Upload multiFile report with corrupt fileName + */ + @Test + public void testMultiFileReportTemplateWithCorruptFileName() { + // Arrange + String fileName = "report"; + String fileEnding = "endingWithoutDot"; + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + + // Act & Assert + var availableTemplates = reportTemplateClient.getAvailableReportTemplates(dossierTemplate.getId()); + assertThat(availableTemplates).isEmpty(); + + final Throwable thrown = catchThrowable(() -> { + reportTemplateClient.uploadTemplate(ReportTemplateUploadRequest.builder() + .activeByDefault(true) + .dossierTemplateId(dossierTemplate.getId()) + .multiFileReport(true) + .fileName(fileName + fileEnding) + .template(new byte[]{1, 2, 3, 4}) + .build()); + }); + + assertThat(thrown.getMessage()).contains("FileName is not correct"); + + } + }