diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/definition/entity/WorkFlowWorkDefinition.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/definition/entity/WorkFlowWorkDefinition.java index e0a5f21c9..52b1c46af 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/definition/entity/WorkFlowWorkDefinition.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/definition/entity/WorkFlowWorkDefinition.java @@ -1,6 +1,7 @@ package com.redhat.parodos.workflow.definition.entity; import com.redhat.parodos.common.AbstractEntity; +import com.redhat.parodos.workflow.enums.WorkType; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -9,6 +10,7 @@ import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.Enumerated; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import java.util.Date; @@ -24,7 +26,8 @@ public class WorkFlowWorkDefinition extends AbstractEntity { private UUID workDefinitionId; - private String workDefinitionType; + @Enumerated + private WorkType workDefinitionType; @ManyToOne(optional = false) @JoinColumn(name = "workflow_definition_id") diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/definition/service/WorkFlowDefinitionServiceImpl.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/definition/service/WorkFlowDefinitionServiceImpl.java index 8b8136178..3ff45e978 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/definition/service/WorkFlowDefinitionServiceImpl.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/definition/service/WorkFlowDefinitionServiceImpl.java @@ -98,9 +98,9 @@ public WorkFlowDefinitionResponseDTO save(String workFlowName, WorkFlowType work if (work instanceof WorkFlow) { // WorkFlow // A workflow in works should already been stored workId = workFlowDefinitionRepository.findFirstByName(work.getName()).getId(); - workFlowWorkDefinitions.add(WorkFlowWorkDefinition.builder().workDefinitionId(workId) - .workDefinitionType(WorkType.WORKFLOW.name()).workFlowDefinition(workFlowDefinition) - .createDate(new Date()).build()); + workFlowWorkDefinitions.add( + WorkFlowWorkDefinition.builder().workDefinitionId(workId).workDefinitionType(WorkType.WORKFLOW) + .workFlowDefinition(workFlowDefinition).createDate(new Date()).build()); } else { // WorkFlowTask WorkFlowTask workFlowTask = (WorkFlowTask) work; @@ -117,9 +117,9 @@ public WorkFlowDefinitionResponseDTO save(String workFlowName, WorkFlowType work .outputs(WorkFlowDTOUtil.writeObjectValueAsString(workFlowTask.getWorkFlowTaskOutputs())) .workFlowDefinition(workFlowDefinition).createDate(new Date()).modifyDate(new Date()).build()) .getId(); - workFlowWorkDefinitions.add(WorkFlowWorkDefinition.builder().workDefinitionId(workId) - .workDefinitionType(WorkType.TASK.name()).workFlowDefinition(workFlowDefinition) - .createDate(new Date()).build()); + workFlowWorkDefinitions + .add(WorkFlowWorkDefinition.builder().workDefinitionId(workId).workDefinitionType(WorkType.TASK) + .workFlowDefinition(workFlowDefinition).createDate(new Date()).build()); } }); workFlowDefinition.setWorkFlowWorkDefinitions(workFlowWorkDefinitions); @@ -219,7 +219,7 @@ private List buildWorkFlowWorksDTOs(WorkFlowDefinitio // add workflowWorkUnits workFlowWorkDefinitions.forEach(workFlowWorkDefinition -> { - if (workFlowWorkDefinition.getWorkDefinitionType().equalsIgnoreCase(WorkType.TASK.name())) { // Task + if (workFlowWorkDefinition.getWorkDefinitionType().equals(WorkType.TASK)) { // Task WorkFlowTaskDefinition wdt = workFlowTaskDefinitionRepository .findById(workFlowWorkDefinition.getWorkDefinitionId()).get(); workDefinitionResponseDTOs.add(WorkDefinitionResponseDTO.builder().id(wdt.getId().toString()) @@ -256,7 +256,7 @@ private List buildWorkFlowWorksDTOs(WorkFlowDefinitio .collect(Collectors.toList()); workFlowWorkUnits1Definition.forEach(wwdt1 -> { - if (wwdt1.getWorkDefinitionType().equalsIgnoreCase(WorkType.TASK.name())) { // Task + if (wwdt1.getWorkDefinitionType().equals(WorkType.TASK)) { // Task WorkFlowTaskDefinition wdt1 = workFlowTaskDefinitionRepository .findById(wwdt1.getWorkDefinitionId()).get(); workDefinitionResponseDTOs.add(WorkDefinitionResponseDTO.builder().id(wdt1.getId().toString()) diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/controller/WorkFlowController.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/controller/WorkFlowController.java index 210d215be..49f6dfd6f 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/controller/WorkFlowController.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/controller/WorkFlowController.java @@ -73,7 +73,6 @@ public ResponseEntity execute(@RequestBody @Valid WorkFlowR if (workReport == null) { return ResponseEntity.status(500).build(); } - return ResponseEntity.ok(WorkFlowResponseDTO.builder() .workFlowExecutionId(WorkContextDelegate.read(workReport.getWorkContext(), WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, WorkContextDelegate.Resource.ID).toString()) @@ -108,9 +107,9 @@ public void updateWorkFlowCheckerTaskStatus(@PathVariable String workFlowExecuti schema = @Schema(implementation = WorkFlowStatusResponseDTO.class)) }), @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content), @ApiResponse(responseCode = "403", description = "Forbidden", content = @Content) }) - @GetMapping("/{id}/status") - public ResponseEntity getStatus(@PathVariable String id) { - return null; + @GetMapping("/{workFlowExecutionId}/status") + public ResponseEntity getStatus(@PathVariable String workFlowExecutionId) { + return ResponseEntity.ok(workFlowService.getWorkFlowStatus(UUID.fromString(workFlowExecutionId))); } } 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 f5e30d672..dbc14be6b 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 @@ -40,6 +40,8 @@ public class WorkFlowStatusResponseDTO { private String workFlowName; + private String status; + @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 02d61c6e5..43b4dea86 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 @@ -15,6 +15,7 @@ */ package com.redhat.parodos.workflow.execution.dto; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.redhat.parodos.workflow.enums.WorkStatus; import com.redhat.parodos.workflow.enums.WorkType; @@ -24,6 +25,7 @@ import lombok.NoArgsConstructor; import java.util.List; +import java.util.UUID; /** * Workflow response dto @@ -38,12 +40,18 @@ @NoArgsConstructor public class WorkStatusResponseDTO { + @JsonIgnore + private UUID workDefinitionId; + private String name; private WorkType type; private WorkStatus status; + @JsonIgnore + private Integer numberOfWorks; + @JsonInclude(JsonInclude.Include.NON_NULL) private List works; diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/repository/WorkFlowRepository.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/repository/WorkFlowRepository.java index 69170a2e4..4863d869f 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/repository/WorkFlowRepository.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/repository/WorkFlowRepository.java @@ -35,4 +35,7 @@ WorkFlowExecution findFirstByWorkFlowDefinitionIdAndMasterWorkFlowExecution(UUID List findByMasterWorkFlowExecution(WorkFlowExecution masterWorkFlowExecution); + WorkFlowExecution findFirstByMasterWorkFlowExecutionAndWorkFlowDefinitionId( + WorkFlowExecution masterWorkFlowExecution, UUID workFlowDefinitionId); + } diff --git a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowService.java b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowService.java index 945b99753..9fb590924 100644 --- a/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowService.java +++ b/workflow-service/src/main/java/com/redhat/parodos/workflow/execution/service/WorkFlowService.java @@ -17,11 +17,11 @@ import com.redhat.parodos.workflow.enums.WorkFlowStatus; import com.redhat.parodos.workflow.execution.dto.WorkFlowRequestDTO; +import com.redhat.parodos.workflow.execution.dto.WorkFlowStatusResponseDTO; import com.redhat.parodos.workflow.execution.entity.WorkFlowExecution; import com.redhat.parodos.workflow.execution.entity.WorkFlowTaskExecution; import com.redhat.parodos.workflow.task.enums.WorkFlowTaskStatus; import com.redhat.parodos.workflows.work.WorkReport; - import java.util.UUID; /** @@ -41,6 +41,8 @@ WorkFlowExecution saveWorkFlow(UUID projectId, UUID workFlowDefinitionId, WorkFl WorkFlowExecution updateWorkFlow(WorkFlowExecution workFlowExecution); + WorkFlowStatusResponseDTO getWorkFlowStatus(UUID workFlowExecutionId); + WorkFlowTaskExecution getWorkFlowTask(UUID workFlowExecutionId, UUID workFlowTaskDefinitionId); WorkFlowTaskExecution saveWorkFlowTask(String arguments, UUID workFlowTaskDefinitionId, UUID workFlowExecutionId, 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 ab017e85a..15cc2c301 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 @@ -19,12 +19,16 @@ import com.redhat.parodos.workflow.context.WorkContextDelegate; import com.redhat.parodos.workflow.definition.entity.WorkFlowDefinition; import com.redhat.parodos.workflow.definition.entity.WorkFlowTaskDefinition; +import com.redhat.parodos.workflow.definition.entity.WorkFlowWorkDefinition; import com.redhat.parodos.workflow.definition.repository.WorkFlowDefinitionRepository; import com.redhat.parodos.workflow.definition.repository.WorkFlowTaskDefinitionRepository; import com.redhat.parodos.workflow.definition.repository.WorkFlowWorkRepository; import com.redhat.parodos.workflow.enums.WorkFlowStatus; import com.redhat.parodos.workflow.enums.WorkFlowType; +import com.redhat.parodos.workflow.enums.WorkType; import com.redhat.parodos.workflow.execution.dto.WorkFlowRequestDTO; +import com.redhat.parodos.workflow.execution.dto.WorkFlowStatusResponseDTO; +import com.redhat.parodos.workflow.execution.dto.WorkStatusResponseDTO; import com.redhat.parodos.workflow.execution.entity.WorkFlowExecution; import com.redhat.parodos.workflow.execution.entity.WorkFlowTaskExecution; import com.redhat.parodos.workflow.execution.repository.WorkFlowRepository; @@ -41,10 +45,15 @@ import org.springframework.stereotype.Service; import org.springframework.web.server.ResponseStatusException; +import java.util.ArrayList; import java.util.Comparator; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.UUID; +import java.util.concurrent.CopyOnWriteArrayList; import static java.util.Objects.isNull; @@ -130,6 +139,145 @@ public synchronized WorkFlowExecution updateWorkFlow(WorkFlowExecution workFlowE return workFlowRepository.save(workFlowExecution); } + @Override + public WorkFlowStatusResponseDTO getWorkFlowStatus(UUID workFlowExecutionId) { + WorkFlowExecution masterWorkFlowExecution = workFlowRepository.findById(workFlowExecutionId).orElseThrow(() -> { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, + String.format("workflow execution id: %s not found!", workFlowExecutionId)); + }); + + WorkFlowDefinition masterWorkFlowDefinition = workFlowDefinitionRepository + .findById(masterWorkFlowExecution.getWorkFlowDefinitionId()).orElseThrow(() -> { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, + String.format("workflow definition id: %s not found!", workFlowExecutionId)); + }); + + CopyOnWriteArrayList workStatusResponseDTOs = new CopyOnWriteArrayList<>(); + Map workFlowWorksStartIndex = new HashMap<>(); + + workStatusResponseDTOs + .add(WorkStatusResponseDTO.builder().workDefinitionId(masterWorkFlowExecution.getWorkFlowDefinitionId()) + .name(masterWorkFlowDefinition.getName()).type(WorkType.WORKFLOW) + .status(WorkFlowStatus.IN_PROGRESS.equals(masterWorkFlowExecution.getStatus()) + ? com.redhat.parodos.workflow.enums.WorkStatus.PENDING + : com.redhat.parodos.workflow.enums.WorkStatus + .valueOf(masterWorkFlowExecution.getStatus().name())) + .numberOfWorks(masterWorkFlowDefinition.getNumberOfWorks()).works(new ArrayList<>()).build()); + workFlowWorksStartIndex.put(masterWorkFlowDefinition.getName(), 1); + + List masterWorkFlowWorkDefinitions = workFlowWorkRepository + .findByWorkFlowDefinitionIdOrderByCreateDateAsc(masterWorkFlowDefinition.getId()); + masterWorkFlowWorkDefinitions.forEach(workFlowWorkDefinition -> { + if (workFlowWorkDefinition.getWorkDefinitionType().equals(WorkType.WORKFLOW)) { + WorkFlowDefinition workFlowDefinition = workFlowDefinitionRepository + .findById(workFlowWorkDefinition.getWorkDefinitionId()).get(); + WorkFlowExecution workExecution = workFlowRepository + .findFirstByMasterWorkFlowExecutionAndWorkFlowDefinitionId(masterWorkFlowExecution, + workFlowWorkDefinition.getWorkDefinitionId()); + /* + * the workflow execution might be null when there is pending checker + * before it + */ + com.redhat.parodos.workflow.enums.WorkStatus workStatus = workExecution == null + || WorkFlowStatus.IN_PROGRESS.equals(workExecution.getStatus()) + ? com.redhat.parodos.workflow.enums.WorkStatus.PENDING + : com.redhat.parodos.workflow.enums.WorkStatus + .valueOf(workExecution.getStatus().name()); + workStatusResponseDTOs.add( + WorkStatusResponseDTO.builder().workDefinitionId(workFlowWorkDefinition.getWorkDefinitionId()) + .name(workFlowDefinition.getName()).type(WorkType.WORKFLOW).status(workStatus) + .numberOfWorks(workFlowDefinition.getNumberOfWorks()).works(new ArrayList<>()).build()); + } + else { + WorkFlowTaskDefinition workFlowTaskDefinition = workFlowTaskDefinitionRepository + .findById(workFlowWorkDefinition.getWorkDefinitionId()).get(); + List workFlowTaskExecutions = workFlowTaskRepository + .findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId(masterWorkFlowExecution.getId(), + workFlowWorkDefinition.getWorkDefinitionId()); + Optional workFlowTaskExecutionOptional = workFlowTaskExecutions.stream() + .max(Comparator.comparing(WorkFlowTaskExecution::getStartDate)); + com.redhat.parodos.workflow.enums.WorkStatus workStatus = com.redhat.parodos.workflow.enums.WorkStatus.PENDING; + if (workFlowTaskExecutionOptional.isPresent()) { + workStatus = WorkFlowTaskStatus.IN_PROGRESS.equals(workFlowTaskExecutionOptional.get().getStatus()) + ? com.redhat.parodos.workflow.enums.WorkStatus.PENDING + : com.redhat.parodos.workflow.enums.WorkStatus + .valueOf(workFlowTaskExecutionOptional.get().getStatus().name()); + } + workStatusResponseDTOs.add( + WorkStatusResponseDTO.builder().workDefinitionId(workFlowWorkDefinition.getWorkDefinitionId()) + .name(workFlowTaskDefinition.getName()).type(WorkType.TASK).status(workStatus).build()); + } + }); + + for (int i = 1; i < workStatusResponseDTOs.size(); i++) { + if (workStatusResponseDTOs.get(i).getType().equals(WorkType.WORKFLOW)) { + List tmpWorkFlowWorkDefinitions = workFlowWorkRepository + .findByWorkFlowDefinitionIdOrderByCreateDateAsc( + workStatusResponseDTOs.get(i).getWorkDefinitionId()); + workFlowWorksStartIndex.put(workStatusResponseDTOs.get(i).getName(), workStatusResponseDTOs.size()); + + tmpWorkFlowWorkDefinitions.forEach(tmpWorkFlowWorkDefinition -> { + if (tmpWorkFlowWorkDefinition.getWorkDefinitionType().equals(WorkType.WORKFLOW)) { + WorkFlowDefinition workFlowDefinition = workFlowDefinitionRepository + .findById(tmpWorkFlowWorkDefinition.getWorkDefinitionId()).get(); + WorkFlowExecution workExecution = workFlowRepository + .findFirstByMasterWorkFlowExecutionAndWorkFlowDefinitionId(masterWorkFlowExecution, + tmpWorkFlowWorkDefinition.getWorkDefinitionId()); + workStatusResponseDTOs.add(WorkStatusResponseDTO.builder().name(workFlowDefinition.getName()) + .workDefinitionId(tmpWorkFlowWorkDefinition.getWorkDefinitionId()) + .type(WorkType.WORKFLOW) + .status(WorkFlowStatus.IN_PROGRESS.equals(workExecution.getStatus()) + ? com.redhat.parodos.workflow.enums.WorkStatus.PENDING + : com.redhat.parodos.workflow.enums.WorkStatus + .valueOf(workExecution.getStatus().name())) + .numberOfWorks(workFlowDefinition.getNumberOfWorks()).works(new ArrayList<>()).build()); + } + else { + WorkFlowTaskDefinition workFlowTaskDefinition = workFlowTaskDefinitionRepository + .findById(tmpWorkFlowWorkDefinition.getWorkDefinitionId()).get(); + WorkFlowExecution workFlowExecution = workFlowRepository + .findFirstByMasterWorkFlowExecutionAndWorkFlowDefinitionId(masterWorkFlowExecution, + tmpWorkFlowWorkDefinition.getWorkFlowDefinition().getId()); + List workFlowTaskExecutions = workFlowExecution == null ? List.of() + : workFlowTaskRepository.findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId( + workFlowExecution.getId(), tmpWorkFlowWorkDefinition.getWorkDefinitionId()); + Optional workFlowTaskExecutionOptional = workFlowTaskExecutions.stream() + .max(Comparator.comparing(WorkFlowTaskExecution::getStartDate)); + com.redhat.parodos.workflow.enums.WorkStatus workStatus = com.redhat.parodos.workflow.enums.WorkStatus.PENDING; + if (workFlowTaskExecutionOptional.isPresent()) { + workStatus = WorkFlowTaskStatus.IN_PROGRESS + .equals(workFlowTaskExecutionOptional.get().getStatus()) + ? com.redhat.parodos.workflow.enums.WorkStatus.PENDING + : com.redhat.parodos.workflow.enums.WorkStatus + .valueOf(workFlowTaskExecutionOptional.get().getStatus().name()); + } + workStatusResponseDTOs + .add(WorkStatusResponseDTO.builder().name(workFlowTaskDefinition.getName()) + .workDefinitionId(tmpWorkFlowWorkDefinition.getWorkDefinitionId()) + .type(WorkType.TASK).status(workStatus).build()); + } + }); + } + } + + for (int j = workStatusResponseDTOs.size() - 1; j >= 0; j--) { + if (workStatusResponseDTOs.get(j).getType().equals(WorkType.WORKFLOW)) { + List tmpList = new ArrayList<>(); + for (int k = workFlowWorksStartIndex + .get(workStatusResponseDTOs.get(j).getName()); k < workFlowWorksStartIndex + .get(workStatusResponseDTOs.get(j).getName()) + + workStatusResponseDTOs.get(j).getNumberOfWorks(); k++) { + tmpList.add(workStatusResponseDTOs.get(k)); + } + workStatusResponseDTOs.get(j).setWorks(tmpList); + } + } + + return WorkFlowStatusResponseDTO.builder().workFlowExecutionId(masterWorkFlowExecution.getId().toString()) + .workFlowName(masterWorkFlowDefinition.getName()).status(masterWorkFlowExecution.getStatus().name()) + .works(workStatusResponseDTOs.get(0).getWorks()).build(); + } + @Override public WorkFlowTaskExecution getWorkFlowTask(UUID workFlowExecutionId, UUID workFlowTaskDefinitionId) { List workFlowTaskExecutionList = workFlowTaskRepository diff --git a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionAspectTest.java b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionAspectTest.java index 8f8f93186..55142c9cd 100644 --- a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionAspectTest.java +++ b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/aspect/WorkFlowExecutionAspectTest.java @@ -152,7 +152,7 @@ void ExecuteAroundAdviceWithInProgressWorkFlowTest() { }; WorkFlowWorkDefinition workFlowWorkDefinition = WorkFlowWorkDefinition.builder() - .workDefinitionId(UUID.randomUUID()).workDefinitionType(WorkType.WORKFLOW.name()) + .workDefinitionId(UUID.randomUUID()).workDefinitionType(WorkType.WORKFLOW) .workFlowDefinition(WorkFlowDefinition.builder().build()).build(); WorkFlowDefinition workFlowDefinition = getSampleWorkFlowDefinition(TEST); WorkFlowExecution workFlowExecution = getSampleWorkFlowExecution(); 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 a289396ed..990b74a8b 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 @@ -3,8 +3,13 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.redhat.parodos.ControllerMockClient; +import com.redhat.parodos.workflow.enums.WorkFlowStatus; +import com.redhat.parodos.workflow.enums.WorkStatus; +import com.redhat.parodos.workflow.enums.WorkType; import com.redhat.parodos.workflow.execution.dto.WorkFlowCheckerTaskRequestDTO; import com.redhat.parodos.workflow.execution.dto.WorkFlowRequestDTO; +import com.redhat.parodos.workflow.execution.dto.WorkFlowStatusResponseDTO; +import com.redhat.parodos.workflow.execution.dto.WorkStatusResponseDTO; import com.redhat.parodos.workflow.execution.service.WorkFlowServiceImpl; import com.redhat.parodos.workflow.task.enums.WorkFlowTaskStatus; import com.redhat.parodos.workflows.work.WorkContext; @@ -24,6 +29,7 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.web.server.ResponseStatusException; +import java.util.List; import java.util.UUID; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; @@ -104,6 +110,58 @@ public void TestGetStatusWithoutAuth() throws Exception { .andExpect(MockMvcResultMatchers.status().isUnauthorized()); } + @Test + public void testGetStatus() throws Exception { + // given + UUID masterWorkFlowExecutionId = UUID.randomUUID(); + String testMasterWorkFlow = "testMasterWorkFlow"; + String testSubWorkFlow1 = "testSubWorkFlow1"; + String testSubWorkFlowTask1 = "testSubWorkFlowTask1"; + String testWorkFlowTask1 = "testWorkFlowTask1"; + + WorkFlowStatusResponseDTO workFlowStatusResponseDTO = WorkFlowStatusResponseDTO.builder() + .workFlowExecutionId(masterWorkFlowExecutionId.toString()).status(WorkFlowStatus.IN_PROGRESS.name()) + .workFlowName(testMasterWorkFlow) + .works(List.of( + WorkStatusResponseDTO.builder().name(testSubWorkFlow1).status(WorkStatus.PENDING) + .type(WorkType.WORKFLOW) + .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).build())) + .build(); + Mockito.when(workFlowService.getWorkFlowStatus(masterWorkFlowExecutionId)) + .thenReturn(workFlowStatusResponseDTO); + + // when + this.mockMvc + .perform(this.getRequestWithValidCredentials( + String.format("/api/v1/workflows/%s/status", masterWorkFlowExecutionId))) + .andExpect(MockMvcResultMatchers.status().isOk()) + .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(MockMvcResultMatchers.jsonPath("$.workFlowExecutionId", + Matchers.is(masterWorkFlowExecutionId.toString()))) + .andExpect(MockMvcResultMatchers.jsonPath("$.workFlowName", Matchers.is(testMasterWorkFlow))) + .andExpect(MockMvcResultMatchers.jsonPath("$.status", Matchers.is(WorkFlowStatus.IN_PROGRESS.name()))) + .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()))); + + // then + Mockito.verify(this.workFlowService, Mockito.times(1)).getWorkFlowStatus(masterWorkFlowExecutionId); + } + @Test public void updateWorkFlowCheckerTaskStatusWithValidData() throws Exception { // given diff --git a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceImplTest.java b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceImplTest.java index fa47879bf..625065a03 100644 --- a/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceImplTest.java +++ b/workflow-service/src/test/java/com/redhat/parodos/workflow/execution/service/WorkFlowServiceImplTest.java @@ -8,7 +8,10 @@ import com.redhat.parodos.workflow.definition.repository.WorkFlowTaskDefinitionRepository; import com.redhat.parodos.workflow.definition.repository.WorkFlowWorkRepository; import com.redhat.parodos.workflow.enums.WorkFlowStatus; + +import com.redhat.parodos.workflow.enums.WorkType; import com.redhat.parodos.workflow.execution.dto.WorkFlowRequestDTO; +import com.redhat.parodos.workflow.execution.dto.WorkFlowStatusResponseDTO; import com.redhat.parodos.workflow.execution.entity.WorkFlowExecution; import com.redhat.parodos.workflow.execution.entity.WorkFlowTaskExecution; import com.redhat.parodos.workflow.execution.repository.WorkFlowRepository; @@ -31,6 +34,7 @@ import java.util.Optional; import java.util.UUID; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @@ -237,7 +241,7 @@ void getWorkFlowByIDTestWithInvalidData() { } @Test - void testsaveWorkflow() { + void testSaveWorkflow() { // given UUID projectId = UUID.randomUUID(); UUID workflowDefID = UUID.randomUUID(); @@ -402,6 +406,190 @@ void testUpdateWorkFlowTask() { assertNotNull(argument.getValue().getResults(), "res"); } + @Test + void testGetWorkFlowStatusWithValidData() { + // given + // master workflow + String masterWorkFlowName = "testMasterWorkFlow"; + UUID masterWorkFlowExecutionId = UUID.randomUUID(); + UUID masterWorkFlowDefinitionId = UUID.randomUUID(); + UUID projectId = UUID.randomUUID(); + WorkFlowDefinition masterWorkFlowDefinition = WorkFlowDefinition.builder().name(masterWorkFlowName) + .numberOfWorks(2).build(); + masterWorkFlowDefinition.setId(masterWorkFlowDefinitionId); + + WorkFlowExecution masterWorkFlowExecution = WorkFlowExecution.builder() + .workFlowDefinitionId(masterWorkFlowDefinitionId).status(WorkFlowStatus.IN_PROGRESS).build(); + masterWorkFlowExecution.setId(masterWorkFlowExecutionId); + + // sub workflow 1 + String TEST_SUB_WORKFLOW_NAME_1 = "testSubWorkFlow1"; + UUID testSubWorkFlowDefinitionId1 = UUID.randomUUID(); + UUID testSubWorkFlowExecutionId1 = UUID.randomUUID(); + // sub workflow definition 1 + WorkFlowDefinition testSubWorkFlowDefinition1 = WorkFlowDefinition.builder().name(TEST_SUB_WORKFLOW_NAME_1) + .numberOfWorks(1).build(); + testSubWorkFlowDefinition1.setId(testSubWorkFlowDefinitionId1); + // sub workflow execution 1 + WorkFlowExecution testSubWorkFlowExecution1 = WorkFlowExecution.builder().projectId(projectId) + .status(WorkFlowStatus.IN_PROGRESS).workFlowDefinitionId(testSubWorkFlowDefinitionId1) + .masterWorkFlowExecution(masterWorkFlowExecution).build(); + testSubWorkFlowExecution1.setId(testSubWorkFlowExecutionId1); + + // sub workflow task 1 + String TEST_SUB_WORKFLOW_TASK_NAME_1 = "testSubWorkFlowTask1"; + UUID testSubWorkFlowTaskDefinitionId1 = UUID.randomUUID(); + UUID testSubWorkFlowTaskExecutionId1 = UUID.randomUUID(); + // sub workflow task definition 1 + WorkFlowTaskDefinition testSubWorkFlowTaskDefinition1 = WorkFlowTaskDefinition.builder() + .name(TEST_SUB_WORKFLOW_TASK_NAME_1).build(); + testSubWorkFlowTaskDefinition1.setId(testSubWorkFlowTaskDefinitionId1); + // link sub workflow task 1 to sub workflow 1 + testSubWorkFlowDefinition1.setWorkFlowTaskDefinitions(List.of(testSubWorkFlowTaskDefinition1)); + // sub workflow task execution 1 + WorkFlowTaskExecution testSubWorkFlowTaskExecution1 = WorkFlowTaskExecution.builder() + .status(WorkFlowTaskStatus.IN_PROGRESS).workFlowExecutionId(testSubWorkFlowExecutionId1) + .workFlowTaskDefinitionId(testSubWorkFlowTaskDefinitionId1).build(); + testSubWorkFlowTaskExecution1.setId(testSubWorkFlowTaskExecutionId1); + + // workflow task 2 + String TEST_WORKFLOW_TASK_NAME_1 = "testWorkFlowTask1"; + UUID testWorkFlowTaskDefinitionId1 = UUID.randomUUID(); + UUID testWorkFlowTaskExecutionId1 = UUID.randomUUID(); + // workflow task definition 2 + WorkFlowTaskDefinition testWorkFlowTaskDefinition1 = WorkFlowTaskDefinition.builder() + .name(TEST_WORKFLOW_TASK_NAME_1).build(); + testWorkFlowTaskDefinition1.setId(testWorkFlowTaskDefinitionId1); + // workflow task execution 2 + WorkFlowTaskExecution testWorkFlowTaskExecution1 = WorkFlowTaskExecution.builder() + .status(WorkFlowTaskStatus.COMPLETED).workFlowExecutionId(masterWorkFlowExecutionId) + .workFlowTaskDefinitionId(testWorkFlowTaskDefinitionId1).build(); + testWorkFlowTaskExecution1.setId(testWorkFlowTaskExecutionId1); + // link workflow task definition 2 to master workFlow + masterWorkFlowDefinition.setWorkFlowTaskDefinitions(List.of(testWorkFlowTaskDefinition1)); + // master workflow works + WorkFlowWorkDefinition masterWorkFlowWorkDefinition1 = WorkFlowWorkDefinition.builder() + .workDefinitionId(testSubWorkFlowDefinitionId1).workDefinitionType(WorkType.WORKFLOW) + .workFlowDefinition(masterWorkFlowDefinition).build(); + masterWorkFlowWorkDefinition1.setId(UUID.randomUUID()); + + WorkFlowWorkDefinition masterWorkFlowWorkDefinition2 = WorkFlowWorkDefinition.builder() + .workDefinitionId(testWorkFlowTaskDefinitionId1).workDefinitionType(WorkType.TASK) + .workFlowDefinition(masterWorkFlowDefinition).build(); + masterWorkFlowWorkDefinition2.setId(UUID.randomUUID()); + + masterWorkFlowDefinition + .setWorkFlowWorkDefinitions(List.of(masterWorkFlowWorkDefinition1, masterWorkFlowWorkDefinition2)); + + WorkFlowWorkDefinition subWorkFlowWorkDefinition1 = WorkFlowWorkDefinition.builder() + .workDefinitionId(testSubWorkFlowTaskDefinitionId1).workDefinitionType(WorkType.TASK) + .workFlowDefinition(testSubWorkFlowDefinition1).build(); + subWorkFlowWorkDefinition1.setId(UUID.randomUUID()); + + // when + Mockito.when(this.workFlowDefinitionRepository.findById(Mockito.eq(masterWorkFlowDefinitionId))) + .thenReturn(Optional.of(masterWorkFlowDefinition)); + + Mockito.when(this.workFlowRepository.findById(Mockito.eq(masterWorkFlowExecutionId))) + .thenReturn(Optional.of(masterWorkFlowExecution)); + + Mockito.when(this.workFlowWorkRepository + .findByWorkFlowDefinitionIdOrderByCreateDateAsc(Mockito.eq(masterWorkFlowDefinitionId))) + .thenReturn(List.of(masterWorkFlowWorkDefinition1, masterWorkFlowWorkDefinition2)); + + Mockito.when(this.workFlowDefinitionRepository.findById(Mockito.eq(testSubWorkFlowDefinitionId1))) + .thenReturn(Optional.of(testSubWorkFlowDefinition1)); + + Mockito.when(this.workFlowRepository.findFirstByMasterWorkFlowExecutionAndWorkFlowDefinitionId( + Mockito.eq(masterWorkFlowExecution), Mockito.eq(testSubWorkFlowDefinitionId1))) + .thenReturn(testSubWorkFlowExecution1); + + Mockito.when(this.workFlowTaskDefinitionRepository.findById(Mockito.eq(testSubWorkFlowTaskDefinitionId1))) + .thenReturn(Optional.of(testSubWorkFlowTaskDefinition1)); + + Mockito.when(this.workFlowTaskDefinitionRepository.findById(Mockito.eq(testWorkFlowTaskDefinitionId1))) + .thenReturn(Optional.of(testWorkFlowTaskDefinition1)); + + Mockito.when(workFlowTaskRepository.findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId( + Mockito.eq(testSubWorkFlowExecutionId1), Mockito.eq(testSubWorkFlowTaskDefinitionId1))) + .thenReturn(List.of(testSubWorkFlowTaskExecution1)); + + Mockito.when(workFlowTaskRepository.findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId( + Mockito.eq(masterWorkFlowExecutionId), Mockito.eq(testWorkFlowTaskDefinitionId1))) + .thenReturn(List.of(testWorkFlowTaskExecution1)); + + Mockito.when(this.workFlowWorkRepository + .findByWorkFlowDefinitionIdOrderByCreateDateAsc(Mockito.eq(testSubWorkFlowDefinitionId1))) + .thenReturn(List.of(subWorkFlowWorkDefinition1)); + + // then + WorkFlowStatusResponseDTO workFlowStatusResponseDTO = this.workFlowService + .getWorkFlowStatus(masterWorkFlowExecutionId); + // master workflow + assertNotNull(workFlowStatusResponseDTO); + assertEquals(workFlowStatusResponseDTO.getWorkFlowExecutionId(), masterWorkFlowExecution.getId().toString()); + assertEquals(workFlowStatusResponseDTO.getWorkFlowName(), masterWorkFlowDefinition.getName()); + assertEquals(workFlowStatusResponseDTO.getStatus(), WorkFlowStatus.IN_PROGRESS.name()); + assertEquals(workFlowStatusResponseDTO.getWorks().size(), 2); + + // sub workflow 1 + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getType(), WorkType.WORKFLOW); + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getName(), testSubWorkFlowDefinition1.getName()); + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getStatus().name(), WorkFlowStatus.PENDING.name()); + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getWorks().size(), 1); + + // sub workflow task 1 + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getWorks().get(0).getType(), WorkType.TASK); + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getWorks().get(0).getName(), + testSubWorkFlowTaskDefinition1.getName()); + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getWorks().get(0).getStatus().name(), + WorkFlowStatus.PENDING.name()); + assertNull(workFlowStatusResponseDTO.getWorks().get(0).getWorks().get(0).getWorks()); + + // workflow task 1 + assertEquals(workFlowStatusResponseDTO.getWorks().get(1).getType(), WorkType.TASK); + assertEquals(workFlowStatusResponseDTO.getWorks().get(1).getName(), testWorkFlowTaskDefinition1.getName()); + assertEquals(workFlowStatusResponseDTO.getWorks().get(1).getStatus().name(), + WorkFlowTaskStatus.COMPLETED.name()); + assertNull(workFlowStatusResponseDTO.getWorks().get(1).getWorks()); + } + + @Test + void testGetWorkFlowStatusWithInvalidExecutionData() { + // master workflow execution + UUID masterWorkFlowExecutionId = UUID.randomUUID(); + + // when + Mockito.when(this.workFlowRepository.findById(Mockito.eq(masterWorkFlowExecutionId))) + .thenReturn(Optional.empty()); + + assertThrows(ResponseStatusException.class, () -> { + this.workFlowService.getWorkFlowStatus(masterWorkFlowExecutionId); + }); + + Mockito.verify(this.workFlowTaskRepository, Mockito.never()).save(any()); + } + + @Test + void testGetWorkFlowStatusWithInvalidDefinitionData() { + // master workflow execution + UUID masterWorkFlowExecutionId = UUID.randomUUID(); + UUID masterWorkFlowDefinitionId = UUID.randomUUID(); + + // when + Mockito.when(this.workFlowRepository.findById(Mockito.eq(masterWorkFlowExecutionId))) + .thenReturn(Optional.of(WorkFlowExecution.builder().workFlowDefinitionId(UUID.randomUUID()) + .status(WorkFlowStatus.IN_PROGRESS).build())); + Mockito.when(this.workFlowDefinitionRepository.findById(Mockito.eq(masterWorkFlowDefinitionId))) + .thenReturn(Optional.empty()); + + assertThrows(ResponseStatusException.class, () -> { + this.workFlowService.getWorkFlowStatus(masterWorkFlowExecutionId); + }); + + Mockito.verify(this.workFlowTaskRepository, Mockito.never()).save(any()); + } + @Test void testUpdateWorkFlowCheckerTaskStatusWithValidData() { // given @@ -507,4 +695,151 @@ private WorkFlowDefinition sampleWorkflowDefinition(String name) { return wf; } + @Test + void testGetWorkFlowStatusWhenSubWorkflowNotExecutedWithValidData() { + // given + // master workflow + String masterWorkFlowName = "testMasterWorkFlow"; + UUID masterWorkFlowExecutionId = UUID.randomUUID(); + UUID masterWorkFlowDefinitionId = UUID.randomUUID(); + UUID projectId = UUID.randomUUID(); + WorkFlowDefinition masterWorkFlowDefinition = WorkFlowDefinition.builder().name(masterWorkFlowName) + .numberOfWorks(2).build(); + masterWorkFlowDefinition.setId(masterWorkFlowDefinitionId); + + WorkFlowExecution masterWorkFlowExecution = WorkFlowExecution.builder() + .workFlowDefinitionId(masterWorkFlowDefinitionId).status(WorkFlowStatus.IN_PROGRESS).build(); + masterWorkFlowExecution.setId(masterWorkFlowExecutionId); + + // sub workflow 1 + String TEST_SUB_WORKFLOW_NAME_1 = "testSubWorkFlow1"; + UUID testSubWorkFlowDefinitionId1 = UUID.randomUUID(); + UUID testSubWorkFlowExecutionId1 = UUID.randomUUID(); + // sub workflow definition 1 + WorkFlowDefinition testSubWorkFlowDefinition1 = WorkFlowDefinition.builder().name(TEST_SUB_WORKFLOW_NAME_1) + .numberOfWorks(1).build(); + testSubWorkFlowDefinition1.setId(testSubWorkFlowDefinitionId1); + // sub workflow execution 1 + WorkFlowExecution testSubWorkFlowExecution1 = WorkFlowExecution.builder().projectId(projectId) + .status(WorkFlowStatus.IN_PROGRESS).workFlowDefinitionId(testSubWorkFlowDefinitionId1) + .masterWorkFlowExecution(masterWorkFlowExecution).build(); + testSubWorkFlowExecution1.setId(testSubWorkFlowExecutionId1); + + // sub workflow task 1 + String TEST_SUB_WORKFLOW_TASK_NAME_1 = "testSubWorkFlowTask1"; + UUID testSubWorkFlowTaskDefinitionId1 = UUID.randomUUID(); + UUID testSubWorkFlowTaskExecutionId1 = UUID.randomUUID(); + // sub workflow task definition 1 + WorkFlowTaskDefinition testSubWorkFlowTaskDefinition1 = WorkFlowTaskDefinition.builder() + .name(TEST_SUB_WORKFLOW_TASK_NAME_1).build(); + testSubWorkFlowTaskDefinition1.setId(testSubWorkFlowTaskDefinitionId1); + // link sub workflow task 1 to sub workflow 1 + testSubWorkFlowDefinition1.setWorkFlowTaskDefinitions(List.of(testSubWorkFlowTaskDefinition1)); + // sub workflow task execution 1 + WorkFlowTaskExecution testSubWorkFlowTaskExecution1 = WorkFlowTaskExecution.builder() + .status(WorkFlowTaskStatus.IN_PROGRESS).workFlowExecutionId(testSubWorkFlowExecutionId1) + .workFlowTaskDefinitionId(testSubWorkFlowTaskDefinitionId1).build(); + testSubWorkFlowTaskExecution1.setId(testSubWorkFlowTaskExecutionId1); + + // workflow task 2 + String TEST_WORKFLOW_TASK_NAME_1 = "testWorkFlowTask1"; + UUID testWorkFlowTaskDefinitionId1 = UUID.randomUUID(); + UUID testWorkFlowTaskExecutionId1 = UUID.randomUUID(); + // workflow task definition 2 + WorkFlowTaskDefinition testWorkFlowTaskDefinition1 = WorkFlowTaskDefinition.builder() + .name(TEST_WORKFLOW_TASK_NAME_1).build(); + testWorkFlowTaskDefinition1.setId(testWorkFlowTaskDefinitionId1); + // workflow task execution 2 + WorkFlowTaskExecution testWorkFlowTaskExecution1 = WorkFlowTaskExecution.builder() + .status(WorkFlowTaskStatus.COMPLETED).workFlowExecutionId(masterWorkFlowExecutionId) + .workFlowTaskDefinitionId(testWorkFlowTaskDefinitionId1).build(); + testWorkFlowTaskExecution1.setId(testWorkFlowTaskExecutionId1); + // link workflow task definition 2 to master workFlow + masterWorkFlowDefinition.setWorkFlowTaskDefinitions(List.of(testWorkFlowTaskDefinition1)); + // master workflow works + WorkFlowWorkDefinition masterWorkFlowWorkDefinition1 = WorkFlowWorkDefinition.builder() + .workDefinitionId(testSubWorkFlowDefinitionId1).workDefinitionType(WorkType.WORKFLOW) + .workFlowDefinition(masterWorkFlowDefinition).build(); + masterWorkFlowWorkDefinition1.setId(UUID.randomUUID()); + + WorkFlowWorkDefinition masterWorkFlowWorkDefinition2 = WorkFlowWorkDefinition.builder() + .workDefinitionId(testWorkFlowTaskDefinitionId1).workDefinitionType(WorkType.TASK) + .workFlowDefinition(masterWorkFlowDefinition).build(); + masterWorkFlowWorkDefinition2.setId(UUID.randomUUID()); + + masterWorkFlowDefinition + .setWorkFlowWorkDefinitions(List.of(masterWorkFlowWorkDefinition1, masterWorkFlowWorkDefinition2)); + + WorkFlowWorkDefinition subWorkFlowWorkDefinition1 = WorkFlowWorkDefinition.builder() + .workDefinitionId(testSubWorkFlowTaskDefinitionId1).workDefinitionType(WorkType.TASK) + .workFlowDefinition(testSubWorkFlowDefinition1).build(); + subWorkFlowWorkDefinition1.setId(UUID.randomUUID()); + + // when + Mockito.when(this.workFlowDefinitionRepository.findById(Mockito.eq(masterWorkFlowDefinitionId))) + .thenReturn(Optional.of(masterWorkFlowDefinition)); + + Mockito.when(this.workFlowRepository.findById(Mockito.eq(masterWorkFlowExecutionId))) + .thenReturn(Optional.of(masterWorkFlowExecution)); + + Mockito.when(this.workFlowWorkRepository + .findByWorkFlowDefinitionIdOrderByCreateDateAsc(Mockito.eq(masterWorkFlowDefinitionId))) + .thenReturn(List.of(masterWorkFlowWorkDefinition1, masterWorkFlowWorkDefinition2)); + + Mockito.when(this.workFlowDefinitionRepository.findById(Mockito.eq(testSubWorkFlowDefinitionId1))) + .thenReturn(Optional.of(testSubWorkFlowDefinition1)); + + Mockito.when(this.workFlowRepository.findFirstByMasterWorkFlowExecutionAndWorkFlowDefinitionId( + Mockito.eq(masterWorkFlowExecution), Mockito.eq(testSubWorkFlowDefinitionId1))).thenReturn(null); + + Mockito.when(this.workFlowTaskDefinitionRepository.findById(Mockito.eq(testSubWorkFlowTaskDefinitionId1))) + .thenReturn(Optional.of(testSubWorkFlowTaskDefinition1)); + + Mockito.when(this.workFlowTaskDefinitionRepository.findById(Mockito.eq(testWorkFlowTaskDefinitionId1))) + .thenReturn(Optional.of(testWorkFlowTaskDefinition1)); + + Mockito.when(workFlowTaskRepository.findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId( + Mockito.eq(testSubWorkFlowExecutionId1), Mockito.eq(testSubWorkFlowTaskDefinitionId1))) + .thenReturn(List.of()); + + Mockito.when(workFlowTaskRepository.findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId( + Mockito.eq(masterWorkFlowExecutionId), Mockito.eq(testWorkFlowTaskDefinitionId1))) + .thenReturn(List.of()); + + Mockito.when(this.workFlowWorkRepository + .findByWorkFlowDefinitionIdOrderByCreateDateAsc(Mockito.eq(testSubWorkFlowDefinitionId1))) + .thenReturn(List.of(subWorkFlowWorkDefinition1)); + + // then + WorkFlowStatusResponseDTO workFlowStatusResponseDTO = this.workFlowService + .getWorkFlowStatus(masterWorkFlowExecutionId); + // master workflow + assertNotNull(workFlowStatusResponseDTO); + assertEquals(workFlowStatusResponseDTO.getWorkFlowExecutionId(), masterWorkFlowExecution.getId().toString()); + assertEquals(workFlowStatusResponseDTO.getWorkFlowName(), masterWorkFlowDefinition.getName()); + assertEquals(workFlowStatusResponseDTO.getStatus(), WorkFlowStatus.IN_PROGRESS.name()); + assertEquals(workFlowStatusResponseDTO.getWorks().size(), 2); + + // sub workflow 1 + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getType(), WorkType.WORKFLOW); + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getName(), testSubWorkFlowDefinition1.getName()); + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getStatus().name(), WorkFlowStatus.PENDING.name()); + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getWorks().size(), 1); + + // sub workflow task 1 + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getWorks().get(0).getType(), WorkType.TASK); + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getWorks().get(0).getName(), + testSubWorkFlowTaskDefinition1.getName()); + assertEquals(workFlowStatusResponseDTO.getWorks().get(0).getWorks().get(0).getStatus().name(), + WorkFlowStatus.PENDING.name()); + assertNull(workFlowStatusResponseDTO.getWorks().get(0).getWorks().get(0).getWorks()); + + // workflow task 1 + assertEquals(workFlowStatusResponseDTO.getWorks().get(1).getType(), WorkType.TASK); + assertEquals(workFlowStatusResponseDTO.getWorks().get(1).getName(), testWorkFlowTaskDefinition1.getName()); + assertEquals(workFlowStatusResponseDTO.getWorks().get(1).getStatus().name(), + com.redhat.parodos.workflow.enums.WorkStatus.PENDING.name()); + assertNull(workFlowStatusResponseDTO.getWorks().get(1).getWorks()); + } + }