/*
* 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.framework.questionnaire;
import com.thoughtworks.selenium.Selenium;
import org.mifos.test.acceptance.framework.MifosPage;
import org.mifos.test.acceptance.framework.center.CenterViewDetailsPage;
import org.mifos.test.acceptance.framework.client.ClientViewDetailsPage;
import org.mifos.test.acceptance.framework.group.GroupViewDetailsPage;
import org.mifos.test.acceptance.framework.loan.LoanAccountPage;
import org.mifos.test.acceptance.framework.loan.QuestionResponseParameters;
import org.mifos.test.acceptance.framework.user.UserViewDetailsPage;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.mifos.test.acceptance.framework.savings.CreateSavingsAccountPreviewPage;
import org.mifos.test.acceptance.framework.savings.SavingsAccountDetailPage;
import org.testng.Assert;
@SuppressWarnings("PMD")
public class QuestionnairePage extends MifosPage {
private static final String SELECT_QUESTION_JS = "window.$(\"#questionnaire label:contains(\\\"%s\\\")\").attr(\"for\")";
public QuestionnairePage(Selenium selenium) {
super(selenium);
verifyPage("questionnaire");
}
public void verifyPage() {
super.verifyPage("questionnaire");
}
public void verifyField(String locator, String text) {
Assert.assertEquals(selenium.getText(locator), text);
}
public void verifyRadioGroup(String locator, String value, boolean checked){
Assert.assertEquals(selenium.isChecked(locator + " value="+ value),checked);
}
private String getQuestionLocator(String question) {
return selenium.getEval(String.format(SELECT_QUESTION_JS, question));
}
public void setResponse(String question, String answer) {
selenium.type("id=" + getQuestionLocator(question), answer);
}
public QuestionnairePage setResponses(Map<String, String> responses) {
for(String question: responses.keySet()) {
setResponse(question, responses.get(question));
}
return this;
}
public void checkResponse(String question, String answer) {
//selenium.check("name=" + getQuestionLocator(question) + " value=" + answer);
selenium.check("//input[@name='" + getQuestionLocator(question) + "' and @value='" + answer + "']");
}
public QuestionnairePage checkResponses(Map<String, List<String>> responses) {
for(String question: responses.keySet()) {
for(String answer : responses.get(question)) {
checkResponse(question, answer);
}
}
return this;
}
private void clickSubmit() {
selenium.click("id=_eventId_saveQuestionnaire");
waitForPageToLoad();
}
public MifosPage submit() {
clickSubmit();
return selenium.isElementPresent("id=allErrors") ? new QuestionnairePage(selenium) : new ClientViewDetailsPage(selenium);
}
public SavingsAccountDetailPage submitAndNavigateToSavingsAccountDetailPage() {
clickSubmit();
return new SavingsAccountDetailPage(selenium);
}
public MifosPage submitAndNavigateToPersonnalDetailsPage(){
clickSubmit();
return selenium.isElementPresent("id=allErrors") ? new QuestionnairePage(selenium) : new UserViewDetailsPage(selenium);
}
public MifosPage submitAndNavigateToCenterViewDetailsPage() {
clickSubmit();
return selenium.isElementPresent("id=allErrors") ? new QuestionnairePage(selenium) : new CenterViewDetailsPage(selenium);
}
public MifosPage submitAndNavigateToGroupViewDetailsPage() {
clickSubmit();
return selenium.isElementPresent("id=allErrors") ? new QuestionnairePage(selenium) : new GroupViewDetailsPage(selenium);
}
public MifosPage submitAndNavigateToLoanViewDetailsPage() {
clickSubmit();
return selenium.isElementPresent("id=allErrors") ? new QuestionnairePage(selenium) : new LoanAccountPage(selenium);
}
public MifosPage submitAndNavigateToClientViewDetailsPage() {
clickSubmit();
return selenium.isElementPresent("id=allErrors") ? new QuestionnairePage(selenium) : new ClientViewDetailsPage(selenium);
}
public void setResponsesForMultiSelect(String question, int totalChoices, String... choices) {
String questionId = selenium.getEval(String.format(SELECT_QUESTION_JS, question));
String choiceIdFormat = questionId + "s%d";
List<String> choiceList = Arrays.asList(choices);
for (int i=0; i<totalChoices; i++) {
String choiceId = String.format(choiceIdFormat, i);
String choice = selenium.getEval("window.document.getElementById(\"" + choiceId + "\").value");
if (choiceList.contains(choice)) {
selenium.check("id=" + choiceId);
}
}
}
public boolean isErrorPresent(String errorMsg) {
return selenium.isTextPresent(errorMsg);
}
public void verifyErrorsOnPage(String[] errors) {
for(String error : errors) {
Assert.assertTrue(isErrorPresent(error));
}
}
public QuestionnairePage verifyEmptyTextQuestionResponses(Map<String, String> questions) {
for(String question: questions.keySet()) {
Assert.assertEquals(selenium.getValue(getQuestionLocator(question)), "");
}
return this;
}
public QuestionnairePage verifyEmptyCheckQuestionResponses(Map<String, List<String>> questions) {
for(String question: questions.keySet()) {
for(String answer : questions.get(question)) {
Assert.assertFalse(selenium.isChecked("//input[@name='" + getQuestionLocator(question) + "' and @value='" + answer + "']"));
}
}
return this;
}
private void clickCancel() {
selenium.click("id=_eventId_cancel");
waitForPageToLoad();
}
public ClientViewDetailsPage cancel() {
clickCancel();
return new ClientViewDetailsPage(selenium);
}
public CenterViewDetailsPage cancelAndNavigateToCenterViewDetailsPage() {
clickCancel();
return new CenterViewDetailsPage(selenium);
}
public GroupViewDetailsPage cancelAndNavigateToGroupViewDetailsPage() {
clickCancel();
return new GroupViewDetailsPage(selenium);
}
public LoanAccountPage cancelAndNavigateToLoanViewDetailsPage() {
clickCancel();
return new LoanAccountPage(selenium);
}
public SavingsAccountDetailPage cancelAndNavigateToSavingsAccountDetailPage() {
clickCancel();
return new SavingsAccountDetailPage(selenium);
}
public void verifyTextPresent(String expectedText, String errorMessage) {
Assert.assertTrue(selenium.isTextPresent(expectedText), errorMessage);
}
public void populateAnswers(QuestionResponseParameters responseParameters) {
for (Map.Entry<String, String> entry : responseParameters.getTextResponses().entrySet()) {
selenium.type(entry.getKey(), entry.getValue());
}
for (Map.Entry<String, String> entry : responseParameters.getSingleSelectResponses().entrySet()) {
selenium.check("//input[@name='" + entry.getKey() + "' and @value='" + entry.getValue() + "']");
}
}
public CreateSavingsAccountPreviewPage navigateToNextPageSavingsAccountCreation() {
selenium.click("captureQuestionResponses.button.continue");
waitForPageToLoad();
return new CreateSavingsAccountPreviewPage(selenium);
}
public void verifyQuestionsExists(String[] questions) {
for(String question: questions) {
Assert.assertTrue(selenium.isTextPresent(question));
}
}
public void verifyQuestionsDoesnotappear(String[] questions) {
for (String question : questions) {
Assert.assertFalse(selenium.isTextPresent(question));
}
}
}