From 419fa4628b1df12fea6ad3ee757f0b1aeafc0da8 Mon Sep 17 00:00:00 2001 From: corinaolariu Date: Fri, 8 Nov 2024 14:50:39 +0200 Subject: [PATCH] RED-9588 - No "You have been unassigned..." Notification after setting file status to back to new - update the condition for sending unassigned notification - unit test added --- .../api/impl/controller/StatusController.java | 6 +- .../v1/server/integration/tests/FileTest.java | 67 ++++++++++++++++++- 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java index 126cbf294..d5e3936d0 100644 --- a/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java +++ b/persistence-service-v1/persistence-service-external-api-impl-v1/src/main/java/com/iqser/red/persistence/service/v1/external/api/impl/controller/StatusController.java @@ -369,8 +369,10 @@ public class StatusController implements StatusResource { private void generatePossibleUnassignedFromFileNotification(String dossierId, String fileId, FileModel oldFileStatus, String newAssigneeId) { - if (oldFileStatus.getAssignee() == null || newAssigneeId == null || oldFileStatus.getAssignee().equals(newAssigneeId) || KeycloakSecurity.getUserId() - .equals(oldFileStatus.getAssignee())) { + if (oldFileStatus.getAssignee() == null + || newAssigneeId == null && oldFileStatus.getAssignee() == null + || oldFileStatus.getAssignee().equals(newAssigneeId) + || KeycloakSecurity.getUserId().equals(oldFileStatus.getAssignee())) { return; } diff --git a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java index 0b6fccd75..1fe8f4275 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java +++ b/persistence-service-v1/persistence-service-server-v1/src/test/java/com/iqser/red/service/peristence/v1/server/integration/tests/FileTest.java @@ -8,6 +8,8 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.ByteArrayInputStream; @@ -25,8 +27,12 @@ import java.util.Set; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mockito; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.core.io.ClassPathResource; import org.springframework.mock.web.MockMultipartFile; @@ -40,6 +46,8 @@ import com.iqser.red.service.peristence.v1.server.integration.client.FileAttribu import com.iqser.red.service.peristence.v1.server.integration.client.FileClient; import com.iqser.red.service.peristence.v1.server.integration.client.FileManagementClient; import com.iqser.red.service.peristence.v1.server.integration.client.ManualRedactionClient; +import com.iqser.red.service.peristence.v1.server.integration.client.NotificationClient; +import com.iqser.red.service.peristence.v1.server.integration.client.NotificationPreferencesClient; import com.iqser.red.service.peristence.v1.server.integration.client.ReanalysisClient; import com.iqser.red.service.peristence.v1.server.integration.client.UploadClient; import com.iqser.red.service.peristence.v1.server.integration.client.ViewedPagesClient; @@ -58,7 +66,9 @@ import com.iqser.red.service.persistence.management.v1.processor.service.job.Del import com.iqser.red.service.persistence.management.v1.processor.service.job.DocumentDataFilesConversionJob; import com.iqser.red.service.persistence.management.v1.processor.service.job.SoftDeletedFilesCleanupJob; import com.iqser.red.service.persistence.management.v1.processor.service.persistence.FileAttributeConfigPersistenceService; +import com.iqser.red.service.persistence.management.v1.processor.service.persistence.NotificationPersistenceService; import com.iqser.red.service.persistence.management.v1.processor.utils.StorageIdUtils; +import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.DossierTemplateModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributes; import com.iqser.red.service.persistence.service.v1.api.shared.model.FileAttributesConfig; @@ -72,6 +82,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryState; import com.iqser.red.service.persistence.service.v1.api.shared.model.analysislog.entitylog.EntryType; import com.iqser.red.service.persistence.service.v1.api.shared.model.annotations.AnnotationComments; +import com.iqser.red.service.persistence.service.v1.api.shared.model.audit.AddNotificationRequest; import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.Dossier; import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.dossier.file.FileAttributeConfig; @@ -86,6 +97,7 @@ import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.Forc import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.LegalBasisChangeRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RecategorizationRequestModel; import com.iqser.red.service.persistence.service.v1.api.shared.model.manual.RemoveRedactionRequestModel; +import com.iqser.red.service.persistence.service.v1.api.shared.model.notification.NotificationType; import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPageProto; import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentPositionDataProto; import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentStructureProto; @@ -160,6 +172,10 @@ public class FileTest extends AbstractPersistenceServerServiceTest { @Autowired private DocumentDataFilesConversionJob documentDataFilesConversionJob; + @MockBean + private NotificationPersistenceService notificationPersistenceService; + @Captor + private ArgumentCaptor captor; @Test @@ -464,10 +480,18 @@ public class FileTest extends AbstractPersistenceServerServiceTest { manualRedactionClient.removeRedactionBulk(dossierId, fileId, - Set.of(RemoveRedactionRequestModel.builder().annotationId(annotationId).comment("removeComment").removeFromDictionary(false).build())); + Set.of(RemoveRedactionRequestModel.builder() + .annotationId(annotationId) + .comment("removeComment") + .removeFromDictionary(false) + .build())); manualRedactionClient.forceRedactionBulk(dossierId, fileId, - Set.of(ForceRedactionRequestModel.builder().annotationId("forceRedactionAnnotation").comment("forceComment").legalBasis("1").build())); + Set.of(ForceRedactionRequestModel.builder() + .annotationId("forceRedactionAnnotation") + .comment("forceComment") + .legalBasis("1") + .build())); manualRedactionClient.legalBasisChangeBulk(dossierId, fileId, Set.of(LegalBasisChangeRequestModel.builder() @@ -1187,4 +1211,43 @@ public class FileTest extends AbstractPersistenceServerServiceTest { DocumentPositionDataProto.AllDocumentPositionData allDocumentPositionData = DocumentPositionDataProto.AllDocumentPositionData.parseFrom(documentPositionBytes); } + + @Test + public void testUserNotificationsWhenUnAssigned() { //RED-9588 + + var dossierTemplate = dossierTemplateTesterAndProvider.provideTestTemplate(); + var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate); + var file = fileTesterAndProvider.testAndProvideFile(dossier); + var file2 = fileTesterAndProvider.testAndProvideFile(dossier, "file2"); + + var currentUserId = userProvider.getUserId(); + var user1 = userProvider.getAltUserId(); + var user2 = userProvider.getMemberUserId(); + assertThat(currentUserId).isNotEqualTo(user1); + assertThat(currentUserId).isNotEqualTo(user2); + assertThat(user1).isNotEqualTo(user2); + + DossierRequest cru = new DossierRequest(); + cru.setDossierTemplateId(dossierTemplate.getId()); + BeanUtils.copyProperties(dossier, cru); + cru.getMemberIds().add(user1); + cru.getMemberIds().add(user2); + dossierClient.createDossierOrUpdateDossier(cru); + + fileClient.setStatusUnderReviewForList(dossier.getId(), List.of(file.getId(), file2.getId()), user1); + var fileStatus1 = fileClient.getFileStatus(dossier.getId(), file.getId()); + assertEquals(WorkflowStatus.UNDER_REVIEW, fileStatus1.getWorkflowStatus()); + assertEquals(user1, fileStatus1.getAssignee()); + + fileClient.setStatusNewForList(dossier.getId(), List.of(file.getId(), file2.getId())); + fileStatus1 = fileClient.getFileStatus(dossier.getId(), file.getId()); + assertEquals(WorkflowStatus.NEW, fileStatus1.getWorkflowStatus()); + assertNull(fileStatus1.getAssignee()); + + verify(notificationPersistenceService, times(5)).insertNotification(captor.capture()); + + Assertions.assertEquals(captor.getValue().getUserId(), user1); + Assertions.assertEquals(captor.getValue().getNotificationType(), NotificationType.UNASSIGNED_FROM_FILE.name()); + } + }