From c3029c27dce61576080c98e08fb11a574ec0f195 Mon Sep 17 00:00:00 2001 From: Aditya Dwadasi Date: Fri, 29 Aug 2025 17:02:23 +0100 Subject: [PATCH 1/5] RWA-4661: Added new test case for complete --- ...TaskCompleteByIdControllerReplicaTest.java | 310 ++++++++++++++++++ 1 file changed, 310 insertions(+) create mode 100644 src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java b/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java new file mode 100644 index 0000000000..96dca82761 --- /dev/null +++ b/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java @@ -0,0 +1,310 @@ +package uk.gov.hmcts.reform.wataskmanagementapi.controllers; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import uk.gov.hmcts.reform.authorisation.ServiceAuthorisationApi; +import uk.gov.hmcts.reform.authorisation.generators.AuthTokenGenerator; +import uk.gov.hmcts.reform.wataskmanagementapi.auth.access.AccessControlService; +import uk.gov.hmcts.reform.wataskmanagementapi.auth.access.entities.AccessControlResponse; +import uk.gov.hmcts.reform.wataskmanagementapi.auth.idam.IdamService; +import uk.gov.hmcts.reform.wataskmanagementapi.auth.idam.entities.Token; +import uk.gov.hmcts.reform.wataskmanagementapi.auth.idam.entities.UserInfo; +import uk.gov.hmcts.reform.wataskmanagementapi.auth.restrict.ClientAccessControlService; +import uk.gov.hmcts.reform.wataskmanagementapi.auth.role.entities.RoleAssignment; +import uk.gov.hmcts.reform.wataskmanagementapi.auth.role.entities.response.RoleAssignmentResource; +import uk.gov.hmcts.reform.wataskmanagementapi.clients.CamundaServiceApi; +import uk.gov.hmcts.reform.wataskmanagementapi.clients.IdamWebApi; +import uk.gov.hmcts.reform.wataskmanagementapi.clients.RoleAssignmentServiceApi; +import uk.gov.hmcts.reform.wataskmanagementapi.config.LaunchDarklyFeatureFlagProvider; +import uk.gov.hmcts.reform.wataskmanagementapi.config.features.FeatureFlag; +import uk.gov.hmcts.reform.wataskmanagementapi.controllers.request.CompleteTaskRequest; +import uk.gov.hmcts.reform.wataskmanagementapi.domain.camunda.SecurityClassification; +import uk.gov.hmcts.reform.wataskmanagementapi.domain.enums.TestRolesWithGrantType; +import uk.gov.hmcts.reform.wataskmanagementapi.entity.NoteResource; +import uk.gov.hmcts.reform.wataskmanagementapi.entity.ReportableTaskResource; +import uk.gov.hmcts.reform.wataskmanagementapi.entity.TaskResource; +import uk.gov.hmcts.reform.wataskmanagementapi.entity.TaskRoleResource; +import uk.gov.hmcts.reform.wataskmanagementapi.enums.TaskAction; +import uk.gov.hmcts.reform.wataskmanagementapi.services.CFTTaskDatabaseService; +import uk.gov.hmcts.reform.wataskmanagementapi.services.ReplicaBaseTest; +import uk.gov.hmcts.reform.wataskmanagementapi.utils.ServiceMocks; + +import java.time.OffsetDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.awaitility.Awaitility.await; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.when; +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static uk.gov.hmcts.reform.wataskmanagementapi.cft.enums.CFTTaskState.COMPLETED; +import static uk.gov.hmcts.reform.wataskmanagementapi.cft.enums.CFTTaskState.UNASSIGNED; +import static uk.gov.hmcts.reform.wataskmanagementapi.config.SecurityConfiguration.AUTHORIZATION; +import static uk.gov.hmcts.reform.wataskmanagementapi.config.SecurityConfiguration.SERVICE_AUTHORIZATION; +import static uk.gov.hmcts.reform.wataskmanagementapi.utils.ServiceMocks.IDAM_AUTHORIZATION_TOKEN; +import static uk.gov.hmcts.reform.wataskmanagementapi.utils.ServiceMocks.IDAM_OTHER_USER_ID; +import static uk.gov.hmcts.reform.wataskmanagementapi.utils.ServiceMocks.IDAM_USER_EMAIL; +import static uk.gov.hmcts.reform.wataskmanagementapi.utils.ServiceMocks.IDAM_USER_ID; +import static uk.gov.hmcts.reform.wataskmanagementapi.utils.ServiceMocks.SERVICE_AUTHORIZATION_TOKEN; + +@ActiveProfiles("replica") +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) +@Slf4j +public class PostTaskCompleteByIdControllerReplicaTest extends ReplicaBaseTest { + + private static final String ENDPOINT_PATH = "/task/%s/complete"; + private static String ENDPOINT_BEING_TESTED; + + @MockitoBean + LaunchDarklyFeatureFlagProvider launchDarklyFeatureFlagProvider; + + @MockitoBean + private AuthTokenGenerator authTokenGenerator; + + @MockitoBean + private IdamWebApi idamWebApi; + @MockitoBean + private CamundaServiceApi camundaServiceApi; + @MockitoBean + private RoleAssignmentServiceApi roleAssignmentServiceApi; + @MockitoBean + private ServiceAuthorisationApi serviceAuthorisationApi; + @Autowired + private CFTTaskDatabaseService cftTaskDatabaseService; + @MockitoBean + private IdamService idamService; + @MockitoBean + private AccessControlService accessControlService; + @MockitoBean + private ClientAccessControlService clientAccessControlService; + + @Mock + private UserInfo mockedUserInfo; + + private ServiceMocks mockServices; + + @Test + void when_the_task_completed_values_should_reflect_replica_db() throws Exception { + + final String taskId = UUID.randomUUID().toString(); + + when(clientAccessControlService.hasPrivilegedAccess(eq(SERVICE_AUTHORIZATION_TOKEN), any())) + .thenReturn(false); + + lenient().when(launchDarklyFeatureFlagProvider.getBooleanValue(eq(FeatureFlag.WA_COMPLETION_PROCESS_UPDATE), + anyString(), anyString())).thenReturn(false); + when(authTokenGenerator.generate()) + .thenReturn(IDAM_AUTHORIZATION_TOKEN); + lenient().when(mockedUserInfo.getUid()) + .thenReturn(IDAM_USER_ID); + lenient().when(mockedUserInfo.getEmail()) + .thenReturn(IDAM_USER_EMAIL); + + mockServices = new ServiceMocks( + idamWebApi, + serviceAuthorisationApi, + camundaServiceApi, + roleAssignmentServiceApi + ); + + mockServices.mockUserInfo(); + + RoleAssignmentRequest roleAssignmentRequest = RoleAssignmentRequest.builder() + .testRolesWithGrantType(TestRolesWithGrantType.STANDARD_TRIBUNAL_CASE_WORKER_PUBLIC) + .roleAssignmentAttribute( + RoleAssignmentAttribute.builder() + .jurisdiction("IA") + .caseType("Asylum") + .caseId("completeCaseId1") + .build() + ) + .build(); + + List roleAssignments = new ArrayList<>(); + + createRoleAssignment(roleAssignments, roleAssignmentRequest); + + final RoleAssignmentResource accessControlResponse = new RoleAssignmentResource(roleAssignments); + + + + TaskRoleResource taskRoleResource = new TaskRoleResource( + TestRolesWithGrantType.STANDARD_TRIBUNAL_CASE_WORKER_PUBLIC.getRoleName(), + true, true, true, false, false, false, + new String[]{}, 1, false, + TestRolesWithGrantType.STANDARD_TRIBUNAL_CASE_WORKER_PUBLIC.getRoleCategory().name() + ); + + taskRoleResource.setComplete(true); + + insertDummyTaskInDb("IA", "Asylum", taskId, taskRoleResource,IDAM_USER_ID); + + await() + .pollDelay(5, SECONDS) + .atMost(30, SECONDS) + .untilAsserted(() -> { + List reportableTaskList2 + = miReportingServiceForTest.findByReportingTaskId(taskId); + assertEquals(1, reportableTaskList2.size()); + }); + + ENDPOINT_BEING_TESTED = String.format(ENDPOINT_PATH, taskId); + + when(idamService.getUserInfo(IDAM_AUTHORIZATION_TOKEN)).thenReturn(mockedUserInfo); + when(roleAssignmentServiceApi.getRolesForUser( + any(), any(), any() + )).thenReturn(accessControlResponse); + when(accessControlService.getRoles(IDAM_AUTHORIZATION_TOKEN)) + .thenReturn(new AccessControlResponse(mockedUserInfo, roleAssignments)); + + lenient().when(mockedUserInfo.getUid()) + .thenReturn(IDAM_OTHER_USER_ID); + when(idamWebApi.token(any())).thenReturn(new Token(IDAM_AUTHORIZATION_TOKEN, "scope")); + when(serviceAuthorisationApi.serviceToken(any())).thenReturn(SERVICE_AUTHORIZATION_TOKEN); + + doNothing().when(camundaServiceApi).assignTask(any(), any(), any()); + doNothing().when(camundaServiceApi).addLocalVariablesToTask(any(), any(), any()); + + CompleteTaskRequest request = new CompleteTaskRequest(null); + mockMvc.perform( + post(ENDPOINT_BEING_TESTED) + .header(AUTHORIZATION, IDAM_AUTHORIZATION_TOKEN) + .header(SERVICE_AUTHORIZATION, SERVICE_AUTHORIZATION_TOKEN) + .contentType(APPLICATION_JSON_VALUE) + .content(asJsonString(request)) + ).andExpectAll( + status().isNoContent() + ); + + Optional taskResourcePostComplete = cftTaskDatabaseService.findByIdOnly(taskId); + + assertTrue(taskResourcePostComplete.isPresent()); + assertEquals(COMPLETED, taskResourcePostComplete.get().getState()); + assertEquals(IDAM_USER_ID, taskResourcePostComplete.get().getAssignee()); + assertNotNull(taskResourcePostComplete.get().getLastUpdatedTimestamp()); + assertEquals(IDAM_OTHER_USER_ID, taskResourcePostComplete.get().getLastUpdatedUser()); + assertEquals(TaskAction.COMPLETED.getValue(), taskResourcePostComplete.get().getLastUpdatedAction()); + + await() + .pollDelay(5, SECONDS) + .atMost(30, SECONDS) + .untilAsserted(() -> { + + List reportableTaskList + = miReportingServiceForTest.findByReportingTaskId(taskId); + + assertEquals(1, reportableTaskList.size()); + assertEquals("COMPLETED", reportableTaskList.get(0).getState()); + assertNotNull(reportableTaskList.get(0).getAssignee()); + assertNotNull(reportableTaskList.get(0).getUpdatedBy()); + assertNotNull(reportableTaskList.get(0).getUpdated()); + assertEquals("Complete", reportableTaskList.get(0).getUpdateAction()); + assertNotNull(reportableTaskList.get(0).getCompletedDate()); + assertNotNull(reportableTaskList.get(0).getCompletedDateTime()); + assertNotNull(reportableTaskList.get(0).getCreatedDate()); + assertNotNull(reportableTaskList.get(0).getDueDate()); + assertNotNull(reportableTaskList.get(0).getLastUpdatedDate()); + assertEquals("COMPLETED", reportableTaskList.get(0).getFinalStateLabel()); + assertNotNull(reportableTaskList.get(0).getFirstAssignedDate()); + assertNotNull(reportableTaskList.get(0).getFirstAssignedDateTime()); + Assertions.assertNull(reportableTaskList.get(0).getWaitTimeDays()); + Assertions.assertNull(reportableTaskList.get(0).getWaitTime()); + assertNotNull(reportableTaskList.get(0).getHandlingTimeDays()); + assertNotNull(reportableTaskList.get(0).getHandlingTime()); + assertNotNull(reportableTaskList.get(0).getProcessingTimeDays()); + assertNotNull(reportableTaskList.get(0).getProcessingTime()); + assertEquals("Yes", reportableTaskList.get(0).getIsWithinSla()); + assertEquals(0, reportableTaskList.get(0).getNumberOfReassignments()); + assertEquals(-1, reportableTaskList.get(0).getDueDateToCompletedDiffDays()); + assertNotNull(reportableTaskList.get(0).getDueDateToCompletedDiffTime()); + }); + + } + + private void insertDummyTaskInDb(String jurisdiction, String caseType, String taskId, + TaskRoleResource taskRoleResource, + String assignee) { + + TaskResource taskResource = new TaskResource( + taskId, + "someTaskName", + "someTaskType", + UNASSIGNED + ); + taskResource.setCreated(OffsetDateTime.now()); + taskResource.setDueDateTime(OffsetDateTime.now().plusDays(1)); + taskResource.setJurisdiction(jurisdiction); + taskResource.setCaseTypeId(caseType); + taskResource.setSecurityClassification(SecurityClassification.PUBLIC); + taskResource.setLocation("765324"); + taskResource.setLocationName("Taylor House"); + taskResource.setRegion("TestRegion"); + taskResource.setCaseId("completeCaseId1"); + taskResource.setAssignee(assignee); + taskResource.setLastUpdatedUser(assignee); + taskResource.setLastUpdatedAction("Configure"); + taskResource.setLastUpdatedTimestamp(OffsetDateTime.now()); + taskRoleResource.setTaskId(taskId); + Set taskRoleResourceSet = Set.of(taskRoleResource); + taskResource.setTaskRoleResources(taskRoleResourceSet); + + addMissingParameters(taskResource,true); + taskResource.setPriorityDate(OffsetDateTime.now().plusDays(3).withHour(10).withMinute(0).withSecond(0) + .withNano(0)); + taskResourceRepository.save(taskResource); + } + + private void addMissingParameters(TaskResource taskResource, boolean required) { + taskResource.setDescription(required + ? "[Decide an application](/case/WA/WaCaseType/${[CASE_REFERENCE]}/trigger/decideAnApplication)" + : null); + List notesList = new ArrayList<>(); + final NoteResource noteResource = new NoteResource( + "someCode", + "noteTypeVal", + "userVal", + "someContent" + ); + notesList.add(noteResource); + taskResource.setNotes(required ? notesList : null); + taskResource.setRegion(required ? "Wales" : null); + taskResource.setLocationName(required ? "Cardiff" : null); + taskResource.setAdditionalProperties(required ? Map.of( + "key1", "value1", + "key2", "value2", + "key3", "value3", + "key4", "value4" + ) : null); + taskResource.setReconfigureRequestTime(required + ? OffsetDateTime.now().plusDays(1).withHour(10).withMinute(0).withSecond(0).withNano(0) + : null); + taskResource.setLastReconfigurationTime(required + ? OffsetDateTime.now().plusDays(1).withHour(10).withMinute(0).withSecond(0).withNano(0) + : null); + taskResource.setNextHearingId(required ? "W-CA-1234" : null); + taskResource.setNextHearingDate(required + ? OffsetDateTime.now().plusDays(2).withHour(10).withMinute(0).withSecond(0).withNano(0) + : null); + } + +} From ded224f871113d259d07244dfa023d650f336463 Mon Sep 17 00:00:00 2001 From: Aditya Dwadasi Date: Mon, 6 Oct 2025 10:52:00 +0100 Subject: [PATCH 2/5] Updated the test name --- .../controllers/PostTaskCompleteByIdControllerReplicaTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java b/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java index 96dca82761..eaacd07012 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java @@ -104,7 +104,7 @@ public class PostTaskCompleteByIdControllerReplicaTest extends ReplicaBaseTest { private ServiceMocks mockServices; @Test - void when_the_task_completed_values_should_reflect_replica_db() throws Exception { + void should_update_reportable_task_values_when_complete_api_invoked() throws Exception { final String taskId = UUID.randomUUID().toString(); From 64bb880e395336851ee5bed9f738a95061aa049b Mon Sep 17 00:00:00 2001 From: Aditya Dwadasi Date: Mon, 6 Oct 2025 13:36:14 +0100 Subject: [PATCH 3/5] Added history table assertions. --- ...TaskCompleteByIdControllerReplicaTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java b/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java index eaacd07012..e7bb0a6021 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java @@ -28,6 +28,7 @@ import uk.gov.hmcts.reform.wataskmanagementapi.domain.enums.TestRolesWithGrantType; import uk.gov.hmcts.reform.wataskmanagementapi.entity.NoteResource; import uk.gov.hmcts.reform.wataskmanagementapi.entity.ReportableTaskResource; +import uk.gov.hmcts.reform.wataskmanagementapi.entity.TaskHistoryResource; import uk.gov.hmcts.reform.wataskmanagementapi.entity.TaskResource; import uk.gov.hmcts.reform.wataskmanagementapi.entity.TaskRoleResource; import uk.gov.hmcts.reform.wataskmanagementapi.enums.TaskAction; @@ -205,6 +206,24 @@ void should_update_reportable_task_values_when_complete_api_invoked() throws Exc assertEquals(IDAM_OTHER_USER_ID, taskResourcePostComplete.get().getLastUpdatedUser()); assertEquals(TaskAction.COMPLETED.getValue(), taskResourcePostComplete.get().getLastUpdatedAction()); + await() + .pollDelay(5, SECONDS) + .atMost(30, SECONDS) + .untilAsserted(() -> { + + List taskHistoryResourceList + = miReportingServiceForTest.findByTaskId(taskId); + + assertEquals(2, taskHistoryResourceList.size()); + assertEquals("COMPLETED", taskHistoryResourceList.get(1).getState()); + assertNotNull(taskHistoryResourceList.get(1).getAssignee()); + assertNotNull(taskHistoryResourceList.get(1).getUpdatedBy()); + assertNotNull(taskHistoryResourceList.get(1).getUpdated()); + assertEquals("Complete", taskHistoryResourceList.get(1).getUpdateAction()); + assertNotNull(taskHistoryResourceList.get(1).getCreated()); + assertNotNull(taskHistoryResourceList.get(1).getDueDateTime()); + }); + await() .pollDelay(5, SECONDS) .atMost(30, SECONDS) From 31eaabfaa90da218eb9133be6f0cc86fcc55ade4 Mon Sep 17 00:00:00 2001 From: Aditya Dwadasi Date: Thu, 16 Oct 2025 14:55:46 +0100 Subject: [PATCH 4/5] Test refactor --- ...TaskCompleteByIdControllerReplicaTest.java | 107 ++++-------------- .../utils/TaskTestUtils.java | 57 +++++++++- 2 files changed, 78 insertions(+), 86 deletions(-) diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java b/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java index e7bb0a6021..b3c804c720 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java @@ -2,6 +2,7 @@ import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; @@ -24,9 +25,7 @@ import uk.gov.hmcts.reform.wataskmanagementapi.config.LaunchDarklyFeatureFlagProvider; import uk.gov.hmcts.reform.wataskmanagementapi.config.features.FeatureFlag; import uk.gov.hmcts.reform.wataskmanagementapi.controllers.request.CompleteTaskRequest; -import uk.gov.hmcts.reform.wataskmanagementapi.domain.camunda.SecurityClassification; import uk.gov.hmcts.reform.wataskmanagementapi.domain.enums.TestRolesWithGrantType; -import uk.gov.hmcts.reform.wataskmanagementapi.entity.NoteResource; import uk.gov.hmcts.reform.wataskmanagementapi.entity.ReportableTaskResource; import uk.gov.hmcts.reform.wataskmanagementapi.entity.TaskHistoryResource; import uk.gov.hmcts.reform.wataskmanagementapi.entity.TaskResource; @@ -35,13 +34,11 @@ import uk.gov.hmcts.reform.wataskmanagementapi.services.CFTTaskDatabaseService; import uk.gov.hmcts.reform.wataskmanagementapi.services.ReplicaBaseTest; import uk.gov.hmcts.reform.wataskmanagementapi.utils.ServiceMocks; +import uk.gov.hmcts.reform.wataskmanagementapi.utils.TaskTestUtils; -import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.Optional; -import java.util.Set; import java.util.UUID; import static java.util.concurrent.TimeUnit.SECONDS; @@ -104,6 +101,13 @@ public class PostTaskCompleteByIdControllerReplicaTest extends ReplicaBaseTest { private ServiceMocks mockServices; + TaskTestUtils taskTestUtils; + + @BeforeAll + void init() { + taskTestUtils = new TaskTestUtils(cftTaskDatabaseService,"replica"); + } + @Test void should_update_reportable_task_values_when_complete_api_invoked() throws Exception { @@ -158,19 +162,6 @@ void should_update_reportable_task_values_when_complete_api_invoked() throws Exc taskRoleResource.setComplete(true); - insertDummyTaskInDb("IA", "Asylum", taskId, taskRoleResource,IDAM_USER_ID); - - await() - .pollDelay(5, SECONDS) - .atMost(30, SECONDS) - .untilAsserted(() -> { - List reportableTaskList2 - = miReportingServiceForTest.findByReportingTaskId(taskId); - assertEquals(1, reportableTaskList2.size()); - }); - - ENDPOINT_BEING_TESTED = String.format(ENDPOINT_PATH, taskId); - when(idamService.getUserInfo(IDAM_AUTHORIZATION_TOKEN)).thenReturn(mockedUserInfo); when(roleAssignmentServiceApi.getRolesForUser( any(), any(), any() @@ -186,6 +177,11 @@ void should_update_reportable_task_values_when_complete_api_invoked() throws Exc doNothing().when(camundaServiceApi).assignTask(any(), any(), any()); doNothing().when(camundaServiceApi).addLocalVariablesToTask(any(), any(), any()); + taskTestUtils.insertDummyTaskInDb("IA", "Asylum", "completeCaseId1", + taskId,UNASSIGNED, taskRoleResource,null, IDAM_USER_ID); + + ENDPOINT_BEING_TESTED = String.format(ENDPOINT_PATH, taskId); + CompleteTaskRequest request = new CompleteTaskRequest(null); mockMvc.perform( post(ENDPOINT_BEING_TESTED) @@ -197,6 +193,15 @@ void should_update_reportable_task_values_when_complete_api_invoked() throws Exc status().isNoContent() ); + await() + .pollDelay(5, SECONDS) + .atMost(30, SECONDS) + .untilAsserted(() -> { + List reportableTaskList2 + = miReportingServiceForTest.findByReportingTaskId(taskId); + assertEquals(1, reportableTaskList2.size()); + }); + Optional taskResourcePostComplete = cftTaskDatabaseService.findByIdOnly(taskId); assertTrue(taskResourcePostComplete.isPresent()); @@ -260,70 +265,4 @@ void should_update_reportable_task_values_when_complete_api_invoked() throws Exc } - private void insertDummyTaskInDb(String jurisdiction, String caseType, String taskId, - TaskRoleResource taskRoleResource, - String assignee) { - - TaskResource taskResource = new TaskResource( - taskId, - "someTaskName", - "someTaskType", - UNASSIGNED - ); - taskResource.setCreated(OffsetDateTime.now()); - taskResource.setDueDateTime(OffsetDateTime.now().plusDays(1)); - taskResource.setJurisdiction(jurisdiction); - taskResource.setCaseTypeId(caseType); - taskResource.setSecurityClassification(SecurityClassification.PUBLIC); - taskResource.setLocation("765324"); - taskResource.setLocationName("Taylor House"); - taskResource.setRegion("TestRegion"); - taskResource.setCaseId("completeCaseId1"); - taskResource.setAssignee(assignee); - taskResource.setLastUpdatedUser(assignee); - taskResource.setLastUpdatedAction("Configure"); - taskResource.setLastUpdatedTimestamp(OffsetDateTime.now()); - taskRoleResource.setTaskId(taskId); - Set taskRoleResourceSet = Set.of(taskRoleResource); - taskResource.setTaskRoleResources(taskRoleResourceSet); - - addMissingParameters(taskResource,true); - taskResource.setPriorityDate(OffsetDateTime.now().plusDays(3).withHour(10).withMinute(0).withSecond(0) - .withNano(0)); - taskResourceRepository.save(taskResource); - } - - private void addMissingParameters(TaskResource taskResource, boolean required) { - taskResource.setDescription(required - ? "[Decide an application](/case/WA/WaCaseType/${[CASE_REFERENCE]}/trigger/decideAnApplication)" - : null); - List notesList = new ArrayList<>(); - final NoteResource noteResource = new NoteResource( - "someCode", - "noteTypeVal", - "userVal", - "someContent" - ); - notesList.add(noteResource); - taskResource.setNotes(required ? notesList : null); - taskResource.setRegion(required ? "Wales" : null); - taskResource.setLocationName(required ? "Cardiff" : null); - taskResource.setAdditionalProperties(required ? Map.of( - "key1", "value1", - "key2", "value2", - "key3", "value3", - "key4", "value4" - ) : null); - taskResource.setReconfigureRequestTime(required - ? OffsetDateTime.now().plusDays(1).withHour(10).withMinute(0).withSecond(0).withNano(0) - : null); - taskResource.setLastReconfigurationTime(required - ? OffsetDateTime.now().plusDays(1).withHour(10).withMinute(0).withSecond(0).withNano(0) - : null); - taskResource.setNextHearingId(required ? "W-CA-1234" : null); - taskResource.setNextHearingDate(required - ? OffsetDateTime.now().plusDays(2).withHour(10).withMinute(0).withSecond(0).withNano(0) - : null); - } - } diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/utils/TaskTestUtils.java b/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/utils/TaskTestUtils.java index d8ca5a2863..d16c545b8f 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/utils/TaskTestUtils.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/utils/TaskTestUtils.java @@ -20,6 +20,7 @@ import uk.gov.hmcts.reform.wataskmanagementapi.domain.camunda.PermissionsDmnEvaluationResponse; import uk.gov.hmcts.reform.wataskmanagementapi.domain.camunda.SecurityClassification; import uk.gov.hmcts.reform.wataskmanagementapi.domain.enums.TestRolesWithGrantType; +import uk.gov.hmcts.reform.wataskmanagementapi.entity.NoteResource; import uk.gov.hmcts.reform.wataskmanagementapi.entity.TaskResource; import uk.gov.hmcts.reform.wataskmanagementapi.entity.TaskRoleResource; import uk.gov.hmcts.reform.wataskmanagementapi.services.CFTTaskDatabaseService; @@ -29,6 +30,7 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.UUID; @@ -42,8 +44,16 @@ public class TaskTestUtils { private final CFTTaskDatabaseService cftTaskDatabaseService; + private final String profile; + public TaskTestUtils(CFTTaskDatabaseService cftTaskDatabaseService) { this.cftTaskDatabaseService = cftTaskDatabaseService; + this.profile = "primary"; + } + + public TaskTestUtils(CFTTaskDatabaseService cftTaskDatabaseService, String profile) { + this.cftTaskDatabaseService = cftTaskDatabaseService; + this.profile = profile; } public String createTaskAndRoleAssignments(CFTTaskState cftTaskState, String caseId,OffsetDateTime dueDateTime, @@ -98,7 +108,7 @@ public void insertDummyTaskInDb(String jurisdiction, if (null != dueDateTime) { taskResource.setDueDateTime(dueDateTime); } else { - taskResource.setDueDateTime(OffsetDateTime.now()); + taskResource.setDueDateTime(OffsetDateTime.now().plusDays(1)); } taskResource.setJurisdiction(jurisdiction); taskResource.setCaseTypeId(caseType); @@ -111,7 +121,13 @@ public void insertDummyTaskInDb(String jurisdiction, if (null != assignee) { taskResource.setAssignee(assignee); } - + if ("replica".equals(profile)) { + taskResource.setLastUpdatedAction("Configure"); + taskResource.setLastUpdatedTimestamp(OffsetDateTime.now()); + addMissingParameters(taskResource,true); + taskResource.setPriorityDate(OffsetDateTime.now().plusDays(3).withHour(10).withMinute(0).withSecond(0) + .withNano(0)); + } taskRoleResource.setTaskId(taskId); Set taskRoleResourceSet = Set.of(taskRoleResource); taskResource.setTaskRoleResources(taskRoleResourceSet); @@ -348,4 +364,41 @@ public RoleAssignment buildRoleAssignment(String actorId, String roleName, List< .endTime(OffsetDateTime.now().plusYears(1)) .build(); } + + private void addMissingParameters(TaskResource taskResource, boolean required) { + taskResource.setDescription(required + ? "[Decide an application](/case/WA/WaCaseType/" + + "${[CASE_REFERENCE]}/trigger/decideAnApplication)" + : null); + List notesList = new ArrayList<>(); + final NoteResource noteResource = new NoteResource( + "someCode", + "noteTypeVal", + "userVal", + "someContent" + ); + notesList.add(noteResource); + taskResource.setNotes(required ? notesList : null); + taskResource.setRegion(required ? "Wales" : null); + taskResource.setLocationName(required ? "Cardiff" : null); + taskResource.setAdditionalProperties(required ? Map.of( + "key1", "value1", + "key2", "value2", + "key3", "value3", + "key4", "value4" + ) : null); + taskResource.setReconfigureRequestTime(required + ? OffsetDateTime.now().plusDays(1).withHour(10) + .withMinute(0).withSecond(0).withNano(0) + : null); + taskResource.setLastReconfigurationTime(required + ? OffsetDateTime.now().plusDays(1).withHour(10) + .withMinute(0).withSecond(0).withNano(0) + : null); + taskResource.setNextHearingId(required ? "W-CA-1234" : null); + taskResource.setNextHearingDate(required + ? OffsetDateTime.now().plusDays(2).withHour(10).withMinute(0) + .withSecond(0).withNano(0) + : null); + } } From 6f3288288c2de1d65d8deca7559f7fe875db7516 Mon Sep 17 00:00:00 2001 From: Aditya Dwadasi Date: Fri, 17 Oct 2025 10:55:22 +0100 Subject: [PATCH 5/5] Updated the Assertions --- ...TaskCompleteByIdControllerReplicaTest.java | 101 ++++++++++++++---- 1 file changed, 81 insertions(+), 20 deletions(-) diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java b/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java index b3c804c720..dabf80b0c6 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/wataskmanagementapi/controllers/PostTaskCompleteByIdControllerReplicaTest.java @@ -36,12 +36,20 @@ import uk.gov.hmcts.reform.wataskmanagementapi.utils.ServiceMocks; import uk.gov.hmcts.reform.wataskmanagementapi.utils.TaskTestUtils; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; import static java.util.concurrent.TimeUnit.SECONDS; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.within; import static org.awaitility.Awaitility.await; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -212,7 +220,7 @@ void should_update_reportable_task_values_when_complete_api_invoked() throws Exc assertEquals(TaskAction.COMPLETED.getValue(), taskResourcePostComplete.get().getLastUpdatedAction()); await() - .pollDelay(5, SECONDS) + .pollDelay(3, SECONDS) .atMost(30, SECONDS) .untilAsserted(() -> { @@ -221,16 +229,24 @@ void should_update_reportable_task_values_when_complete_api_invoked() throws Exc assertEquals(2, taskHistoryResourceList.size()); assertEquals("COMPLETED", taskHistoryResourceList.get(1).getState()); - assertNotNull(taskHistoryResourceList.get(1).getAssignee()); - assertNotNull(taskHistoryResourceList.get(1).getUpdatedBy()); - assertNotNull(taskHistoryResourceList.get(1).getUpdated()); + assertEquals(IDAM_USER_ID, taskHistoryResourceList.get(1).getAssignee()); + assertEquals(IDAM_OTHER_USER_ID, taskHistoryResourceList.get(1).getUpdatedBy()); assertEquals("Complete", taskHistoryResourceList.get(1).getUpdateAction()); - assertNotNull(taskHistoryResourceList.get(1).getCreated()); - assertNotNull(taskHistoryResourceList.get(1).getDueDateTime()); + + OffsetDateTime expected = OffsetDateTime.now(); + + assertThat(taskHistoryResourceList.get(1).getUpdated()) + .isCloseTo(expected, within(1, ChronoUnit.MINUTES)); + + assertThat(taskHistoryResourceList.get(1).getCreated()) + .isCloseTo(expected, within(1, ChronoUnit.MINUTES)); + + assertThat(taskHistoryResourceList.get(1).getDueDateTime()) + .isCloseTo(expected.plusDays(1), within(1, ChronoUnit.MINUTES)); }); await() - .pollDelay(5, SECONDS) + .pollDelay(3, SECONDS) .atMost(30, SECONDS) .untilAsserted(() -> { @@ -240,27 +256,72 @@ void should_update_reportable_task_values_when_complete_api_invoked() throws Exc assertEquals(1, reportableTaskList.size()); assertEquals("COMPLETED", reportableTaskList.get(0).getState()); assertNotNull(reportableTaskList.get(0).getAssignee()); + assertEquals(IDAM_USER_ID, reportableTaskList.get(0).getAssignee()); assertNotNull(reportableTaskList.get(0).getUpdatedBy()); - assertNotNull(reportableTaskList.get(0).getUpdated()); + assertEquals(IDAM_OTHER_USER_ID, reportableTaskList.get(0).getUpdatedBy()); + + OffsetDateTime expected = OffsetDateTime.now(); + + assertThat(reportableTaskList.get(0).getUpdated()) + .isCloseTo(expected, within(1, ChronoUnit.MINUTES)); assertEquals("Complete", reportableTaskList.get(0).getUpdateAction()); - assertNotNull(reportableTaskList.get(0).getCompletedDate()); - assertNotNull(reportableTaskList.get(0).getCompletedDateTime()); - assertNotNull(reportableTaskList.get(0).getCreatedDate()); - assertNotNull(reportableTaskList.get(0).getDueDate()); - assertNotNull(reportableTaskList.get(0).getLastUpdatedDate()); + + LocalDate today = LocalDate.now(ZoneId.systemDefault()); + + assertEquals(today, reportableTaskList.get(0).getCompletedDate() + .toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); + assertThat(reportableTaskList.get(0).getCompletedDateTime().toLocalDate()) + .isEqualTo(expected.toLocalDate()); + assertEquals(today, reportableTaskList.get(0).getCreatedDate() + .toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); + + assertThat(reportableTaskList.get(0).getDueDate() + .toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDate()) + .isEqualTo(LocalDate.now().plusDays(1)); + + assertEquals(today, reportableTaskList.get(0).getLastUpdatedDate() + .toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); assertEquals("COMPLETED", reportableTaskList.get(0).getFinalStateLabel()); - assertNotNull(reportableTaskList.get(0).getFirstAssignedDate()); - assertNotNull(reportableTaskList.get(0).getFirstAssignedDateTime()); + assertEquals(today, reportableTaskList.get(0).getFirstAssignedDate() + .toInstant().atZone(ZoneId.systemDefault()).toLocalDate()); + assertThat(reportableTaskList.get(0).getFirstAssignedDateTime()) + .isCloseTo(expected, within(1, ChronoUnit.MINUTES)); Assertions.assertNull(reportableTaskList.get(0).getWaitTimeDays()); Assertions.assertNull(reportableTaskList.get(0).getWaitTime()); - assertNotNull(reportableTaskList.get(0).getHandlingTimeDays()); - assertNotNull(reportableTaskList.get(0).getHandlingTime()); - assertNotNull(reportableTaskList.get(0).getProcessingTimeDays()); - assertNotNull(reportableTaskList.get(0).getProcessingTime()); + assertEquals(0, reportableTaskList.get(0).getHandlingTimeDays()); + + long seconds = 0; + LocalTime time = null; + + String processingTime = reportableTaskList.get(0).getProcessingTime(); + time = LocalTime.parse(processingTime); + seconds = Duration.between(LocalTime.MIDNIGHT, time).getSeconds(); + assertTrue(seconds < 60, + String.format("Processing time %s exceeds 1 minute limit", processingTime)); + + String handlingTime = reportableTaskList.get(0).getHandlingTime(); + time = LocalTime.parse(handlingTime); + seconds = Duration.between(LocalTime.MIDNIGHT, time).getSeconds(); + assertTrue(seconds < 60, + String.format("Handling time %s exceeds 1 minute limit", processingTime)); + + assertEquals(0, reportableTaskList.get(0).getProcessingTimeDays()); assertEquals("Yes", reportableTaskList.get(0).getIsWithinSla()); assertEquals(0, reportableTaskList.get(0).getNumberOfReassignments()); assertEquals(-1, reportableTaskList.get(0).getDueDateToCompletedDiffDays()); - assertNotNull(reportableTaskList.get(0).getDueDateToCompletedDiffTime()); + + String diffTime = reportableTaskList.get(0).getDueDateToCompletedDiffTime(); + if (diffTime.contains("day")) { + int days = Integer.parseInt(diffTime.split(" ")[0]); + assertTrue(days <= 1, + String.format("Expected diff <= 1 day, but was %s", diffTime)); + } else { + time = LocalTime.parse(diffTime); + assertTrue(time.isBefore(LocalTime.MIDNIGHT.minus(1, ChronoUnit.MILLIS)), + String.format("Expected time < 24h, but was %s", time)); + } }); }