From f5687750ff7e1e977cc2532592d13846ea964747 Mon Sep 17 00:00:00 2001 From: taskain7 Date: Tue, 7 Feb 2023 17:58:08 +0100 Subject: [PATCH] [FINERACT-1678] COB business step order fix --- .../starter/AcmeBusinessStepDefinitions.java | 7 ++-- .../fineract/cob/COBBusinessStepService.java | 4 +- .../cob/COBBusinessStepServiceImpl.java | 10 +++-- .../cob/data/BusinessStepNameAndOrder.java | 34 ++++++++++++++++ .../cob/loan/AbstractLoanItemProcessor.java | 13 ++++++- ...neLoanCOBBuildExecutionContextTasklet.java | 7 ++-- .../fineract/cob/loan/LoanCOBConstant.java | 2 +- .../fineract/cob/loan/LoanCOBPartitioner.java | 18 ++++----- .../cob/loan/LoanInlineCOBConfig.java | 2 +- ...COBBusinessStepServiceStepDefinitions.java | 14 ++++--- .../LoanCOBPartitionerStepDefinitions.java | 39 ++++++++++++------- .../LoanItemProcessorStepDefinitions.java | 11 +++--- 12 files changed, 114 insertions(+), 47 deletions(-) create mode 100644 fineract-provider/src/main/java/org/apache/fineract/cob/data/BusinessStepNameAndOrder.java diff --git a/custom/acme/loan/starter/src/test/java/com/acme/fineract/loan/starter/AcmeBusinessStepDefinitions.java b/custom/acme/loan/starter/src/test/java/com/acme/fineract/loan/starter/AcmeBusinessStepDefinitions.java index 9e6469bc9..fb407dd39 100644 --- a/custom/acme/loan/starter/src/test/java/com/acme/fineract/loan/starter/AcmeBusinessStepDefinitions.java +++ b/custom/acme/loan/starter/src/test/java/com/acme/fineract/loan/starter/AcmeBusinessStepDefinitions.java @@ -21,10 +21,11 @@ package com.acme.fineract.loan.starter; import static org.assertj.core.api.Assertions.assertThat; import io.cucumber.java8.En; -import java.util.TreeMap; +import java.util.Set; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.cob.COBBusinessStep; import org.apache.fineract.cob.COBBusinessStepService; +import org.apache.fineract.cob.data.BusinessStepNameAndOrder; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -38,7 +39,7 @@ public class AcmeBusinessStepDefinitions implements En { private COBBusinessStep businessStep; - private TreeMap result; + private Set result; public AcmeBusinessStepDefinitions() { Given("/^An auto configuration (.*) and a service configuration (.*)$/", @@ -56,7 +57,7 @@ public class AcmeBusinessStepDefinitions implements En { this.businessStep = ctx.getBean((Class>) Class.forName(stepClass)); // TODO: not yet working, because no storage configured/mocked - this.result = businessStepService.getCOBBusinessStepMap(this.businessStep.getClass(), stepName); + this.result = businessStepService.getCOBBusinessSteps(this.businessStep.getClass(), stepName); }); }); diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/COBBusinessStepService.java b/fineract-provider/src/main/java/org/apache/fineract/cob/COBBusinessStepService.java index ade540adc..1ab1d82e8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/COBBusinessStepService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/COBBusinessStepService.java @@ -18,7 +18,9 @@ */ package org.apache.fineract.cob; +import java.util.Set; import java.util.TreeMap; +import org.apache.fineract.cob.data.BusinessStepNameAndOrder; import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom; import org.jetbrains.annotations.NotNull; @@ -27,6 +29,6 @@ public interface COBBusinessStepService { , S extends AbstractPersistableCustom> S run(TreeMap executionMap, S item); @NotNull - , S extends AbstractPersistableCustom> TreeMap getCOBBusinessStepMap( + , S extends AbstractPersistableCustom> Set getCOBBusinessSteps( Class businessStepClass, String cobJobName); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/COBBusinessStepServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/cob/COBBusinessStepServiceImpl.java index 2ea27b8a6..51d1c7ee0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/COBBusinessStepServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/COBBusinessStepServiceImpl.java @@ -19,11 +19,14 @@ package org.apache.fineract.cob; import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.TreeMap; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.fineract.cob.data.BusinessStepNameAndOrder; import org.apache.fineract.cob.domain.BatchBusinessStep; import org.apache.fineract.cob.domain.BatchBusinessStepRepository; import org.apache.fineract.cob.exceptions.BusinessStepException; @@ -86,16 +89,17 @@ public class COBBusinessStepServiceImpl implements COBBusinessStepService { @NotNull @Override - public , S extends AbstractPersistableCustom> TreeMap getCOBBusinessStepMap( + public , S extends AbstractPersistableCustom> Set getCOBBusinessSteps( Class businessStepClass, String cobJobName) { List cobStepConfigs = batchBusinessStepRepository.findAllByJobName(cobJobName); List businessSteps = Arrays.stream(beanFactory.getBeanNamesForType(businessStepClass)).toList(); - TreeMap executionMap = new TreeMap<>(); + Set executionMap = new HashSet<>(); for (String businessStep : businessSteps) { COBBusinessStep businessStepBean = (COBBusinessStep) applicationContext.getBean(businessStep); Optional businessStepConfig = cobStepConfigs.stream() .filter(stepConfig -> businessStepBean.getEnumStyledName().equals(stepConfig.getStepName())).findFirst(); - businessStepConfig.ifPresent(batchBusinessStep -> executionMap.put(batchBusinessStep.getStepOrder(), businessStep)); + businessStepConfig.ifPresent( + batchBusinessStep -> executionMap.add(new BusinessStepNameAndOrder(businessStep, batchBusinessStep.getStepOrder()))); } return executionMap; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/data/BusinessStepNameAndOrder.java b/fineract-provider/src/main/java/org/apache/fineract/cob/data/BusinessStepNameAndOrder.java new file mode 100644 index 000000000..5f084f458 --- /dev/null +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/data/BusinessStepNameAndOrder.java @@ -0,0 +1,34 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.fineract.cob.data; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@Getter +@NoArgsConstructor +@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) +public class BusinessStepNameAndOrder { + + private String stepName; + private Long stepOrder; +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemProcessor.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemProcessor.java index 65ddcfff0..f88693303 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemProcessor.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/AbstractLoanItemProcessor.java @@ -20,13 +20,17 @@ package org.apache.fineract.cob.loan; import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.TreeMap; +import java.util.stream.Collectors; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.cob.COBBusinessStepService; +import org.apache.fineract.cob.data.BusinessStepNameAndOrder; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.jetbrains.annotations.NotNull; import org.springframework.batch.core.ExitStatus; @@ -47,13 +51,20 @@ public abstract class AbstractLoanItemProcessor implements ItemProcessor businessStepMap = (TreeMap) executionContext.get(LoanCOBConstant.BUSINESS_STEP_MAP); + Set businessSteps = (Set) executionContext.get(LoanCOBConstant.BUSINESS_STEPS); + TreeMap businessStepMap = getBusinessStepMap(businessSteps); Loan alreadyProcessedLoan = cobBusinessStepService.run(businessStepMap, item); alreadyProcessedLoan.setLastClosedBusinessDate(businessDate); return alreadyProcessedLoan; } + private TreeMap getBusinessStepMap(Set businessSteps) { + Map businessStepMap = businessSteps.stream() + .collect(Collectors.toMap(BusinessStepNameAndOrder::getStepOrder, BusinessStepNameAndOrder::getStepName)); + return new TreeMap<>(businessStepMap); + } + @AfterStep public ExitStatus afterStep(@NotNull StepExecution stepExecution) { return ExitStatus.COMPLETED; diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineLoanCOBBuildExecutionContextTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineLoanCOBBuildExecutionContextTasklet.java index b24b2b9a4..276d7c702 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineLoanCOBBuildExecutionContextTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/InlineLoanCOBBuildExecutionContextTasklet.java @@ -25,10 +25,11 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.TreeMap; +import java.util.Set; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.cob.COBBusinessStepService; +import org.apache.fineract.cob.data.BusinessStepNameAndOrder; import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType; import org.apache.fineract.infrastructure.core.domain.ActionContext; import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; @@ -55,10 +56,10 @@ public class InlineLoanCOBBuildExecutionContextTasklet implements Tasklet { public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { HashMap businessDates = ThreadLocalContextUtil.getBusinessDates(); ThreadLocalContextUtil.setActionContext(ActionContext.COB); - TreeMap cobBusinessStepMap = cobBusinessStepService.getCOBBusinessStepMap(LoanCOBBusinessStep.class, + Set cobBusinessSteps = cobBusinessStepService.getCOBBusinessSteps(LoanCOBBusinessStep.class, LoanCOBConstant.LOAN_COB_JOB_NAME); contribution.getStepExecution().getExecutionContext().put(LoanCOBConstant.LOAN_IDS, getLoanIdsFromJobParameters(chunkContext)); - contribution.getStepExecution().getExecutionContext().put(LoanCOBConstant.BUSINESS_STEP_MAP, cobBusinessStepMap); + contribution.getStepExecution().getExecutionContext().put(LoanCOBConstant.BUSINESS_STEPS, cobBusinessSteps); String businessDateString = getBusinessDateFromJobParameters(chunkContext); contribution.getStepExecution().getExecutionContext().put(LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME, businessDateString); LocalDate businessDate = LocalDate.parse(businessDateString, DateTimeFormatter.ISO_DATE); diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBConstant.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBConstant.java index 782abcef7..8a1e4d024 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBConstant.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBConstant.java @@ -24,7 +24,7 @@ public final class LoanCOBConstant { public static final String JOB_HUMAN_READABLE_NAME = "Loan COB"; public static final String LOAN_COB_JOB_NAME = "LOAN_CLOSE_OF_BUSINESS"; public static final String LOAN_IDS = "loanIds"; - public static final String BUSINESS_STEP_MAP = "businessStepMap"; + public static final String BUSINESS_STEPS = "businessSteps"; public static final String LOAN_COB_WORKER_STEP = "loanCOBWorkerStep"; public static final String ALREADY_LOCKED_BY_INLINE_COB_OR_PROCESSED_LOAN_IDS = "alreadyLockedOrProcessedLoanIds"; diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java index 83abe7dd5..1d4a912d9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanCOBPartitioner.java @@ -23,10 +23,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeMap; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.fineract.cob.COBBusinessStepService; +import org.apache.fineract.cob.data.BusinessStepNameAndOrder; import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.springbatch.PropertyService; import org.jetbrains.annotations.NotNull; @@ -56,16 +56,16 @@ public class LoanCOBPartitioner implements Partitioner { @Override public Map partition(int gridSize) { int partitionSize = propertyService.getPartitionSize(LoanCOBConstant.JOB_NAME); - TreeMap cobBusinessStepMap = cobBusinessStepService.getCOBBusinessStepMap(LoanCOBBusinessStep.class, + Set cobBusinessSteps = cobBusinessStepService.getCOBBusinessSteps(LoanCOBBusinessStep.class, LoanCOBConstant.LOAN_COB_JOB_NAME); - if (cobBusinessStepMap.isEmpty()) { + if (cobBusinessSteps.isEmpty()) { stopJobExecution(); return Map.of(); } - return getPartitions(partitionSize, cobBusinessStepMap); + return getPartitions(partitionSize, cobBusinessSteps); } - private Map getPartitions(int partitionSize, TreeMap cobBusinessStepMap) { + private Map getPartitions(int partitionSize, Set cobBusinessSteps) { Map partitions = new HashMap<>(); if (CollectionUtils.isEmpty(loanIds)) { @@ -74,11 +74,11 @@ public class LoanCOBPartitioner implements Partitioner { } int partitionIndex = 1; int remainingSpace = 0; - createNewPartition(partitions, partitionIndex, cobBusinessStepMap); + createNewPartition(partitions, partitionIndex, cobBusinessSteps); for (Long loanId : loanIds) { if (remainingSpace == partitionSize) { partitionIndex++; - createNewPartition(partitions, partitionIndex, cobBusinessStepMap); + createNewPartition(partitions, partitionIndex, cobBusinessSteps); remainingSpace = 0; } String key = PARTITION_PREFIX + partitionIndex; @@ -91,10 +91,10 @@ public class LoanCOBPartitioner implements Partitioner { } private void createNewPartition(Map partitions, int partitionIndex, - TreeMap cobBusinessStepMap) { + Set cobBusinessSteps) { ExecutionContext executionContext = new ExecutionContext(); executionContext.put(LoanCOBConstant.LOAN_IDS, new ArrayList()); - executionContext.put(LoanCOBConstant.BUSINESS_STEP_MAP, cobBusinessStepMap); + executionContext.put(LoanCOBConstant.BUSINESS_STEPS, cobBusinessSteps); executionContext.put("partition", PARTITION_PREFIX + partitionIndex); partitions.put(PARTITION_PREFIX + partitionIndex, executionContext); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java index a23bcc1c4..64dcecfcb 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanInlineCOBConfig.java @@ -122,7 +122,7 @@ public class LoanInlineCOBConfig { public ExecutionContextPromotionListener inlineCobPromotionListener() { ExecutionContextPromotionListener listener = new ExecutionContextPromotionListener(); listener.setKeys( - new String[] { LoanCOBConstant.LOAN_IDS, LoanCOBConstant.BUSINESS_STEP_MAP, LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME }); + new String[] { LoanCOBConstant.LOAN_IDS, LoanCOBConstant.BUSINESS_STEPS, LoanCOBConstant.BUSINESS_DATE_PARAMETER_NAME }); return listener; } } diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/COBBusinessStepServiceStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/cob/COBBusinessStepServiceStepDefinitions.java index b2c8d7736..2d4c41614 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/COBBusinessStepServiceStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/COBBusinessStepServiceStepDefinitions.java @@ -30,7 +30,9 @@ import java.math.BigDecimal; import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Set; import java.util.TreeMap; +import org.apache.fineract.cob.data.BusinessStepNameAndOrder; import org.apache.fineract.cob.domain.BatchBusinessStep; import org.apache.fineract.cob.domain.BatchBusinessStepRepository; import org.apache.fineract.cob.exceptions.BusinessStepException; @@ -69,7 +71,7 @@ public class COBBusinessStepServiceStepDefinitions implements En { private Class clazz; private String jobName; private BatchBusinessStep batchBusinessStep = mock(BatchBusinessStep.class); - private TreeMap resultMap; + private Set resultSet; public COBBusinessStepServiceStepDefinitions() { Given("/^The COBBusinessStepService.run method with executeMap (.*)$/", (String executionMap) -> { @@ -136,7 +138,7 @@ public class COBBusinessStepServiceStepDefinitions implements En { }); When("COBBusinessStepService.getCOBBusinessStepMap method executed", () -> { - resultMap = this.businessStepService.getCOBBusinessStepMap(this.clazz, this.jobName); + resultSet = this.businessStepService.getCOBBusinessSteps(this.clazz, this.jobName); }); Then("The COBBusinessStepService.run result should match", () -> { @@ -162,19 +164,19 @@ public class COBBusinessStepServiceStepDefinitions implements En { Then("The COBBusinessStepService.getCOBBusinessStepMap result exception", () -> { assertThrows(BeanCreationException.class, () -> { - this.businessStepService.getCOBBusinessStepMap(this.clazz, this.jobName); + this.businessStepService.getCOBBusinessSteps(this.clazz, this.jobName); }); ThreadLocalContextUtil.setActionContext(ActionContext.DEFAULT); }); Then("The COBBusinessStepService.getCOBBusinessStepMap result should match", () -> { - assertEquals(1, resultMap.size()); - assertEquals("test", resultMap.get(1L)); + assertEquals(1, resultSet.size()); + assertEquals("test", resultSet.stream().findFirst().get().getStepName()); ThreadLocalContextUtil.setActionContext(ActionContext.DEFAULT); }); Then("The COBBusinessStepService.getCOBBusinessStepMap result empty", () -> { - assertEquals(0, resultMap.size()); + assertEquals(0, resultSet.size()); ThreadLocalContextUtil.setActionContext(ActionContext.DEFAULT); }); diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerStepDefinitions.java index d3892497e..626ea96b5 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanCOBPartitionerStepDefinitions.java @@ -25,13 +25,17 @@ import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import com.google.gson.Gson; import io.cucumber.java8.En; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeMap; import org.apache.fineract.cob.COBBusinessStepService; +import org.apache.fineract.cob.data.BusinessStepNameAndOrder; +import org.apache.fineract.infrastructure.core.serialization.GoogleGsonSerializerHelper; import org.apache.fineract.infrastructure.jobs.service.JobName; import org.apache.fineract.infrastructure.springbatch.PropertyService; import org.mockito.Mockito; @@ -46,11 +50,12 @@ public class LoanCOBPartitionerStepDefinitions implements En { COBBusinessStepService cobBusinessStepService = mock(COBBusinessStepService.class); JobOperator jobOperator = mock(JobOperator.class); JobExplorer jobExplorer = mock(JobExplorer.class); + private final Gson gson = GoogleGsonSerializerHelper.createSimpleGson(); List loanIds; private LoanCOBPartitioner loanCOBPartitioner; - private TreeMap cobBusinessMap = new TreeMap<>(); + private Set cobBusinessSteps = new HashSet<>(); private Map resultItem; private String action; @@ -61,20 +66,20 @@ public class LoanCOBPartitionerStepDefinitions implements En { this.action = action; lenient().when(propertyService.getPartitionSize(LoanCOBConstant.JOB_NAME)).thenReturn(2); if ("empty steps".equals(action)) { - lenient().when(cobBusinessStepService.getCOBBusinessStepMap(LoanCOBBusinessStep.class, LoanCOBConstant.LOAN_COB_JOB_NAME)) - .thenReturn(new TreeMap<>()); + lenient().when(cobBusinessStepService.getCOBBusinessSteps(LoanCOBBusinessStep.class, LoanCOBConstant.LOAN_COB_JOB_NAME)) + .thenReturn(Collections.emptySet()); lenient().when(jobExplorer.findRunningJobExecutions(JobName.LOAN_COB.name())).thenReturn(Set.of(new JobExecution(3L))); lenient().when(jobOperator.stop(3L)).thenReturn(Boolean.TRUE); } else if ("empty loanIds".equals(action)) { - cobBusinessMap.put(1L, "Business step"); - lenient().when(cobBusinessStepService.getCOBBusinessStepMap(LoanCOBBusinessStep.class, LoanCOBConstant.LOAN_COB_JOB_NAME)) - .thenReturn(cobBusinessMap); + cobBusinessSteps.add(new BusinessStepNameAndOrder("Business step", 1L)); + lenient().when(cobBusinessStepService.getCOBBusinessSteps(LoanCOBBusinessStep.class, LoanCOBConstant.LOAN_COB_JOB_NAME)) + .thenReturn(cobBusinessSteps); loanIds = new ArrayList<>(); lenient().when(jobExplorer.findRunningJobExecutions(JobName.LOAN_COB.name())).thenThrow(new RuntimeException("fail")); } else if ("good".equals(action)) { - cobBusinessMap.put(1L, "Business step"); - lenient().when(cobBusinessStepService.getCOBBusinessStepMap(LoanCOBBusinessStep.class, LoanCOBConstant.LOAN_COB_JOB_NAME)) - .thenReturn(cobBusinessMap); + cobBusinessSteps.add(new BusinessStepNameAndOrder("Business step", 1L)); + lenient().when(cobBusinessStepService.getCOBBusinessSteps(LoanCOBBusinessStep.class, LoanCOBConstant.LOAN_COB_JOB_NAME)) + .thenReturn(cobBusinessSteps); loanIds = List.of(1L, 2L, 3L); } loanCOBPartitioner = new LoanCOBPartitioner(propertyService, cobBusinessStepService, jobOperator, jobExplorer, loanIds); @@ -92,14 +97,20 @@ public class LoanCOBPartitionerStepDefinitions implements En { verify(jobOperator, Mockito.times(0)).stop(Mockito.anyLong()); assertEquals(2, resultItem.size()); assertTrue(resultItem.containsKey(LoanCOBPartitioner.PARTITION_PREFIX + "1")); - assertEquals(cobBusinessMap, - resultItem.get(LoanCOBPartitioner.PARTITION_PREFIX + "1").get(LoanCOBConstant.BUSINESS_STEP_MAP)); + Set businessSteps = (Set) resultItem + .get(LoanCOBPartitioner.PARTITION_PREFIX + "1").get(LoanCOBConstant.BUSINESS_STEPS); + assertEquals(cobBusinessSteps.stream().findFirst().get().getStepOrder(), + businessSteps.stream().findFirst().get().getStepOrder()); + assertEquals(cobBusinessSteps.stream().findFirst().get().getStepName(), + businessSteps.stream().findFirst().get().getStepName()); assertEquals(2, ((List) resultItem.get(LoanCOBPartitioner.PARTITION_PREFIX + "1").get(LoanCOBConstant.LOAN_IDS)).size()); assertEquals(1L, ((List) resultItem.get(LoanCOBPartitioner.PARTITION_PREFIX + "1").get(LoanCOBConstant.LOAN_IDS)).get(0)); assertEquals(2L, ((List) resultItem.get(LoanCOBPartitioner.PARTITION_PREFIX + "1").get(LoanCOBConstant.LOAN_IDS)).get(1)); assertTrue(resultItem.containsKey(LoanCOBPartitioner.PARTITION_PREFIX + "2")); - assertEquals(cobBusinessMap, - resultItem.get(LoanCOBPartitioner.PARTITION_PREFIX + "2").get(LoanCOBConstant.BUSINESS_STEP_MAP)); + assertEquals(cobBusinessSteps.stream().findFirst().get().getStepOrder(), + businessSteps.stream().findFirst().get().getStepOrder()); + assertEquals(cobBusinessSteps.stream().findFirst().get().getStepName(), + businessSteps.stream().findFirst().get().getStepName()); assertEquals(1, ((List) resultItem.get(LoanCOBPartitioner.PARTITION_PREFIX + "2").get(LoanCOBConstant.LOAN_IDS)).size()); assertEquals(3L, ((List) resultItem.get(LoanCOBPartitioner.PARTITION_PREFIX + "2").get(LoanCOBConstant.LOAN_IDS)).get(0)); } diff --git a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemProcessorStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemProcessorStepDefinitions.java index 3c2e2f842..15d0f31f3 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemProcessorStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/cob/loan/LoanItemProcessorStepDefinitions.java @@ -20,12 +20,15 @@ package org.apache.fineract.cob.loan; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; import io.cucumber.java8.En; import java.time.LocalDate; import java.time.ZoneId; +import java.util.Collections; import java.util.TreeMap; import org.apache.fineract.cob.COBBusinessStepService; import org.apache.fineract.portfolio.loanaccount.domain.Loan; @@ -46,8 +49,6 @@ public class LoanItemProcessorStepDefinitions implements En { private Loan resultItem; - private TreeMap treeMap = mock(TreeMap.class); - public LoanItemProcessorStepDefinitions() { Given("/^The LoanItemProcessor.process method with item (.*)$/", (String loanItem) -> { JobExecution jobExecution = new JobExecution(1L); @@ -55,7 +56,7 @@ public class LoanItemProcessorStepDefinitions implements En { LocalDate.now(ZoneId.systemDefault()).toString()); StepExecution stepExecution = new StepExecution("test", jobExecution); ExecutionContext stepExecutionContext = new ExecutionContext(); - stepExecutionContext.put(LoanCOBConstant.BUSINESS_STEP_MAP, treeMap); + stepExecutionContext.put(LoanCOBConstant.BUSINESS_STEPS, Collections.emptySet()); stepExecution.setExecutionContext(stepExecutionContext); loanItemProcessor.beforeStep(stepExecution); @@ -65,8 +66,8 @@ public class LoanItemProcessorStepDefinitions implements En { this.loanItem = loan; } - lenient().when(this.cobBusinessStepService.run(treeMap, null)).thenThrow(new RuntimeException("fail")); - lenient().when(this.cobBusinessStepService.run(treeMap, loan)).thenReturn(processedLoan); + lenient().when(this.cobBusinessStepService.run(any(TreeMap.class), eq(null))).thenThrow(new RuntimeException("fail")); + lenient().when(this.cobBusinessStepService.run(any(TreeMap.class), eq(loan))).thenReturn(processedLoan); });