FINERACT-1724: Preparation for versioned APIs

This commit is contained in:
Arnold Galovics
2023-05-15 13:19:06 +02:00
committed by Arnold Gálovics
parent 190d995628
commit 037f7f264f
211 changed files with 1202 additions and 2215 deletions
@@ -2340,7 +2340,7 @@ public class BatchApiTest {
* @see org.apache.fineract.batch.command.internal.ModifyLoanApplicationByExternalIdCommandStrategy
*/
@Test
public void shoulRetrieveTheProperErrorDuringLockedLoan() {
public void shoulRetrieveTheProperErrorDuringLockedLoan_OldRelativePath() {
ResponseSpecification responseSpec = new ResponseSpecBuilder().expectStatusCode(202).build();
LoanAccountLockHelper loanAccountLockHelper = new LoanAccountLockHelper(this.requestSpec, responseSpec);
final String loanProductJSON = new LoanProductTestBuilder() //
@@ -2415,6 +2415,87 @@ public class BatchApiTest {
Assertions.assertEquals(HttpStatus.SC_CONFLICT, repaymentResponse.get(0).getStatusCode(), "Verify Status Code 409 for Locked Loan");
}
/**
* Tests that a loan is hard locked and if a repayment triggered in as a batch request, it returns the proper error
*
* @see org.apache.fineract.batch.command.internal.ModifyLoanApplicationByExternalIdCommandStrategy
*/
@Test
public void shoulRetrieveTheProperErrorDuringLockedLoan() {
ResponseSpecification responseSpec = new ResponseSpecBuilder().expectStatusCode(202).build();
LoanAccountLockHelper loanAccountLockHelper = new LoanAccountLockHelper(this.requestSpec, responseSpec);
final String loanProductJSON = new LoanProductTestBuilder() //
.withPrincipal("1000.00") //
.withNumberOfRepayments("24") //
.withRepaymentAfterEvery("1") //
.withRepaymentTypeAsMonth() //
.withinterestRatePerPeriod("2") //
.withInterestRateFrequencyTypeAsMonths() //
.withAmortizationTypeAsEqualPrincipalPayment() //
.withInterestTypeAsDecliningBalance() //
.currencyDetails("0", "100").build(null);
final Long applyLoanRequestId = RandomUtils.nextLong(100, 1000);
final Long approveLoanRequestId = applyLoanRequestId + 1;
final Long disburseLoanRequestId = approveLoanRequestId + 1;
final Long getLoanRequestId = disburseLoanRequestId + 1;
// Create product
final Integer productId = new LoanTransactionHelper(this.requestSpec, this.responseSpec).getLoanProductId(loanProductJSON);
// Create client
final Integer clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec);
ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, clientId);
final BatchRequest applyLoanRequest = BatchHelper.applyLoanRequestWithClientId(applyLoanRequestId, clientId, productId);
final BatchRequest approveLoanRequest = BatchHelper.transistionLoanStateByExternalId(approveLoanRequestId, applyLoanRequestId,
LocalDate.now(ZoneId.systemDefault()).minusDays(10), "approve");
final BatchRequest disburseLoanRequest = BatchHelper.transistionLoanStateByExternalId(disburseLoanRequestId, approveLoanRequestId,
LocalDate.now(ZoneId.systemDefault()).minusDays(8), "disburse");
final BatchRequest getLoanRequest = BatchHelper.getLoanByExternalIdRequest(getLoanRequestId, approveLoanRequestId,
"associations=all");
// Create batch requests list
final List<BatchRequest> batchRequests = Arrays.asList(applyLoanRequest, approveLoanRequest, disburseLoanRequest, getLoanRequest);
final String jsonifiedRequest = BatchHelper.toJsonString(batchRequests);
final List<BatchResponse> responses = BatchHelper.postBatchRequestsWithoutEnclosingTransaction(this.requestSpec, this.responseSpec,
jsonifiedRequest);
Assertions.assertEquals(HttpStatus.SC_OK, responses.get(0).getStatusCode(), "Verify Status Code 200 for Apply Loan");
Assertions.assertEquals(HttpStatus.SC_OK, responses.get(1).getStatusCode(), "Verify Status Code 200 for Approve Loan");
Assertions.assertEquals(HttpStatus.SC_OK, responses.get(2).getStatusCode(), "Verify Status Code 200 for Disburse Loan");
Assertions.assertEquals(HttpStatus.SC_OK, responses.get(3).getStatusCode(), "Verify Status Code 200 for Get Loan");
final Long loanId = new FromJsonHelper().parse(responses.get(2).getBody()).getAsJsonObject().get("resourceId").getAsLong();
loanAccountLockHelper.placeSoftLockOnLoanAccount(loanId.intValue(), "LOAN_COB_CHUNK_PROCESSING");
RequestSpecification requestSpec = UserHelper.getSimpleUserWithoutBypassPermission(this.requestSpec, this.responseSpec);
// Create a repayment Request
final BatchRequest br = new BatchRequest();
br.setRequestId(1L);
br.setRelativeUrl(String.format("v1/loans/" + loanId + "/transactions?command=repayment"));
br.setMethod("POST");
String dateString = LocalDate.now(ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
br.setBody(String.format(
"{\"locale\": \"en\", \"dateFormat\": \"dd MMMM yyyy\", " + "\"transactionDate\": \"%s\", \"transactionAmount\": \"500\"}",
dateString));
final String jsonifiedRepaymentRequest = BatchHelper.toJsonString(List.of(br));
final List<BatchResponse> repaymentResponse = BatchHelper.postBatchRequestsWithoutEnclosingTransaction(requestSpec,
this.responseSpec, jsonifiedRepaymentRequest);
Assertions.assertEquals(HttpStatus.SC_CONFLICT, repaymentResponse.get(0).getStatusCode(), "Verify Status Code 409 for Locked Loan");
}
/**
* Delete datatable
*
@@ -256,13 +256,13 @@ public class ImageTest extends IntegrationTest {
interface ImagesApiWithHeadersForTest extends ImagesApi {
@Headers("Accept: text/plain")
@GET("{entityType}/{entityId}/images")
@GET("v1/{entityType}/{entityId}/images")
Call<ResponseBody> getText(@retrofit2.http.Path("entityType") String entityType, @retrofit2.http.Path("entityId") Long entityId,
@retrofit2.http.Query("maxWidth") Integer maxWidth, @retrofit2.http.Query("maxHeight") Integer maxHeight,
@retrofit2.http.Query("output") String output);
@Headers("Accept: application/octet-stream")
@GET("{entityType}/{entityId}/images")
@GET("v1/{entityType}/{entityId}/images")
Call<ResponseBody> getBytes(@retrofit2.http.Path("entityType") String entityType, @retrofit2.http.Path("entityId") Long entityId,
@retrofit2.http.Query("maxWidth") Integer maxWidth, @retrofit2.http.Query("maxHeight") Integer maxHeight,
@retrofit2.http.Query("output") String output);
@@ -62,7 +62,7 @@ public abstract class IntegrationTest {
protected FineractClient fineract() {
if (fineract == null) {
String url = System.getProperty("fineract.it.url", "https://localhost:8443/fineract-provider/api/v1/");
String url = System.getProperty("fineract.it.url", "https://localhost:8443/fineract-provider/api/");
// insecure(true) should *ONLY* ever be used for https://localhost:8443, NOT in real clients!!
fineract = FineractClient.builder().insecure(true).baseURL(url).tenant("default").basicAuth("mifos", "password")
.logging(Level.NONE).build();
@@ -158,7 +158,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("clients");
br.setRelativeUrl("v1/clients");
br.setMethod("POST");
final String extId;
@@ -189,7 +189,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("clients");
br.setRelativeUrl("v1/clients");
br.setMethod("POST");
final String extId;
@@ -221,7 +221,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("clients/$.clientId");
br.setRelativeUrl("v1/clients/$.clientId");
br.setMethod("PUT");
br.setReference(reference);
br.setBody("{\"firstname\": \"TestFirstName\", \"lastname\": \"TestLastName\"}");
@@ -269,7 +269,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("loans");
br.setRelativeUrl("v1/loans");
br.setMethod("POST");
br.setReference(reference);
String dateString = date.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
@@ -329,7 +329,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("loans");
br.setRelativeUrl("v1/loans");
br.setMethod("POST");
String body = String.format("{\"dateFormat\": \"dd MMMM yyyy\", \"locale\": \"en_GB\", \"clientId\": %s, "
@@ -359,7 +359,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("savingsaccounts");
br.setRelativeUrl("v1/savingsaccounts");
br.setMethod("POST");
br.setReference(reference);
@@ -383,7 +383,7 @@ public final class BatchHelper {
* @return BatchRequest
*/
public static BatchRequest createChargeByLoanIdRequest(final Long requestId, final Long reference, final Integer chargeId) {
return createChargeRequest(requestId, reference, "loans/$.loanId/charges", chargeId);
return createChargeRequest(requestId, reference, "v1/loans/$.loanId/charges", chargeId);
}
/**
@@ -400,7 +400,7 @@ public final class BatchHelper {
* @return BatchRequest
*/
public static BatchRequest createChargeByLoanExternalIdRequest(final Long requestId, final Long reference, final Integer chargeId) {
return createChargeRequest(requestId, reference, "loans/external-id/$.externalId/charges", chargeId);
return createChargeRequest(requestId, reference, "v1/loans/external-id/$.externalId/charges", chargeId);
}
/**
@@ -450,7 +450,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("loans/$.loanId/charges/$.resourceId?command=adjustment");
br.setRelativeUrl("v1/loans/$.loanId/charges/$.resourceId?command=adjustment");
br.setMethod("POST");
br.setReference(reference);
br.setBody("{\"amount\":7.00,\"locale\":\"en\"}");
@@ -479,7 +479,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl(
String.format("loans/external-id/%s/charges/external-id/%s?command=adjustment", loanExternalId, chargeExternalId));
String.format("v1/loans/external-id/%s/charges/external-id/%s?command=adjustment", loanExternalId, chargeExternalId));
br.setMethod("POST");
br.setReference(reference);
br.setBody("{\"amount\":7.00,\"locale\":\"en\"}");
@@ -498,7 +498,7 @@ public final class BatchHelper {
* @return BatchRequest
*/
public static BatchRequest collectChargesByLoanIdRequest(final Long requestId, final Long reference) {
return collectChargesRequest(requestId, reference, "loans/$.loanId/charges");
return collectChargesRequest(requestId, reference, "v1/loans/$.loanId/charges");
}
/**
@@ -513,7 +513,7 @@ public final class BatchHelper {
* @return BatchRequest
*/
public static BatchRequest collectChargesByLoanExternalIdRequest(final Long requestId, final Long reference) {
return collectChargesRequest(requestId, reference, "loans/external-id/$.externalId/charges");
return collectChargesRequest(requestId, reference, "v1/loans/external-id/$.externalId/charges");
}
/**
@@ -574,7 +574,7 @@ public final class BatchHelper {
* @return the {@link BatchRequest}
*/
public static BatchRequest getChargeByLoanIdChargeId(final Long requestId, final Long reference) {
return getChargeById(requestId, reference, "loans/$.loanId/charges/$.resourceId");
return getChargeById(requestId, reference, "v1/loans/$.loanId/charges/$.resourceId");
}
/**
@@ -591,7 +591,7 @@ public final class BatchHelper {
public static BatchRequest getChargeByLoanExternalIdChargeExternalId(final Long requestId, final Long reference,
final String loanExternalId, final String chargeExternalId) {
return getChargeById(requestId, reference,
String.format("loans/external-id/%s/charges/external-id/%s", loanExternalId, chargeExternalId));
String.format("v1/loans/external-id/%s/charges/external-id/%s", loanExternalId, chargeExternalId));
}
/**
@@ -608,7 +608,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("clients/$.clientId?command=activate");
br.setRelativeUrl("v1/clients/$.clientId?command=activate");
br.setReference(reference);
br.setMethod("POST");
br.setBody("{\"locale\": \"en\", \"dateFormat\": \"dd MMMM yyyy\", \"activationDate\": \"01 March 2011\"}");
@@ -663,7 +663,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("loans/$.loanId?command=approve");
br.setRelativeUrl("v1/loans/$.loanId?command=approve");
br.setReference(reference);
br.setMethod("POST");
String dateString = date.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
@@ -677,7 +677,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("loans/$.loanId?command=approveX");
br.setRelativeUrl("v1/loans/$.loanId?command=approveX");
br.setReference(reference);
br.setMethod("POST");
String dateString = date.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
@@ -719,7 +719,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("loans/$.loanId?command=disburse");
br.setRelativeUrl("v1/loans/$.loanId?command=disburse");
br.setReference(reference);
br.setMethod("POST");
String dateString = date.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
@@ -749,7 +749,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("loans/external-id/$.resourceExternalId?command=" + command);
br.setRelativeUrl("v1/loans/external-id/$.resourceExternalId?command=" + command);
br.setReference(reference);
br.setMethod("POST");
String dateString = date.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
@@ -783,6 +783,21 @@ public final class BatchHelper {
return createTransactionRequestWithGivenLoanId(requestId, loanId, "repayment", amount, date);
}
public static BatchRequest oldRepayLoanRequestWithGivenLoanId(final Long requestId, final Integer loanId, final String amount,
final LocalDate date) {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl(String.format("loans/" + loanId + "/transactions?command=%s", "repayment"));
br.setMethod("POST");
String dateString = date.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
br.setBody(String.format(
"{\"locale\": \"en\", \"dateFormat\": \"dd MMMM yyyy\", " + "\"transactionDate\": \"%s\", \"transactionAmount\": %s}",
dateString, amount));
return br;
}
/**
* Creates and returns a {@link CreateTransactionLoanCommandStrategy} Request with given requestId.
*
@@ -802,7 +817,7 @@ public final class BatchHelper {
br.setRequestId(requestId);
br.setReference(reference);
br.setRelativeUrl(String.format("loans/$.loanId/transactions?command=%s", transactionCommand));
br.setRelativeUrl(String.format("v1/loans/$.loanId/transactions?command=%s", transactionCommand));
br.setMethod("POST");
String dateString = date.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
br.setBody(String.format(
@@ -817,7 +832,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl(String.format("loans/" + loanId + "/transactions?command=%s", transactionCommand));
br.setRelativeUrl(String.format("v1/loans/" + loanId + "/transactions?command=%s", transactionCommand));
br.setMethod("POST");
String dateString = date.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
br.setBody(String.format(
@@ -848,7 +863,7 @@ public final class BatchHelper {
br.setRequestId(requestId);
br.setReference(reference);
br.setRelativeUrl(String.format("loans/external-id/$.externalId/transactions?command=%s", transactionCommand));
br.setRelativeUrl(String.format("v1/loans/external-id/$.externalId/transactions?command=%s", transactionCommand));
br.setMethod("POST");
String dateString = date.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
br.setBody(String.format(
@@ -948,7 +963,7 @@ public final class BatchHelper {
br.setRequestId(requestId);
br.setReference(reference);
br.setRelativeUrl("rescheduleloans");
br.setRelativeUrl("v1/rescheduleloans");
br.setMethod("POST");
final LocalDate today = LocalDate.now(ZoneId.systemDefault());
final LocalDate adjustedDueDate = LocalDate.now(ZoneId.systemDefault()).plusDays(40);
@@ -978,7 +993,7 @@ public final class BatchHelper {
br.setRequestId(requestId);
br.setReference(reference);
br.setRelativeUrl("rescheduleloans/$.resourceId?command=approve");
br.setRelativeUrl("v1/rescheduleloans/$.resourceId?command=approve");
br.setMethod("POST");
final LocalDate approvedOnDate = LocalDate.now(ZoneId.systemDefault());
final String approvedOnDateString = approvedOnDate.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
@@ -1020,9 +1035,9 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
String relativeUrl;
if (subResourceId) {
relativeUrl = "loans/$.loanId/transactions/$.subResourceId";
relativeUrl = "v1/loans/$.loanId/transactions/$.subResourceId";
} else {
relativeUrl = "loans/$.loanId/transactions/$.resourceId";
relativeUrl = "v1/loans/$.loanId/transactions/$.resourceId";
}
br.setRequestId(requestId);
@@ -1051,9 +1066,9 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
String relativeUrl;
if (subResourceExternalId) {
relativeUrl = String.format("loans/external-id/%s/transactions/external-id/$.subResourceExternalId", loanExternalId);
relativeUrl = String.format("v1/loans/external-id/%s/transactions/external-id/$.subResourceExternalId", loanExternalId);
} else {
relativeUrl = String.format("loans/external-id/%s/transactions/external-id/$.resourceExternalId", loanExternalId);
relativeUrl = String.format("v1/loans/external-id/%s/transactions/external-id/$.resourceExternalId", loanExternalId);
}
br.setRequestId(requestId);
@@ -1080,7 +1095,7 @@ public final class BatchHelper {
public static BatchRequest getLoanByIdRequest(final Long requestId, final Long reference, final String queryParameter) {
final BatchRequest br = new BatchRequest();
String relativeUrl = "loans/$.loanId";
String relativeUrl = "v1/loans/$.loanId";
if (queryParameter != null) {
relativeUrl = relativeUrl + "?" + queryParameter;
}
@@ -1109,7 +1124,7 @@ public final class BatchHelper {
public static BatchRequest getLoanByExternalIdRequest(final Long requestId, final Long reference, final String queryParameter) {
final BatchRequest br = new BatchRequest();
String relativeUrl = "loans/external-id/$.resourceExternalId";
String relativeUrl = "v1/loans/external-id/$.resourceExternalId";
if (queryParameter != null) {
relativeUrl = relativeUrl + "?" + queryParameter;
}
@@ -1154,7 +1169,7 @@ public final class BatchHelper {
public static BatchRequest getLoanByIdRequest(final Long loanId, final Long requestId, final Long referenceId,
final String queryParameter) {
final BatchRequest br = new BatchRequest();
String relativeUrl = String.format("loans/%s", loanId);
String relativeUrl = String.format("v1/loans/%s", loanId);
if (queryParameter != null) {
relativeUrl = relativeUrl + "?" + queryParameter;
}
@@ -1184,7 +1199,7 @@ public final class BatchHelper {
public static BatchRequest getDatatableByIdRequest(final Long loanId, final String datatableName, final String queryParameter,
final Long referenceId) {
final BatchRequest br = new BatchRequest();
String relativeUrl = String.format("datatables/%s/%s", datatableName, loanId);
String relativeUrl = String.format("v1/datatables/%s/%s", datatableName, loanId);
if (queryParameter != null) {
relativeUrl = relativeUrl + "?" + queryParameter;
}
@@ -1216,7 +1231,7 @@ public final class BatchHelper {
public static BatchRequest getDatatableEntryByIdRequest(final Long loanId, final String datatableName, final String appTableId,
final String queryParameter, final Long referenceId) {
final BatchRequest br = new BatchRequest();
String relativeUrl = String.format("datatables/%s/%s/%s", datatableName, loanId, appTableId);
String relativeUrl = String.format("v1/datatables/%s/%s/%s", datatableName, loanId, appTableId);
if (queryParameter != null) {
relativeUrl = relativeUrl + "?" + queryParameter;
}
@@ -1243,7 +1258,7 @@ public final class BatchHelper {
*/
public static BatchRequest createDatatableEntryRequest(final Long loanId, final String datatableName, final List<String> columnNames) {
final BatchRequest br = new BatchRequest();
final String relativeUrl = String.format("datatables/%s/%s", datatableName, loanId);
final String relativeUrl = String.format("v1/datatables/%s/%s", datatableName, loanId);
final Map<String, Object> datatableEntryMap = new HashMap<>();
datatableEntryMap.putAll(columnNames.stream().collect(Collectors.toMap(v -> v, v -> Utils.randomStringGenerator("VAL_", 3))));
final String datatableEntryRequestJsonString = new Gson().toJson(datatableEntryMap);
@@ -1273,7 +1288,7 @@ public final class BatchHelper {
public static BatchRequest updateDatatableEntryByEntryIdRequest(final Long loanId, final String datatableName,
final Long datatableEntryId, final List<String> columnNames) {
final BatchRequest br = new BatchRequest();
final String relativeUrl = String.format("datatables/%s/%s/%s", datatableName, loanId, datatableEntryId);
final String relativeUrl = String.format("v1/datatables/%s/%s/%s", datatableName, loanId, datatableEntryId);
final Map<String, Object> datatableEntryMap = new HashMap<>();
datatableEntryMap.putAll(columnNames.stream().collect(Collectors.toMap(v -> v, v -> Utils.randomStringGenerator("VAL_", 3))));
final String datatableEntryRequestJsonString = new Gson().toJson(datatableEntryMap);
@@ -1307,7 +1322,7 @@ public final class BatchHelper {
br.setRequestId(requestId);
br.setReference(reference);
br.setRelativeUrl("loans/$.loanId/transactions/$.resourceId");
br.setRelativeUrl("v1/loans/$.loanId/transactions/$.resourceId");
br.setMethod("POST");
String dateString = date.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
br.setBody(String.format(
@@ -1340,7 +1355,7 @@ public final class BatchHelper {
br.setRequestId(requestId);
br.setReference(reference);
br.setRelativeUrl(String.format("loans/external-id/%s/transactions/external-id/%s", loanExternalId, transactionExternalId));
br.setRelativeUrl(String.format("v1/loans/external-id/%s/transactions/external-id/%s", loanExternalId, transactionExternalId));
br.setMethod("POST");
String dateString = date.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
br.setBody(String.format(
@@ -1367,7 +1382,7 @@ public final class BatchHelper {
br.setRequestId(requestId);
br.setReference(reference);
br.setRelativeUrl("loans/$.loanId/transactions/$.resourceId?command=chargeback");
br.setRelativeUrl("v1/loans/$.loanId/transactions/$.resourceId?command=chargeback");
br.setMethod("POST");
br.setBody(String.format("{\"locale\": \"en\", \"transactionAmount\": %s, \"paymentTypeId\": 2}", amount));
@@ -1389,7 +1404,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("loans/$.loanId?command=markAsFraud");
br.setRelativeUrl("v1/loans/$.loanId?command=markAsFraud");
br.setMethod("PUT");
br.setReference(reference);
br.setBody("{\"fraud\": \"true\"}");
@@ -1411,7 +1426,7 @@ public final class BatchHelper {
final BatchRequest br = new BatchRequest();
br.setRequestId(requestId);
br.setRelativeUrl("loans/external-id/$.resourceExternalId?command=markAsFraud");
br.setRelativeUrl("v1/loans/external-id/$.resourceExternalId?command=markAsFraud");
br.setMethod("PUT");
br.setReference(reference);
br.setBody("{\"fraud\": \"true\"}");
@@ -1431,7 +1446,7 @@ public final class BatchHelper {
public static BatchRequest queryDatatableEntries(final String datatableName, final String columnName, final String columnValue,
final String columnResult) {
final BatchRequest br = new BatchRequest();
String relativeUrl = String.format("datatables/%s/query", datatableName);
String relativeUrl = String.format("v1/datatables/%s/query", datatableName);
relativeUrl += "?columnFilter=" + columnName + "&" + "valueFilter=" + columnValue + "&" + "resultColumns=" + columnResult;
br.setRequestId(1L);
@@ -1455,7 +1470,7 @@ public final class BatchHelper {
public static BatchRequest updateDatatableEntry(final String datatableName, final String resourceId, final String columnName,
final String columnValue) {
final BatchRequest br = new BatchRequest();
final String relativeUrl = String.format("datatables/%s/%s", datatableName, resourceId);
final String relativeUrl = String.format("v1/datatables/%s/%s", datatableName, resourceId);
final Map<String, Object> datatableEntryMap = new HashMap<>();
datatableEntryMap.put(columnName, columnValue);
final String datatableEntryRequestJsonString = new Gson().toJson(datatableEntryMap);
@@ -1483,7 +1498,7 @@ public final class BatchHelper {
public static BatchRequest updateDatatableEntry(final String datatableName, final String resourceId, final String subResourceId,
final String columnName, final String columnValue) {
final BatchRequest br = new BatchRequest();
final String relativeUrl = String.format("datatables/%s/%s/%s", datatableName, resourceId, subResourceId);
final String relativeUrl = String.format("v1/datatables/%s/%s/%s", datatableName, resourceId, subResourceId);
final Map<String, Object> datatableEntryMap = new HashMap<>();
datatableEntryMap.put(columnName, columnValue);
final String datatableEntryRequestJsonString = new Gson().toJson(datatableEntryMap);
@@ -1512,7 +1527,7 @@ public final class BatchHelper {
public static BatchRequest getSavingAccount(final Long requestId, final Long accountId, final String queryParameter,
final Long referenceId) {
final BatchRequest br = new BatchRequest();
String relativeUrl = String.format("savingsaccounts/%s", accountId);
String relativeUrl = String.format("v1/savingsaccounts/%s", accountId);
if (queryParameter != null) {
relativeUrl = relativeUrl + "?" + queryParameter;
}
@@ -1542,7 +1557,7 @@ public final class BatchHelper {
br.setRequestId(requestId);
br.setReference(reference);
br.setRelativeUrl("savingsaccounts/$.id/transactions?command=deposit");
br.setRelativeUrl("v1/savingsaccounts/$.id/transactions?command=deposit");
br.setMethod(HttpMethod.POST);
final LocalDate transactionDate = LocalDate.now(ZoneId.systemDefault());
final String transactionDateString = transactionDate.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
@@ -1568,7 +1583,7 @@ public final class BatchHelper {
br.setRequestId(requestId);
br.setReference(reference);
br.setRelativeUrl("savingsaccounts/$.id/transactions?command=withdrawal");
br.setRelativeUrl("v1/savingsaccounts/$.id/transactions?command=withdrawal");
br.setMethod(HttpMethod.POST);
final LocalDate transactionDate = LocalDate.now(ZoneId.systemDefault());
final String transactionDateString = transactionDate.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
@@ -1594,7 +1609,7 @@ public final class BatchHelper {
br.setRequestId(requestId);
br.setReference(reference);
br.setRelativeUrl("savingsaccounts/$.id/transactions?command=holdAmount");
br.setRelativeUrl("v1/savingsaccounts/$.id/transactions?command=holdAmount");
br.setMethod(HttpMethod.POST);
final LocalDate transactionDate = LocalDate.now(ZoneId.systemDefault());
final String transactionDateString = transactionDate.format(DateTimeFormatter.ofPattern("dd MMMM yyyy"));
@@ -1625,7 +1640,7 @@ public final class BatchHelper {
br.setRequestId(requestId);
br.setReference(reference);
br.setRelativeUrl("savingsaccounts/$.id/transactions/" + transactionId + "?command=releaseAmount");
br.setRelativeUrl("v1/savingsaccounts/$.id/transactions/" + transactionId + "?command=releaseAmount");
br.setMethod(HttpMethod.POST);
br.setBody("{\"isBulk\": \"false\"}");
@@ -357,6 +357,75 @@ public class InlineLoanCOBTest {
}
}
@Test
public void testInlineCOBOnBatchAPIWithOldRelativeUrls() {
try {
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.TRUE);
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 2));
GlobalConfigurationHelper.updateValueForGlobalConfiguration(this.requestSpec, this.responseSpec, "10", "0");
loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec);
loanAccountLockHelper = new LoanAccountLockHelper(requestSpec, new ResponseSpecBuilder().expectStatusCode(202).build());
final Integer clientID = ClientHelper.createClient(requestSpec, responseSpec);
Assertions.assertNotNull(clientID);
Integer overdueFeeChargeId = ChargesHelper.createCharges(requestSpec, responseSpec,
ChargesHelper.getLoanOverdueFeeJSONWithCalculationTypePercentage("1"));
Assertions.assertNotNull(overdueFeeChargeId);
final Integer loanProductID = createLoanProduct(overdueFeeChargeId.toString());
Assertions.assertNotNull(loanProductID);
HashMap loanStatusHashMap;
final Integer loanID = applyForLoanApplication(clientID.toString(), loanProductID.toString(), null, "10 January 2020");
Assertions.assertNotNull(loanID);
loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(requestSpec, responseSpec, loanID);
LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap);
loanStatusHashMap = loanTransactionHelper.approveLoan("01 March 2020", loanID);
LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap);
String loanDetails = loanTransactionHelper.getLoanDetails(requestSpec, responseSpec, loanID);
loanStatusHashMap = loanTransactionHelper.disburseLoanWithNetDisbursalAmount("02 March 2020", loanID,
JsonPath.from(loanDetails).get("netDisbursalAmount").toString());
LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap);
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.COB_DATE, LocalDate.of(2020, 3, 2));
inlineLoanCOBHelper.executeInlineCOB(List.of(loanID.longValue()));
GetLoansLoanIdResponse loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID);
Assertions.assertEquals(LocalDate.of(2020, 3, 2), loan.getLastClosedBusinessDate());
BusinessDateHelper.updateBusinessDate(requestSpec, responseSpec, BusinessDateType.BUSINESS_DATE, LocalDate.of(2020, 3, 10));
requestSpec = UserHelper.getSimpleUserWithoutBypassPermission(requestSpec, responseSpec);
loanAccountLockHelper.placeSoftLockOnLoanAccount(loanID, "LOAN_COB_PARTITIONING");
loanTransactionHelper = new LoanTransactionHelper(requestSpec, responseSpec);
final BatchRequest br1 = BatchHelper.oldRepayLoanRequestWithGivenLoanId(4730L, loanID, "10", LocalDate.of(2020, 3, 10));
final List<BatchRequest> batchRequests = new ArrayList<>();
batchRequests.add(br1);
final String jsonifiedRequest = BatchHelper.toJsonString(batchRequests);
final List<BatchResponse> response = BatchHelper.postBatchRequestsWithoutEnclosingTransaction(this.requestSpec,
this.responseSpec, jsonifiedRequest);
Assertions.assertEquals(HttpStatus.SC_OK, (long) response.get(0).getStatusCode(), "Verify Status Code 200 for Repayment");
loan = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanID);
Assertions.assertEquals(LocalDate.of(2020, 3, 9), loan.getLastClosedBusinessDate());
} finally {
requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
requestSpec.header("Fineract-Platform-TenantId", "default");
responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build();
GlobalConfigurationHelper.updateIsBusinessDateEnabled(requestSpec, responseSpec, Boolean.FALSE);
}
}
@Test
public void testInlineCOBOnBatchAPI() {
try {
@@ -24,22 +24,38 @@ import io.restassured.http.ContentType;
import io.restassured.specification.RequestSpecification;
import io.restassured.specification.ResponseSpecification;
import org.apache.fineract.integrationtests.common.Utils;
import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.AfterTestExecutionCallback;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
import org.junit.jupiter.api.extension.ExtensionContext.Store;
public class InstanceModeSupportExtension implements BeforeTestExecutionCallback, AfterTestExecutionCallback {
public class InstanceModeSupportExtension
implements BeforeAllCallback, BeforeTestExecutionCallback, AfterAllCallback, AfterTestExecutionCallback {
private static final Namespace INSTANCE_MODE_NAMESPACE = Namespace.create(InstanceModeSupportExtension.class);
private static final String AUTH_KEY = "AUTH_KEY";
@Override
public void beforeAll(ExtensionContext context) throws Exception {
Utils.initializeRESTAssured();
resetInstanceMode(context);
}
@Override
public void afterAll(ExtensionContext context) throws Exception {
Utils.initializeRESTAssured();
resetInstanceMode(context);
}
@Override
public void beforeTestExecution(ExtensionContext context) throws Exception {
context.getTestMethod().ifPresent(m -> {
ConfigureInstanceMode annotation = m.getAnnotation(ConfigureInstanceMode.class);
if (annotation != null) {
Utils.initializeRESTAssured();
boolean readEnabled = annotation.readEnabled();
boolean writeEnabled = annotation.writeEnabled();
boolean batchWorkerEnabled = annotation.batchWorkerEnabled();
@@ -54,11 +70,16 @@ public class InstanceModeSupportExtension implements BeforeTestExecutionCallback
context.getTestMethod().ifPresent(m -> {
ConfigureInstanceMode annotation = m.getAnnotation(ConfigureInstanceMode.class);
if (annotation != null) {
changeInstanceMode(context, true, true, true, true);
Utils.initializeRESTAssured();
resetInstanceMode(context);
}
});
}
private void resetInstanceMode(ExtensionContext context) {
changeInstanceMode(context, true, true, true, true);
}
private void changeInstanceMode(ExtensionContext extensionContext, boolean readEnabled, boolean writeEnabled,
boolean batchWorkerEnabled, boolean batchManagerEnabled) {
Store store = extensionContext.getStore(INSTANCE_MODE_NAMESPACE);