/*
* 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.admin;
import org.joda.time.DateTime;
import org.junit.Assert;
import org.mifos.test.acceptance.framework.MifosPage;
import org.mifos.test.acceptance.framework.UiTestCaseBase;
import org.mifos.test.acceptance.framework.admin.AdminPage;
import org.mifos.test.acceptance.framework.admin.ManageRolePage;
import org.mifos.test.acceptance.framework.admin.ViewRolesPage;
import org.mifos.test.acceptance.framework.loan.LoanAccountPage;
import org.mifos.test.acceptance.framework.loanproduct.DefineNewLoanProductPage;
import org.mifos.test.acceptance.framework.office.OfficeParameters;
import org.mifos.test.acceptance.framework.testhelpers.LoanTestHelper;
import org.mifos.test.acceptance.framework.testhelpers.NavigationHelper;
import org.mifos.test.acceptance.loanproduct.LoanProductTestHelper;
import org.mifos.test.acceptance.util.ApplicationDatabaseOperation;
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"})
@Test(singleThreaded = true, groups = {"admin", "acceptance", "ui", "db_unit"})
public class RolesAndPermissionTest extends UiTestCaseBase {
private NavigationHelper navigationHelper;
private LoanTestHelper loanTestHelper;
private LoanProductTestHelper loanProductTestHelper;
private DateTime systemDateTime;
@Autowired
private ApplicationDatabaseOperation applicationDatabaseOperation;
private final static String userLoginName = "test_user";
private final static String officeName = "test_office";
private final static String clientName = "test client";
private final static String userName = "test user";
static final int WEEKLY_RECURRENCE_TYPE_ID = 1;
@Override
@SuppressWarnings("PMD.SignatureDeclareThrowsException") // one of the dependent methods throws Exception
@BeforeMethod
public void setUp() throws Exception {
super.setUp();
initRemote.dataLoadAndCacheRefresh(dbUnitUtilities, "acceptance_dbunit.xml", dataSource, selenium);
navigationHelper = new NavigationHelper(selenium);
loanTestHelper = new LoanTestHelper(selenium);
loanProductTestHelper = new LoanProductTestHelper(selenium);
systemDateTime = new DateTime(2010, 10, 11, 10, 0, 0, 0);
TestDataSetup dataSetup = new TestDataSetup(selenium, applicationDatabaseOperation);
loanTestHelper.setApplicationTime(systemDateTime);
dataSetup.createBranch(OfficeParameters.BRANCH_OFFICE, officeName, "Off");
dataSetup.createUser(userLoginName, userName, officeName);
dataSetup.createClient(clientName, officeName, userName);
dataSetup.addDecliningPrincipalBalance();
}
@AfterMethod
public void tearDown() {
(new MifosPage(selenium)).logout();
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=false) //TODO http://mifosforge.jira.com/browse/MIFOS-5081
public void adjustmentOfPostDatedTransactions() throws Exception {
navigationHelper.navigateToAdminPage().navigateToViewRolesPage().navigateToManageRolePage("Admin").disablePermission("5_1_9").
verifyPermissionText("5_1_9", "Can adjust back dated transactions").submitAndGotoViewRolesPage();
DefineNewLoanProductPage.SubmitFormParameters formParameters = loanProductTestHelper.defineLoanProductParameters(5, 1000, 20, DefineNewLoanProductPage.SubmitFormParameters.DECLINING_BALANCE_INTEREST_RECALCULATION, WEEKLY_RECURRENCE_TYPE_ID);
loanProductTestHelper.
navigateToDefineNewLoanPageAndFillMandatoryFields(formParameters).
submitAndGotoNewLoanProductPreviewPage().submit();
loanTestHelper.createLoanAccount(clientName, formParameters.getOfferingName());
loanTestHelper.approveLoan();
loanTestHelper.disburseLoan(systemDateTime.plusDays(1));
loanTestHelper.makePayment(systemDateTime.plusDays(10), "10");
loanTestHelper.setApplicationTime(systemDateTime.plusDays(11)).navigateBack();
new LoanAccountPage(selenium).navigateToApplyAdjustment().verifyAdjustBackdatedPermission().cancelAdjustment();
loanTestHelper.repayLoan(systemDateTime.plusDays(11));
loanTestHelper.setApplicationTime(systemDateTime.plusDays(12)).navigateBack();
new LoanAccountPage(selenium).navigateToApplyAdjustment().verifyAdjustBackdatedPermissionOnRepay().cancelAdjustment();
navigationHelper.navigateToAdminPage().navigateToViewRolesPage().navigateToManageRolePage("Admin").enablePermission("5_1_9").submitAndGotoViewRolesPage();
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled=true)
public void disableSystemInfoPermission() throws Exception {
AdminPage adminPage = navigationHelper.navigateToAdminPage();
changePermission(adminPage, "10_0", false);
//try to reach System Info page, should fail
adminPage = adminPage.failNavigationToSystemInfoPage();
adminPage = navigationHelper.navigateToAdminPage();
// reverting for other tests to pass
changePermission(adminPage, "10_0", true);
}
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Test(enabled = true)
public void editLoanStatusWithMaxRestrictionAndMultipleRolesTest() throws Exception {
AdminPage adminPage = navigationHelper.navigateToAdminPage();
// Set 'Maximum loan amount' for role Admin
setMaximumLoanAmountRestriction(adminPage, "100", true);
LoanAccountPage loanAccountPage = navigationHelper.navigateToLoanAccountPage("000100000000043");
try {
loanAccountPage.changeAccountStatusToAccepted();
} catch (AssertionError ae) {
Assert.assertEquals(
ae.getMessage(),
"Expected page <LoanAccountDetail>, actual page <ChangeStatusPreview>!!! with error message > User does not have permission to approve loans of this value");
}
adminPage = navigationHelper.navigateToAdminPage();
setMaximumLoanAmountRestriction(adminPage, "", false);
}
private void setMaximumLoanAmountRestriction(AdminPage adminPage, String amount,
boolean enablePermissionAndRestriction) {
ViewRolesPage viewRolesPage = adminPage.navigateToViewRolesPage();
Assert.assertEquals("Role 'CanRunBatchJobs' does not exist!", selenium.isTextPresent("CanRunBatchJobs"), true);
ManageRolePage manageRolePage = viewRolesPage.navigateToManageRolePage("Admin");
manageRolePage.verifyPage();
if (enablePermissionAndRestriction) {
selenium.check("css=input#activityRestrictionCheckbox1");
} else {
selenium.uncheck("css=input#activityRestrictionCheckbox1");
}
selenium.type("css=input[name='restrictionValue(1)']", amount);
viewRolesPage = manageRolePage.submitAndGotoViewRolesPage();
viewRolesPage.navigateToAdminPage();
}
private void changePermission(AdminPage adminPage, String permissionValue, boolean enablePermission) {
ViewRolesPage viewRolesPage;
ManageRolePage manageRolePage;
viewRolesPage = adminPage.navigateToViewRolesPage();
manageRolePage = viewRolesPage.navigateToManageRolePage("Admin");
manageRolePage.verifyPage();
if (enablePermission) {
manageRolePage.enablePermission(permissionValue);
} else {
manageRolePage.disablePermission(permissionValue);
}
viewRolesPage = manageRolePage.submitAndGotoViewRolesPage();
viewRolesPage.navigateToAdminPage();
}
}