Skip to content

Commit

Permalink
Rwa 3193 mandatory fileds add validation during reconfig (#1357)
Browse files Browse the repository at this point in the history
* RWA-3193 only for testing

* RWA-3193 only for testing

* RWA-3193 only for testing

* RWA-3193 only for testing

* RWA-3193 only for testing

* RWA-3193 only for testing

* RWA-3193 only for testing

* RWA-3193 only for testing

* RWA-3193 only for testing

* RWA-3193 only for testing

* RWA-3193 only for testing

* RWA-3193 only for testing

* RWA-3193 add launchdarkly flag

* RWA-3193 add launchdarkly flag

* RWA-3193 add launchdarkly flag

* RWA-3193 add launchdarkly flag

* RWA-3193 add launchdarkly flag

* RWA-3193 add launchdarkly flag

* RWA-3880 extend suppression date

* RWA-3880 extend suppression date

* RWA-3880 extend suppression date

* RWA-3193 updated

* RWA-3193 updated

* RWA-3193 updated

* RWA-3193 updated

* RWA-3193 updated

* RWA-3193 updated

* RWA-3193 updated

* RWA-3193 updated

* RWA-3193 updated

* RWA-3193 updated

* RWA-3193 updated

* RWA-3193 updated

* RWA-3193 updated

* RWA-3193 more code coverage

* RWA-3193 more code coverage

* RWA-3193 more code coverage

* RWA-3940 mandatory field validation during initiation

* RWA-3940 mandatory field validation during initiation

* RWA-3940 mandatory field validation during initiation

* RWA-3940 mandatory field validation during initiation

* RWA-3940 mandatory field validation during initiation

* RWA-3940 mandatory field validation during initiation

* RWA-3940 mandatory field validation during initiation

* RWA-3940 mandatory field validation during initiation

* RWA-3979 added more assertions

* RWA-3979 added more assertions

* RWA-3979 added more assertions

* RWA-3193 mandatory field validation during reconfiguration

* RWA-3193 mandatory field validation during reconfiguration

* RWA-3193 mandatory field validation during reconfiguration

* RWA-3193 mandatory field validation during reconfiguration

* RWA-3193 mandatory field validation during reconfiguration

* Bumping chart version/ fixing aliases

* RWA-3193 mandatory field validation during reconfiguration

* RWA-3193 mandatory field validation during reconfiguration

* RWA-3193 updated assert statement

* Bumping chart version/ fixing aliases

* RWA-3193 updated tests

* RWA-3193 updated tests

* RWA-3962 review comments

* RWA-3962 review comments

* RWA-3962 review comments

* RWA-3193 running the test after updating test in task monitor, case event handler and post deployment tests and updated config

---------

Co-authored-by: hmcts-jenkins-j-to-z <61242337+hmcts-jenkins-j-to-z[bot]@users.noreply.github.com>
  • Loading branch information
skandala-cgi and hmcts-jenkins-j-to-z[bot] authored Jan 15, 2025
1 parent 42357ca commit 3838e31
Show file tree
Hide file tree
Showing 6 changed files with 199 additions and 21 deletions.
2 changes: 1 addition & 1 deletion charts/wa-task-management-api/values.aat.template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -58,4 +58,4 @@ java:
CALENDAR_CACHE_TIMEOUT_DURATION: 24
CALENDAR_CACHE_TIMEOUT_TIMEUNIT: HOURS
SPRING_PROFILES_ACTIVE: "replica"
MANDATORY_TASK_FIELD_CHECK_ENABLED: false
MANDATORY_TASK_FIELD_CHECK_ENABLED: true
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package uk.gov.hmcts.reform.wataskmanagementapi.watasks.controllers;

import com.fasterxml.jackson.databind.ObjectMapper;
import io.restassured.response.Response;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -53,7 +52,6 @@
public class PostTaskExecuteReconfigureControllerTest extends SpringBootFunctionalBaseTest {

private static final String ENDPOINT_BEING_TESTED = "/task/operation";
private final ObjectMapper objectMapper = new ObjectMapper();

@Before
public void setUp() {
Expand Down Expand Up @@ -184,6 +182,81 @@ public void should_return_a_200_after_tasks_are_marked_and_executed_for_reconfig
common.cleanUpTask(taskId);
}

@Test
public void should_not_reconfigure_task_when_task_validation_fails_during_reconfiguration()
throws Exception {
TestVariables taskVariables = common.setupWATaskAndRetrieveIds(
"validateMandatoryTaskAttributesDuringReconfiguration",
"validateMandatoryTaskAttributesDuringReconfiguration"
);
common.setupHearingPanelJudgeForSpecificAccess(assignerCredentials.getHeaders(),
taskVariables.getCaseId(), WA_JURISDICTION, WA_CASE_TYPE
);

initiateTask(taskVariables);

common.setupWAOrganisationalRoleAssignment(assigneeCredentials.getHeaders(), "tribunal-caseworker");

assignTaskAndValidate(taskVariables, getAssigneeId(assigneeCredentials.getHeaders()));
log.info("Assign task task id {}, case id {}", taskVariables.getTaskId(), taskVariables.getCaseId());

Response result = restApiActions.post(
ENDPOINT_BEING_TESTED,
taskOperationRequestForMarkToReconfigure(TaskOperationType.MARK_TO_RECONFIGURE, taskVariables.getCaseId()),
assigneeCredentials.getHeaders()
);
result.prettyPrint();

result.then().assertThat()
.statusCode(HttpStatus.OK.value());

String taskId = taskVariables.getTaskId();

result = restApiActions.get(
"/task/{task-id}",
taskId,
assigneeCredentials.getHeaders()
);
result.prettyPrint();

result = restApiActions.post(
ENDPOINT_BEING_TESTED,
taskOperationRequestForExecuteReconfiguration(
TaskOperationType.EXECUTE_RECONFIGURE,
OffsetDateTime.now().minus(Duration.ofDays(1))
),
assigneeCredentials.getHeaders()
);

result.prettyPrint();
result.then().assertThat()
.statusCode(HttpStatus.OK.value());

await()
.atLeast(5, TimeUnit.SECONDS)
.pollDelay(5, TimeUnit.SECONDS)
.atMost(180, SECONDS)
.untilAsserted(() -> {
Response taskResult = restApiActions.get(
"/task/{task-id}",
taskId,
assigneeCredentials.getHeaders()
);

taskResult.prettyPrint();

taskResult.then().assertThat()
.statusCode(HttpStatus.OK.value())
.and().contentType(MediaType.APPLICATION_JSON_VALUE)
.and().body("task.id", equalTo(taskId))
.body("task.task_state", is("assigned"))
.body("task.reconfigure_request_time", notNullValue())
.body("task.last_reconfiguration_time", nullValue());
});
common.cleanUpTask(taskId);
}



@Test
public void should_return_200_after_task_marked_but_not_executed_and_failure_process_finds_unprocessed_record()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import io.restassured.response.Response;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.http.HttpStatus;
import uk.gov.hmcts.reform.wataskmanagementapi.SpringBootFunctionalBaseTest;
Expand Down Expand Up @@ -877,7 +876,6 @@ public void should_return_a_503_if_task_already_initiated_however_handled_gracef
common.cleanUpTask(taskId);
}

@Ignore
@Test
public void should_return_a_502_if_task_is_missing_mandatory_task_attributes() {
TestVariables taskVariables = common.setupWATaskAndRetrieveIds(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package uk.gov.hmcts.reform.wataskmanagementapi.controllers;

import com.launchdarkly.sdk.LDValue;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
Expand Down Expand Up @@ -28,6 +29,7 @@
import uk.gov.hmcts.reform.wataskmanagementapi.cft.enums.CFTTaskState;
import uk.gov.hmcts.reform.wataskmanagementapi.cft.query.CftQueryService;
import uk.gov.hmcts.reform.wataskmanagementapi.clients.IdamWebApi;
import uk.gov.hmcts.reform.wataskmanagementapi.config.LaunchDarklyFeatureFlagProvider;
import uk.gov.hmcts.reform.wataskmanagementapi.controllers.request.TaskOperationRequest;
import uk.gov.hmcts.reform.wataskmanagementapi.controllers.request.entities.ExecuteReconfigureTaskFilter;
import uk.gov.hmcts.reform.wataskmanagementapi.controllers.request.entities.MarkTaskToReconfigureTaskFilter;
Expand All @@ -48,6 +50,7 @@
import uk.gov.hmcts.reform.wataskmanagementapi.services.CcdDataService;
import uk.gov.hmcts.reform.wataskmanagementapi.services.DmnEvaluationService;
import uk.gov.hmcts.reform.wataskmanagementapi.services.operation.TaskReconfigurationTransactionHandler;
import uk.gov.hmcts.reform.wataskmanagementapi.services.utils.TaskMandatoryFieldsValidator;

import java.time.LocalDate;
import java.time.LocalDateTime;
Expand All @@ -73,6 +76,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyList;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.times;
Expand All @@ -87,6 +91,7 @@
import static uk.gov.hmcts.reform.wataskmanagementapi.domain.camunda.CamundaValue.booleanValue;
import static uk.gov.hmcts.reform.wataskmanagementapi.domain.camunda.CamundaValue.integerValue;
import static uk.gov.hmcts.reform.wataskmanagementapi.domain.camunda.CamundaValue.stringValue;
import static uk.gov.hmcts.reform.wataskmanagementapi.exceptions.v2.enums.ErrorMessages.MANDATORY_FIELD_MISSING_ERROR;
import static uk.gov.hmcts.reform.wataskmanagementapi.utils.ServiceMocks.SERVICE_AUTHORIZATION_TOKEN;

@SuppressWarnings("checkstyle:LineLength")
Expand Down Expand Up @@ -114,12 +119,16 @@ class ExecuteReconfigurationTaskOperationControllerTest extends SpringBootIntegr
private RoleAssignmentService roleAssignmentService;
@MockBean
private IdamWebApi idamWebApi;
@MockBean
private LaunchDarklyFeatureFlagProvider launchDarklyFeatureFlagProvider;

@Autowired
private IdamTokenGenerator systemUserIdamToken;

@SpyBean
TaskReconfigurationTransactionHandler taskReconfigurationTransactionHandler;
@SpyBean
TaskMandatoryFieldsValidator taskMandatoryFieldsValidator;

private String taskId;
private String bearerAccessToken1;
Expand Down Expand Up @@ -172,6 +181,7 @@ void should_execute_reconfigure_nextHearingDate_to_null_from_null() throws Excep
String caseIdToday = "caseId-" + OffsetDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
OffsetDateTime dueDateTime = OffsetDateTime.now();
createTaskAndRoleAssignments(CFTTaskState.ASSIGNED, ASSIGNEE_USER, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));

//mark to reconfigure
mockMvc.perform(
Expand Down Expand Up @@ -230,6 +240,7 @@ void should_execute_reconfigure_on_task_and_not_update_data_when_can_reconfigure
String caseIdToday = "caseId1-" + OffsetDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
OffsetDateTime dueDateTime = OffsetDateTime.now();
createTaskAndRoleAssignments(CFTTaskState.ASSIGNED, ASSIGNEE_USER, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));

mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
Expand Down Expand Up @@ -319,6 +330,7 @@ void should_execute_reconfigure_on_task_and_update_data_when_can_reconfigure_is_
String caseIdToday = "caseId2-" + OffsetDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
OffsetDateTime dueDateTime = OffsetDateTime.now();
createTaskAndRoleAssignments(CFTTaskState.ASSIGNED, ASSIGNEE_USER, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));

mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
Expand Down Expand Up @@ -422,6 +434,7 @@ void should_rollback_changes_and_retry_task_reconfiguration_for_failed_task_when
createTaskAndRoleAssignments(CFTTaskState.ASSIGNED, ASSIGNEE_USER, caseIdToday, dueDateTime);
taskId = UUID.randomUUID().toString();
createTaskAndRoleAssignments(CFTTaskState.ASSIGNED, ASSIGNEE_USER, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));

mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
Expand Down Expand Up @@ -543,6 +556,7 @@ void should_not_execute_reconfigure_on_task_and_update_data_when_state_not_assig
String caseIdToday = "caseId2-" + OffsetDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
OffsetDateTime dueDateTime = OffsetDateTime.now();
createTaskAndRoleAssignments(CFTTaskState.ASSIGNED, ASSIGNEE_USER, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));

mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
Expand Down Expand Up @@ -605,6 +619,7 @@ void should_execute_reconfigure_on_task_and_update_title_when_can_reconfigure_is
String caseIdToday = "caseId3-" + OffsetDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
OffsetDateTime dueDateTime = OffsetDateTime.now();
createTaskAndRoleAssignments(CFTTaskState.ASSIGNED, ASSIGNEE_USER, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));

mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
Expand Down Expand Up @@ -672,6 +687,7 @@ void should_execute_reconfigure_autoassignment_unassigned_to_assigned() throws E
String caseIdToday = "caseId-" + OffsetDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
OffsetDateTime dueDateTime = OffsetDateTime.now();
createTaskAndRoleAssignments(CFTTaskState.UNASSIGNED, null, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));

mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
Expand Down Expand Up @@ -760,6 +776,7 @@ void should_execute_reconfigure_autoassignment_unassigned_to_unassigned() throws
String caseIdToday = "caseId-" + OffsetDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
OffsetDateTime dueDateTime = OffsetDateTime.now();
createTaskAndRoleAssignments(CFTTaskState.UNASSIGNED, null, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));

mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
Expand Down Expand Up @@ -850,6 +867,7 @@ void should_execute_reconfigure_set_indexed_true() throws Exception {
String caseIdToday = "caseId-" + OffsetDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
OffsetDateTime dueDateTime = OffsetDateTime.now();
createTaskAndRoleAssignments(CFTTaskState.UNASSIGNED, null, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));

mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
Expand Down Expand Up @@ -909,6 +927,7 @@ void should_execute_reconfigure_set_indexed_assigned_true() throws Exception {
String caseIdToday = "caseId-" + OffsetDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
OffsetDateTime dueDateTime = OffsetDateTime.now();
createTaskAndRoleAssignments(CFTTaskState.UNASSIGNED, null, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));

mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
Expand Down Expand Up @@ -970,6 +989,7 @@ void should_execute_reconfigure_autoassignment_assigned_to_assigned_another_user
String caseIdToday = "caseId-" + OffsetDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
OffsetDateTime dueDateTime = OffsetDateTime.now();
createTaskAndRoleAssignments(CFTTaskState.ASSIGNED, OLD_ASSIGNEE_USER, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));

mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
Expand Down Expand Up @@ -1063,6 +1083,7 @@ void should_execute_reconfigure_autoassignment_assigned_to_unassigned() throws E
OffsetDateTime dueDateTime = OffsetDateTime.now();
String dueDateTimeCheck = OffsetDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
createTaskAndRoleAssignments(CFTTaskState.ASSIGNED, ASSIGNEE_USER, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));

mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
Expand Down Expand Up @@ -1158,6 +1179,7 @@ void should_not_execute_reconfigure_for_past_reconfigure_request_time() throws E
String caseIdToday = "caseId" + OffsetDateTime.now();
OffsetDateTime dueDateTime = OffsetDateTime.now();
createTaskAndRoleAssignments(CFTTaskState.ASSIGNED, ASSIGNEE_USER, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));
mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
.header(SERVICE_AUTHORIZATION, SERVICE_AUTHORIZATION_TOKEN)
Expand Down Expand Up @@ -1197,12 +1219,63 @@ void should_not_execute_reconfigure_for_past_reconfigure_request_time() throws E
});
}

@Test
void should_not_execute_reconfigure_if_task_validation_fails(CapturedOutput output) throws Exception {
String jsonString = "{\"jurisdictions\":[\"WA\"]}";
lenient().when(launchDarklyFeatureFlagProvider.getJsonValue(any(), any()))
.thenReturn(LDValue.parse(jsonString));
String caseIdToday = "caseId" + OffsetDateTime.now();
OffsetDateTime dueDateTime = OffsetDateTime.now();
createTaskAndRoleAssignments(CFTTaskState.ASSIGNED, ASSIGNEE_USER, caseIdToday, dueDateTime);
mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
.header(SERVICE_AUTHORIZATION, SERVICE_AUTHORIZATION_TOKEN)
.contentType(MediaType.APPLICATION_JSON_VALUE)
.content(asJsonString(taskOperationRequest(MARK_TO_RECONFIGURE, markTaskFilters(caseIdToday))))

).andExpectAll(
status().is(HttpStatus.OK.value())
);

List<TaskResource> taskResources = cftTaskDatabaseService.findByCaseIdOnly(caseIdToday);

taskResources.forEach(task -> {
assertNotNull(task.getReconfigureRequestTime());
assertEquals(LocalDate.now(), task.getReconfigureRequestTime().toLocalDate());
});
mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
.header(SERVICE_AUTHORIZATION, SERVICE_AUTHORIZATION_TOKEN)
.contentType(MediaType.APPLICATION_JSON_VALUE)
.content(asJsonString(taskOperationRequest(
EXECUTE_RECONFIGURE,
executeTaskFilters(OffsetDateTime.now().minusSeconds(30L))
)))
).andExpectAll(
status().is(HttpStatus.OK.value())
);

await().ignoreException(AssertionFailedError.class)
.pollInterval(1, SECONDS)
.atMost(10, SECONDS)
.untilAsserted(() -> {
List<TaskResource> taskResourcesAfter = cftTaskDatabaseService.findByCaseIdOnly(caseIdToday);
taskResourcesAfter.forEach(task -> {
assertNull(task.getLastReconfigurationTime());
assertNotNull(task.getReconfigureRequestTime());
});
assertTrue(output.getOut()
.contains(MANDATORY_FIELD_MISSING_ERROR.getDetail() + taskResources.get(0).getTaskId()));
});
}

@Test
void should_execute_reconfigure_on_task_and_fail_due_to_calendar_configuration_alerts_captured(CapturedOutput output)
throws Exception {
String caseIdToday = "calendarCaseId-" + OffsetDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
OffsetDateTime dueDateTime = OffsetDateTime.now();
createTaskAndRoleAssignments(CFTTaskState.ASSIGNED, ASSIGNEE_USER, caseIdToday, dueDateTime);
doNothing().when(taskMandatoryFieldsValidator).validate(any(TaskResource.class));

mockMvc.perform(
post(ENDPOINT_BEING_TESTED)
Expand Down
Loading

0 comments on commit 3838e31

Please sign in to comment.