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 31bb0ec38..bb32401ac 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 @@ -397,8 +397,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..3bee17a28 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; @@ -58,7 +64,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 +80,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 +95,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 +170,10 @@ public class FileTest extends AbstractPersistenceServerServiceTest { @Autowired private DocumentDataFilesConversionJob documentDataFilesConversionJob; + @MockBean + private NotificationPersistenceService notificationPersistenceService; + @Captor + private ArgumentCaptor captor; @Test @@ -1187,4 +1201,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()); + } + }