http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/4b1ec9ef/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/DisbursalAndRepaymentScheduleTest.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/DisbursalAndRepaymentScheduleTest.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/DisbursalAndRepaymentScheduleTest.java new file mode 100644 index 0000000..611a9ee --- /dev/null +++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/DisbursalAndRepaymentScheduleTest.java @@ -0,0 +1,368 @@ +/** + * 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.integrationtests; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; + +import org.apache.fineract.integrationtests.common.*; +import org.apache.fineract.integrationtests.common.loans.*; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +import com.jayway.restassured.builder.RequestSpecBuilder; +import com.jayway.restassured.builder.ResponseSpecBuilder; +import com.jayway.restassured.http.ContentType; +import com.jayway.restassured.specification.RequestSpecification; +import com.jayway.restassured.specification.ResponseSpecification; + +/** + * Tests loan schedule change based on group meeting changes and loan + * rescheduling + **/ +@SuppressWarnings({ "rawtypes" }) +@Ignore +public class DisbursalAndRepaymentScheduleTest { + + private ResponseSpecification responseSpec; + private ResponseSpecification responseSpecForStatusCode403; + private ResponseSpecification generalResponseSpec; + private RequestSpecification requestSpec; + private LoanTransactionHelper loanTransactionHelper; + private LoanRescheduleRequestHelper loanRescheduleRequestHelper; + private Integer loanRescheduleRequestId; + private Integer clientId; + private Integer groupId; + private Integer groupCalendarId; + private Integer loanProductId; + private Integer loanId; + private final String loanPrincipalAmount = "100000.00"; + private final String numberOfRepayments = "12"; + private final String interestRatePerPeriod = "18"; + + private final SimpleDateFormat dateFormatterStandard = new SimpleDateFormat("dd MMMM yyyy"); + + @Before + public void setup() { + Utils.initializeRESTAssured(); + } + + @Test + public void testRescheduleJLGLoanSynk() { + System.out.println("---------------------------------STARTING RESCHEDULE JLG LOAN TEST ------------------------------------------"); + + Calendar meetingCalendar = Calendar.getInstance(); + meetingCalendar.setFirstDayOfWeek(Calendar.MONDAY); + meetingCalendar.setTime(new java.util.Date()); + + int today = meetingCalendar.get(Calendar.DAY_OF_WEEK); + // making sure that the meeting calendar is set for the coming monday. + if (today >= Calendar.MONDAY) { + meetingCalendar.add(Calendar.DAY_OF_YEAR, +(Calendar.MONDAY - today + 7)); + } else { + meetingCalendar.add(Calendar.DAY_OF_YEAR, +(Calendar.MONDAY - today)); + } + + Calendar groupMeetingChangeCalendar = (Calendar) meetingCalendar.clone(); + + meetingCalendar.add(Calendar.WEEK_OF_YEAR, -3); + + final String groupMeetingDate = this.dateFormatterStandard.format(meetingCalendar.getTime()); + + final String disbursalDate = groupMeetingDate; // first meeting date + // after group creation + + final String rescheduleSubmittedDate = this.dateFormatterStandard.format(new java.util.Date()); + + final String loanType = "jlg"; + final String rescheduleInterestRate = "28.0"; + groupMeetingChangeCalendar.add(Calendar.DAY_OF_YEAR, 1); + final String groupMeetingNewStartDate = this.dateFormatterStandard.format(groupMeetingChangeCalendar.getTime()); + // The date + // from + // which we + // start the + // new group + // meeting + // occasion, + // this is a + // tuesday. + groupMeetingChangeCalendar.add(Calendar.WEEK_OF_YEAR, 2); + final String rescheduleDate = this.dateFormatterStandard.format(groupMeetingChangeCalendar.getTime()); + + this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); + this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + this.requestSpec.header("Fineract-Platform-TenantId", "default"); + this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + this.generalResponseSpec = new ResponseSpecBuilder().build(); + this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); + + this.loanRescheduleRequestHelper = new LoanRescheduleRequestHelper(this.requestSpec, this.responseSpec); + System.out.println("---------------------------------CREATING ENTITIES AND JLG LOAN ------------------------------------------"); + // create all required entities + this.createRequiredEntitiesForJLGLoanSync(groupMeetingDate); + + final String loanApplicationJSON = new LoanApplicationTestBuilder().withPrincipal(loanPrincipalAmount).withLoanTermFrequency("24") + .withLoanTermFrequencyAsWeeks().withNumberOfRepayments("12").withRepaymentEveryAfter("2") + .withRepaymentFrequencyTypeAsMonths().withAmortizationTypeAsEqualInstallments().withInterestCalculationPeriodTypeAsDays() + .withInterestRatePerPeriod(interestRatePerPeriod).withRepaymentFrequencyTypeAsWeeks().withSubmittedOnDate(disbursalDate) + .withExpectedDisbursementDate(disbursalDate).withLoanType(loanType).withSyncDisbursementWithMeetin() + .withCalendarID(this.groupCalendarId.toString()) + .build(this.clientId.toString(), this.groupId.toString(), this.loanProductId.toString(), null); + + this.loanId = this.loanTransactionHelper.getLoanId(loanApplicationJSON); + + // Test for loan account is created + Assert.assertNotNull(this.loanId); + HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, this.loanId); + + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + + // Test for loan account is created, can be approved + this.loanTransactionHelper.approveLoan(disbursalDate, this.loanId); + loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, this.loanId); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + + // Test for loan account approved can be disbursed + this.loanTransactionHelper.disburseLoan(disbursalDate, this.loanId); + loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, this.loanId); + LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + + System.out.println("---------------------------------CHANGING GROUP MEETING DATE ------------------------------------------"); + CalendarHelper.updateMeetingCalendarForGroup(this.requestSpec, this.responseSpec, this.groupId, this.groupCalendarId.toString(), + groupMeetingNewStartDate, "2", "2", "2"); // New meeting dates + // will be the tuesday + // after the + // coming + // monday + + ArrayList loanRepaymnetSchedule = this.loanTransactionHelper + .getLoanRepaymentSchedule(requestSpec, generalResponseSpec, this.loanId); + + ArrayList dueDateLoanSchedule = (ArrayList) ((HashMap) loanRepaymnetSchedule.get(2)).get("dueDate"); + Calendar dueDateCalendar = Calendar.getInstance(); + dueDateCalendar.setFirstDayOfWeek(Calendar.MONDAY); + dueDateCalendar.set((Integer) dueDateLoanSchedule.get(0), (Integer) dueDateLoanSchedule.get(1) - 1, + (Integer) dueDateLoanSchedule.get(2)); + assertEquals("AFTER MEETING CHANGE DATE THE NEXT REPAYMENT SHOULD BE ON TUESDAY", 3, dueDateCalendar.get(Calendar.DAY_OF_WEEK)); + + System.out.println("---------------------------------CREATING LOAN RESCHEDULE REQUEST------------------------------------------"); + + String requestJSON = new LoanRescheduleRequestTestBuilder().updateGraceOnInterest("2").updateGraceOnPrincipal("2") + .updateNewInterestRate(rescheduleInterestRate).updateRescheduleFromDate(rescheduleDate) + .updateSubmittedOnDate(rescheduleSubmittedDate).build(this.loanId.toString()); + + this.loanRescheduleRequestId = this.loanRescheduleRequestHelper.createLoanRescheduleRequest(requestJSON); + this.loanRescheduleRequestHelper.verifyCreationOfLoanRescheduleRequest(this.loanRescheduleRequestId); + + loanRepaymnetSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, generalResponseSpec, this.loanId); + dueDateLoanSchedule = (ArrayList) ((HashMap) loanRepaymnetSchedule.get(2)).get("dueDate"); + dueDateCalendar.set((Integer) dueDateLoanSchedule.get(0), (Integer) dueDateLoanSchedule.get(1) - 1, + (Integer) dueDateLoanSchedule.get(2)); + assertEquals("AFTER MEETING CHANGE DATE THE NEXT REPAYMENT SHOULD BE ON TUESDAY, EVEN AFTER LOAN RESCHEDULE REQUEST WAS SENT", 3, + dueDateCalendar.get(Calendar.DAY_OF_WEEK)); + + System.out.println("Successfully created loan reschedule request (ID: " + this.loanRescheduleRequestId + ")"); + + System.out.println("-----------------------------APPROVING LOAN RESCHEDULE REQUEST--------------------------"); + + requestJSON = new LoanRescheduleRequestTestBuilder().updateSubmittedOnDate(rescheduleSubmittedDate) + .getApproveLoanRescheduleRequestJSON(); + this.loanRescheduleRequestHelper.approveLoanRescheduleRequest(this.loanRescheduleRequestId, requestJSON); + + final HashMap response = (HashMap) this.loanRescheduleRequestHelper.getLoanRescheduleRequest(loanRescheduleRequestId, "statusEnum"); + assertTrue((Boolean) response.get("approved")); + + loanRepaymnetSchedule = this.loanTransactionHelper.getLoanRepaymentSchedule(requestSpec, generalResponseSpec, this.loanId); + + dueDateLoanSchedule = (ArrayList) ((HashMap) loanRepaymnetSchedule.get(2)).get("dueDate"); + dueDateCalendar.set((Integer) dueDateLoanSchedule.get(0), (Integer) dueDateLoanSchedule.get(1) - 1, + (Integer) dueDateLoanSchedule.get(2)); + assertEquals("AFTER MEETING CHANGE DATE THE NEXT REPAYMENT SHOULD BE ON TUESDAY, EVEN AFTER RESCHEDULE", 3, + dueDateCalendar.get(Calendar.DAY_OF_WEEK)); + System.out.println("Successfully changed group meeting date (CAELNDAR ID: " + this.groupCalendarId + + ") and rescheduled loan (RESCHEDULE ID: " + this.loanRescheduleRequestId + ")"); + + this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpecForStatusCode403); + } + + @Test + public void testChangeGroupMeetingMaturedOnDate() { + System.out + .println("---------------------------------STARTING GROUP LOAN MEETING CHANGE DATE EXPECTED MATURED CHANGE------------------------------------------"); + + Calendar meetingCalendar = Calendar.getInstance(); + meetingCalendar.setFirstDayOfWeek(Calendar.MONDAY); + meetingCalendar.setTime(new java.util.Date()); + + int today = meetingCalendar.get(Calendar.DAY_OF_WEEK); + // making sure that the meeting calendar is set for the coming monday. + if (today >= Calendar.MONDAY) { + meetingCalendar.add(Calendar.DAY_OF_YEAR, +(Calendar.MONDAY - today + 7)); + } else { + meetingCalendar.add(Calendar.DAY_OF_YEAR, +(Calendar.MONDAY - today)); + } + + Calendar groupMeetingChangeCalendar = (Calendar) meetingCalendar.clone(); + + meetingCalendar.add(Calendar.WEEK_OF_YEAR, -3); + + final String groupMeetingDate = this.dateFormatterStandard.format(meetingCalendar.getTime()); + + final String disbursalDate = groupMeetingDate; // first meeting date + // after group creation + + final String loanType = "jlg"; + groupMeetingChangeCalendar.add(Calendar.DAY_OF_YEAR, 1); + final String groupMeetingNewStartDate = this.dateFormatterStandard.format(groupMeetingChangeCalendar.getTime()); + // The date + // from + // which we + // start the + // new group + // meeting + // occasion, + // this is a + // tuesday. + + this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); + this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + this.requestSpec.header("Fineract-Platform-TenantId", "default"); + this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + this.generalResponseSpec = new ResponseSpecBuilder().build(); + this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpec); + + this.loanRescheduleRequestHelper = new LoanRescheduleRequestHelper(this.requestSpec, this.responseSpec); + System.out.println("---------------------------------CREATING ENTITIES AND JLG LOAN ------------------------------------------"); + // create all required entities + this.createRequiredEntitiesForJLGLoanSync(groupMeetingDate); + + final String loanApplicationJSON = new LoanApplicationTestBuilder().withPrincipal(loanPrincipalAmount).withLoanTermFrequency("24") + .withLoanTermFrequencyAsWeeks().withNumberOfRepayments("12").withRepaymentEveryAfter("2") + .withRepaymentFrequencyTypeAsMonths().withAmortizationTypeAsEqualInstallments().withInterestCalculationPeriodTypeAsDays() + .withInterestRatePerPeriod(interestRatePerPeriod).withRepaymentFrequencyTypeAsWeeks().withSubmittedOnDate(disbursalDate) + .withExpectedDisbursementDate(disbursalDate).withLoanType(loanType).withSyncDisbursementWithMeetin() + .withCalendarID(this.groupCalendarId.toString()) + .build(this.clientId.toString(), this.groupId.toString(), this.loanProductId.toString(), null); + + this.loanId = this.loanTransactionHelper.getLoanId(loanApplicationJSON); + + // Test for loan account is created + Assert.assertNotNull(this.loanId); + HashMap loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, this.loanId); + + LoanStatusChecker.verifyLoanIsPending(loanStatusHashMap); + + // Test for loan account is created, can be approved + this.loanTransactionHelper.approveLoan(disbursalDate, this.loanId); + loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, this.loanId); + LoanStatusChecker.verifyLoanIsApproved(loanStatusHashMap); + + // Test for loan account approved can be disbursed + this.loanTransactionHelper.disburseLoan(disbursalDate, this.loanId); + loanStatusHashMap = LoanStatusChecker.getStatusOfLoan(this.requestSpec, this.responseSpec, this.loanId); + LoanStatusChecker.verifyLoanIsActive(loanStatusHashMap); + + System.out.println("---------------------------------CHANGING GROUP MEETING DATE ------------------------------------------"); + CalendarHelper.updateMeetingCalendarForGroup(this.requestSpec, this.responseSpec, this.groupId, this.groupCalendarId.toString(), + groupMeetingNewStartDate, "2", "2", "2"); // New meeting dates + // will be the tuesday + // after the + // coming + // monday + + Calendar expectedMaturityCalendar = Calendar.getInstance(); + expectedMaturityCalendar.setFirstDayOfWeek(Calendar.MONDAY); + ArrayList expectedMaturityDate = ((ArrayList) ((HashMap) this.loanTransactionHelper.getLoanDetail(requestSpec, generalResponseSpec, + this.loanId, "timeline")).get("expectedMaturityDate")); + + expectedMaturityCalendar.set((Integer) expectedMaturityDate.get(0), (Integer) expectedMaturityDate.get(1) - 1, + (Integer) expectedMaturityDate.get(2)); + + assertEquals("AFTER MEETING CHANGE DATE THE EXPECTED MATURITY SHOULD BE ON TUESDAY", 3, + expectedMaturityCalendar.get(Calendar.DAY_OF_WEEK)); + + this.loanTransactionHelper = new LoanTransactionHelper(this.requestSpec, this.responseSpecForStatusCode403); + } + + /** + * entities for jlg loan + **/ + private void createRequiredEntitiesForJLGLoanSync(final String groupActivationDate) { + this.createGroupEntityWithCalendar("2", "2", "1", groupActivationDate);// frequency=2:Weekly + // , interval=2: + // Every two weeks , + // repeatsOnDay=1:Monday + // groupActivationDate is decided by the current date + this.createClientEntity(); + this.associateClientToGroup(this.groupId, this.clientId); + this.createLoanProductEntity(); + + } + + /* + * Associate client to the group + */ + + private void associateClientToGroup(final Integer groupId, final Integer clientId) { + GroupHelper.associateClient(this.requestSpec, this.responseSpec, groupId.toString(), clientId.toString()); + GroupHelper.verifyGroupMembers(this.requestSpec, this.responseSpec, groupId, clientId); + } + + private void createGroupEntityWithCalendar(final String frequency, final String interval, final String repeatsOnDay, + final String groupActivationDate) { + this.groupId = GroupHelper.createGroup(this.requestSpec, this.responseSpec, groupActivationDate); + GroupHelper.verifyGroupCreatedOnServer(this.requestSpec, this.responseSpec, this.groupId); + + final String startDate = groupActivationDate; + + this.setGroupCalendarId(CalendarHelper.createMeetingCalendarForGroup(this.requestSpec, this.responseSpec, this.groupId, startDate, + frequency, interval, repeatsOnDay)); + } + + /** + * create a new client + **/ + private void createClientEntity() { + this.clientId = ClientHelper.createClient(this.requestSpec, this.responseSpec); + ClientHelper.verifyClientCreatedOnServer(this.requestSpec, this.responseSpec, this.clientId); + } + + /** + * create a new loan product + **/ + private void createLoanProductEntity() { + final String loanProductJSON = new LoanProductTestBuilder().withPrincipal(loanPrincipalAmount) + .withNumberOfRepayments(numberOfRepayments).withinterestRatePerPeriod(interestRatePerPeriod) + .withInterestRateFrequencyTypeAsYear().build(null); + this.loanProductId = this.loanTransactionHelper.getLoanProductId(loanProductJSON); + } + + public void setGroupCalendarId(Integer groupCalendarId) { + this.groupCalendarId = groupCalendarId; + } +} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/4b1ec9ef/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/ExternalServicesConfigurationTest.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/ExternalServicesConfigurationTest.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/ExternalServicesConfigurationTest.java new file mode 100644 index 0000000..3abbcee --- /dev/null +++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/ExternalServicesConfigurationTest.java @@ -0,0 +1,115 @@ +/** + * 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.integrationtests; + +import java.util.ArrayList; +import java.util.HashMap; + +import org.apache.fineract.integrationtests.common.ExternalServicesConfigurationHelper; +import org.apache.fineract.integrationtests.common.Utils; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.jayway.restassured.builder.RequestSpecBuilder; +import com.jayway.restassured.builder.ResponseSpecBuilder; +import com.jayway.restassured.http.ContentType; +import com.jayway.restassured.specification.RequestSpecification; +import com.jayway.restassured.specification.ResponseSpecification; + +@SuppressWarnings({ "rawtypes", "unchecked", "static-access" }) +public class ExternalServicesConfigurationTest { + + private ResponseSpecification responseSpec; + private RequestSpecification requestSpec; + private ExternalServicesConfigurationHelper externalServicesConfigurationHelper; + private ResponseSpecification httpStatusForidden; + + @Before + public void setup() { + Utils.initializeRESTAssured(); + this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); + this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + this.httpStatusForidden = new ResponseSpecBuilder().expectStatusCode(403).build(); + + } + + @Test + public void testExternalServicesConfiguration() { + this.externalServicesConfigurationHelper = new ExternalServicesConfigurationHelper(this.requestSpec, this.responseSpec); + + // Checking for S3 + String configName = "s3_access_key"; + ArrayList<HashMap> externalServicesConfig = this.externalServicesConfigurationHelper + .getExternalServicesConfigurationByServiceName(requestSpec, responseSpec, "S3"); + Assert.assertNotNull(externalServicesConfig); + for (Integer configIndex = 0; configIndex < (externalServicesConfig.size()); configIndex++) { + String name = (String) externalServicesConfig.get(configIndex).get("name"); + String value = null; + if (name.equals(configName)) { + value = (String) externalServicesConfig.get(configIndex).get("value"); + if(value == null){ + value = "testnull"; + } + String newValue = "test"; + System.out.println(name + ":" + value); + HashMap arrayListValue = this.externalServicesConfigurationHelper.updateValueForExternaServicesConfiguration(requestSpec, + responseSpec, "S3", name, newValue); + Assert.assertNotNull(arrayListValue.get("value")); + Assert.assertEquals(arrayListValue.get("value"), newValue); + HashMap arrayListValue1 = this.externalServicesConfigurationHelper.updateValueForExternaServicesConfiguration(requestSpec, + responseSpec, "S3", name, value); + Assert.assertNotNull(arrayListValue1.get("value")); + Assert.assertEquals(arrayListValue1.get("value"), value); + } + + } + + // Checking for SMTP: + + configName = "username"; + externalServicesConfig = this.externalServicesConfigurationHelper.getExternalServicesConfigurationByServiceName(requestSpec, + responseSpec, "SMTP"); + Assert.assertNotNull(externalServicesConfig); + for (Integer configIndex = 0; configIndex < (externalServicesConfig.size()); configIndex++) { + String name = (String) externalServicesConfig.get(configIndex).get("name"); + String value = null; + if (name.equals(configName)) { + value = (String) externalServicesConfig.get(configIndex).get("value"); + if(value == null){ + value = "testnull"; + } + String newValue = "test"; + System.out.println(name + ":" + value); + HashMap arrayListValue = this.externalServicesConfigurationHelper.updateValueForExternaServicesConfiguration(requestSpec, + responseSpec, "SMTP", name, newValue); + Assert.assertNotNull(arrayListValue.get("value")); + Assert.assertEquals(arrayListValue.get("value"), newValue); + HashMap arrayListValue1 = this.externalServicesConfigurationHelper.updateValueForExternaServicesConfiguration(requestSpec, + responseSpec, "SMTP", name, value); + Assert.assertNotNull(arrayListValue1.get("value")); + Assert.assertEquals(arrayListValue1.get("value"), value); + } + + } + + } + +} http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/4b1ec9ef/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/FinancialActivityAccountsTest.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/FinancialActivityAccountsTest.java b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/FinancialActivityAccountsTest.java new file mode 100755 index 0000000..ef2183f --- /dev/null +++ b/fineract-provider/src/integrationTest/java/org/apache/fineract/integrationtests/FinancialActivityAccountsTest.java @@ -0,0 +1,164 @@ +/** + * 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.integrationtests; + +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.List; + +import org.apache.fineract.accounting.common.AccountingConstants.FINANCIAL_ACTIVITY; +import org.apache.fineract.accounting.financialactivityaccount.exception.DuplicateFinancialActivityAccountFoundException; +import org.apache.fineract.accounting.financialactivityaccount.exception.FinancialActivityAccountInvalidException; +import org.apache.fineract.integrationtests.common.CommonConstants; +import org.apache.fineract.integrationtests.common.Utils; +import org.apache.fineract.integrationtests.common.accounting.Account; +import org.apache.fineract.integrationtests.common.accounting.AccountHelper; +import org.apache.fineract.integrationtests.common.accounting.FinancialActivityAccountHelper; +import org.junit.Assert; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.jayway.restassured.builder.RequestSpecBuilder; +import com.jayway.restassured.builder.ResponseSpecBuilder; +import com.jayway.restassured.http.ContentType; +import com.jayway.restassured.specification.RequestSpecification; +import com.jayway.restassured.specification.ResponseSpecification; + +@SuppressWarnings("rawtypes") +public class FinancialActivityAccountsTest { + + private ResponseSpecification responseSpec; + private ResponseSpecification responseSpecForValidationError; + private ResponseSpecification responseSpecForDomainRuleViolation; + private ResponseSpecification responseSpecForResourceNotFoundError; + private RequestSpecification requestSpec; + private AccountHelper accountHelper; + private FinancialActivityAccountHelper financialActivityAccountHelper; + private final Integer assetTransferFinancialActivityId = FINANCIAL_ACTIVITY.ASSET_TRANSFER.getValue(); + public static final Integer liabilityTransferFinancialActivityId = FINANCIAL_ACTIVITY.LIABILITY_TRANSFER.getValue(); + + @Before + public void setup() { + Utils.initializeRESTAssured(); + this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build(); + this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey()); + this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build(); + this.responseSpecForValidationError = new ResponseSpecBuilder().expectStatusCode(400).build(); + this.responseSpecForDomainRuleViolation = new ResponseSpecBuilder().expectStatusCode(403).build(); + this.responseSpecForResourceNotFoundError = new ResponseSpecBuilder().expectStatusCode(404).build(); + this.accountHelper = new AccountHelper(this.requestSpec, this.responseSpec); + this.financialActivityAccountHelper = new FinancialActivityAccountHelper(this.requestSpec); + } + + @SuppressWarnings("unchecked") + @Test + public void testFinancialActivityAccounts() { + + /** Create a Liability and an Asset Transfer Account **/ + Account liabilityTransferAccount = accountHelper.createLiabilityAccount(); + Account assetTransferAccount = accountHelper.createAssetAccount(); + Assert.assertNotNull(assetTransferAccount); + Assert.assertNotNull(liabilityTransferAccount); + + /*** Create A Financial Activity to Account Mapping **/ + Integer financialActivityAccountId = (Integer) financialActivityAccountHelper.createFinancialActivityAccount( + liabilityTransferFinancialActivityId, liabilityTransferAccount.getAccountID(), responseSpec, + CommonConstants.RESPONSE_RESOURCE_ID); + Assert.assertNotNull(financialActivityAccountId); + + /*** + * Fetch Created Financial Activity to Account Mapping and validate + * created values + **/ + assertFinancialActivityAccountCreation(financialActivityAccountId, liabilityTransferFinancialActivityId, liabilityTransferAccount); + + /** + * Update Existing Financial Activity to Account Mapping and assert + * changes + **/ + Account newLiabilityTransferAccount = accountHelper.createLiabilityAccount(); + Assert.assertNotNull(newLiabilityTransferAccount); + + HashMap changes = (HashMap) financialActivityAccountHelper.updateFinancialActivityAccount(financialActivityAccountId, + liabilityTransferFinancialActivityId, newLiabilityTransferAccount.getAccountID(), responseSpec, + CommonConstants.RESPONSE_CHANGES); + Assert.assertEquals(newLiabilityTransferAccount.getAccountID(), changes.get("glAccountId")); + + /** Validate update works correctly **/ + assertFinancialActivityAccountCreation(financialActivityAccountId, liabilityTransferFinancialActivityId, + newLiabilityTransferAccount); + + /** Update with Invalid Financial Activity should fail **/ + List<HashMap> invalidFinancialActivityUpdateError = (List<HashMap>) financialActivityAccountHelper.updateFinancialActivityAccount( + financialActivityAccountId, 232, newLiabilityTransferAccount.getAccountID(), responseSpecForValidationError, + CommonConstants.RESPONSE_ERROR); + assertEquals("validation.msg.financialactivityaccount.financialActivityId.is.not.one.of.expected.enumerations", + invalidFinancialActivityUpdateError.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE)); + + /** Creating Duplicate Financial Activity should fail **/ + List<HashMap> duplicateFinancialActivityAccountError = (List<HashMap>) financialActivityAccountHelper + .createFinancialActivityAccount(liabilityTransferFinancialActivityId, liabilityTransferAccount.getAccountID(), + responseSpecForDomainRuleViolation, CommonConstants.RESPONSE_ERROR); + assertEquals(DuplicateFinancialActivityAccountFoundException.getErrorcode(), + duplicateFinancialActivityAccountError.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE)); + + /** + * Associating incorrect GL account types with a financial activity + * should fail + **/ + List<HashMap> invalidFinancialActivityAccountError = (List<HashMap>) financialActivityAccountHelper.updateFinancialActivityAccount( + financialActivityAccountId, assetTransferFinancialActivityId, newLiabilityTransferAccount.getAccountID(), + responseSpecForDomainRuleViolation, CommonConstants.RESPONSE_ERROR); + assertEquals(FinancialActivityAccountInvalidException.getErrorcode(), + invalidFinancialActivityAccountError.get(0).get(CommonConstants.RESPONSE_ERROR_MESSAGE_CODE)); + + /** Should be able to delete a Financial Activity to Account Mapping **/ + Integer deletedFinancialActivityAccountId = financialActivityAccountHelper.deleteFinancialActivityAccount( + financialActivityAccountId, responseSpec, CommonConstants.RESPONSE_RESOURCE_ID); + Assert.assertNotNull(deletedFinancialActivityAccountId); + Assert.assertEquals(financialActivityAccountId, deletedFinancialActivityAccountId); + + /*** Trying to fetch a Deleted Account Mapping should give me a 404 **/ + financialActivityAccountHelper.getFinancialActivityAccount(deletedFinancialActivityAccountId, responseSpecForResourceNotFoundError); + } + + private void assertFinancialActivityAccountCreation(Integer financialActivityAccountId, Integer financialActivityId, Account glAccount) { + HashMap mappingDetails = financialActivityAccountHelper.getFinancialActivityAccount(financialActivityAccountId, responseSpec); + Assert.assertEquals(financialActivityId, ((HashMap) mappingDetails.get("financialActivityData")).get("id")); + Assert.assertEquals(glAccount.getAccountID(), ((HashMap) mappingDetails.get("glAccountData")).get("id")); + } + + /** + * Delete the Financial activities + */ + @After + public void tearDown() { + List<HashMap> financialActivities = this.financialActivityAccountHelper.getAllFinancialActivityAccounts(this.responseSpec); + for (HashMap financialActivity : financialActivities) { + Integer financialActivityAccountId = (Integer) financialActivity.get("id"); + Integer deletedFinancialActivityAccountId = this.financialActivityAccountHelper.deleteFinancialActivityAccount( + financialActivityAccountId, this.responseSpec, CommonConstants.RESPONSE_RESOURCE_ID); + Assert.assertNotNull(deletedFinancialActivityAccountId); + Assert.assertEquals(financialActivityAccountId, deletedFinancialActivityAccountId); + } + } +}
