From 4e52bd3a023668a0cfc6587f2a053d7eda425831 Mon Sep 17 00:00:00 2001 From: taskain7 Date: Fri, 17 Mar 2023 08:09:21 +0100 Subject: [PATCH] [FINERACT-1678] all Loan COB steps are completed if there is no loan to be processed --- .../cob/loan/FetchAndLockLoanTasklet.java | 2 ++ .../fineract/cob/loan/LoanCOBPartitioner.java | 8 +------ .../fineract/cob/loan/LoanItemReader.java | 1 - .../LoanCOBPartitionerStepDefinitions.java | 23 +++++++++++-------- .../cob/loan/cob.loan.partitioner.feature | 10 +------- 5 files changed, 17 insertions(+), 27 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/FetchAndLockLoanTasklet.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/FetchAndLockLoanTasklet.java index f11c8576b..80bb45c88 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/FetchAndLockLoanTasklet.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/FetchAndLockLoanTasklet.java @@ -21,6 +21,7 @@ package org.apache.fineract.cob.loan; import com.google.common.collect.Lists; import java.time.LocalDate; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; import lombok.RequiredArgsConstructor; @@ -54,6 +55,7 @@ public class FetchAndLockLoanTasklet implements Tasklet { LocalDate businessDate = LocalDate.parse(Objects.requireNonNull(businessDateParameter)); List allNonClosedLoanIds = retrieveLoanIdService.retrieveLoanIdsNDaysBehind(NUMBER_OF_DAYS_BEHIND, businessDate); if (allNonClosedLoanIds.isEmpty()) { + contribution.getStepExecution().getJobExecution().getExecutionContext().put(LoanCOBConstant.LOAN_IDS, Collections.emptyList()); return RepeatStatus.FINISHED; } List remainingIds = new ArrayList<>(allNonClosedLoanIds); 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 1d4a912d9..2a851130a 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 @@ -37,7 +37,6 @@ import org.springframework.batch.core.launch.JobOperator; import org.springframework.batch.core.launch.NoSuchJobExecutionException; import org.springframework.batch.core.partition.support.Partitioner; import org.springframework.batch.item.ExecutionContext; -import org.springframework.util.CollectionUtils; @Slf4j @RequiredArgsConstructor @@ -58,17 +57,12 @@ public class LoanCOBPartitioner implements Partitioner { int partitionSize = propertyService.getPartitionSize(LoanCOBConstant.JOB_NAME); Set cobBusinessSteps = cobBusinessStepService.getCOBBusinessSteps(LoanCOBBusinessStep.class, LoanCOBConstant.LOAN_COB_JOB_NAME); - if (cobBusinessSteps.isEmpty()) { - stopJobExecution(); - return Map.of(); - } return getPartitions(partitionSize, cobBusinessSteps); } private Map getPartitions(int partitionSize, Set cobBusinessSteps) { Map partitions = new HashMap<>(); - - if (CollectionUtils.isEmpty(loanIds)) { + if (cobBusinessSteps.isEmpty()) { stopJobExecution(); return Map.of(); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java index 2b7993e88..36bdad5ea 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java +++ b/fineract-provider/src/main/java/org/apache/fineract/cob/loan/LoanItemReader.java @@ -35,7 +35,6 @@ public class LoanItemReader extends AbstractLoanItemReader { @BeforeStep @SuppressWarnings({ "unchecked" }) public void beforeStep(@NotNull StepExecution stepExecution) { - ExecutionContext executionContext = stepExecution.getExecutionContext(); ExecutionContext jobExecutionContext = stepExecution.getJobExecution().getExecutionContext(); List loanIds = (List) executionContext.get(LoanCOBConstant.LOAN_IDS); 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 626ea96b5..03a045ac3 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 @@ -19,7 +19,6 @@ 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.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; @@ -27,7 +26,6 @@ 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; @@ -70,12 +68,12 @@ public class LoanCOBPartitionerStepDefinitions implements En { .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); + loanIds = Collections.emptyList(); } else if ("empty loanIds".equals(action)) { 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")); + loanIds = Collections.emptyList(); } else if ("good".equals(action)) { cobBusinessSteps.add(new BusinessStepNameAndOrder("Business step", 1L)); lenient().when(cobBusinessStepService.getCOBBusinessSteps(LoanCOBBusinessStep.class, LoanCOBConstant.LOAN_COB_JOB_NAME)) @@ -113,13 +111,18 @@ public class LoanCOBPartitionerStepDefinitions implements En { 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)); + } else if ("empty loanIds".equals(action)) { + verify(jobOperator, Mockito.times(0)).stop(Mockito.anyLong()); + assertEquals(1, resultItem.size()); + assertTrue(resultItem.containsKey(LoanCOBPartitioner.PARTITION_PREFIX + "1")); + 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(0, ((List) resultItem.get(LoanCOBPartitioner.PARTITION_PREFIX + "1").get(LoanCOBConstant.LOAN_IDS)).size()); } }); - - Then("throw exception LoanCOBPartitioner.partition method", () -> { - assertThrows(RuntimeException.class, () -> { - resultItem = this.loanCOBPartitioner.partition(2); - }); - }); } } diff --git a/fineract-provider/src/test/resources/features/cob/loan/cob.loan.partitioner.feature b/fineract-provider/src/test/resources/features/cob/loan/cob.loan.partitioner.feature index 404928ce4..16edca086 100644 --- a/fineract-provider/src/test/resources/features/cob/loan/cob.loan.partitioner.feature +++ b/fineract-provider/src/test/resources/features/cob/loan/cob.loan.partitioner.feature @@ -29,12 +29,4 @@ Feature: COB Loan partitioner Step |action| |empty steps| |good| - - @cob - Scenario Outline: LoanCOBPartitioner - run test: exception - Given The LoanCOBPartitioner.partition method with action - Then throw exception LoanCOBPartitioner.partition method - - Examples: - |action| - |empty loanIds| \ No newline at end of file + |empty loanIds|