/*
* Copyright (c) 2005-2011 Grameen Foundation USA
* All rights reserved.
*
* Licensed 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.
*
* See also http://www.apache.org/licenses/LICENSE-2.0.html for an
* explanation of the license and how it is applied.
*/
package org.mifos.test.acceptance.client;
import static java.util.Arrays.asList;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import org.joda.time.DateTime;
import org.junit.Assert;
import org.mifos.test.acceptance.admin.FeeTestHelper;
import org.mifos.test.acceptance.framework.ClientsAndAccountsHomepage;
import org.mifos.test.acceptance.framework.HomePage;
import org.mifos.test.acceptance.framework.MifosPage;
import org.mifos.test.acceptance.framework.UiTestCaseBase;
import org.mifos.test.acceptance.framework.account.AccountStatus;
import org.mifos.test.acceptance.framework.account.EditAccountStatusParameters;
import org.mifos.test.acceptance.framework.admin.AdminPage;
import org.mifos.test.acceptance.framework.admin.DefineAcceptedPaymentTypesPage;
import org.mifos.test.acceptance.framework.admin.DefineHiddenMandatoryFieldsPage;
import org.mifos.test.acceptance.framework.admin.FeesCreatePage.SubmitFormParameters;
import org.mifos.test.acceptance.framework.admin.ManageRolePage;
import org.mifos.test.acceptance.framework.center.MeetingParameters;
import org.mifos.test.acceptance.framework.client.ClientCloseReason;
import org.mifos.test.acceptance.framework.client.ClientEditMFIPage;
import org.mifos.test.acceptance.framework.client.ClientEditMFIParameters;
import org.mifos.test.acceptance.framework.client.ClientEditMFIPreviewPage;
import org.mifos.test.acceptance.framework.client.ClientEditPersonalInfoPage;
import org.mifos.test.acceptance.framework.client.ClientNotesPage;
import org.mifos.test.acceptance.framework.client.ClientSearchResultsPage;
import org.mifos.test.acceptance.framework.client.ClientStatus;
import org.mifos.test.acceptance.framework.client.ClientViewDetailsPage;
import org.mifos.test.acceptance.framework.client.CreateClientConfirmationPage;
import org.mifos.test.acceptance.framework.client.CreateClientEnterMfiDataPage;
import org.mifos.test.acceptance.framework.client.CreateClientEnterPersonalDataPage;
import org.mifos.test.acceptance.framework.client.CreateClientPreviewDataPage;
import org.mifos.test.acceptance.framework.client.QuestionGroup;
import org.mifos.test.acceptance.framework.customer.CustomerChangeStatusPage;
import org.mifos.test.acceptance.framework.customer.CustomerChangeStatusPreviewPage;
import org.mifos.test.acceptance.framework.group.CreateGroupEntryPage.CreateGroupSubmitParameters;
import org.mifos.test.acceptance.framework.group.EditCustomerStatusParameters;
import org.mifos.test.acceptance.framework.group.CancelReason;
import org.mifos.test.acceptance.framework.group.GroupCloseReason;
import org.mifos.test.acceptance.framework.group.GroupStatus;
import org.mifos.test.acceptance.framework.group.GroupViewDetailsPage;
import org.mifos.test.acceptance.framework.loan.ApplyPaymentConfirmationPage;
import org.mifos.test.acceptance.framework.loan.ApplyPaymentPage;
import org.mifos.test.acceptance.framework.loan.ChargeParameters;
import org.mifos.test.acceptance.framework.loan.CreateLoanAccountSearchParameters;
import org.mifos.test.acceptance.framework.loan.CreateLoanAccountSubmitParameters;
import org.mifos.test.acceptance.framework.loan.LoanAccountPage;
import org.mifos.test.acceptance.framework.loan.PaymentParameters;
import org.mifos.test.acceptance.framework.loan.QuestionResponseParameters;
import org.mifos.test.acceptance.framework.loanproduct.DefineNewLoanProductPage;
import org.mifos.test.acceptance.framework.questionnaire.CreateQuestionGroupPage;
import org.mifos.test.acceptance.framework.questionnaire.CreateQuestionGroupParameters;
import org.mifos.test.acceptance.framework.questionnaire.CreateQuestionPage;
import org.mifos.test.acceptance.framework.questionnaire.CreateQuestionParameters;
import org.mifos.test.acceptance.framework.questionnaire.EditQuestionPage;
import org.mifos.test.acceptance.framework.questionnaire.QuestionDetailPage;
import org.mifos.test.acceptance.framework.questionnaire.QuestionGroupResponsePage;
import org.mifos.test.acceptance.framework.questionnaire.QuestionResponsePage;
import org.mifos.test.acceptance.framework.questionnaire.QuestionnairePage;
import org.mifos.test.acceptance.framework.questionnaire.ViewAllQuestionsPage;
import org.mifos.test.acceptance.framework.savings.CreateSavingsAccountSearchParameters;
import org.mifos.test.acceptance.framework.savings.CreateSavingsAccountSubmitParameters;
import org.mifos.test.acceptance.framework.savings.SavingsAccountDetailPage;
import org.mifos.test.acceptance.framework.savingsproduct.SavingsProductParameters;
import org.mifos.test.acceptance.framework.search.SearchResultsPage;
import org.mifos.test.acceptance.framework.testhelpers.ClientTestHelper;
import org.mifos.test.acceptance.framework.testhelpers.CustomPropertiesHelper;
import org.mifos.test.acceptance.framework.testhelpers.FormParametersHelper;
import org.mifos.test.acceptance.framework.testhelpers.GroupTestHelper;
import org.mifos.test.acceptance.framework.testhelpers.LoanTestHelper;
import org.mifos.test.acceptance.framework.testhelpers.NavigationHelper;
import org.mifos.test.acceptance.framework.testhelpers.QuestionGroupTestHelper;
import org.mifos.test.acceptance.framework.testhelpers.SavingsAccountHelper;
import org.mifos.test.acceptance.framework.testhelpers.SavingsProductHelper;
import org.mifos.test.acceptance.remote.DateTimeUpdaterRemoteTestingService;
import org.mifos.test.acceptance.util.ApplicationDatabaseOperation;
import org.mifos.test.acceptance.util.StringUtil;
import org.mifos.test.acceptance.util.TestDataSetup;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@ContextConfiguration(locations = {"classpath:ui-test-context.xml"})
@SuppressWarnings({"PMD.TooManyFields","PMD.ExcessiveClassLength"})
@Test(singleThreaded = true, groups = {"client", "acceptance", "ui", "no_db_unit"})
public class ClientTest extends UiTestCaseBase {
private NavigationHelper navigationHelper;
private CustomPropertiesHelper propertiesHelper;
private ClientTestHelper clientTestHelper;
private QuestionGroupTestHelper questionGroupTestHelper;
private GroupTestHelper groupTestHelper;
private SavingsAccountHelper savingsAccountHelper;
private SavingsProductHelper savingsProductHelper;
private FeeTestHelper feeTestHelper;
private LoanTestHelper loanTestHelper;
@Autowired
private ApplicationDatabaseOperation applicationDatabaseOperation;
public static final String MULTI_SELECT = "Multi Select";
public static final String EXPECTED_DATE_FORMAT = "%02d/%02d/%04d";
public static final String NUMBER = "Number";
public static final String SMART_SELECT = "Smart Select";
private String questionGroupTitle;
private String question1 = "663q1";
private String question2 = "663q2";
private DateTime targetTime;
private static final String question3 = "663q3";
private static final String question4 = "663q4";
private static final String question5 = "663q5";
private static final String question6 = "663q6";
private static final String question7 = "663q7";
private static final String question8 = "663q8";
private static final String question9 = "663q9";
private static final String question10 = "663q10";
private static final String question11 = "663q11";
private static final String officeName = "MyOfficeDHMFT";
private String response;
private ClientViewDetailsPage viewClientDetailsPage;
private Map<Integer, QuestionGroup> questionGroupInstancesOfClient;
@Override
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// one of the dependent methods throws Exception
@BeforeMethod(alwaysRun = true)
public void setUp() throws Exception {
super.setUp();
navigationHelper = new NavigationHelper(selenium);
propertiesHelper = new CustomPropertiesHelper(selenium);
clientTestHelper = new ClientTestHelper(selenium);
questionGroupTestHelper = new QuestionGroupTestHelper(selenium);
groupTestHelper = new GroupTestHelper(selenium);
savingsAccountHelper = new SavingsAccountHelper(selenium);
savingsProductHelper = new SavingsProductHelper(selenium);
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
targetTime = new DateTime(2009, 7, 11, 12, 0, 0, 0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
TestDataSetup dataSetup = new TestDataSetup(selenium, applicationDatabaseOperation);
feeTestHelper = new FeeTestHelper(dataSetup, navigationHelper);
loanTestHelper = new LoanTestHelper(selenium);
}
@AfterMethod(alwaysRun = true)
public void logOut() {
setDefaultProperties();
(new MifosPage(selenium)).logout();
}
private void setDefaultProperties() {
propertiesHelper.setClientPendingApprovalStateEnabled("true");
propertiesHelper.setClientsNameSequence("first_name,middle_name,last_name,second_last_name");
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-248
@Test(enabled=true)
public void verifyAcceptedPaymentTypes() throws Exception {
// When
String groupName = "group1";
CreateClientEnterPersonalDataPage.SubmitFormParameters clientParams = new CreateClientEnterPersonalDataPage.SubmitFormParameters();
clientParams = clientParams();
clientParams.setFirstName("John");
clientParams.setLastName("Doe123");
ClientViewDetailsPage clientViewDetailsPage = clientTestHelper.createNewClient(groupName, clientParams);
clientViewDetailsPage.verifyHeading("John Doe123");
AdminPage adminPage = navigationHelper.navigateToAdminPage();
DefineAcceptedPaymentTypesPage defineAcceptedPaymentTypesPage = adminPage.navigateToDefineAcceptedPaymentType();
defineAcceptedPaymentTypesPage.addLoanFeesPaymentType(DefineAcceptedPaymentTypesPage.CHEQUE);
adminPage = navigationHelper.navigateToAdminPage();
defineAcceptedPaymentTypesPage = adminPage.navigateToDefineAcceptedPaymentType();
defineAcceptedPaymentTypesPage.addLoanFeesPaymentType(DefineAcceptedPaymentTypesPage.VOUCHER);
ApplyPaymentPage applyPaymentPage = navigationHelper.navigateToClientViewDetailsPage("John Doe123")
.navigateToViewClientChargesDetail().navigateToApplyPayments();
// Then
applyPaymentPage.verifyModeOfPayments();
}
@Test(singleThreaded = true, groups = {"smoke", "client", "acceptance", "ui", "no_db_unit"}, enabled=true)
public void verifyErrorsMessages() {
AdminPage adminPage = navigationHelper.navigateToAdminPage();
DefineHiddenMandatoryFieldsPage mandatoryFieldsPage = adminPage.navigateToDefineHiddenMandatoryFields();
mandatoryFieldsPage.checkMandatoryCitizenShip();
mandatoryFieldsPage.checkMandatoryEthnicity();
mandatoryFieldsPage.checkMandatoryMaritalStatus();
mandatoryFieldsPage.submit();
CreateClientEnterPersonalDataPage personalDataPage = navigationHelper.navigateToCreateClientEnterPersonalDataPage(officeName);
String[] errors = personalDataPage.getMandatoryBlankFieldsNames();
String[] fields = new String[] { "Salutation", "First Name", "Last Name", "Date of birth", "Gender",
"Ethnicity", "Citizenship", "Poverty status", "Marital Status" };
for(int i = 0; i < fields.length; ++i) {
Assert.assertEquals(fields[i], errors[i]);
}
adminPage = navigationHelper.navigateToAdminPage();
adminPage.navigateToDefineHiddenMandatoryFields();
mandatoryFieldsPage.uncheckMandatoryCitizenShip();
mandatoryFieldsPage.uncheckMandatoryEthnicity();
mandatoryFieldsPage.uncheckMandatoryMaritalStatus();
mandatoryFieldsPage.submit();
adminPage.logout();
}
@Test(singleThreaded = true, groups = {"smoke", "client", "acceptance", "ui", "no_db_unit"}, enabled=true)
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-208
public void createClientAndChangeStatusTest() throws Exception {
ClientViewDetailsPage clientDetailsPage = clientTestHelper.createClientAndVerify("loan officer",
"MyOfficeDHMFT");
// When / Then
clientTestHelper.changeCustomerStatus(clientDetailsPage);
}
@Test(enabled=true)
// http://mifosforge.jira.com/browse/MIFOS-4776
public void createClientAddTwoFeesTryPayMoreThanAmountVerifyErrorMessage() {
String oneTimeFeeName = "One Time Fee";
String periodicTimeFee = "Periodic Time Fee";
defineNewFree(oneTimeFeeName, SubmitFormParameters.ONETIME_FEE_FREQUENCY, 10.0);
defineNewFree(periodicTimeFee, SubmitFormParameters.PERIODIC_FEE_FREQUENCY, 37.0);
String clientName = "Stu1233266299995 Client1233266299995";
ChargeParameters chargeParameters = new ChargeParameters();
chargeParameters.setAmount("10");
chargeParameters.setType(oneTimeFeeName);
clientTestHelper.applyCharge(clientName, chargeParameters);
chargeParameters.setAmount("37");
chargeParameters.setType(periodicTimeFee);
clientTestHelper.applyCharge(clientName, chargeParameters);
PaymentParameters params = new PaymentParameters();
params.setTransactionDateDD("11");
params.setTransactionDateMM("02");
params.setTransactionDateYYYY("2009");
params.setAmount("48");
params.setPaymentType(PaymentParameters.CASH);
params.setReceiptId("");
params.setReceiptDateDD("");
params.setReceiptDateMM("");
params.setReceiptDateYYYY("");
ApplyPaymentConfirmationPage applyPaymentConfirmationPage = clientTestHelper
.navigateToClientViewDetailsPage(clientName)
.navigateToViewClientChargesDetail().navigateToApplyPayments()
.submitAndNavigateToApplyPaymentConfirmationPage(params);
applyPaymentConfirmationPage.dontLoadNext();
String actual = applyPaymentConfirmationPage.getSelenium()
.getText("//span[@id='reviewapplypayment.error.message']");
String expected = "Payment cannot be more than Amount due.";
Assert.assertEquals(expected, actual);
}
private void defineNewFree(String name, int feeFrequencyType, double amount) {
SubmitFormParameters params = new SubmitFormParameters();
params.setFeeName(name);
params.setCategoryType(SubmitFormParameters.ALL_CUSTOMERS);
params.setFeeFrequencyType(feeFrequencyType);
if(feeFrequencyType == SubmitFormParameters.ONETIME_FEE_FREQUENCY) {
params.setCustomerCharge(SubmitFormParameters.UPFRONT);
} else {
params.setFeeRecurrenceType(SubmitFormParameters.WEEKLY_FEE_RECURRENCE);
params.setWeekRecurAfter(1);
}
params.setAmount(amount);
params.setGlCode("31301 - Fees");
feeTestHelper.defineFees(params);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-310
@Test(enabled=true)
public void searchClientAndEditExistingClientDetails() throws Exception {
HomePage homePage = navigationHelper.navigateToHomePage();
homePage = searchForClient("client1 lastname", homePage, 1);
homePage = searchForClient("zzz", homePage, 0);
SearchResultsPage searchResultsPage = homePage.search("client1 lastname");
searchResultsPage.verifyPage();
int numResults = searchResultsPage.countSearchResults();
Assert.assertEquals(numResults, 1);
ClientViewDetailsPage viewDetailsPage = searchResultsPage
.navigateToClientViewDetailsPage("link=client1 lastname*");
ClientNotesPage notesPage = viewDetailsPage.navigateToNotesPage();
notesPage.addNotePreviewAndSubmit("test note");
viewDetailsPage.verifyNotes("test note");
CustomerChangeStatusPage changeStatusPage = viewDetailsPage.navigateToCustomerChangeStatusPage();
EditCustomerStatusParameters parameters = new EditCustomerStatusParameters();
parameters.setClientStatus(ClientStatus.ON_HOLD);
parameters.setNote("test");
CustomerChangeStatusPreviewPage changeStatusPreviewPage = changeStatusPage
.setChangeStatusParametersAndSubmit(parameters);
viewDetailsPage = changeStatusPreviewPage.submitAndGotoClientViewDetailsPage();
viewDetailsPage.verifyStatus("On Hold");
ClientEditPersonalInfoPage editPersonalInfoPage = viewDetailsPage.editPersonalInformation();
CreateClientEnterPersonalDataPage.SubmitFormParameters parameters2 = new CreateClientEnterPersonalDataPage.SubmitFormParameters();
parameters2.setSpouseFirstName("FatherFirstnameTest");
parameters2.setSpouseLastName("FatherLastNameTest");
parameters2.setSpouseNameType(CreateClientEnterPersonalDataPage.SubmitFormParameters.FATHER);
parameters2.setDateOfBirthYYYY("1960");
parameters2.setDateOfBirthMM("08");
parameters2.setDateOfBirthDD("01");
viewDetailsPage = editPersonalInfoPage.submitAndNavigateToViewDetailsPage(parameters2);
viewDetailsPage.verifySpouseFather("FatherFirstnameTest FatherLastNameTest");
ClientNotesPage seeAllNotes = viewDetailsPage.navigateToAllNotesPage();
seeAllNotes.verifySeeAllNotesTitle("client1 lastname");
// extension to verify MIFOS-5685
applicationDatabaseOperation.updateGLIM(1);
applicationDatabaseOperation.updateLSIM(1);
seeAllNotes.navigateBack();
editPersonalInfoPage = viewDetailsPage.editPersonalInformation();
parameters2.setDateOfBirthYYYY("1961");
parameters2.setDateOfBirthMM("07");
parameters2.setDateOfBirthDD("02");
viewDetailsPage = editPersonalInfoPage.submitAndNavigateToViewDetailsPage(parameters2);
viewDetailsPage.verifyDateOfBirth("02", "07", "1961");
seeAllNotes = viewDetailsPage.navigateToAllNotesPage();
seeAllNotes.verifySeeAllNotesTitle("client1 lastname");
applicationDatabaseOperation.updateGLIM(0);
applicationDatabaseOperation.updateLSIM(0);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-236
@Test(enabled=true)
public void createClientOutsideGroup() throws Exception {
// When
CreateClientEnterPersonalDataPage clientPersonalDataPage = navigationHelper.navigateToCreateClientEnterPersonalDataPage(officeName);
// we remember form parameters to verify MIFOS-5032
CreateClientEnterPersonalDataPage.SubmitFormParameters formParameters = FormParametersHelper.getClientEnterPersonalDataPageFormParameters();
clientPersonalDataPage=clientPersonalDataPage.create(formParameters);
CreateClientEnterMfiDataPage clientEnterMfiDataPage = clientPersonalDataPage.submitAndGotoCreateClientEnterMfiDataPage();
CreateClientEnterMfiDataPage.SubmitFormParameters parameters = new CreateClientEnterMfiDataPage.SubmitFormParameters();
parameters.setLoanOfficerId("loan officer");
MeetingParameters meeting = new MeetingParameters();
meeting.setMeetingPlace("testMeetingPlace");
meeting.setWeekFrequency("1");
meeting.setWeekDay(MeetingParameters.WeekDay.MONDAY);
parameters.setMeeting(meeting);
CreateClientPreviewDataPage createClientPreviewDataPage = clientEnterMfiDataPage
.submitAndGotoCreateClientPreviewDataPage(parameters);
CreateClientConfirmationPage clientConfirmationPage = createClientPreviewDataPage.submit();
// Then
clientConfirmationPage.navigateToClientViewDetailsPage();
// extension to verify MIFOS-5032
clientPersonalDataPage = navigationHelper.navigateToCreateClientEnterPersonalDataPage(officeName);
clientPersonalDataPage=clientPersonalDataPage.create(formParameters);
clientEnterMfiDataPage = clientPersonalDataPage.submitAndGotoCreateClientEnterMfiDataPage();
createClientPreviewDataPage = clientEnterMfiDataPage.submitAndGotoCreateClientPreviewDataPage(parameters);
createClientPreviewDataPage.submitWithOneError("The combination of the specified Date of Birth and name " +
formParameters.getFirstName() + " " + formParameters.getLastName() + " already exists in the application. Please specify a different name.");
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void createClientAssignedGroup() throws Exception {
GroupViewDetailsPage groupViewDetailsPage= navigationHelper.navigateToGroupViewDetailsPage("GroupWeekly");
String groupMeetingSchedule = groupViewDetailsPage.getMeetingSchedule();
String groupMeetingPlace = groupViewDetailsPage.getMeetingPlace();
ClientsAndAccountsHomepage clientsAndAccountsHomepage = navigationHelper.navigateToClientsAndAccountsPage();
CreateClientEnterPersonalDataPage createClientEnterPersonalDataPage = clientsAndAccountsHomepage.navigateToCreateNewClientPage().selectGroup("GroupWeekly");
String clientMeetingSchedule = createClientEnterPersonalDataPage.getMeetingSchedule();
String clientMeetingPlace = createClientEnterPersonalDataPage.getMeetingPlace();
Assert.assertEquals(groupMeetingSchedule, clientMeetingSchedule);
Assert.assertEquals(groupMeetingPlace, clientMeetingPlace);
CreateClientEnterPersonalDataPage.SubmitFormParameters parameters = new CreateClientEnterPersonalDataPage.SubmitFormParameters();
parameters = clientParams();
CreateClientPreviewDataPage createClientPreviewDataPage= createClientEnterPersonalDataPage.createWithoutSpouse(parameters).submitAndGotoCreateClientEnterMfiDataPage().navigateToPreview();
String clientPreviewMeetingSchedule = createClientPreviewDataPage.getMeetingSchedule();
String clientPreviewMeetingPlace = createClientPreviewDataPage.getMeetingPlace();
Assert.assertEquals(groupMeetingSchedule, clientPreviewMeetingSchedule);
Assert.assertEquals(groupMeetingPlace, clientPreviewMeetingPlace);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
private HomePage searchForClient(String clientName, HomePage homePage, int expectedNumberOfClients)
throws Exception {
SearchResultsPage searchResultsPage = homePage.search(clientName);
searchResultsPage.verifyPage();
int numResults = searchResultsPage.countSearchResults();
Assert.assertEquals(expectedNumberOfClients, numResults);
selenium.click("header.link.home");
selenium.waitForPageToLoad("30000");
return new HomePage(selenium);
}
// implementation of test described in issue 2454
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void searchForClientAndEditDetailsTest() throws Exception {
ClientsAndAccountsHomepage clientsPage = navigationHelper.navigateToClientsAndAccountsPage();
ClientSearchResultsPage searchResultsPage = clientsPage.searchForClient("client1");
searchResultsPage.verifyPage();
ClientViewDetailsPage clientDetailsPage = searchResultsPage
.navigateToSearchResult("client1 lastname: ID 0002-000000005");
ClientEditMFIPage editMFIPage = clientDetailsPage.navigateToEditMFIPage();
editMFIPage.verifyPage();
ClientEditMFIParameters params = new ClientEditMFIParameters();
params.setExternalId("extID123");
params.setTrainedDateDD("15");
params.setTrainedDateMM("12");
params.setTrainedDateYYYY("2008");
ClientEditMFIPreviewPage mfiPreviewPage = editMFIPage.submitAndNavigateToClientEditMFIPreviewPage(params);
mfiPreviewPage.verifyPage();
clientDetailsPage = mfiPreviewPage.submit();
assertTextFoundOnPage("extID123");
assertTextFoundOnPage("15/12/2008");
}
// http://mifosforge.jira.com/browse/MIFOSTEST-663
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void closeClientAccountWithQG() throws Exception {
//Given
String groupName = "group1";
CreateClientEnterPersonalDataPage.SubmitFormParameters clientParams = clientParams();
clientParams.setFirstName("John");
clientParams.setLastName("Doe4321");
ClientViewDetailsPage clientPage = clientTestHelper.createNewClient(groupName, clientParams);
String clientName = clientPage.getGlobalCustNum();
clientTestHelper.changeCustomerStatus(clientPage, ClientStatus.ACTIVE);
createQuestions2();
createQuestionGroup2();
String qG_1 = "CloseClientQG";
String qG_2 = "CloseClientQG2";
QuestionResponseParameters responseParams = getQuestionResponseParametersForClientAccountClose("answer1");
QuestionResponseParameters responseParams2 = getQuestionResponseParametersForClientAccountClose("answer2");
QuestionResponseParameters responseParamsAfterModyfication = getQuestionResponseParametersForClientAccountCloseAfterModyfication("answer2");
List<CreateQuestionParameters> questionsList = new ArrayList<CreateQuestionParameters>();
questionsList.add(newFreeTextQuestionParameters("663new question 1"));
questionsList.add(newFreeTextQuestionParameters("663new question 2"));
questionsList.add(newFreeTextQuestionParameters("663new question 3"));
String[] newActiveQuestions = { "663new question 1", "663new question 2" };
String[] deactivateArray = { "663new question 3", question3, question6, question2, question5};
String[] deactivatedGroupArray = {question10, question11};
List<String> deactivateList = Arrays.asList(deactivateArray);
Map<String, String> questionsAndAnswers = new HashMap<String, String>();
questionsAndAnswers.put("663new question 1", "answer2");
questionsAndAnswers.put("663new question 2", "answer2");
questionsAndAnswers.put(question1, "24/01/2011");
questionsAndAnswers.put(question4, "10");
questionsAndAnswers.put(question7, "24/01/2011");
questionsAndAnswers.put(question8, "jan");
questionsAndAnswers.put(question9, "answer2");
//When / Then
QuestionResponsePage responsePage = clientTestHelper.navigateToQuestionResponsePageWhenCloseClientAccount(clientName);
responsePage.populateAnswers(responseParams);
responsePage.navigateToNextPage();
responsePage = new CustomerChangeStatusPreviewPage(selenium).navigateToEditAdditionalInformation();
responsePage.populateAnswers(responseParams2);
responsePage.navigateToNextPage();
new CustomerChangeStatusPreviewPage(selenium).cancelAndGotoClientViewDetailsPage();
QuestionGroupTestHelper questionTestHelper = new QuestionGroupTestHelper(selenium);
questionTestHelper.addNewQuestionsToQuestionGroup(qG_1, questionsList);
questionTestHelper.markQuestionsAsInactive(deactivateList);
questionTestHelper.markQuestionGroupAsInactive(qG_2);
responsePage = clientTestHelper.navigateToQuestionResponsePageWhenCloseClientAccount(clientName);
responsePage.verifyQuestionsDoesnotappear(deactivateArray);
responsePage.verifyQuestionsDoesnotappear(deactivatedGroupArray);
responsePage.verifyQuestionsExists(newActiveQuestions);
clientTestHelper.closeClientWithQG(clientName, responseParamsAfterModyfication);
verifyQuestionResponsesExistInDatabase(clientName, "Close Client", questionsAndAnswers);
questionTestHelper.markQuestionsAsInactive(asList("663new question 1","663new question 2", question1,
question2, question4, question7, question8, question9, question10, question11));
questionTestHelper.markQuestionGroupAsInactive(qG_1);
}
private void createQuestions2() {
List<CreateQuestionParameters> questions = new ArrayList<CreateQuestionParameters>();
CreateQuestionParameters q1 = new CreateQuestionParameters();
q1.setType(CreateQuestionParameters.TYPE_DATE);
q1.setText(question1);
questions.add(q1);
CreateQuestionParameters q2 = new CreateQuestionParameters();
q2.setType(CreateQuestionParameters.TYPE_MULTI_SELECT);
q2.setText(question2);
q2.setChoicesFromStrings(Arrays.asList(new String[] {"first", "second"}));
questions.add(q2);
CreateQuestionParameters q3 = new CreateQuestionParameters();
q3.setType(CreateQuestionParameters.TYPE_NUMBER);
q3.setText(question3);
q3.setNumericMax(10);
q3.setNumericMin(0);
questions.add(q3);
CreateQuestionParameters q4 = new CreateQuestionParameters();
q4.setType(CreateQuestionParameters.TYPE_NUMBER);
q4.setText(question4);
q4.setNumericMax(10);
q4.setNumericMin(0);
questions.add(q4);
CreateQuestionParameters q5 = new CreateQuestionParameters();
q5.setType(CreateQuestionParameters.TYPE_FREE_TEXT);
q5.setText(question5);
questions.add(q5);
CreateQuestionParameters q6 = new CreateQuestionParameters();
q6.setType(CreateQuestionParameters.TYPE_SINGLE_SELECT);
q6.setText(question6);
q6.setChoicesFromStrings(asList("good", "wrong"));
questions.add(q6);
CreateQuestionParameters q7 = new CreateQuestionParameters();
q7.setType(CreateQuestionParameters.TYPE_DATE);
q7.setText(question7);
questions.add(q7);
CreateQuestionParameters q8 = new CreateQuestionParameters();
q8.setType(CreateQuestionParameters.TYPE_MULTI_SELECT);
q8.setText(question8);
q8.setChoicesFromStrings(Arrays.asList(new String[] {"jan", "feb"}));
questions.add(q8);
CreateQuestionParameters q9 = new CreateQuestionParameters();
q9.setType(CreateQuestionParameters.TYPE_FREE_TEXT);
q9.setText(question9);
questions.add(q9);
CreateQuestionParameters q10 = new CreateQuestionParameters();
q10.setType(CreateQuestionParameters.TYPE_SINGLE_SELECT);
q10.setText(question10);
q10.setChoicesFromStrings(Arrays.asList(new String[] {"1", "2","3"}));
questions.add(q10);
CreateQuestionParameters q11 = new CreateQuestionParameters();
q11.setType(CreateQuestionParameters.TYPE_FREE_TEXT);
q11.setText(question11);
questions.add(q11);
questionGroupTestHelper.createQuestions(questions);
}
private void createQuestionGroup2() {
String qG_1 = "CloseClientQG";
String qG_2 = "CloseClientQG2";
AdminPage adminPage = navigationHelper.navigateToAdminPage();
CreateQuestionGroupPage createQuestionGroupPage = adminPage.navigateToCreateQuestionGroupPage();
CreateQuestionGroupParameters parameters;
parameters = questionGroupTestHelper.getCreateQuestionGroupParameters(qG_1, asList(question1, question2, question3, question4, question5),
"Close Client", "Section1");
parameters.addExistingQuestion("Section2", question7);
parameters.addExistingQuestion("Section2", question6);
parameters.addExistingQuestion("Section2", question9);
parameters.addExistingQuestion("Section2", question8);
for (String section : parameters.getExistingQuestions().keySet()) {
createQuestionGroupPage.addExistingQuestion(section, parameters.getExistingQuestions().get(section));
}
createQuestionGroupPage.markEveryOtherQuestionsMandatory(asList(question1));
createQuestionGroupPage.submit(parameters);
adminPage = navigationHelper.navigateToAdminPage();
createQuestionGroupPage = adminPage.navigateToCreateQuestionGroupPage();
parameters = questionGroupTestHelper.getCreateQuestionGroupParameters(qG_2, asList(question1, question6, question3, question5),
"Close Client", "Section1");
parameters.addExistingQuestion("Section2", question9);
parameters.addExistingQuestion("Section2", question10);
parameters.addExistingQuestion("Section2", question8);
parameters.addExistingQuestion("Section2", question11);
for (String section : parameters.getExistingQuestions().keySet()) {
createQuestionGroupPage.addExistingQuestion(section, parameters.getExistingQuestions().get(section));
}
createQuestionGroupPage.submit(parameters);
}
private void verifyQuestionResponsesExistInDatabase(String clientID, String event, Map<String, String> questions) throws SQLException {
for (String question : questions.keySet()) {
Assert.assertTrue(applicationDatabaseOperation.deosQuestionResponseForClientExist(clientID, event, question, questions.get(question)));
}
}
private QuestionResponseParameters getQuestionResponseParametersForClientAccountClose(String answer) {
QuestionResponseParameters responseParams = new QuestionResponseParameters();
responseParams.addTextAnswer("questionGroups[0].sectionDetails[0].questions[0].value", "24/01/2011");
responseParams.addSingleSelectAnswer("questionGroups[0].sectionDetails[0].questions[1].valuesAsArray", "first");
responseParams.addTextAnswer("questionGroups[0].sectionDetails[0].questions[2].value", "10");
responseParams.addTextAnswer("questionGroups[0].sectionDetails[0].questions[3].value", "10");
responseParams.addTextAnswer("questionGroups[0].sectionDetails[0].questions[4].value", answer);
responseParams.addSingleSelectAnswer("questionGroups[0].sectionDetails[1].questions[0].value", "good");
responseParams.addTextAnswer("questionGroups[0].sectionDetails[1].questions[1].value", "24/01/2011");
responseParams.addSingleSelectAnswer("questionGroups[0].sectionDetails[1].questions[2].valuesAsArray", "feb");
responseParams.addTextAnswer("questionGroups[0].sectionDetails[1].questions[3].value", answer);
responseParams.addTextAnswer("questionGroups[1].sectionDetails[0].questions[0].value", "24/01/2011");
responseParams.addTextAnswer("questionGroups[1].sectionDetails[0].questions[1].value", "10");
responseParams.addTextAnswer("questionGroups[1].sectionDetails[0].questions[2].value", answer);
responseParams.addSingleSelectAnswer("questionGroups[1].sectionDetails[0].questions[3].value", "good");
responseParams.addSingleSelectAnswer("questionGroups[1].sectionDetails[1].questions[0].value", "1");
responseParams.addTextAnswer("questionGroups[1].sectionDetails[1].questions[1].value", answer);
responseParams.addSingleSelectAnswer("questionGroups[1].sectionDetails[1].questions[2].valuesAsArray", "jan");
responseParams.addTextAnswer("questionGroups[1].sectionDetails[1].questions[3].value", answer);
return responseParams;
}
private QuestionResponseParameters getQuestionResponseParametersForClientAccountCloseAfterModyfication(String answer) {
QuestionResponseParameters responseParams = new QuestionResponseParameters();
responseParams.addTextAnswer("questionGroups[0].sectionDetails[0].questions[0].value", answer);
responseParams.addTextAnswer("questionGroups[0].sectionDetails[0].questions[1].value", answer);
responseParams.addTextAnswer("questionGroups[0].sectionDetails[1].questions[0].value", "24/01/2011");
responseParams.addTextAnswer("questionGroups[0].sectionDetails[1].questions[1].value", "10");
responseParams.addTextAnswer("questionGroups[0].sectionDetails[2].questions[0].value", "24/01/2011");
responseParams.addSingleSelectAnswer("questionGroups[0].sectionDetails[2].questions[1].valuesAsArray", "jan");
responseParams.addTextAnswer("questionGroups[0].sectionDetails[2].questions[2].value", answer);
return responseParams;
}
private CreateQuestionParameters newFreeTextQuestionParameters(String text) {
CreateQuestionParameters questionParams = new CreateQuestionParameters();
questionParams.setText(text);
questionParams.setType(CreateQuestionParameters.TYPE_FREE_TEXT);
return questionParams;
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void createClientWithCorrectAgeTest() throws Exception {
propertiesHelper.setMinimumAgeForClients(18);
propertiesHelper.setMaximumAgeForClients(60);
CreateClientEnterPersonalDataPage clientPersonalDataPage = clientTestHelper.createClient("MyOfficeDHMFT", "11",
"12", "1987");
CreateClientEnterMfiDataPage nextPage = clientPersonalDataPage.submitAndGotoCreateClientEnterMfiDataPage();
nextPage.verifyPage("CreateClientMfiInfo");
propertiesHelper.setMinimumAgeForClients(0);
propertiesHelper.setMaximumAgeForClients(0);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void createClientWithMoreThanMaximumAgeTest() throws Exception {
propertiesHelper.setMinimumAgeForClients(18);
propertiesHelper.setMaximumAgeForClients(60);
CreateClientEnterPersonalDataPage clientPersonalDataPage = clientTestHelper.createClient("MyOfficeDHMFT", "11",
"12", "1940");
CreateClientEnterPersonalDataPage nextPage = clientPersonalDataPage.dontLoadNext();
nextPage.verifyPage("CreateClientPersonalInfo");
propertiesHelper.setMinimumAgeForClients(0);
propertiesHelper.setMaximumAgeForClients(0);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void createClientWithLessThanMinimumAgeTest() throws Exception {
propertiesHelper.setMinimumAgeForClients(18);
propertiesHelper.setMaximumAgeForClients(60);
CreateClientEnterPersonalDataPage clientPersonalDataPage = clientTestHelper.createClient("MyOfficeDHMFT", "11",
"12", "1995");
CreateClientEnterPersonalDataPage nextPage = clientPersonalDataPage.dontLoadNext();
nextPage.verifyPage("CreateClientPersonalInfo");
propertiesHelper.setMinimumAgeForClients(0);
propertiesHelper.setMaximumAgeForClients(0);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void searchForClientAndAddSurveysTest() throws Exception {
createQuestionGroup();
navigateToClientDetailsPage();
testAttachQuestionGroup(response);
verifyQuestionGroupInstanceListing(1);
verifyQuestionGroupResponse(response);
testEditQuestionGroup(response + 1);
verifyQuestionGroupInstanceListing(2);
verifyQuestionGroupResponse(response + 1);
testShouldEditInactiveQuestion(response + 2);
verifyQuestionGroupInstanceListing(3);
verifyQuestionGroupResponse(response + 2);
testSectionShouldNotAppearInQuestionnaireWhenAllQuestionsAreInactive();
}
private void createQuestionGroup() {
Random random = new Random();
questionGroupTitle = "QG1" + random.nextInt(100);
question1 = "FT_" + random.nextInt(100);
question2 = "MS_" + random.nextInt(100);
response = "Hello World";
AdminPage adminPage = navigationHelper.navigateToAdminPage();
CreateQuestionPage createQuestionPage = adminPage.navigateToCreateQuestionPage();
createQuestionPage.addQuestion(getCreateQuestionParams(question1, "Free Text", null));
createQuestionPage.addQuestion(getCreateQuestionParams(question2, MULTI_SELECT,
asList("Choice1", "Choice2", "Choice3", "Choice4")));
adminPage = createQuestionPage.submitQuestions();
CreateQuestionGroupPage createQuestionGroupPage = adminPage.navigateToCreateQuestionGroupPage();
CreateQuestionGroupParameters parameters;
parameters = questionGroupTestHelper.getCreateQuestionGroupParameters(questionGroupTitle, asList(question1),
"View Client", "Section1");
for (String section : parameters.getExistingQuestions().keySet()) {
createQuestionGroupPage.addExistingQuestion(section, parameters.getExistingQuestions().get(section));
}
createQuestionGroupPage.markEveryOtherQuestionsMandatory(asList(question1));
parameters = questionGroupTestHelper.getCreateQuestionGroupParameters(questionGroupTitle, asList(question2),
"View Client", "Section2");
for (String section : parameters.getExistingQuestions().keySet()) {
createQuestionGroupPage.addExistingQuestion(section, parameters.getExistingQuestions().get(section));
}
createQuestionGroupPage.submit(parameters);
}
private void testSectionShouldNotAppearInQuestionnaireWhenAllQuestionsAreInactive() {
testActivateQuestion(question1);
testDeactivateQuestion(question2);
navigateToClientDetailsPage();
viewClientDetailsPage.getQuestionnairePage(questionGroupTitle);
Assert.assertFalse("Section2 should not be present on questionnaire when all questions are inactive",
selenium.isTextPresent("Section2"));
}
private void testShouldEditInactiveQuestion(String response) {
testDeactivateQuestion(question1);
navigateToClientDetailsPage();
testEditQuestionGroup(response);
}
private void testDeactivateQuestion(String question) {
AdminPage adminPage = navigationHelper.navigateToAdminPage();
ViewAllQuestionsPage viewAllQuestionsPage = adminPage.navigateToViewAllQuestions();
QuestionDetailPage questionDetailPage = viewAllQuestionsPage.navigateToQuestionDetail(question);
EditQuestionPage editQuestionPage = questionDetailPage.navigateToEditQuestionPage();
questionDetailPage = editQuestionPage.deactivate();
}
private void testActivateQuestion(String question) {
AdminPage adminPage = navigationHelper.navigateToAdminPage();
ViewAllQuestionsPage viewAllQuestionsPage = adminPage.navigateToViewAllQuestions();
QuestionDetailPage questionDetailPage = viewAllQuestionsPage.navigateToQuestionDetail(question);
EditQuestionPage editQuestionPage = questionDetailPage.navigateToEditQuestionPage();
questionDetailPage = editQuestionPage.activate();
}
private void testEditQuestionGroup(String answer) {
int instanceId = latestInstanceId(questionGroupInstancesOfClient);
QuestionGroupResponsePage questionGroupResponsePage = viewClientDetailsPage
.navigateToQuestionGroupResponsePage(instanceId);
QuestionnairePage questionnairePage = questionGroupResponsePage.navigateToEditResponses();
verifyCancel(questionnairePage);
questionGroupResponsePage = viewClientDetailsPage.navigateToQuestionGroupResponsePage(instanceId);
questionnairePage = questionGroupResponsePage.navigateToEditResponses();
questionnairePage.setResponse(question1, answer);
MifosPage mifosPage = questionnairePage.submit();
Assert.assertTrue(mifosPage instanceof ClientViewDetailsPage);
ClientViewDetailsPage clientViewDetailsPage = (ClientViewDetailsPage) mifosPage;
viewClientDetailsPage = clientViewDetailsPage;
}
private void verifyQuestionGroupResponse(String response) {
QuestionGroupResponsePage questionGroupResponsePage = viewClientDetailsPage
.navigateToQuestionGroupResponsePage(latestInstanceId(questionGroupInstancesOfClient));
questionGroupResponsePage.verifyPage();
String msg = response + " not found for question " + question1 + ". Instead found "
+ questionGroupResponsePage.getAnswerHtml(question1);
Assert.assertTrue(msg, questionGroupResponsePage.getAnswerHtml(question1).contains(response));
Assert.assertTrue(questionGroupResponsePage.getAnswerHtml(question2).contains("Choice1"));
Assert.assertTrue(questionGroupResponsePage.getAnswerHtml(question2).contains("Choice3"));
Assert.assertTrue(questionGroupResponsePage.getAnswerHtml(question2).contains("Choice4"));
viewClientDetailsPage = questionGroupResponsePage.navigateToViewClientDetailsPage();
}
private void verifyQuestionGroupInstanceListing(int expectedSize) {
questionGroupInstancesOfClient = viewClientDetailsPage.getQuestionGroupInstances();
QuestionGroup latestInstance = getLatestQuestionGroupInstance();
Assert.assertEquals(expectedSize, questionGroupInstancesOfClient.size());
Calendar calendar = Calendar.getInstance();
String expectedDate = String.format(EXPECTED_DATE_FORMAT, calendar.get(Calendar.DATE),
calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.YEAR));
Assert.assertEquals(questionGroupTitle, latestInstance.getName());
Assert.assertEquals(expectedDate, latestInstance.getDate());
}
private QuestionGroup getLatestQuestionGroupInstance() {
return questionGroupInstancesOfClient.get(latestInstanceId(questionGroupInstancesOfClient));
}
private void testAttachQuestionGroup(String response) {
QuestionnairePage questionnairePage = viewClientDetailsPage.getQuestionnairePage(questionGroupTitle);
verifyCancel(questionnairePage);
questionnairePage = checkMandatoryQuestionValidation(questionGroupTitle, question1, question2,
viewClientDetailsPage);
questionnairePage.setResponse(question1, response);
MifosPage mifosPage = questionnairePage.submit();
Assert.assertTrue(mifosPage instanceof ClientViewDetailsPage);
ClientViewDetailsPage clientViewDetailsPage = (ClientViewDetailsPage) mifosPage;
viewClientDetailsPage = clientViewDetailsPage;
}
private void navigateToClientDetailsPage() {
ClientsAndAccountsHomepage clientsPage = navigationHelper.navigateToClientsAndAccountsPage();
ClientSearchResultsPage searchResultsPage = clientsPage.searchForClient("client1 lastname");
searchResultsPage.verifyPage();
viewClientDetailsPage = searchResultsPage.navigateToSearchResult("client1 lastname: ID 0002-000000005");
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-681
@Test(enabled=true)
public void createClientWithQuestionGroups() throws Exception {
createQuestions();
CreateQuestionGroupParameters qg = questionGroupTestHelper.getCreateQuestionGroupParameters("CreateClientQG",
asList("q1", "q2", "q3"), "Create Client", "Sec 1");
questionGroupTestHelper.createQuestionGroup(qg);
CreateQuestionGroupParameters qg2 = questionGroupTestHelper.getCreateQuestionGroupParameters("CreateClientQG2",
asList("q6"), "Create Client", "Sec 2");
questionGroupTestHelper.createQuestionGroup(qg2);
CreateClientEnterPersonalDataPage.SubmitFormParameters formParameters = createFormParameters();
QuestionResponseParameters responseParams = new QuestionResponseParameters();
responseParams.addSingleSelectAnswer("questionGroups[0].sectionDetails[0].questions[0].value", "yes");
responseParams.addSingleSelectAnswer("questionGroups[0].sectionDetails[0].questions[1].value", "good");
responseParams.addTextAnswer("questionGroups[0].sectionDetails[0].questions[2].value", "qwer");
// When
clientTestHelper.createClientWithQuestionGroups(formParameters, "group1", responseParams);
List<String> questionToAdd = new ArrayList<String>();
questionToAdd.add("q4");
questionToAdd.add("q5");
List<String> questionToDeactivate = new ArrayList<String>();
questionToDeactivate.add("q6");
CreateQuestionGroupParameters createQuestionGroupParameters = new CreateQuestionGroupParameters();
for (String question : questionToAdd) {
createQuestionGroupParameters.addExistingQuestion("Sec 1", question);
}
questionGroupTestHelper.addQuestionsToQuestionGroup("CreateClientQG",
createQuestionGroupParameters.getExistingQuestions());
for (String question : questionToDeactivate) {
questionGroupTestHelper.markQuestionAsInactive(question);
}
questionGroupTestHelper.markQuestionGroupAsInactive("CreateClientQG2");
QuestionResponsePage questionResponsePage = clientTestHelper.navigateToQuestionResponsePage(formParameters,
"group1");
// Then
questionResponsePage.verifyQuestionsDoesnotappear(questionToDeactivate.toArray(new String[questionToDeactivate
.size()]));
questionResponsePage.verifyQuestionsExists(questionToAdd.toArray(new String[questionToAdd.size()]));
questionResponsePage.verifySectionDoesnotappear("Sec 2");
questionGroupTestHelper.markQuestionGroupAsInactive("CreateClientQG");
}
private CreateClientEnterPersonalDataPage.SubmitFormParameters createFormParameters() {
CreateClientEnterPersonalDataPage.SubmitFormParameters formParameters = new CreateClientEnterPersonalDataPage.SubmitFormParameters();
formParameters.setSalutation(CreateClientEnterPersonalDataPage.SubmitFormParameters.MRS);
formParameters.setFirstName("test");
formParameters.setLastName("Customer" + StringUtil.getRandomString(8));
formParameters.setDateOfBirthDD("01");
formParameters.setDateOfBirthMM("02");
formParameters.setDateOfBirthYYYY("1988");
formParameters.setGender(CreateClientEnterPersonalDataPage.SubmitFormParameters.FEMALE);
formParameters.setPovertyStatus(CreateClientEnterPersonalDataPage.SubmitFormParameters.POOR);
formParameters.setHandicapped("Yes");
formParameters.setSpouseNameType(CreateClientEnterPersonalDataPage.SubmitFormParameters.FATHER);
formParameters.setSpouseFirstName("father");
formParameters.setSpouseLastName("lastname" + StringUtil.getRandomString(8));
return formParameters;
}
private void createQuestions() {
List<CreateQuestionParameters> questions = new ArrayList<CreateQuestionParameters>();
CreateQuestionParameters q1 = new CreateQuestionParameters();
q1.setType(CreateQuestionParameters.TYPE_SINGLE_SELECT);
q1.setText("q1");
q1.setChoicesFromStrings(Arrays.asList(new String[]{"yes", "no"}));
questions.add(q1);
CreateQuestionParameters q2 = new CreateQuestionParameters();
q2.setType(CreateQuestionParameters.TYPE_SINGLE_SELECT);
q2.setText("q2");
q2.setChoicesFromStrings(Arrays.asList(new String[]{"good", "bad", "average"}));
questions.add(q2);
CreateQuestionParameters q3 = new CreateQuestionParameters();
q3.setType(CreateQuestionParameters.TYPE_FREE_TEXT);
q3.setText("q3");
questions.add(q3);
CreateQuestionParameters q4 = new CreateQuestionParameters();
q4.setType(CreateQuestionParameters.TYPE_DATE);
q4.setText("q4");
questions.add(q4);
CreateQuestionParameters q5 = new CreateQuestionParameters();
q5.setType(CreateQuestionParameters.TYPE_FREE_TEXT);
q5.setText("q5");
questions.add(q5);
CreateQuestionParameters q6 = new CreateQuestionParameters();
q6.setType(CreateQuestionParameters.TYPE_NUMBER);
q6.setText("q6");
q6.setNumericMax(10);
q6.setNumericMin(0);
questions.add(q6);
questionGroupTestHelper.createQuestions(questions);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-35
@Test(enabled=false) //TODO http://mifosforge.jira.com/browse/MIFOS-5081
public void addingMemeberToGroupWithDiffrentStatuses() throws Exception {
String clientName;
CreateGroupSubmitParameters groupParams = new CreateGroupSubmitParameters();
groupParams.setGroupName("testGroup" + StringUtil.getRandomString(5));
EditCustomerStatusParameters editCustomerStatusParameters = new EditCustomerStatusParameters();
editCustomerStatusParameters.setNote("change status");
// When
ClientViewDetailsPage clientDetailsPage = clientTestHelper.createClientAndVerify("loan officer",
"MyOfficeDHMFT");
clientName = clientDetailsPage.getHeading();
clientTestHelper.changeCustomerStatus(clientDetailsPage, ClientStatus.ACTIVE);
groupTestHelper.createNewGroupPartialApplication("Default Center", groupParams);
// Then
clientTestHelper.addClientToGroupWithErrorGroupLowerStatus(clientName, groupParams.getGroupName());
// When
editCustomerStatusParameters.setGroupStatus(GroupStatus.PENDING_APPROVAL);
groupTestHelper.changeGroupStatus(groupParams.getGroupName(), editCustomerStatusParameters);
// Then
clientTestHelper.addClientToGroupWithErrorGroupLowerStatus(clientName, groupParams.getGroupName());
// When
editCustomerStatusParameters.setGroupStatus(GroupStatus.ACTIVE);
groupTestHelper.changeGroupStatus(groupParams.getGroupName(), editCustomerStatusParameters);
// Then
clientTestHelper.addClientToGroup(clientName, groupParams.getGroupName());
// When
clientTestHelper.deleteClientGroupMembership(clientName, "remove group membership");
editCustomerStatusParameters.setGroupStatus(GroupStatus.ON_HOLD);
groupTestHelper.changeGroupStatus(groupParams.getGroupName(), editCustomerStatusParameters);
// Then
clientTestHelper.tryAddClientToClosedOrOnHoldGroup(clientName, groupParams.getGroupName());
// When
editCustomerStatusParameters.setGroupStatus(GroupStatus.CLOSED);
editCustomerStatusParameters.setCloseReason(GroupCloseReason.DUPLICATE);
groupTestHelper.changeGroupStatus(groupParams.getGroupName(), editCustomerStatusParameters);
// Then
clientTestHelper.tryAddClientToClosedOrOnHoldGroup(clientName, groupParams.getGroupName());
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-40
@Test(enabled=false) //TODO http://mifosforge.jira.com/browse/MIFOS-5081
public void addingMemeberOnHoldStatusToGroupWithDiffrentStatuses() throws Exception {
String groupName = "testGroup";
String clientName = "test";
CreateGroupSubmitParameters groupParams = new CreateGroupSubmitParameters();
groupParams.setGroupName(groupName);
EditCustomerStatusParameters editCustomerStatusParameters = new EditCustomerStatusParameters();
editCustomerStatusParameters.setNote("change status");
// When
ClientViewDetailsPage clientDetailsPage = clientTestHelper.createClientAndVerify("loan officer",
"MyOfficeDHMFT");
clientTestHelper.changeCustomerStatus(clientDetailsPage, ClientStatus.ACTIVE);
clientTestHelper.changeCustomerStatus(clientDetailsPage, ClientStatus.ON_HOLD);
groupTestHelper.createNewGroupPartialApplication("Default Center", groupParams);
// Then
clientTestHelper.addClientToGroupWithErrorGroupLowerStatus(clientName, groupName);
// When
editCustomerStatusParameters.setGroupStatus(GroupStatus.PENDING_APPROVAL);
groupTestHelper.changeGroupStatus(groupName, editCustomerStatusParameters);
// Then
clientTestHelper.addClientToGroupWithErrorGroupLowerStatus(clientName, groupName);
// When
editCustomerStatusParameters.setGroupStatus(GroupStatus.ACTIVE);
groupTestHelper.changeGroupStatus(groupName, editCustomerStatusParameters);
// Then
clientTestHelper.addClientToGroup(clientName, groupName);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-51
@Test(enabled=true)
public void tryRemoveClientWithLoanFromGroup() throws Exception {
String clientName = "ClientWithLoan 20110221";
// When / Then
clientTestHelper.deleteClientGroupMembershipWithError(clientName);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-50
@Test(enabled=true)
public void tryRemoveClientWithLoanFromGroupWithLoan() throws Exception {
String clientName = "client1 lastname";
// When / Then
clientTestHelper.deleteClientGroupMembershipWithError(clientName);
}
/**
* Verify that sequence of client names in the properties file is used for displaying the order of client names in
* the UI http://mifosforge.jira.com/browse/MIFOSTEST-205
*
* @throws Exception
*/
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void verifySequenceOfClientNamesInPropertiesFile() throws Exception {
String groupName = "group";
CreateClientEnterPersonalDataPage.SubmitFormParameters clientParams = new CreateClientEnterPersonalDataPage.SubmitFormParameters();
clientParams.setSalutation(CreateClientEnterPersonalDataPage.SubmitFormParameters.MRS);
clientParams.setFirstName("firstName");
clientParams.setMiddleName("middleName");
clientParams.setLastName("lastName");
clientParams.setSecondLastName("secondLastName");
clientParams.setDateOfBirthDD("22");
clientParams.setDateOfBirthMM("05");
clientParams.setDateOfBirthYYYY("1987");
clientParams.setGender(CreateClientEnterPersonalDataPage.SubmitFormParameters.FEMALE);
clientParams.setPovertyStatus(CreateClientEnterPersonalDataPage.SubmitFormParameters.POOR);
clientParams.setSpouseNameType(CreateClientEnterPersonalDataPage.SubmitFormParameters.FATHER);
clientParams.setSpouseFirstName("fatherName");
clientParams.setSpouseLastName("fatherLastName");
ClientViewDetailsPage clientViewDetailsPage = clientTestHelper.createNewClient(groupName, clientParams);
clientViewDetailsPage.verifyHeading("firstName middleName lastName secondLastName");
propertiesHelper.setClientsNameSequence("last_name,second_last_name,middle_name,first_name");
clientParams.setFirstName("firstName2");
clientViewDetailsPage = clientTestHelper.createNewClient(groupName, clientParams);
clientViewDetailsPage.verifyHeading("lastName secondLastName middleName firstName2");
propertiesHelper.setClientsNameSequence("first_name,middle_name,last_name,second_last_name");
clientParams.setFirstName("firstName3");
clientViewDetailsPage = clientTestHelper.createNewClient(groupName, clientParams);
clientViewDetailsPage.verifyHeading("firstName3 middleName lastName secondLastName");
}
/**
* Verify when Pending Approval (Clients) is set to false; the system transitions the account to 'Active state' when
* creating new clients http://mifosforge.jira.com/browse/MIFOSTEST-209
*
* @throws Exception
*/
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void verifyClientCreatedWithActiveStatus() throws Exception {
applicationDatabaseOperation.updateCustomerState("2", "0");
propertiesHelper.setClientPendingApprovalStateEnabled("false");
String officeName = "MyOfficeDHMFT";
String loanOfficer = "loan officer";
ClientViewDetailsPage clientViewDetailsPage = clientTestHelper.createClientAndVerify(loanOfficer, officeName);
clientViewDetailsPage.verifyStatus("Active");
// restore original settings
applicationDatabaseOperation.updateCustomerState("2", "1");
propertiesHelper.setClientPendingApprovalStateEnabled("true");
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-48
//https://mifosforge.jira.com/browse/MIFOS-5843
@Test(enabled=true)
public void removeClientWithLoanFromGroup() throws Exception {
// Given
String clientName = clientTestHelper.createClientAndVerify("loan officer", "MyOfficeDHMFT").getHeading();
clientTestHelper.activateClient(clientName);
// Then
clientTestHelper.addClientToGroup(clientName, "groupWithoutLoan");
CreateLoanAccountSearchParameters searchParams = new CreateLoanAccountSearchParameters();
searchParams.setSearchString(clientName);
searchParams.setLoanProduct("WeeklyFlatLoanWithOneTimeFees");
CreateLoanAccountSubmitParameters submitLoanAccountParameters = new CreateLoanAccountSubmitParameters();
submitLoanAccountParameters.setDd("22");
submitLoanAccountParameters.setMm("01");
submitLoanAccountParameters.setYy("2010");
String loanAccounntID = loanTestHelper.createLoanAccount(searchParams, submitLoanAccountParameters ).getAccountId();
loanTestHelper.activateLoanAccount(loanAccounntID);
String groupName = navigationHelper.navigateToClientViewDetailsPage(clientName).getGroupMembership();
SavingsProductParameters params = savingsProductHelper.
getGenericSavingsProductParameters(new DateTime(2009, 7, 13, 12, 0, 0, 0),
SavingsProductParameters.MANDATORY,SavingsProductParameters.GROUPS);
savingsProductHelper.createSavingsProduct(params);
CreateSavingsAccountSearchParameters searchParameters = new CreateSavingsAccountSearchParameters();
searchParameters.setSearchString(groupName);
searchParameters.setSavingsProduct(params.getProductInstanceName());
CreateSavingsAccountSubmitParameters submitAccountParameters = new CreateSavingsAccountSubmitParameters();
submitAccountParameters.setAmount("250.0");
String savingsId = savingsAccountHelper.createSavingsAccount(searchParameters, submitAccountParameters).getAccountId();
EditAccountStatusParameters editAccountStatusParameters = new EditAccountStatusParameters();
editAccountStatusParameters.setAccountStatus(AccountStatus.SAVINGS_ACTIVE);
editAccountStatusParameters.setNote("change status to active");
savingsAccountHelper.changeStatus(savingsId, editAccountStatusParameters);
// When / Then
clientTestHelper.deleteClientGroupMembership(clientName, "remove group membership");
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-52
// https://mifosforge.jira.com/browse/MIFOS-5844
@Test(enabled=true)
public void removeClientWithSavingsFromGroupWithSavingsCheckGroupCalculation() throws Exception {
//Given
SavingsProductParameters savingsProductParameters = savingsProductHelper.
getGenericSavingsProductParameters(new DateTime(2009, 7, 13, 12, 0, 0, 0),
SavingsProductParameters.MANDATORY,SavingsProductParameters.GROUPS);
savingsProductParameters.setProductInstanceName("MandatoryGroupSavingProduct");
savingsProductParameters.setShortName("M-45");
savingsProductParameters.setAmountAppliesTo(SavingsProductParameters.PER_INDIVIDUAL);
savingsProductHelper.createSavingsProduct(savingsProductParameters);
String clientName = clientTestHelper.createClientAndVerify("loan officer", "MyOfficeDHMFT").getHeading();
clientTestHelper.activateClient(clientName);
clientTestHelper.addClientToGroup(clientName, "groupWithoutLoan");
String groupName = navigationHelper.navigateToClientViewDetailsPage(clientName).getGroupMembership();
CreateSavingsAccountSearchParameters searchParameters = new CreateSavingsAccountSearchParameters();
CreateSavingsAccountSubmitParameters submitAccountParameters = new CreateSavingsAccountSubmitParameters();
submitAccountParameters.setAmount("240.0");
EditAccountStatusParameters editAccountStatusParameters = new EditAccountStatusParameters();
editAccountStatusParameters.setAccountStatus(AccountStatus.SAVINGS_ACTIVE);
editAccountStatusParameters.setNote("change status to active");
// When
searchParameters.setSearchString(clientName);
searchParameters.setSavingsProduct("MonthlyClientSavingsAccount");
String savingsId = savingsAccountHelper.createSavingsAccount(searchParameters, submitAccountParameters).getAccountId();
searchParameters.setSearchString(groupName);
searchParameters.setSavingsProduct("MandatoryGroupSavingProduct");
savingsAccountHelper.changeStatus(savingsId, editAccountStatusParameters);
savingsId = savingsAccountHelper.createSavingsAccount(searchParameters, submitAccountParameters)
.getAccountId();
savingsAccountHelper.changeStatus(savingsId, editAccountStatusParameters);
clientTestHelper.deleteClientGroupMembership(clientName, "remove group membership");
Integer numberOfGroupMembers = Integer.parseInt(navigationHelper.navigateToGroupViewDetailsPage(groupName)
.getNumberOfClientsInGroup());
// Then
savingsAccountHelper.verifyTotalAmountDue(savingsId, numberOfGroupMembers,
Float.parseFloat(submitAccountParameters.getAmount()));
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-45
@Test(enabled=false) //blocked by http://mifosforge.jira.com/browse/MIFOS-4272 - ldomzalski
public void addClientWithSavingToGroupWithSavingsCheckGroupCalculation() throws Exception {
String groupName = "group1";
CreateSavingsAccountSearchParameters searchParameters = new CreateSavingsAccountSearchParameters();
CreateSavingsAccountSubmitParameters submitAccountParameters = new CreateSavingsAccountSubmitParameters();
submitAccountParameters.setAmount("240.0");
EditAccountStatusParameters editAccountStatusParameters = new EditAccountStatusParameters();
editAccountStatusParameters.setAccountStatus(AccountStatus.SAVINGS_ACTIVE);
editAccountStatusParameters.setNote("change status to active");
// When
ClientViewDetailsPage clientDetailsPage = clientTestHelper.createClientAndVerify("loan officer",
"MyOfficeDHMFT");
clientTestHelper.changeCustomerStatus(clientDetailsPage, ClientStatus.ACTIVE);
String clientName = clientDetailsPage.getHeading();
searchParameters.setSavingsProduct("MonthlyClientSavingsAccount");
searchParameters.setSearchString(clientName);
String savingsId = savingsAccountHelper.createSavingsAccount(searchParameters, submitAccountParameters).getAccountId();
savingsAccountHelper.changeStatus(savingsId, editAccountStatusParameters);
SavingsProductParameters savingsProductParameters = savingsProductHelper.
getGenericSavingsProductParameters(new DateTime(2009, 7, 13, 12, 0, 0, 0),
SavingsProductParameters.MANDATORY,SavingsProductParameters.GROUPS);
savingsProductParameters.setShortName("M-45");
savingsProductParameters.setAmountAppliesTo(SavingsProductParameters.PER_INDIVIDUAL);
savingsProductHelper.createSavingsProduct(savingsProductParameters);
searchParameters.setSavingsProduct(savingsProductParameters.getProductInstanceName());
searchParameters.setSearchString(groupName);
savingsId = savingsAccountHelper.createSavingsAccount(searchParameters, submitAccountParameters).getAccountId();
savingsAccountHelper.changeStatus(savingsId, editAccountStatusParameters);
clientTestHelper.addClientToGroup(clientName, groupName);
// Then
Integer numberOfGroupMembers = Integer.parseInt(navigationHelper.navigateToGroupViewDetailsPage(groupName)
.getNumberOfClientsInGroup());
savingsAccountHelper.verifyTotalAmountDue(savingsId, numberOfGroupMembers,
Float.parseFloat(submitAccountParameters.getAmount()));
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-43
@Test(enabled=true)
public void addingMemeberPendingApprovalStatusToGroupWithActiveStatus() throws Exception {
String groupName = "group1";
// When
String clientName = clientTestHelper.createClientAndVerify("loan officer", "MyOfficeDHMFT").getHeading();
// Then
clientTestHelper.addClientToGroup(clientName, groupName);
}
private QuestionnairePage checkMandatoryQuestionValidation(String questionGroupTitle, String question1,
String question2, ClientViewDetailsPage viewDetailsPage) {
QuestionnairePage questionnairePage = viewDetailsPage.getQuestionnairePage(questionGroupTitle);
questionnairePage.setResponsesForMultiSelect(question2, 4, "Choice1", "Choice3", "Choice4");
MifosPage mifosPage = questionnairePage.submit();
Assert.assertTrue(mifosPage instanceof QuestionnairePage);
questionnairePage = (QuestionnairePage) mifosPage;
Assert.assertTrue(questionnairePage.isErrorPresent("Please specify " + question1));
return questionnairePage;
}
private ClientViewDetailsPage verifyCancel(QuestionnairePage questionnairePage) {
return questionnairePage.cancel();
}
public Integer latestInstanceId(Map<Integer, QuestionGroup> questionGroups) {
Set<Integer> keys = questionGroups.keySet();
return Collections.max(keys);
}
private CreateQuestionParameters getCreateQuestionParams(String title, String type, List<String> choices) {
CreateQuestionParameters parameters = new CreateQuestionParameters();
parameters.setText(title);
parameters.setType(type);
parameters.setChoicesFromStrings(choices);
return parameters;
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
// http://mifosforge.jira.com/browse/MIFOSTEST-305
@Test(enabled=true)
public void createClientWithSaveForLaterAndChangeStatusTest() throws Exception {
ClientViewDetailsPage clientDetailsPage = clientTestHelper.createClientAndVerify("loan officer",
"MyOfficeDHMFT");
// When
String groupName = "group1";
CreateClientEnterPersonalDataPage.SubmitFormParameters clientParams = new CreateClientEnterPersonalDataPage.SubmitFormParameters();
clientParams = clientParams();
ClientViewDetailsPage clientViewDetailsPage = navigationHelper.navigateToClientsAndAccountsPage()
.navigateToCreateNewClientPage().selectGroup(groupName).create(clientParams)
.submitAndGotoCreateClientEnterMfiDataPage().navigateToPreview().saveForLater()
.navigateToClientViewDetailsPage();
clientViewDetailsPage.verifyStatus(ClientTestHelper.PARTIAL_APPLICATION);
// Then
clientTestHelper.changeCustomerStatus(clientDetailsPage, ClientStatus.PENDING_APPROVAL);
}
private CreateClientEnterPersonalDataPage.SubmitFormParameters clientParams() {
CreateClientEnterPersonalDataPage.SubmitFormParameters clientParams = new CreateClientEnterPersonalDataPage.SubmitFormParameters();
clientParams.setSalutation(CreateClientEnterPersonalDataPage.SubmitFormParameters.MRS);
clientParams.setFirstName("John");
clientParams.setLastName("Doe");
clientParams.setDateOfBirthDD("22");
clientParams.setDateOfBirthMM("05");
clientParams.setDateOfBirthYYYY("1987");
clientParams.setGender(CreateClientEnterPersonalDataPage.SubmitFormParameters.MALE);
clientParams.setPovertyStatus(CreateClientEnterPersonalDataPage.SubmitFormParameters.NOT_POOR);
clientParams.setSpouseNameType(CreateClientEnterPersonalDataPage.SubmitFormParameters.FATHER);
clientParams.setSpouseFirstName("fatherName");
clientParams.setSpouseLastName("fatherLastName");
return clientParams;
}
//http://mifosforge.jira.com/browse/MIFOS-4643
/**
* Creates new client, tests status changes and verifies blacklisted flag.
* @see http://mifosforge.jira.com/browse/MIFOS-4643
*/
@Test(enabled=true)
public void changeClientStatusAndVerifyBlacklistedFlag(){
//Constant values
String STATUS_PENDING_APPROVAL="Application Pending Approval";
int numberOfBlackFlags = 1;
ClientViewDetailsPage clientDetailsPage = clientTestHelper.createClientAndVerify("loan officer","MyOfficeDHMFT");
//verify new client's status
clientDetailsPage.verifyStatus(STATUS_PENDING_APPROVAL);
//change client status to PARTIAL APPLICATION and check
clientDetailsPage = changeClientStatusToPartialAndVerify(clientDetailsPage);
//change client status to CANCELED with reason REJECTED and check
clientDetailsPage=changeClientStatusToCancelWithReason("CancelWithReasonRejected", CancelReason.CLIENT_REJECTED, clientDetailsPage);
clientDetailsPage.verifyCancellationReason(CancelReason.CLIENT_REJECTED.getPurposeText());
//change client status to PARTIAL APPLICATION again and check
clientDetailsPage=changeClientStatusToPartialAndVerify(clientDetailsPage);
//change client status to CANCELED with reason BLACKLISTED and check for text and flag image
clientDetailsPage=changeClientStatusToCancelWithReason("CancelWithReasonBlacklisted",
CancelReason.CLIENT_BLACKLISTED, clientDetailsPage);
clientDetailsPage.verifyCancellationReason(CancelReason.CLIENT_BLACKLISTED.getPurposeText());
clientDetailsPage.verifyElementExistence("viewClientDetails.img.blackFlag");
//next is sequence of status changing and verifying that there is always one and only one blackflag image
CancelReason reasonArray[]={CancelReason.CLIENT_REJECTED, CancelReason.CLIENT_DUPLICATE,
CancelReason.CLIENT_OTHER, CancelReason.CLIENT_WITHDRAW, CancelReason.CLIENT_BLACKLISTED
};
for (CancelReason cancelReason : reasonArray) {
clientDetailsPage = changeBackToPartialApplication(numberOfBlackFlags,
clientDetailsPage);
clientDetailsPage=changeClientStatusToCancelWithReason("CancelWithBlackFlag",
cancelReason,clientDetailsPage);
clientDetailsPage.verifyNumberOfBlackflags(numberOfBlackFlags);
}
}
@Test(enabled=true)
public void removeClientFromBlacklistTest(){
ClientViewDetailsPage clientDetailsPage = clientTestHelper.createClientAndVerify("loan officer","MyOfficeDHMFT");
String clientName = clientDetailsPage.getHeading();
clientTestHelper.activateClient(clientName);
EditCustomerStatusParameters editCustomerStatusParameters = new EditCustomerStatusParameters();
editCustomerStatusParameters.setClientCloseReason(ClientCloseReason.BLACKLISTED);
editCustomerStatusParameters.setClientStatus(ClientStatus.CLOSED);
editCustomerStatusParameters.setNote("Adding Client to blacklist");
clientTestHelper.changeCustomerStatus(clientName, editCustomerStatusParameters);
clientDetailsPage.verifyCancellationReason(ClientCloseReason.BLACKLISTED.getPurposeText());
clientDetailsPage.verifyElementExistence("viewClientDetails.img.blackFlag");
clientTestHelper.activateClient(clientName);
Assert.assertFalse(selenium.isTextPresent("Blacklisted"));
Assert.assertFalse(selenium.isElementPresent("viewClientDetails.img.blackFlag"));
Assert.assertFalse(selenium.isTextPresent("Blacklisted"));
clientDetailsPage.verifyStatus(ClientTestHelper.ACTIVE);
}
private ClientViewDetailsPage changeBackToPartialApplication(
int numberOfBlackFlags,
ClientViewDetailsPage clientDetailsPage){
ClientViewDetailsPage newClientDetailsPage = changeClientStatusToPartialAndVerify(clientDetailsPage);
newClientDetailsPage.verifyNumberOfBlackflags(numberOfBlackFlags);
return clientDetailsPage;
}
private ClientViewDetailsPage changeClientStatusToPartialAndVerify(ClientViewDetailsPage clientDetailsPage) {
String STATUS_PARTIAL_APPLICATION="Partial Application";
//change status
ClientViewDetailsPage newClientDetailsPage=clientTestHelper.changeCustomerStatus(clientDetailsPage,ClientStatus.PARTIAL);
//verify
newClientDetailsPage.verifyStatus(STATUS_PARTIAL_APPLICATION);
return clientDetailsPage;
}
private ClientViewDetailsPage changeClientStatusToCancelWithReason(String note, CancelReason reason, ClientViewDetailsPage clientDetailsPage){
String STATUS_CANCELLED="Cancelled";
//prepare parameters
EditCustomerStatusParameters statusParameters=new EditCustomerStatusParameters();
statusParameters.setClientStatus(ClientStatus.CANCELLED);
statusParameters.setNote(note);
statusParameters.setCancelReason(reason);
//change status
ClientViewDetailsPage newClientDetailsPage=clientTestHelper.changeCustomerStatus(clientDetailsPage.getHeading(), statusParameters);
//verify that status has changed
newClientDetailsPage.verifyStatus(STATUS_CANCELLED);
return clientDetailsPage;
}
/**
* Creates six clients with different loan/savings accounts and tries to add them
* to two groups: one with inactive account and one with active account
* @throws UnsupportedEncodingException
* @see http://mifosforge.jira.com/browse/MIFOS-4272
*/
@Test(enabled=true)
public void addClientsWithAccountsToGroups() throws UnsupportedEncodingException{
//prepare strings (I/A means that client loan/savings account is inactive/active)
String groupInactiveAccountName="4272_groupInactive_"+StringUtil.getRandomString(8);
String groupActiveAccountName="4272_groupActive_"+StringUtil.getRandomString(8);
String clientKeys[]={"NoAccount", "ILoan", "ISaving", "IMultiple", "ALoan", "ASaving", "AMultiple"};
String savingsProductNameForGroups="4272_SPFG"+StringUtil.getRandomString(8);
Map<String,GroupViewDetailsPage> groups=new HashMap<String, GroupViewDetailsPage>();
Map<String,String> clients=new HashMap<String, String>();
//create savings product for groups
prepareNewSavingsProductForGroups(savingsProductNameForGroups);
//prepare groups: create, activate, add accounts
prepareGroupsForAddClientsWithAccountsToGroups(groupInactiveAccountName, groupActiveAccountName, groups, savingsProductNameForGroups);
//prepare clients: create and activate
prepareClientsForAddClientsWithAccountsToGroups(clientKeys, clients);
//case a: add clients with innactive accounts to group with active accounts and group with active account
for(int i=0; i<=3; i++){
String clientName=clients.get(clientKeys[i]);
addClientToGroupAndVerify(groupInactiveAccountName,clientName);
clientTestHelper.deleteClientGroupMembership(clientName, "MIFOS-4272");
addClientToGroupAndVerify(groupActiveAccountName, clientName);
}
//case b: add clients with active account to group with innactive accounts and group with active accounts
for(int i=4; i<clientKeys.length; i++){
String clientName=clients.get(clientKeys[i]);
clientTestHelper.addClientToGroupWithErrorActiveAccountExists(clientName, groupInactiveAccountName);
clientTestHelper.addClientToGroupWithErrorActiveAccountExists(clientName, groupActiveAccountName);
}
}
private void addClientToGroupAndVerify(
String groupName, String clientName) {
clientTestHelper.addClientToGroup(clientName, groupName);
ClientViewDetailsPage cvdp=clientTestHelper.navigateToClientViewDetailsPage(clientName);
cvdp.verifyGroupMembership(groupName);
}
private void prepareNewSavingsProductForGroups(
String savingsProductNameForGroups) {
SavingsProductParameters productParameters=
savingsProductHelper.getGenericSavingsProductParameters(targetTime, SavingsProductParameters.VOLUNTARY, SavingsProductParameters.GROUPS);
productParameters.setProductInstanceName(savingsProductNameForGroups);
productParameters.setShortName(StringUtil.getRandomString(8));
savingsProductHelper.createSavingsProduct(productParameters);
}
private void prepareClientsForAddClientsWithAccountsToGroups(String[] clientKeys,
Map<String, String> clients) throws UnsupportedEncodingException {
DateTime today=new DateTime();
if(today.getDayOfWeek()==7){
today=today.plusDays(1); //skip Sunday
}
String frequency="1";
String meetingPlace="Gniezno";
MeetingParameters.WeekDay weekDay= MeetingParameters.WeekDay.findByInt(today.getDayOfWeek()+1); //+1 because ISO week begins with Monday=1 and Mifos week begin with Sunday=1
String savingsProduct="MonthlyClientSavingsAccount";
String office="MyOfficeDHMFT";
String loanOfficer="loan officer";
String loanProduct="Flat Interest Loan Product With Fee";
for(int i=0; i<clientKeys.length; i++){
ClientViewDetailsPage cvdp=clientTestHelper.createClientWithCustomMFIInformation(
loanOfficer,office,frequency,weekDay,meetingPlace);
cvdp=clientTestHelper.changeCustomerStatus(cvdp, ClientStatus.ACTIVE);
clients.put(clientKeys[i], cvdp.getHeading());
}
addLoanToCustomer(clients.get("ILoan"),false,loanProduct,today);
addLoanToCustomer(clients.get("ALoan"),true,loanProduct,today);
addSavingsToCustomer(clients.get("ISaving"), false, savingsProduct);
addSavingsToCustomer(clients.get("ASaving"), true, savingsProduct);
addLoanToCustomer(clients.get("IMultiple"),false, loanProduct,today);
addSavingsToCustomer(clients.get("IMultiple"), false, savingsProduct);
addLoanToCustomer(clients.get("AMultiple"),false, loanProduct,today);
addSavingsToCustomer(clients.get("AMultiple"), true, savingsProduct);
}
private void prepareGroupsForAddClientsWithAccountsToGroups(String groupInactiveAccountName, String groupActiveAccountName,
Map<String, GroupViewDetailsPage> groups, String savingsProductNameForGroups) {
String center="Default Center";
groups.put(groupInactiveAccountName, null);
groups.put(groupActiveAccountName, null);
CreateGroupSubmitParameters groupParams = new CreateGroupSubmitParameters();
EditCustomerStatusParameters customerStatusParameters=new EditCustomerStatusParameters();
customerStatusParameters.setNote("MIFOS-4272: activate groups");
for (String groupKey : groups.keySet()) {
groupParams.setGroupName(groupKey);
groupTestHelper.createNewGroupPartialApplication(center, groupParams);
customerStatusParameters.setGroupStatus(GroupStatus.PENDING_APPROVAL);
groupTestHelper.changeGroupStatus(groupKey, customerStatusParameters);
customerStatusParameters.setGroupStatus(GroupStatus.ACTIVE);
groups.put(groupKey, groupTestHelper.changeGroupStatus(groupKey, customerStatusParameters));
}
addSavingsToCustomer(groupInactiveAccountName, false, savingsProductNameForGroups);
addSavingsToCustomer(groupActiveAccountName, true, savingsProductNameForGroups);
}
private LoanAccountPage addLoanToCustomer(String searchString, boolean active,String loanProduct,DateTime date) throws UnsupportedEncodingException{
CreateLoanAccountSearchParameters searchParameters= new CreateLoanAccountSearchParameters();
CreateLoanAccountSubmitParameters submitParameters= new CreateLoanAccountSubmitParameters();
submitParameters.setAmount("1000");
submitParameters.setDd(String.valueOf(date.getDayOfMonth()));
submitParameters.setMm(String.valueOf(date.getMonthOfYear()));
submitParameters.setYy(String.valueOf(date.getYear()));
searchParameters.setLoanProduct(loanProduct);
searchParameters.setSearchString(searchString);
LoanAccountPage lap=loanTestHelper.createLoanAccount(searchParameters, submitParameters);
if(active){
loanTestHelper.activateLoanAccount(lap.getAccountId());
loanTestHelper.disburseLoan(date);
}
return lap;
}
private void addSavingsToCustomer(String searchString, boolean active, String savingsProduct){
CreateSavingsAccountSubmitParameters submitParametes=new CreateSavingsAccountSubmitParameters();
submitParametes.setAmount("10");
CreateSavingsAccountSearchParameters searchParameters= new CreateSavingsAccountSearchParameters();
searchParameters.setSavingsProduct(savingsProduct);
searchParameters.setSearchString(searchString);
SavingsAccountDetailPage sadp = savingsAccountHelper.createSavingsAccount(searchParameters, submitParametes);
if(active){
savingsAccountHelper.activateSavingsAccount(sadp.getAccountId());
}
}
@Test(enabled=true)
public void moveClientToGroupWithDifferentMeetingFrequencyTest(){
//Given
String startGroupName = "GroupWeekly";
String destinationGroupName = "MonthlyGroup";
//client
CreateClientEnterPersonalDataPage.SubmitFormParameters clientParams = clientParams();
clientParams.setFirstName("John");
clientParams.setLastName("DoeTest");
ClientViewDetailsPage clientPage = clientTestHelper.createNewClient(startGroupName, clientParams);
//When
clientPage.navigateToEditRemoveGroupMembership()
.searchGroup(destinationGroupName)
.selectGroupToAdd(destinationGroupName)
.submitAddGroup();
//Then
clientPage.verifyGroupMembership(destinationGroupName);
}
@Test(enabled=true)
public void checkPermissionToEditClientInPendingApprovalState() {
String firstName = "Edit";
String lastName = "Permission";
DefineHiddenMandatoryFieldsPage mandatoryFieldsPage = navigationHelper.navigateToAdminPage().navigateToDefineHiddenMandatoryFields();
mandatoryFieldsPage.uncheckMandatoryCitizenShip();
mandatoryFieldsPage.uncheckMandatoryEthnicity();
mandatoryFieldsPage.uncheckMandatoryMaritalStatus();
mandatoryFieldsPage.submit();
CreateClientEnterPersonalDataPage.SubmitFormParameters clientParams = clientParams();
clientParams.setFirstName(firstName);
clientParams.setLastName(lastName);
ClientViewDetailsPage clientPage = clientTestHelper.createNewClient("group1", clientParams);
clientPage.editPersonalInformation().submitAndNavigateToViewDetailsPage(clientParams);
CustomerChangeStatusPage changeStatusPage = clientPage.navigateToCustomerChangeStatusPage();
EditCustomerStatusParameters parameters = new EditCustomerStatusParameters();
parameters.setClientStatus(ClientStatus.PARTIAL);
parameters.setNote("test");
changeStatusPage.setChangeStatusParametersAndSubmit(parameters);
ManageRolePage manageRolePage = navigationHelper.navigateToAdminPage().navigateToViewRolesPage().navigateToManageRolePage("Admin");
manageRolePage.disablePermission("3");
manageRolePage.enablePermission("3_0_0");
manageRolePage.enablePermission("3_0_2");
manageRolePage.enablePermission("3_0_3");
manageRolePage.submitAndGotoViewRolesPage();
HomePage homePage = navigationHelper.navigateToHomePage();
SearchResultsPage searchResultsPage = homePage.search(firstName+" "+lastName);
ClientViewDetailsPage viewDetailsPage = searchResultsPage.navigateToClientViewDetailsPage("link="+firstName+" "+lastName+"*");
Assert.assertTrue(viewDetailsPage.editPersonalInformation().isAccessDeniedDisplayed());
manageRolePage = navigationHelper.navigateToAdminPage().navigateToViewRolesPage().navigateToManageRolePage("Admin");
manageRolePage.enablePermission("3");
manageRolePage.submitAndGotoViewRolesPage();
}
public void verifyCustomerScheduleAfterMovingClientToGroupWithDifferentMeetingFrequency(){
//Given
String startGroupName = "GroupWeekly";
String destinationGroupName = "MonthlyGroup";
String clientName = "DoeTest2";
//define declining balance monthly loan product
DefineNewLoanProductPage.SubmitFormParameters formParameters = FormParametersHelper.getMonthlyLoanProductParameters();
navigationHelper.navigateToAdminPage().
defineLoanProduct(formParameters);
//client
CreateClientEnterPersonalDataPage.SubmitFormParameters clientParams = clientParams();
clientParams.setFirstName("John");
clientParams.setLastName(clientName);
ClientViewDetailsPage clientPage = clientTestHelper.createNewClient(startGroupName, clientParams);
clientTestHelper.changeCustomerStatus(clientPage, ClientStatus.ACTIVE);
//When
CreateLoanAccountSearchParameters loanFormParameters = new CreateLoanAccountSearchParameters();
loanFormParameters.setSearchString(clientName);
loanFormParameters.setLoanProduct("productMonthly*");
clientPage.navigateToEditRemoveGroupMembership()
.searchGroup(destinationGroupName)
.selectGroupToAdd(destinationGroupName)
.submitAddGroup()
.navigateToClientsAndAccountsPageUsingHeaderTab()
.navigateToCreateLoanAccountUsingLeftMenu()
.searchAndNavigateToCreateLoanAccountPage(loanFormParameters);
//Then
//get current month
int currentMonth = targetTime.getMonthOfYear();
//get disbursement month
int disbursementMonth = Integer.parseInt(selenium.getValue(
"id=disbursementDateMM"));
//disbursement date should be set to next month
//check if its a last month
if(currentMonth == 12) {
currentMonth = 1;
}
else {
currentMonth++;
}
Assert.assertEquals(currentMonth, disbursementMonth);
}
}