/*
* 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.customers.personnel.struts.action;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import junit.framework.Assert;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mifos.application.master.business.CustomFieldType;
import org.mifos.application.util.helpers.ActionForwards;
import org.mifos.application.util.helpers.Methods;
import org.mifos.customers.office.business.OfficeBO;
import org.mifos.customers.personnel.business.PersonnelBO;
import org.mifos.customers.personnel.business.service.PersonnelBusinessService;
import org.mifos.customers.personnel.util.helpers.PersonnelConstants;
import org.mifos.customers.personnel.util.helpers.PersonnelLevel;
import org.mifos.dto.domain.CustomFieldDto;
import org.mifos.framework.MifosMockStrutsTestCase;
import org.mifos.framework.TestUtils;
import org.mifos.framework.business.service.ServiceFactory;
import org.mifos.framework.business.util.Address;
import org.mifos.framework.business.util.Name;
import org.mifos.framework.components.batchjobs.MifosBatchJob;
import org.mifos.framework.components.fieldConfiguration.util.helpers.FieldConfig;
import org.mifos.framework.hibernate.helper.StaticHibernateUtil;
import org.mifos.framework.struts.plugin.helper.EntityMasterData;
import org.mifos.framework.util.helpers.BusinessServiceName;
import org.mifos.framework.util.helpers.Constants;
import org.mifos.framework.util.helpers.IntegrationTestObjectMother;
import org.mifos.framework.util.helpers.SessionUtils;
import org.mifos.framework.util.helpers.TestObjectFactory;
import org.mifos.security.rolesandpermission.business.RoleBO;
import org.mifos.security.util.ActivityContext;
import org.mifos.security.util.UserContext;
public class PersonnelSettingsActionStrutsTest extends MifosMockStrutsTestCase {
private String flowKey;
private UserContext userContext;
PersonnelBO personnel;
@Before
public void setUp() throws Exception {
userContext = TestUtils.makeUser();
request.getSession().setAttribute(Constants.USERCONTEXT, userContext);
addRequestParameter("recordLoanOfficerId", "1");
addRequestParameter("recordOfficeId", "1");
ActivityContext ac = new ActivityContext((short) 0, userContext.getBranchId().shortValue(), userContext.getId()
.shortValue());
request.getSession(false).setAttribute("ActivityContext", ac);
flowKey = createFlow(request, PersonnelSettingsAction.class);
EntityMasterData.getInstance().init();
FieldConfig fieldConfig = FieldConfig.getInstance();
fieldConfig.init();
getActionServlet().getServletContext().setAttribute(Constants.FIELD_CONFIGURATION,
fieldConfig.getEntityMandatoryFieldMap());
request.setAttribute(Constants.CURRENTFLOWKEY, flowKey);
addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
addRequestParameter("input", "CreateUser");
PersonnelBusinessService personnelBusinessService = new PersonnelBusinessService();
SessionUtils.setAttribute(PersonnelConstants.OFFICE, personnelBusinessService
.getOffice(TestObjectFactory.HEAD_OFFICE), request);
SessionUtils
.setCollectionAttribute(PersonnelConstants.ROLES_LIST, personnelBusinessService.getRoles(), request);
SessionUtils.setCollectionAttribute(PersonnelConstants.ROLEMASTERLIST, personnelBusinessService.getRoles(),
request);
personnelBusinessService = null;
}
@After
public void tearDown() throws Exception {
userContext = null;
personnel = null;
}
@Test
public void testGet() throws Exception {
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.get.toString());
addRequestParameter("globalPersonnelNum", personnel.getGlobalPersonnelNum());
performNoErrors();
verifyMasterData();
verifyForward(ActionForwards.get_success.toString());
}
@Test
public void testManage() throws Exception {
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.get.toString());
addRequestParameter("globalPersonnelNum", personnel.getGlobalPersonnelNum());
actionPerform();
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.manage.toString());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
performNoErrors();
verifyForward(ActionForwards.manage_success.toString());
}
@Test
public void testFailurePreview() throws Exception {
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.preview.toString());
addRequestParameter("middleName", personnel.getPersonnelDetails().getName().getMiddleName());
addRequestParameter("secondLastName", personnel.getPersonnelDetails().getName().getSecondLastName());
addRequestParameter("maritalStatus", personnel.getPersonnelDetails().getMaritalStatus().toString());
addRequestParameter("emailId", "1");
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
actionPerform();
Assert.assertEquals(1, getErrorSize("firstName"));
Assert.assertEquals(1, getErrorSize("lastName"));
Assert.assertEquals(1, getErrorSize("gender"));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_VALID_EMAIL));
verifyInputForward();
}
@Test
public void testFailurePreviewNoFirstName() throws Exception {
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.preview.toString());
addRequestParameter("middleName", personnel.getPersonnelDetails().getName().getMiddleName());
addRequestParameter("secondLastName", personnel.getPersonnelDetails().getName().getSecondLastName());
addRequestParameter("lastName", personnel.getPersonnelDetails().getName().getLastName());
addRequestParameter("gender", personnel.getPersonnelDetails().getGender().toString());
addRequestParameter("maritalStatus", personnel.getPersonnelDetails().getMaritalStatus().toString());
addRequestParameter("emailId", personnel.getEmailId());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
actionPerform();
Assert.assertEquals(1, getErrorSize("firstName"));
verifyInputForward();
}
@Test
public void testFailurePreviewFirstNameLengthExceedsLimit() throws Exception {
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.preview.toString());
addRequestParameter("firstName", "Testing for firstName length exceeding by 100 characters"
+ "Testing for firstName length exceeding by 100 characters"
+ "Testing for firstName length exceeding by 100 characters"
+ "Testing for firstName length exceeding by 100 characters"
+ "Testing for firstName length exceeding by 100 characters "
+ "Testing for firstName length exceeding by 100 characters "
+ "Testing for firstName length exceeding by 100 characters");
addRequestParameter("middleName", personnel.getPersonnelDetails().getName().getMiddleName());
addRequestParameter("secondLastName", personnel.getPersonnelDetails().getName().getSecondLastName());
addRequestParameter("lastName", personnel.getPersonnelDetails().getName().getLastName());
addRequestParameter("gender", personnel.getPersonnelDetails().getGender().toString());
addRequestParameter("maritalStatus", personnel.getPersonnelDetails().getMaritalStatus().toString());
addRequestParameter("emailId", personnel.getEmailId());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
actionPerform();
Assert.assertEquals(1, getErrorSize("firstName"));
verifyInputForward();
}
@Test
public void testFailurePreviewLastNameLengthExceedsLimit() throws Exception {
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.preview.toString());
addRequestParameter("lastName", "Testing for lastName length exceeding by 100 characters"
+ "Testing for lastName length exceeding by 100 characters"
+ "Testing for lastName length exceeding by 100 characters"
+ "Testing for lastName length exceeding by 100 characters"
+ "Testing for lastName length exceeding by 100 characters "
+ "Testing for lastName length exceeding by 100 characters "
+ "Testing for lastName length exceeding by 100 characters");
addRequestParameter("middleName", personnel.getPersonnelDetails().getName().getMiddleName());
addRequestParameter("secondLastName", personnel.getPersonnelDetails().getName().getSecondLastName());
addRequestParameter("firstName", personnel.getPersonnelDetails().getName().getFirstName());
addRequestParameter("gender", personnel.getPersonnelDetails().getGender().toString());
addRequestParameter("maritalStatus", personnel.getPersonnelDetails().getMaritalStatus().toString());
addRequestParameter("emailId", personnel.getEmailId());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
actionPerform();
Assert.assertEquals(1, getErrorSize("lastName"));
verifyInputForward();
}
@Test
public void testFailurePreviewNoLastName() throws Exception {
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.preview.toString());
addRequestParameter("firstName", personnel.getPersonnelDetails().getName().getFirstName());
addRequestParameter("middleName", personnel.getPersonnelDetails().getName().getMiddleName());
addRequestParameter("secondLastName", personnel.getPersonnelDetails().getName().getSecondLastName());
addRequestParameter("gender", personnel.getPersonnelDetails().getGender().toString());
addRequestParameter("maritalStatus", personnel.getPersonnelDetails().getMaritalStatus().toString());
addRequestParameter("emailId", personnel.getEmailId());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
actionPerform();
Assert.assertEquals(1, getErrorSize("lastName"));
verifyInputForward();
}
@Test
public void testFailurePreviewNoGenderSelected() throws Exception {
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.preview.toString());
addRequestParameter("firstName", personnel.getPersonnelDetails().getName().getFirstName());
addRequestParameter("middleName", personnel.getPersonnelDetails().getName().getMiddleName());
addRequestParameter("secondLastName", personnel.getPersonnelDetails().getName().getSecondLastName());
addRequestParameter("lastName", personnel.getPersonnelDetails().getName().getLastName());
addRequestParameter("maritalStatus", personnel.getPersonnelDetails().getMaritalStatus().toString());
addRequestParameter("emailId", personnel.getEmailId());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
actionPerform();
Assert.assertEquals(1, getErrorSize("gender"));
verifyInputForward();
}
@Test
public void testFailurePreviewDisplayLengthExceedsMaxLimit() throws Exception {
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
userContext.setId(personnel.getPersonnelId());
request.getSession().setAttribute(Constants.USERCONTEXT, userContext);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.get.toString());
addRequestParameter("globalPersonnelNum", personnel.getGlobalPersonnelNum());
StaticHibernateUtil.flushAndClearSession();
actionPerform();
userContext.setId(PersonnelConstants.SYSTEM_USER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.manage.toString());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
actionPerform();
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.preview.toString());
addRequestParameter("firstName",
"Testing for displayName length exceeding by 200 characters.It should be less than 200");
addRequestParameter("middleName", "new middle name");
addRequestParameter("secondLastName", "new second Last name");
addRequestParameter("lastName",
"Testing for displayName length exceeding by 200 characters.It should be less than 200");
addRequestParameter("gender", "2");
addRequestParameter("maritalStatus", "2");
addRequestParameter("emailId", "XYZ@aditi.com");
addRequestParameter("preferredLocale", "1");
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
actionPerform();
Assert.assertEquals(1, getErrorSize("displayName"));
verifyInputForward();
}
@Test
public void testSuccessPreview() throws Exception {
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.preview.toString());
addRequestParameter("firstName", personnel.getPersonnelDetails().getName().getFirstName());
addRequestParameter("middleName", personnel.getPersonnelDetails().getName().getMiddleName());
addRequestParameter("secondLastName", personnel.getPersonnelDetails().getName().getSecondLastName());
addRequestParameter("lastName", personnel.getPersonnelDetails().getName().getLastName());
addRequestParameter("gender", personnel.getPersonnelDetails().getGender().toString());
addRequestParameter("maritalStatus", personnel.getPersonnelDetails().getMaritalStatus().toString());
addRequestParameter("emailId", personnel.getEmailId());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
performNoErrors();
verifyForward(ActionForwards.preview_success.toString());
}
@Test
public void testPrevious() throws Exception {
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.previous.toString());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
performNoErrors();
verifyForward(ActionForwards.previous_success.toString());
}
@Test
public void testSuccessUpdate() throws Exception {
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
userContext.setId(personnel.getPersonnelId());
request.getSession().setAttribute(Constants.USER_CONTEXT_KEY, userContext);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.get.toString());
addRequestParameter("globalPersonnelNum", personnel.getGlobalPersonnelNum());
StaticHibernateUtil.flushAndClearSession();
actionPerform();
userContext.setId(PersonnelConstants.SYSTEM_USER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.manage.toString());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
actionPerform();
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.preview.toString());
addRequestParameter("firstName", "new first name");
addRequestParameter("middleName", "new middle name");
addRequestParameter("secondLastName", "new second Last name");
addRequestParameter("lastName", "new last name");
addRequestParameter("gender", "2");
addRequestParameter("maritalStatus", "2");
addRequestParameter("emailId", "XYZ@aditi.com");
addRequestParameter("preferredLocale", "1");
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
actionPerform();
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.update.toString());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
performNoErrors();
verifyForward(ActionForwards.updateSettings_success.toString());
Assert.assertNull(request.getAttribute(Constants.CURRENTFLOWKEY));
personnel = (PersonnelBO) StaticHibernateUtil.getSessionTL().get(PersonnelBO.class, personnel.getPersonnelId());
Assert.assertEquals("new first name", personnel.getPersonnelDetails().getName().getFirstName());
Assert.assertEquals("new middle name", personnel.getPersonnelDetails().getName().getMiddleName());
Assert.assertEquals("new second Last name", personnel.getPersonnelDetails().getName().getSecondLastName());
Assert.assertEquals("new last name", personnel.getPersonnelDetails().getName().getLastName());
Assert.assertEquals("XYZ@aditi.com", personnel.getEmailId());
Assert.assertEquals(2, personnel.getPersonnelDetails().getGender().intValue());
Assert.assertEquals(1, personnel.getPreferredLocale().intValue());
Assert.assertEquals(2, personnel.getPersonnelDetails().getMaritalStatus().intValue());
}
@Test
public void testLoadChangePassword() throws Exception {
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.loadChangePassword.toString());
performNoErrors();
verifyForward(ActionForwards.loadChangePassword_success.toString());
}
@Test
public void testGet_batchJobNotRunningThatRequiresExclusiveAccess() throws Exception {
MifosBatchJob.batchJobFinished();
Assert.assertEquals(false, MifosBatchJob.isBatchJobRunningThatRequiresExclusiveAccess());
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.get.toString());
addRequestParameter("globalPersonnelNum", personnel.getGlobalPersonnelNum());
performNoErrors();
verifyMasterData();
verifyForward(ActionForwards.get_success.toString());
}
@Test
public void testGet_batchJobRunningThatDoesntRequireExclusiveAccess() throws Exception {
MifosBatchJob.batchJobStarted();
MifosBatchJob.batchJobRequiresExclusiveAccess(false);
Assert.assertEquals(false, MifosBatchJob.isBatchJobRunningThatRequiresExclusiveAccess());
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.get.toString());
addRequestParameter("globalPersonnelNum", personnel.getGlobalPersonnelNum());
performNoErrors();
verifyMasterData();
verifyForward(ActionForwards.get_success.toString());
}
@Test
public void testGet_batchJobRunningThatRequiresExclusiveAccess() throws Exception {
MifosBatchJob.batchJobStarted(); /*should default to requiring exclusive access */
Assert.assertEquals(true, MifosBatchJob.isBatchJobRunningThatRequiresExclusiveAccess());
createPersonnel(getHeadOffice(), PersonnelLevel.LOAN_OFFICER);
setRequestPathInfo("/yourSettings.do");
addRequestParameter("method", Methods.get.toString());
addRequestParameter("globalPersonnelNum", personnel.getGlobalPersonnelNum());
actionPerform();
verifyForward(ActionForwards.load_main_page.toString());
MifosBatchJob.batchJobFinished();
}
private void verifyMasterData() throws Exception {
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.GENDER_LIST, request));
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.MARITAL_STATUS_LIST, request));
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.LANGUAGE_LIST, request));
}
private PersonnelBO createPersonnel(OfficeBO office, PersonnelLevel personnelLevel) throws Exception {
List<CustomFieldDto> customFieldDto = new ArrayList<CustomFieldDto>();
customFieldDto.add(new CustomFieldDto(Short.valueOf("9"), "123456", CustomFieldType.NUMERIC.getValue()));
Address address = new Address("abcd", "abcd", "abcd", "abcd", "abcd", "abcd", "abcd", "abcd");
Date date = new Date();
personnel = new PersonnelBO(personnelLevel, office, Integer.valueOf("1"), Short.valueOf("1"), "ABCD", "XYZ",
"xyz@yahoo.com", getRoles(), customFieldDto, new Name("XYZ", null, null, "ABC"), "111111", date,
Integer.valueOf("1"), Integer.valueOf("1"), date, date, address, userContext.getId(), new Date(), new HashSet());
IntegrationTestObjectMother.createPersonnel(personnel);
return IntegrationTestObjectMother.findPersonnelById(personnel.getPersonnelId());
}
public List<RoleBO> getRoles() throws Exception {
return ((PersonnelBusinessService) ServiceFactory.getInstance().getBusinessService(
BusinessServiceName.Personnel)).getRoles();
}
}