FINERACT-2181: Use matrix jobs via Github Actions to improve performance

This commit is contained in:
Adam Saghy
2025-07-02 10:01:37 +02:00
committed by Arnold Gálovics
parent dc2101bc21
commit 70eb2add0d
28 changed files with 924 additions and 437 deletions
@@ -86,6 +86,9 @@ public class AccrualsOnLoanClosureTest extends BaseLoanIntegrationTest {
transaction(800.0, "Disbursement", "22 April 2024", 800.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
transaction(820.0, "Repayment", "25 April 2024", 0.0, 800.0, 0.0, 0.0, 20.0, 0.0, 0.0),
transaction(20.0, "Accrual", "25 April 2024", 0.0, 0.0, 0.0, 0.0, 20.0, 0.0, 0.0));
globalConfigurationHelper.updateGlobalConfiguration(CHARGE_ACCRUAL_DATE,
new PutGlobalConfigurationsRequest().stringValue("due-date"));
});
}
}
@@ -25,14 +25,24 @@ import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.apache.fineract.integrationtests.common.Utils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@Slf4j
public class ActuatorIntegrationTest {
private static final String INFO_URL = "/fineract-provider/actuator/info";
@BeforeEach
public void setup() {
Utils.initializeRESTAssured();
}
@Test
public void testActuatorGitBuildInfo() {
log.info(INFO_URL);
Response response = RestAssured.given().headers("Content-Type", ContentType.JSON, "Accept", ContentType.JSON).when().get(INFO_URL)
.then().contentType(ContentType.JSON).extract().response();
@@ -168,9 +168,8 @@ public class DelinquencyAndChargebackIntegrationTest extends BaseLoanIntegration
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate);
log.info("Current Business date {}", businessDate);
// Run the Loan COB Job
final String jobName = "Loan COB";
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
// Get loan details expecting to have a delinquency classification
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
@@ -293,9 +292,8 @@ public class DelinquencyAndChargebackIntegrationTest extends BaseLoanIntegration
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, businessDate);
log.info("Current Business date {}", businessDate);
// Run the Loan COB Job
final String jobName = "Loan COB";
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
// Get loan details expecting to have a delinquency classification
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
@@ -76,7 +76,6 @@ import org.apache.fineract.integrationtests.common.CommonConstants;
import org.apache.fineract.integrationtests.common.SchedulerJobHelper;
import org.apache.fineract.integrationtests.common.Utils;
import org.apache.fineract.integrationtests.common.charges.ChargesHelper;
import org.apache.fineract.integrationtests.common.loans.CobHelper;
import org.apache.fineract.integrationtests.common.loans.LoanApplicationTestBuilder;
import org.apache.fineract.integrationtests.common.loans.LoanProductTestBuilder;
import org.apache.fineract.integrationtests.common.loans.LoanTestLifecycleExtension;
@@ -867,9 +866,8 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
assertTrue(jobBusinessStepConfigData.getBusinessSteps().stream().anyMatch(
businessStep -> BusinessConfigurationApiTest.LOAN_DELINQUENCY_CLASSIFICATION.equals(businessStep.getStepName())));
// Run first time the Loan COB Job
final String jobName = "Loan COB";
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
// Get loan details expecting to have not a delinquency classification
GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
@@ -885,13 +883,11 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
}
// Move the Business date to get older the loan and to have an overdue loan
LocalDate lastLoanCOBBusinessDate = bussinesLocalDate;
bussinesLocalDate = bussinesLocalDate.plusDays(3);
schedulerJobHelper.fastForwardTime(lastLoanCOBBusinessDate, bussinesLocalDate, jobName, responseSpec);
log.info("Current date {}", bussinesLocalDate);
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, bussinesLocalDate);
// Run Second time the Job
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
// Get loan details expecting to have a delinquency classification
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
@@ -968,15 +964,11 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
log.info("Loan Delinquency Range is null {}", (firstTestCase == null));
loanTransactionHelper.printRepaymentSchedule(getLoansLoanIdResponse);
final String jobName = "Loan COB";
bussinesLocalDate = Utils.getDateAsLocalDate("31 January 2012");
LocalDate lastLoanCOBBusinessDate = bussinesLocalDate.minusDays(1);
schedulerJobHelper.fastForwardTime(lastLoanCOBBusinessDate, bussinesLocalDate, jobName, responseSpec);
log.info("Current date {}", bussinesLocalDate);
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, bussinesLocalDate);
// Run Second time the Job
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
// Get loan details expecting to have a delinquency classification
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
@@ -1059,15 +1051,11 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
log.info("Loan Product Arrears: {}", loanProductsProductIdResponseUpd.getInArrearsTolerance());
assertEquals(0, loanProductsProductIdResponseUpd.getInArrearsTolerance());
final String jobName = "Loan COB";
bussinesLocalDate = Utils.getDateAsLocalDate("31 January 2012");
LocalDate lastLoanCOBBusinessDate = bussinesLocalDate.minusDays(1);
schedulerJobHelper.fastForwardTime(lastLoanCOBBusinessDate, bussinesLocalDate, jobName, responseSpec);
log.info("Current date {}", bussinesLocalDate);
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, bussinesLocalDate);
// Run Second time the Job
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
// Get loan details expecting to have a delinquency classification
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
@@ -1114,24 +1102,22 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
log.info("Loan Account Arrears {}", getLoansLoanIdResponse.getInArrearsTolerance());
assertEquals(3, getLoansLoanIdResponse.getInArrearsTolerance());
final String jobName = "Loan COB";
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "04 February 2012");
updateBusinessDate("06 February 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 1033.33, 5);
PostLoansDelinquencyActionResponse pauseDelinquencyResponse = loanTransactionHelper
.createLoanDelinquencyAction(loanId.longValue(), PAUSE, "06 February 2012", "10 February 2012");
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "07 February 2012");
updateBusinessDate("09 February 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 1033.33, 5);
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "10 March 2012");
updateBusinessDate("12 March 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 2049.99, 36);
});
}
@@ -1165,28 +1151,26 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
log.info("Loan Account Arrears {}", getLoansLoanIdResponse.getInArrearsTolerance());
assertEquals(3, getLoansLoanIdResponse.getInArrearsTolerance());
final String jobName = "Loan COB";
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "04 February 2012");
updateBusinessDate("06 February 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 1033.33, 5);
PostLoansDelinquencyActionResponse pauseDelinquencyResponse = loanTransactionHelper
.createLoanDelinquencyAction(loanId.longValue(), PAUSE, "06 February 2012", "10 March 2012");
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "07 February 2012");
updateBusinessDate("09 February 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 1033.33, 5);
bussinesLocalDate = Utils.getDateAsLocalDate("10 February 2012");
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, bussinesLocalDate);
loanTransactionHelper.createLoanDelinquencyAction(loanId.longValue(), RESUME, "10 February 2012");
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "10 March 2012");
updateBusinessDate("12 March 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 2049.99, 36);
});
}
@@ -1217,38 +1201,36 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
log.info("Loan Account Arrears {}", getLoansLoanIdResponse.getInArrearsTolerance());
assertEquals(3, getLoansLoanIdResponse.getInArrearsTolerance());
final String jobName = "Loan COB";
// delinquent days: 5
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "04 February 2012");
updateBusinessDate("06 February 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 1033.33, 5);
// Add delinquency pause on 06 February 2012
PostLoansDelinquencyActionResponse pauseDelinquencyResponse = loanTransactionHelper
.createLoanDelinquencyAction(loanId.longValue(), PAUSE, "06 February 2012", "10 March 2012");
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "07 February 2012");
updateBusinessDate("09 February 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 1033.33, 5);
// Add delinquency resume on 10 February 2012
updateBusinessDate("10 February 2012");
loanTransactionHelper.createLoanDelinquencyAction(loanId.longValue(), RESUME, "10 February 2012");
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "11 February 2012");
updateBusinessDate("13 February 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 1033.33, 8);
// Add new pause on 13 February 2012
pauseDelinquencyResponse = loanTransactionHelper.createLoanDelinquencyAction(loanId.longValue(), PAUSE, "13 February 2012",
"18 February 2012");
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "21 February 2012");
updateBusinessDate("23 February 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 1033.33, 13);
// Add new pause on 23 February 2012
@@ -1256,9 +1238,9 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
"28 February 2012");
updateBusinessDate("25 February 2012");
loanTransactionHelper.createLoanDelinquencyAction(loanId.longValue(), RESUME, "25 February 2012");
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "10 March 2012");
updateBusinessDate("12 March 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 2049.99, 29);
});
}
@@ -1299,36 +1281,34 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
log.info("Loan Account Arrears {}", getLoansLoanIdResponse.getInArrearsTolerance());
assertEquals(3, getLoansLoanIdResponse.getInArrearsTolerance());
final String jobName = "Loan COB";
// delinquent days: 5
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "04 February 2012");
updateBusinessDate("06 February 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 1033.33, 5);
PostLoansDelinquencyActionResponse pauseDelinquencyResponse = loanTransactionHelper
.createLoanDelinquencyAction(loanId.longValue(), PAUSE, "06 February 2012", "10 March 2012");
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "07 February 2012");
updateBusinessDate("09 February 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 1033.33, 5);
updateBusinessDate("10 February 2012");
loanTransactionHelper.createLoanDelinquencyAction(loanId.longValue(), RESUME, "10 February 2012");
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "11 February 2012");
updateBusinessDate("13 February 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 1033.33, 8);
pauseDelinquencyResponse = loanTransactionHelper.createLoanDelinquencyAction(loanId.longValue(), PAUSE, "13 February 2012",
"18 February 2012");
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "21 February 2012");
updateBusinessDate("23 February 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
verifyDelinquency(loanId, "01 February 2012", 1033.33, 13);
pauseDelinquencyResponse = loanTransactionHelper.createLoanDelinquencyAction(loanId.longValue(), PAUSE, "23 February 2012",
@@ -1337,9 +1317,9 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
updateBusinessDate("25 February 2012");
loanTransactionHelper.createLoanDelinquencyAction(loanId.longValue(), RESUME, "25 February 2012");
CobHelper.fastForwardLoansLastCOBDate(requestSpec, responseSpec204, loanId, "12 March 2012");
updateBusinessDate("14 March 2012");
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
loanTransactionHelper.printDelinquencyData(getLoansLoanIdResponse);
@@ -1447,10 +1427,10 @@ public class DelinquencyBucketsIntegrationTest extends BaseLoanIntegrationTest {
getLoanProductsProductResponse.getId().toString(), operationDate, null);
// run cob for business date 01 January 2012
final String jobName = "Loan COB";
bussinesLocalDate = Utils.getDateAsLocalDate(operationDate);
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, bussinesLocalDate);
schedulerJobHelper.executeAndAwaitJob(jobName);
// Run the Loan inline COB Job
inlineLoanCOBHelper.executeInlineCOB(Long.valueOf(loanId));
// Loan delinquency data
GetLoansLoanIdResponse getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
@@ -192,6 +192,8 @@ public class UndoRepaymentWithDownPaymentIntegrationTest extends BaseLoanIntegra
loanDetails = loanTransactionHelper.getLoanDetails(loanId.longValue());
assertEquals(500.0, Utils.getDoubleValue(loanDetails.getSummary().getTotalOutstanding()));
globalConfigurationHelper.updateGlobalConfiguration(GlobalConfigurationConstants.ENABLE_BUSINESS_DATE,
new PutGlobalConfigurationsRequest().enabled(false));
}
private Integer createLoanProductWithPeriodicAccrualAccountingAndAdvancedPaymentAllocationStrategy() {
@@ -544,7 +544,7 @@ public class GlobalConfigurationHelper {
assetOwnerTransferInterestOutstandingStrategy.put("name",
GlobalConfigurationConstants.ASSET_OWNER_TRANSFER_OUTSTANDING_INTEREST_CALCULATION_STRATEGY);
assetOwnerTransferInterestOutstandingStrategy.put("value", 0L);
assetOwnerTransferInterestOutstandingStrategy.put("enabled", false);
assetOwnerTransferInterestOutstandingStrategy.put("enabled", true);
assetOwnerTransferInterestOutstandingStrategy.put("trapDoor", false);
assetOwnerTransferInterestOutstandingStrategy.put("string_value", "TOTAL_OUTSTANDING_INTEREST");
defaults.add(assetOwnerTransferInterestOutstandingStrategy);
@@ -142,7 +142,7 @@ public class OfficeHelper {
public static String getAsJSON(String externalId, final String openingDate) {
final HashMap<String, String> map = new HashMap<>();
map.put("parentId", "1");
map.put("name", Utils.uniqueRandomStringGenerator("Office_", 4));
map.put("name", Utils.uniqueRandomStringGenerator("O_", 9));
map.put("dateFormat", "dd MMMM yyyy");
map.put("locale", "en");
map.put("openingDate", openingDate);
@@ -272,7 +272,7 @@ public class SchedulerJobHelper {
private void awaitJob(Instant beforeExecuteTime, Supplier<Callable<Map<String, String>>> retrieveLastRunHistory) {
final Duration timeout = Duration.ofMinutes(2);
final Duration pause = Duration.ofSeconds(5);
final Duration pause = Duration.ofSeconds(1);
DateTimeFormatter df = DateTimeFormatter.ISO_INSTANT; // FINERACT-926
// Await JobDetailData.lastRunHistory [JobDetailHistoryData]
// jobRunStartTime >= beforeExecuteTime (or timeout)
@@ -109,6 +109,7 @@ public class SearchExternalAssetOwnerTransferTest extends ExternalAssetOwnerTran
@Test
public void initialSearchExternalAssetOwnerTransferUsingTextTest() {
saleActiveLoanToExternalAssetOwnerWithSearching();
String textToSearch = UUID.randomUUID().toString();
PagedRequestExternalAssetOwnerSearchRequest searchRequest = EXTERNAL_ASSET_OWNER_HELPER
.buildExternalAssetOwnerSearchRequest(textToSearch, "", null, null, 0, 10);
@@ -118,10 +119,10 @@ public class SearchExternalAssetOwnerTransferTest extends ExternalAssetOwnerTran
// Search over the current Asset Transfers and get just the first five
textToSearch = "";
searchRequest = EXTERNAL_ASSET_OWNER_HELPER.buildExternalAssetOwnerSearchRequest(textToSearch, "", null, null, 0, 5);
searchRequest = EXTERNAL_ASSET_OWNER_HELPER.buildExternalAssetOwnerSearchRequest(textToSearch, "", null, null, 0, 1);
response = EXTERNAL_ASSET_OWNER_HELPER.searchExternalAssetOwnerTransfer(searchRequest);
assertNotNull(response);
assertEquals(5, response.getContent().size(), "Expecting first five results");
assertEquals(1, response.getContent().size(), "Expecting first result");
textToSearch = response.getContent().iterator().next().getOwner().getExternalId();
searchRequest = EXTERNAL_ASSET_OWNER_HELPER.buildExternalAssetOwnerSearchRequest(textToSearch, "", null, null, 0, 5);
@@ -133,6 +134,7 @@ public class SearchExternalAssetOwnerTransferTest extends ExternalAssetOwnerTran
@Test
public void initialSearchExternalAssetOwnerTransferUsingEffectiveDateTest() {
saleActiveLoanToExternalAssetOwnerWithSearching();
final String attribute = "effective";
LocalDate fromDate = Utils.getDateAsLocalDate("01 March 2023");
LocalDate toDate = fromDate.plusMonths(3);