diff --git a/workflow-service-sdk/api/openapi.yaml b/workflow-service-sdk/api/openapi.yaml index 890821e8b..bd7bd837c 100644 --- a/workflow-service-sdk/api/openapi.yaml +++ b/workflow-service-sdk/api/openapi.yaml @@ -1332,17 +1332,22 @@ components: - null - null name: name + message: message type: TASK status: FAILED - works: - null - null name: name + message: message type: TASK status: FAILED workFlowExecutionId: 046b6c7f-0b8a-43b9-b35d-6489e6daee91 + message: message status: FAILED properties: + message: + type: string status: enum: - FAILED @@ -1424,9 +1429,12 @@ components: - null - null name: name + message: message type: TASK status: FAILED properties: + message: + type: string name: type: string status: diff --git a/workflow-service-sdk/docs/WorkFlowStatusResponseDTO.md b/workflow-service-sdk/docs/WorkFlowStatusResponseDTO.md index 9cb5f3ca9..34749ba2f 100644 --- a/workflow-service-sdk/docs/WorkFlowStatusResponseDTO.md +++ b/workflow-service-sdk/docs/WorkFlowStatusResponseDTO.md @@ -7,6 +7,7 @@ | Name | Type | Description | Notes | |------------ | ------------- | ------------- | -------------| +|**message** | **String** | | [optional] | |**status** | [**StatusEnum**](#StatusEnum) | | [optional] | |**workFlowExecutionId** | **UUID** | | [optional] | |**workFlowName** | **String** | | [optional] | diff --git a/workflow-service-sdk/docs/WorkStatusResponseDTO.md b/workflow-service-sdk/docs/WorkStatusResponseDTO.md index 832fb4c0e..62f70f7fb 100644 --- a/workflow-service-sdk/docs/WorkStatusResponseDTO.md +++ b/workflow-service-sdk/docs/WorkStatusResponseDTO.md @@ -7,6 +7,7 @@ | Name | Type | Description | Notes | |------------ | ------------- | ------------- | -------------| +|**message** | **String** | | [optional] | |**name** | **String** | | [optional] | |**status** | [**StatusEnum**](#StatusEnum) | | [optional] | |**type** | [**TypeEnum**](#TypeEnum) | | [optional] | diff --git a/workflow-service-sdk/src/main/java/com/redhat/parodos/sdk/model/WorkFlowStatusResponseDTO.java b/workflow-service-sdk/src/main/java/com/redhat/parodos/sdk/model/WorkFlowStatusResponseDTO.java index 034b253fe..8bda0d94e 100644 --- a/workflow-service-sdk/src/main/java/com/redhat/parodos/sdk/model/WorkFlowStatusResponseDTO.java +++ b/workflow-service-sdk/src/main/java/com/redhat/parodos/sdk/model/WorkFlowStatusResponseDTO.java @@ -40,6 +40,11 @@ @javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen") public class WorkFlowStatusResponseDTO { + public static final String SERIALIZED_NAME_MESSAGE = "message"; + + @SerializedName(SERIALIZED_NAME_MESSAGE) + private String message; + /** * Gets or Sets status */ @@ -120,6 +125,26 @@ public StatusEnum read(final JsonReader jsonReader) throws IOException { public WorkFlowStatusResponseDTO() { } + public WorkFlowStatusResponseDTO message(String message) { + + this.message = message; + return this; + } + + /** + * Get message + * @return message + **/ + @javax.annotation.Nullable + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + public WorkFlowStatusResponseDTO status(StatusEnum status) { this.status = status; @@ -217,7 +242,8 @@ public boolean equals(Object o) { return false; } WorkFlowStatusResponseDTO workFlowStatusResponseDTO = (WorkFlowStatusResponseDTO) o; - return Objects.equals(this.status, workFlowStatusResponseDTO.status) + return Objects.equals(this.message, workFlowStatusResponseDTO.message) + && Objects.equals(this.status, workFlowStatusResponseDTO.status) && Objects.equals(this.workFlowExecutionId, workFlowStatusResponseDTO.workFlowExecutionId) && Objects.equals(this.workFlowName, workFlowStatusResponseDTO.workFlowName) && Objects.equals(this.works, workFlowStatusResponseDTO.works); @@ -225,13 +251,14 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(status, workFlowExecutionId, workFlowName, works); + return Objects.hash(message, status, workFlowExecutionId, workFlowName, works); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class WorkFlowStatusResponseDTO {\n"); + sb.append(" message: ").append(toIndentedString(message)).append("\n"); sb.append(" status: ").append(toIndentedString(status)).append("\n"); sb.append(" workFlowExecutionId: ").append(toIndentedString(workFlowExecutionId)).append("\n"); sb.append(" workFlowName: ").append(toIndentedString(workFlowName)).append("\n"); @@ -258,6 +285,7 @@ private String toIndentedString(Object o) { static { // a set of all properties/fields (JSON key names) openapiFields = new HashSet(); + openapiFields.add("message"); openapiFields.add("status"); openapiFields.add("workFlowExecutionId"); openapiFields.add("workFlowName"); @@ -297,6 +325,12 @@ public static void validateJsonObject(JsonObject jsonObj) throws IOException { entry.getKey(), jsonObj.toString())); } } + if ((jsonObj.get("message") != null && !jsonObj.get("message").isJsonNull()) + && !jsonObj.get("message").isJsonPrimitive()) { + throw new IllegalArgumentException( + String.format("Expected the field `message` to be a primitive type in the JSON string but got `%s`", + jsonObj.get("message").toString())); + } if ((jsonObj.get("status") != null && !jsonObj.get("status").isJsonNull()) && !jsonObj.get("status").isJsonPrimitive()) { throw new IllegalArgumentException( diff --git a/workflow-service-sdk/src/main/java/com/redhat/parodos/sdk/model/WorkStatusResponseDTO.java b/workflow-service-sdk/src/main/java/com/redhat/parodos/sdk/model/WorkStatusResponseDTO.java index 3b0001ff2..68c6cd847 100644 --- a/workflow-service-sdk/src/main/java/com/redhat/parodos/sdk/model/WorkStatusResponseDTO.java +++ b/workflow-service-sdk/src/main/java/com/redhat/parodos/sdk/model/WorkStatusResponseDTO.java @@ -39,6 +39,11 @@ @javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen") public class WorkStatusResponseDTO { + public static final String SERIALIZED_NAME_MESSAGE = "message"; + + @SerializedName(SERIALIZED_NAME_MESSAGE) + private String message; + public static final String SERIALIZED_NAME_NAME = "name"; @SerializedName(SERIALIZED_NAME_NAME) @@ -170,6 +175,26 @@ public TypeEnum read(final JsonReader jsonReader) throws IOException { public WorkStatusResponseDTO() { } + public WorkStatusResponseDTO message(String message) { + + this.message = message; + return this; + } + + /** + * Get message + * @return message + **/ + @javax.annotation.Nullable + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + public WorkStatusResponseDTO name(String name) { this.name = name; @@ -267,7 +292,8 @@ public boolean equals(Object o) { return false; } WorkStatusResponseDTO workStatusResponseDTO = (WorkStatusResponseDTO) o; - return Objects.equals(this.name, workStatusResponseDTO.name) + return Objects.equals(this.message, workStatusResponseDTO.message) + && Objects.equals(this.name, workStatusResponseDTO.name) && Objects.equals(this.status, workStatusResponseDTO.status) && Objects.equals(this.type, workStatusResponseDTO.type) && Objects.equals(this.works, workStatusResponseDTO.works); @@ -275,13 +301,14 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(name, status, type, works); + return Objects.hash(message, name, status, type, works); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class WorkStatusResponseDTO {\n"); + sb.append(" message: ").append(toIndentedString(message)).append("\n"); sb.append(" name: ").append(toIndentedString(name)).append("\n"); sb.append(" status: ").append(toIndentedString(status)).append("\n"); sb.append(" type: ").append(toIndentedString(type)).append("\n"); @@ -308,6 +335,7 @@ private String toIndentedString(Object o) { static { // a set of all properties/fields (JSON key names) openapiFields = new HashSet(); + openapiFields.add("message"); openapiFields.add("name"); openapiFields.add("status"); openapiFields.add("type"); @@ -344,6 +372,12 @@ public static void validateJsonObject(JsonObject jsonObj) throws IOException { entry.getKey(), jsonObj.toString())); } } + if ((jsonObj.get("message") != null && !jsonObj.get("message").isJsonNull()) + && !jsonObj.get("message").isJsonPrimitive()) { + throw new IllegalArgumentException( + String.format("Expected the field `message` to be a primitive type in the JSON string but got `%s`", + jsonObj.get("message").toString())); + } if ((jsonObj.get("name") != null && !jsonObj.get("name").isJsonNull()) && !jsonObj.get("name").isJsonPrimitive()) { throw new IllegalArgumentException( diff --git a/workflow-service/generated/openapi/openapi.json b/workflow-service/generated/openapi/openapi.json index c7c1bdcac..5f9f6e279 100644 --- a/workflow-service/generated/openapi/openapi.json +++ b/workflow-service/generated/openapi/openapi.json @@ -1382,6 +1382,9 @@ "WorkFlowStatusResponseDTO" : { "type" : "object", "properties" : { + "message" : { + "type" : "string" + }, "status" : { "type" : "string", "enum" : [ "FAILED", "COMPLETED", "IN_PROGRESS", "REJECTED", "PENDING" ] @@ -1457,6 +1460,9 @@ "WorkStatusResponseDTO" : { "type" : "object", "properties" : { + "message" : { + "type" : "string" + }, "name" : { "type" : "string" }, diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionAspect.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionAspect.java index 171099ad8..18c998866 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionAspect.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionAspect.java @@ -108,7 +108,7 @@ public WorkReport executeAroundAdvice(ProceedingJoinPoint proceedingJoinPoint, W } catch (Throwable e) { log.error("Workflow {} has failed! with error: {}", workflowName, e.getMessage()); - report = new DefaultWorkReport(WorkStatus.FAILED, workContext); + report = new DefaultWorkReport(WorkStatus.FAILED, workContext, e); } return executionHandler.handlePostWorkFlowExecution(report, (WorkFlow) proceedingJoinPoint.getTarget()); diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionInterceptor.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionInterceptor.java index 6e23439cf..75a1cd8c1 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionInterceptor.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionInterceptor.java @@ -70,6 +70,9 @@ public WorkReport handlePostWorkFlowExecution(WorkReport report, WorkFlow workFl // update workflow execution entity workFlowExecution.setStatus(report.getStatus()); workFlowExecution.setEndDate(new Date()); + if (report.getError() != null) { + workFlowExecution.setMessage(report.getError().getMessage()); + } WorkFlowPostInterceptor postExecutor = createPostExecutor(workFlow, report.getStatus()); WorkReport workReport = postExecutor.handlePostWorkFlowExecution(); diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowTaskExecutionAspect.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowTaskExecutionAspect.java index 0464e5484..e27329cca 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowTaskExecutionAspect.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowTaskExecutionAspect.java @@ -136,7 +136,7 @@ else if (WorkStatus.FAILED != workFlowTaskExecution.getStatus()) { } catch (Throwable e) { log.error("Workflow task execution {} has failed! error message: {}", workFlowTaskName, e.getMessage()); - report = new DefaultWorkReport(WorkStatus.FAILED, workContext); + report = new DefaultWorkReport(WorkStatus.FAILED, workContext, e); } WorkContextDelegate.write(workContext, WorkContextDelegate.ProcessType.WORKFLOW_TASK_EXECUTION, diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/dto/WorkFlowStatusResponseDTO.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/dto/WorkFlowStatusResponseDTO.java index fb7b39ee8..5d4189883 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/dto/WorkFlowStatusResponseDTO.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/dto/WorkFlowStatusResponseDTO.java @@ -44,6 +44,8 @@ public class WorkFlowStatusResponseDTO { private WorkStatus status; + private String message; + @JsonInclude(JsonInclude.Include.NON_EMPTY) private List works; diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/dto/WorkStatusResponseDTO.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/dto/WorkStatusResponseDTO.java index 9cffd39cd..f1a4c39c9 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/dto/WorkStatusResponseDTO.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/dto/WorkStatusResponseDTO.java @@ -47,6 +47,8 @@ public class WorkStatusResponseDTO { private WorkStatus status; + private String message; + @JsonProperty("works") @JsonInclude(JsonInclude.Include.NON_EMPTY) private List works; diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/entity/WorkFlowExecution.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/entity/WorkFlowExecution.java index caf4280d0..f10fbccc7 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/entity/WorkFlowExecution.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/entity/WorkFlowExecution.java @@ -56,6 +56,8 @@ public class WorkFlowExecution extends AbstractEntity { private WorkStatus status; + private String message; + @Column(updatable = false) private Date startDate; diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceDelegate.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceDelegate.java index 96bd805ff..9a2df1f94 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceDelegate.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceDelegate.java @@ -96,12 +96,12 @@ private void buildWorkFlowStatusDTO(WorkFlowExecution workFlowExecution, WorkFlo CopyOnWriteArrayList workStatusResponseDTOList, Map workFlowWorkStartIndexMap) { // build workflow status DTO - workStatusResponseDTOList.add(WorkStatusResponseDTO.builder().name(workFlowDefinition.getName()) - .type(WorkType.WORKFLOW) - .status(WorkStatus.IN_PROGRESS.equals(workFlowExecution.getStatus()) ? WorkStatus.PENDING - : WorkStatus.valueOf(workFlowExecution.getStatus().name())) - .workExecution(workFlowExecution).numberOfWorks(workFlowDefinition.getNumberOfWorks()) - .works(new ArrayList<>()).build()); + workStatusResponseDTOList + .add(WorkStatusResponseDTO.builder().name(workFlowDefinition.getName()).type(WorkType.WORKFLOW) + .status(WorkStatus.IN_PROGRESS.equals(workFlowExecution.getStatus()) ? WorkStatus.PENDING + : WorkStatus.valueOf(workFlowExecution.getStatus().name())) + .message(workFlowExecution.getMessage()).workExecution(workFlowExecution) + .numberOfWorks(workFlowDefinition.getNumberOfWorks()).works(new ArrayList<>()).build()); // save the start index of the workflow's works workFlowWorkStartIndexMap.put(workFlowDefinition.getName(), workStatusResponseDTOList.size()); diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceImpl.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceImpl.java index bc02ac8f5..d6f95bf1e 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceImpl.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceImpl.java @@ -237,7 +237,7 @@ public WorkFlowStatusResponseDTO getWorkFlowStatus(UUID workFlowExecutionId) { return WorkFlowStatusResponseDTO.builder().workFlowExecutionId(workFlowExecution.getId()) .workFlowName(workFlowDefinition.getName()).status(workFlowExecution.getStatus()) - .works(workFlowWorksStatusResponseDTOs).build(); + .message(workFlowExecution.getMessage()).works(workFlowWorksStatusResponseDTOs).build(); } @Override diff --git a/workflow-service/src/main/resources/db/changelog/tables.xml b/workflow-service/src/main/resources/db/changelog/tables.xml index c904d7f7a..74e1347e4 100644 --- a/workflow-service/src/main/resources/db/changelog/tables.xml +++ b/workflow-service/src/main/resources/db/changelog/tables.xml @@ -133,6 +133,7 @@ + diff --git a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionInterceptorTest.java b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionInterceptorTest.java index f8e18e187..088dd90c7 100644 --- a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionInterceptorTest.java +++ b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionInterceptorTest.java @@ -26,6 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.eq; @@ -140,11 +141,43 @@ public void testHandleCompletePostWorkFlowExecution() { // then verify(workFlowService, times(0)).saveWorkFlow(any(UUID.class), any(UUID.class), any(), eq(WorkStatus.IN_PROGRESS), any(), anyString()); + verify(workFlowService, times(1)).updateWorkFlow(argThat(we -> we.getMessage() == null)); verify(workFlowSchedulerService, times(1)).stop(any(), any(), any(WorkFlow.class)); verify(workFlowContinuationServiceImpl, times(1)).continueWorkFlow(any(ExecutionContext.class)); assertEquals(result.getStatus(), report.getStatus()); } + @Test + public void testHandlePostWorkFlowExecutionWithFailedStatus() { + // given + WorkReport report = mock(WorkReport.class); + + // when + when(report.getStatus()).thenReturn(WorkStatus.FAILED); + when(report.getError()).thenReturn(new Throwable("Error while executing")); + when(workContext.get(WorkContextDelegate.buildKey(WorkContextDelegate.ProcessType.WORKFLOW_DEFINITION, + WorkContextDelegate.Resource.NAME))).thenReturn(TEST_WORKFLOW_NAME); + WorkFlow workFlow = mock(WorkFlow.class); + when(workFlow.getName()).thenReturn(TEST_WORKFLOW_NAME); + when(workFlowDefinition.getType()).thenReturn(WorkFlowType.CHECKER); + when(workFlowDefinition.getCheckerWorkFlowDefinition()) + .thenReturn(mock(WorkFlowCheckerMappingDefinition.class)); + when(mainWorkFlowExecution.getId()).thenReturn(UUID.randomUUID()); + when(mainWorkFlowExecution.getWorkFlowDefinition()).thenReturn(workFlowDefinition); + + WorkFlowExecution workFlowExecution = interceptor.handlePreWorkFlowExecution(); + assertNotNull(workFlowExecution); + WorkReport result = interceptor.handlePostWorkFlowExecution(report, workFlow); + + // then + verify(workFlowService, times(0)).saveWorkFlow(any(UUID.class), any(UUID.class), any(), + eq(WorkStatus.IN_PROGRESS), any(), anyString()); + verify(workFlowService, times(1)) + .updateWorkFlow(argThat(we -> we.getMessage().equals(report.getError().getMessage()))); + assertEquals(result.getStatus(), report.getStatus()); + assertEquals(result.getError(), report.getError()); + } + private User createUser() { User user = User.builder().username(UUID.randomUUID().toString()).build(); user.setId(UUID.randomUUID()); diff --git a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/controller/WorkFlowControllerTest.java b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/controller/WorkFlowControllerTest.java index cc931bc3e..3f1be5161 100644 --- a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/controller/WorkFlowControllerTest.java +++ b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/controller/WorkFlowControllerTest.java @@ -177,6 +177,68 @@ public void testGetStatus() throws Exception { verify(this.workFlowService, times(1)).getWorkFlowStatus(mainWorkFlowExecutionId); } + @Test + public void testGetStatusWithFailedWorkflowAndTask() throws Exception { + // given + UUID mainWorkFlowExecutionId = UUID.randomUUID(); + String testMainWorkFlow = "testMainWorkFlow"; + String testSubWorkFlow1 = "testSubWorkFlow1"; + String testSubWorkFlowTask1 = "testSubWorkFlowTask1"; + String testWorkFlowTask1 = "testWorkFlowTask1"; + String testFailedWorkFlowTask1 = "testFailedWorkFlowTask1"; + String errorMessageMainWorkflow = "Main workflow error message"; + String errorMessage = "Error message"; + + WorkFlowStatusResponseDTO workFlowStatusResponseDTO = WorkFlowStatusResponseDTO.builder() + .workFlowExecutionId(mainWorkFlowExecutionId).status(WorkStatus.FAILED).workFlowName(testMainWorkFlow) + .message(errorMessageMainWorkflow) + .works(List.of( + WorkStatusResponseDTO.builder().name(testSubWorkFlow1).status(WorkStatus.PENDING) + .type(WorkType.WORKFLOW).message("") + .works(List.of(WorkStatusResponseDTO.builder().name(testSubWorkFlowTask1) + .status(WorkStatus.PENDING).type(WorkType.TASK).build())) + .build(), + WorkStatusResponseDTO.builder().name(testWorkFlowTask1).status(WorkStatus.COMPLETED) + .type(WorkType.TASK).message("").build(), + WorkStatusResponseDTO.builder().name(testFailedWorkFlowTask1).status(WorkStatus.FAILED) + .message(errorMessage).type(WorkType.TASK).build())) + .build(); + when(workFlowService.getWorkFlowStatus(mainWorkFlowExecutionId)).thenReturn(workFlowStatusResponseDTO); + + // when + this.mockMvc + .perform(this.getRequestWithValidCredentials( + String.format("/api/v1/workflows/%s/status", mainWorkFlowExecutionId))) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.jsonPath("$.workFlowExecutionId", + Matchers.is(mainWorkFlowExecutionId.toString()))) + .andExpect(MockMvcResultMatchers.jsonPath("$.workFlowName", Matchers.is(testMainWorkFlow))) + .andExpect(MockMvcResultMatchers.jsonPath("$.status", Matchers.is(WorkStatus.FAILED.name()))) + .andExpect(MockMvcResultMatchers.jsonPath("$.message", Matchers.is(errorMessageMainWorkflow))) + .andExpect(MockMvcResultMatchers.jsonPath("$.works[0].name", Matchers.is(testSubWorkFlow1))) + .andExpect(MockMvcResultMatchers.jsonPath("$.works[0].type", Matchers.is(WorkType.WORKFLOW.name()))) + .andExpect(MockMvcResultMatchers.jsonPath("$.works[0].status", Matchers.is(WorkStatus.PENDING.name()))) + .andExpect( + MockMvcResultMatchers.jsonPath("$.works[0].works[0].name", Matchers.is(testSubWorkFlowTask1))) + .andExpect(MockMvcResultMatchers.jsonPath("$.works[0].works[0].status", + Matchers.is(WorkStatus.PENDING.name()))) + .andExpect( + MockMvcResultMatchers.jsonPath("$.works[0].works[0].type", Matchers.is(WorkType.TASK.name()))) + .andExpect(MockMvcResultMatchers.jsonPath("$.works[1].name", Matchers.is(testWorkFlowTask1))) + .andExpect(MockMvcResultMatchers.jsonPath("$.works[1].type", Matchers.is(WorkType.TASK.name()))) + .andExpect( + MockMvcResultMatchers.jsonPath("$.works[1].status", Matchers.is(WorkStatus.COMPLETED.name()))) + .andExpect(MockMvcResultMatchers.jsonPath("$.works[1].message", Matchers.is(""))) + .andExpect(MockMvcResultMatchers.jsonPath("$.works[2].name", Matchers.is(testFailedWorkFlowTask1))) + .andExpect(MockMvcResultMatchers.jsonPath("$.works[2].type", Matchers.is(WorkType.TASK.name()))) + .andExpect(MockMvcResultMatchers.jsonPath("$.works[2].status", Matchers.is(WorkStatus.FAILED.name()))) + .andExpect(MockMvcResultMatchers.jsonPath("$.works[2].message", Matchers.is(errorMessage))); + + // then + verify(this.workFlowService, times(1)).getWorkFlowStatus(mainWorkFlowExecutionId); + } + @Test public void updateWorkFlowCheckerTaskStatusWithValidData() throws Exception { // given