/*
* 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.questionnaire;
import static java.util.Arrays.asList;
import org.joda.time.DateTime;
import org.mifos.test.acceptance.framework.MifosPage;
import org.mifos.test.acceptance.framework.UiTestCaseBase;
import org.mifos.test.acceptance.framework.account.EditAccountStatusParameters;
import org.mifos.test.acceptance.framework.account.AccountStatus;
import org.mifos.test.acceptance.framework.client.CreateClientEnterPersonalDataPage;
import org.mifos.test.acceptance.framework.loan.QuestionResponseParameters;
import org.mifos.test.acceptance.framework.questionnaire.AttachQuestionGroupParameters;
import org.mifos.test.acceptance.framework.questionnaire.CreateQuestionGroupParameters;
import org.mifos.test.acceptance.framework.questionnaire.CreateQuestionParameters;
import org.mifos.test.acceptance.framework.questionnaire.QuestionnairePage;
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.testhelpers.ClientTestHelper;
import org.mifos.test.acceptance.framework.testhelpers.QuestionGroupTestHelper;
import org.mifos.test.acceptance.framework.testhelpers.SavingsAccountHelper;
import org.mifos.test.acceptance.remote.DateTimeUpdaterRemoteTestingService;
import org.mifos.test.acceptance.util.ApplicationDatabaseOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ContextConfiguration(locations = {"classpath:ui-test-context.xml"})
@Test(singleThreaded = true, groups = {"client", "acceptance", "ui", "no_db_unit"})
public class QuestionGroupSavingsAccountTest extends UiTestCaseBase {
@Autowired
private ApplicationDatabaseOperation applicationDatabaseOperation;
private QuestionGroupTestHelper questionGroupTestHelper;
private SavingsAccountHelper savingsAccountHelper;
private ClientTestHelper clientTestHelper;
@Override
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@BeforeMethod(alwaysRun = true)
public void setUp() throws Exception {
super.setUp();
questionGroupTestHelper = new QuestionGroupTestHelper(selenium);
savingsAccountHelper = new SavingsAccountHelper(selenium);
clientTestHelper = new ClientTestHelper(selenium);
}
@AfterMethod
public void logOut() {
(new MifosPage(selenium)).logout();
}
/**
* Attaching a Question Group to a Savings Account and capturing responses
* http://mifosforge.jira.com/browse/MIFOSTEST-659
*
* @throws Exception
*/
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
public void verifyAttachingQuestionGroupToSavingsAccount() throws Exception {
//Given
questionGroupTestHelper.markQuestionGroupAsActive("QGForViewSavings");
try {
AttachQuestionGroupParameters attachParams = new AttachQuestionGroupParameters();
attachParams.setTarget("000100000000059");
attachParams.setQuestionGroupName("QGForViewSavings");
attachParams.addTextResponse("DateQuestion", "09/02/2011");
attachParams.addTextResponse("Number", "10");
attachParams.addTextResponse("NumberBetween5And10", "6");
AttachQuestionGroupParameters attachErrorParams = new AttachQuestionGroupParameters();
attachErrorParams.setTarget("000100000000059");
attachErrorParams.setQuestionGroupName("QGForViewSavings");
attachErrorParams.addTextResponse("Number", "qwerty");
attachErrorParams.addTextResponse("NumberBetween5And10", "qwerty");
attachErrorParams.addError("Please specify DateQuestion");
attachErrorParams.addError("Please specify a number for Number");
attachErrorParams.addError("Please specify a number between 5 and 10 for NumberBetween5And10");
//When
questionGroupTestHelper.verifyErrorsWhileAttachingQuestionGroupToSavingsAccount(attachErrorParams);
questionGroupTestHelper.attachQuestionGroupToSavingsAccount(attachParams);
attachParams.addTextResponse("Number", "15");
attachParams.addTextResponse("NumberBetween5And10", "10");
//Then
questionGroupTestHelper.editQuestionGroupResponsesInSavingsAccount(attachParams);
} finally {
questionGroupTestHelper.markQuestionGroupAsInactive("QGForViewSavings");
}
}
//http://mifosforge.jira.com/browse/MIFOSTEST-669
/*
* need to fix up commonality between questionaire pages for loan and savings.
*/
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=false) //TODO http://mifosforge.jira.com/browse/MIFOS-5081
public void verifyCapturingResponsesDuringSavingsCreation() throws Exception {
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
DateTime targetTime = new DateTime(2011, 2, 28, 15, 0, 0, 0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
setQuestionGroup();
createClient("669");
CreateSavingsAccountSearchParameters searchParameters = new CreateSavingsAccountSearchParameters();
searchParameters.setSearchString("Joe669 Doe669");
searchParameters.setSavingsProduct("MonthlyClientSavingsAccount");
CreateSavingsAccountSubmitParameters submitAccountParameters = new CreateSavingsAccountSubmitParameters();
submitAccountParameters.setAmount("248.0");
QuestionResponseParameters questionResponseParameters = new QuestionResponseParameters();
questionResponseParameters.addTextAnswer("questionGroups[1].sectionDetails[0].questions[0].value", "textquestion");
questionResponseParameters.addTextAnswer("questionGroups[1].sectionDetails[0].questions[1].value", "100");
questionResponseParameters.addTextAnswer("questionGroups[1].sectionDetails[0].questions[2].value", "Text");
questionResponseParameters.addSingleSelectAnswer("questionGroups[1].sectionDetails[0].questions[3].value", "blue");
questionResponseParameters.addSingleSelectAnswer("questionGroups[1].sectionDetails[1].questions[0].values", "two");
questionResponseParameters.addTextAnswer("questionGroups[1].sectionDetails[1].questions[1].value", "6");
questionResponseParameters.addTextAnswer("questionGroups[0].sectionDetails[0].questions[0].value", "04/02/2011");
questionResponseParameters.addSingleSelectAnswer("questionGroups[0].sectionDetails[0].questions[1].values", "one");
questionResponseParameters.addTextAnswer("questionGroups[0].sectionDetails[0].questions[2].value", "123");
questionResponseParameters.addTextAnswer("questionGroups[0].sectionDetails[0].questions[3].value", "7");
questionResponseParameters.addTextAnswer("questionGroups[0].sectionDetails[1].questions[0].value", "Text");
questionResponseParameters.addSingleSelectAnswer("questionGroups[0].sectionDetails[1].questions[1].value", "red");
questionResponseParameters.addTextAnswer("questionGroups[0].sectionDetails[2].questions[0].value", "Text");
QuestionResponseParameters questionResponseParameters2 = new QuestionResponseParameters();
questionResponseParameters2.addTextAnswer("questionGroups[1].sectionDetails[0].questions[0].value", "textQuestion");
questionResponseParameters2.addTextAnswer("questionGroups[0].sectionDetails[0].questions[3].value", "9");
savingsAccountHelper.fillQuestionGroupsDurringCreationSavingsAccount(searchParameters, submitAccountParameters, questionResponseParameters);
SavingsAccountDetailPage savingsAccountDetailPage = savingsAccountHelper.editAdditionalInformationDurringCreationSavingsAccount(questionResponseParameters2);
String savingsId = savingsAccountDetailPage.getAccountId();
questionGroupTestHelper.markQuestionGroupAsInactive("QGForCreateSavingsAccount");
questionGroupTestHelper.markQuestionAsInactive("SingleSelect");
questionGroupTestHelper.markQuestionAsInactive("NumberBetween5And10");
questionGroupTestHelper.markQuestionAsInactive("Question1");
questionGroupTestHelper.markQuestionAsInactive("question 1");
CreateQuestionParameters createQuestionParameters = new CreateQuestionParameters();
createQuestionParameters.setType(CreateQuestionParameters.TYPE_FREE_TEXT);
createQuestionParameters.setText("newQuestion232");
List<CreateQuestionParameters> newQuestionList = new ArrayList<CreateQuestionParameters>();
newQuestionList.add(createQuestionParameters);
questionGroupTestHelper.addNewQuestionsToQuestionGroup("QGForCreateSavingsAccount2", newQuestionList);
Map<String, String> questionsAndAnswers = new HashMap<String, String>();
questionsAndAnswers.put("MultiSelect", "two");
questionsAndAnswers.put("Number", "100");
questionsAndAnswers.put("FreeText", "textquestion");
String[] questionsExist = {"newQuestion232", "MultiSelect", "Number", "FreeText"};
String[] questionsInactive = {"SingleSelect", "NumberBetween5And10", "Question1", "question 1", "Date"};
QuestionnairePage questionnairePage = savingsAccountHelper.navigateToQuestionResponseDuringCreateSavings(searchParameters, submitAccountParameters);
questionnairePage.verifyQuestionsExists(questionsExist);
questionnairePage.verifyQuestionsDoesnotappear(questionsInactive);
verifyQuestionResponsesExistInDatabase(savingsId, "Create Savings", questionsAndAnswers);
questionGroupTestHelper.markQuestionGroupAsInactive("QGForCreateSavingsAccount2");
questionGroupTestHelper.markQuestionAsActive("SingleSelect");
questionGroupTestHelper.markQuestionAsActive("NumberBetween5And10");
questionGroupTestHelper.markQuestionAsActive("Question1");
questionGroupTestHelper.markQuestionAsActive("question 1");
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void verifyCapturingResponsesDuringSavingsClosing() throws Exception {
DateTimeUpdaterRemoteTestingService dateTimeUpdaterRemoteTestingService = new DateTimeUpdaterRemoteTestingService(selenium);
DateTime targetTime = new DateTime(2011, 2, 28, 15, 0, 0, 0);
dateTimeUpdaterRemoteTestingService.setDateTime(targetTime);
questionGroupTestHelper.markQuestionGroupAsActive("QGForCloseSavings");
try {
createClient("670");
CreateSavingsAccountSearchParameters searchParameters = new CreateSavingsAccountSearchParameters();
searchParameters.setSearchString("Joe670 Doe670");
searchParameters.setSavingsProduct("MonthlyClientSavingsAccount");
CreateSavingsAccountSubmitParameters submitAccountParameters = new CreateSavingsAccountSubmitParameters();
submitAccountParameters.setAmount("248.0");
QuestionResponseParameters questionResponseParameters = new QuestionResponseParameters();
questionResponseParameters.addSingleSelectAnswer("questionGroups[0].sectionDetails[0].questions[0].valuesAsArray", "three");
questionResponseParameters.addTextAnswer("questionGroups[0].sectionDetails[0].questions[1].value", "20");
String savingsId = savingsAccountHelper.createSavingsAccount(searchParameters, submitAccountParameters).getAccountId();
EditAccountStatusParameters editAccountStatusParameters = new EditAccountStatusParameters();
editAccountStatusParameters.setAccountStatus(AccountStatus.SAVINGS_ACTIVE);
editAccountStatusParameters.setNote("test");
savingsAccountHelper.changeStatus(savingsId, editAccountStatusParameters);
String[] questionsExist = {"MultiSelect", "Number"};
savingsAccountHelper.fillQuestionGroupsDuringClosingSavingsAccount(savingsId, questionResponseParameters, questionsExist);
Map<String, String> questionsAndAnswers = new HashMap<String, String>();
questionsAndAnswers.put("MultiSelect", "three");
questionsAndAnswers.put("Number", "20");
verifyQuestionResponsesExistInDatabase(savingsId, "Close Savings", questionsAndAnswers);
} finally {
questionGroupTestHelper.markQuestionGroupAsInactive("QGForCloseSavings");
}
}
private void createClient(String postfix) {
String groupName = "group1";
CreateClientEnterPersonalDataPage.SubmitFormParameters clientParams = new CreateClientEnterPersonalDataPage.SubmitFormParameters();
clientParams.setSalutation(CreateClientEnterPersonalDataPage.SubmitFormParameters.MRS);
clientParams.setFirstName("Joe" + postfix);
clientParams.setLastName("Doe" + postfix);
clientParams.setDateOfBirthDD("17");
clientParams.setDateOfBirthMM("11");
clientParams.setDateOfBirthYYYY("1977");
clientParams.setGender(CreateClientEnterPersonalDataPage.SubmitFormParameters.MALE);
clientParams.setPovertyStatus(CreateClientEnterPersonalDataPage.SubmitFormParameters.NOT_POOR);
clientParams.setSpouseNameType(CreateClientEnterPersonalDataPage.SubmitFormParameters.FATHER);
clientParams.setSpouseFirstName("fatherName");
clientParams.setSpouseLastName("fatherLastName");
clientTestHelper.createNewClient(groupName, clientParams);
clientTestHelper.activateClient("Joe" + postfix + " Doe" + postfix);
}
private void verifyQuestionResponsesExistInDatabase(String savingsID, String event, Map<String, String> questions) throws SQLException {
for (String question : questions.keySet()) {
Assert.assertTrue(applicationDatabaseOperation.deosQuestionResponseForSavingsExist(savingsID, event, question, questions.get(question)));
}
}
private void setQuestionGroup() {
String questionGroupName = "QGForCreateSavingsAccount";
questionGroupTestHelper.markQuestionGroupAsActive(questionGroupName);
CreateQuestionGroupParameters createQuestionGroupParameters = questionGroupTestHelper.getCreateQuestionGroupParameters(questionGroupName+"2",
asList("Number", "SingleSelect", "FreeText" , "question 1"), "Create Savings", "Sec 1");
createQuestionGroupParameters.addExistingQuestion("Sec 2", "NumberBetween5And10");
createQuestionGroupParameters.addExistingQuestion("Sec 2", "MultiSelect");
questionGroupTestHelper.createQuestionGroup(createQuestionGroupParameters);
Map<String, List<String>> sectionQuestions = new HashMap<String, List<String>>();
List<String> questions = new ArrayList<String>();
questions.add("Date");
questions.add("MultiSelect");
questions.add("Number");
questions.add("NumberBetween5And10");
sectionQuestions.put("Sec 1", questions);
questions = new ArrayList<String>();
questions.add("SingleSelect");
questions.add("FreeText");
sectionQuestions.put("Sec 2", questions);
questionGroupTestHelper.addQuestionsToQuestionGroup(questionGroupName, sectionQuestions);
}
}