/*
* 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 java.util.Set;
import junit.framework.Assert;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.mifos.application.admin.servicefacade.InvalidDateException;
import org.mifos.application.master.business.CustomFieldType;
import org.mifos.application.util.helpers.ActionForwards;
import org.mifos.application.util.helpers.EntityType;
import org.mifos.application.util.helpers.Methods;
import org.mifos.config.Localization;
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.struts.actionforms.PersonActionForm;
import org.mifos.customers.personnel.util.helpers.PersonnelConstants;
import org.mifos.customers.personnel.util.helpers.PersonnelLevel;
import org.mifos.customers.util.helpers.CustomerConstants;
import org.mifos.dto.domain.CustomFieldDto;
import org.mifos.dto.screen.PersonnelInformationDto;
import org.mifos.framework.MifosMockStrutsTestCase;
import org.mifos.framework.TestUtils;
import org.mifos.framework.business.util.Address;
import org.mifos.framework.business.util.Name;
import org.mifos.framework.components.audit.business.AuditLog;
import org.mifos.framework.components.audit.business.AuditLogRecord;
import org.mifos.framework.components.audit.persistence.LegacyAuditDao;
import org.mifos.framework.components.audit.util.helpers.AuditConstants;
import org.mifos.framework.components.fieldConfiguration.util.helpers.FieldConfig;
import org.mifos.framework.exceptions.PageExpiredException;
import org.mifos.framework.hibernate.helper.QueryResult;
import org.mifos.framework.hibernate.helper.StaticHibernateUtil;
import org.mifos.framework.struts.plugin.helper.EntityMasterData;
import org.mifos.framework.util.helpers.Constants;
import org.mifos.framework.util.helpers.DateUtils;
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.login.util.helpers.LoginConstants;
import org.mifos.security.util.ActivityContext;
import org.mifos.security.util.UserContext;
import org.springframework.beans.factory.annotation.Autowired;
public class PersonActionStrutsTest extends MifosMockStrutsTestCase {
private String flowKey;
private UserContext userContext;
private OfficeBO createdBranchOffice;
PersonnelBO personnel;
@Autowired
private LegacyAuditDao legacyAuditDao;
@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, PersonAction.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;
createdBranchOffice = null;
}
@Test
public void testChooseOffice() {
addActionAndMethod(Methods.chooseOffice.toString());
actionPerform();
verifyNoActionErrors();
verifyNoActionMessages();
verifyForward(ActionForwards.chooseOffice_success.toString());
}
@Test
public void testLoad() throws Exception {
addActionAndMethod(Methods.load.toString());
addRequestParameter("officeId", "1");
actionPerform();
verifyNoActionErrors();
verifyNoActionMessages();
OfficeBO office = (OfficeBO) SessionUtils.getAttribute(PersonnelConstants.OFFICE, request);
Assert.assertNotNull(office);
Assert.assertEquals(1, office.getOfficeId().intValue());
verifyMasterData();
PersonActionForm personActionForm = (PersonActionForm) request.getSession().getAttribute("personActionForm");
Assert.assertNotNull(personActionForm);
// Assert.assertEquals(1, personActionForm.getCustomFields().size());
verifyForward(ActionForwards.load_success.toString());
PersonActionForm actionForm = (PersonActionForm) request.getSession().getAttribute("personActionForm");
Date currentDate = DateUtils.getCurrentDateWithoutTimeStamp();
Assert.assertEquals(currentDate, DateUtils.getDateAsSentFromBrowser(actionForm.getDateOfJoiningMFI()));
}
@SuppressWarnings("unchecked")
@Test
public void testLoadWithBranchOffice() throws Exception {
addActionAndMethod(Methods.load.toString());
addRequestParameter("officeId", "3");
actionPerform();
verifyNoActionErrors();
verifyNoActionMessages();
OfficeBO office = (OfficeBO) SessionUtils.getAttribute(PersonnelConstants.OFFICE, request);
Assert.assertNotNull(office);
Assert.assertEquals(3, office.getOfficeId().intValue());
verifyMasterData();
PersonActionForm personActionForm = (PersonActionForm) request.getSession().getAttribute("personActionForm");
Assert.assertNotNull(personActionForm);
// Assert.assertEquals(1, personActionForm.getCustomFields().size());
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.PERSONNEL_LEVEL_LIST, request));
Assert.assertEquals(2, ((List) SessionUtils.getAttribute(PersonnelConstants.PERSONNEL_LEVEL_LIST, request))
.size());
verifyForward(ActionForwards.load_success.toString());
}
@Test
public void testPreviewFailure() throws Exception {
addActionAndMethod(Methods.preview.toString());
actionPerform();
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_FIRSTNAME));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_LASTNAME));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_GENDER));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_LEVEL));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_USER_NAME));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.PASSWORD));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_DOB));
verifyInputForward();
}
@Test
@Ignore
public void testPreviewFailureWrongPasswordLength() throws Exception {
addActionAndMethod(Methods.preview.toString());
setRequestData();
addRequestParameter("userPassword", "XXX");
actionPerform();
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_PASSWORD_LENGTH));
verifyInputForward();
}
@Test
public void testPreviewFailureWrongPasswordAndReaptPassword() throws Exception {
addActionAndMethod(Methods.preview.toString());
setRequestData();
addRequestParameter("userPassword", "XXXXXX");
addRequestParameter("passwordRepeat", "XXXXXZ");
actionPerform();
Assert.assertEquals(1, getErrorSize(PersonnelConstants.PASSWORD));
verifyInputForward();
}
@Test
public void testPreviewSucess() throws Exception {
addActionAndMethod(Methods.preview.toString());
addRequestParameter("userPassword", "XXXXXXXX");
addRequestParameter("passwordRepeat", "XXXXXXXX");
setRequestData();
actionPerform();
verifyNoActionErrors();
verifyNoActionMessages();
verifyForward(ActionForwards.preview_success.toString());
}
@Test
public void testPreviousSucess() throws Exception {
addActionAndMethod(Methods.previous.toString());
actionPerform();
verifyNoActionErrors();
verifyNoActionMessages();
verifyForward(ActionForwards.previous_success.toString());
}
@Test
public void testGetSucess() throws Exception {
addActionAndMethod(Methods.get.toString());
addRequestParameter("globalPersonnelNum", "1");
actionPerform();
verifyNoActionErrors();
verifyNoActionMessages();
verifyMasterData();
verifyForward(ActionForwards.get_success.toString());
}
@Test
public void testSearchSucess() throws Exception {
addActionAndMethod(Methods.search.toString());
addRequestParameter("searchString", "Mi");
actionPerform();
verifyNoActionErrors();
verifyNoActionMessages();
QueryResult queryResult = (QueryResult) SessionUtils.getAttribute(Constants.SEARCH_RESULTS, request);
Assert.assertNotNull(queryResult);
Assert.assertEquals(1, queryResult.getSize());
Assert.assertEquals(1, queryResult.get(0, 10).size());
verifyForward(ActionForwards.search_success.toString());
}
@Test
public void testSearchwithNoinput() throws Exception {
cleanRequest();
addActionAndMethod(Methods.search.toString());
addRequestParameter("input", "");
actionPerform();
Assert.assertEquals(1, getErrorSize(PersonnelConstants.NO_SEARCH_STRING));
verifyInputForward();
}
@Test
public void testLoadSearchSucess() throws Exception {
addActionAndMethod(Methods.search.toString());
addRequestParameter("searchString", "Mi");
actionPerform();
verifyNoActionErrors();
verifyNoActionMessages();
verifyForward(ActionForwards.search_success.toString());
}
private void addActionAndMethod(String method) {
setRequestPathInfo("/PersonAction.do");
addRequestParameter("method", method);
}
private void cleanRequest() throws PageExpiredException {
SessionUtils.removeAttribute(PersonnelConstants.OFFICE, request);
SessionUtils.removeAttribute(PersonnelConstants.ROLES_LIST, request);
SessionUtils.removeAttribute(PersonnelConstants.ROLEMASTERLIST, request);
}
@SuppressWarnings("unchecked")
private void verifyMasterData() throws Exception {
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.TITLE_LIST, request));
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.PERSONNEL_LEVEL_LIST, request));
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.GENDER_LIST, request));
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.MARITAL_STATUS_LIST, request));
List languages = (List) SessionUtils.getAttribute(PersonnelConstants.LANGUAGE_LIST, request);
Assert.assertNotNull(languages);
Assert.assertEquals(Localization.getInstance().getLocaleForUI().size(), languages.size());
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.ROLES_LIST, request));
Assert.assertNotNull(SessionUtils.getAttribute(CustomerConstants.CUSTOM_FIELDS_LIST, request));
}
@Test
public void testManage() throws Exception {
request.setAttribute(Constants.CURRENTFLOWKEY, flowKey);
createPersonnelAndSetInSession(getBranchOffice(), PersonnelLevel.LOAN_OFFICER);
addActionAndMethod(Methods.manage.toString());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
StaticHibernateUtil.flushAndClearSession();
actionPerform();
verifyNoActionErrors();
verifyNoActionMessages();
verifyForward(ActionForwards.manage_success.toString());
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.TITLE_LIST, request));
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.PERSONNEL_LEVEL_LIST, request));
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));
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.ROLES_LIST, request));
Assert.assertNotNull(SessionUtils.getAttribute(CustomerConstants.CUSTOM_FIELDS_LIST, request));
}
@Test
public void testPreviewManage() throws Exception {
request.setAttribute(Constants.CURRENTFLOWKEY, flowKey);
createPersonnelAndSetInSession(getBranchOffice(), PersonnelLevel.LOAN_OFFICER);
addActionAndMethod(Methods.manage.toString());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
StaticHibernateUtil.flushAndClearSession();
actionPerform();
verifyNoActionErrors();
verifyNoActionMessages();
verifyForward(ActionForwards.manage_success.toString());
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.TITLE_LIST, request));
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.PERSONNEL_LEVEL_LIST, request));
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));
Assert.assertNotNull(SessionUtils.getAttribute(PersonnelConstants.ROLES_LIST, request));
Assert.assertNotNull(SessionUtils.getAttribute(CustomerConstants.CUSTOM_FIELDS_LIST, request));
addActionAndMethod(Methods.previewManage.toString());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
addRequestParameter("userPassword", "abcdef");
addRequestParameter("passwordRepeat", "abcdef");
addRequestParameter("personnelRoles", "1");
actionPerform();
verifyNoActionErrors();
verifyNoActionMessages();
verifyForward(ActionForwards.previewManage_success.toString());
}
@Test
public void testManagePreviewFailure() throws Exception {
addActionAndMethod(Methods.previewManage.toString());
actionPerform();
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_FIRSTNAME));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_LASTNAME));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_GENDER));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_LEVEL));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_USER_NAME));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.PASSWORD));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.ERROR_DOB));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.OFFICE));
Assert.assertEquals(1, getErrorSize(PersonnelConstants.STATUS));
verifyInputForward();
}
@Test
public void testManagePreviewFailureWrongPasswordLength() throws Exception {
addActionAndMethod(Methods.preview.toString());
setRequestData();
addRequestParameter("userPassword", "XXX");
actionPerform();
Assert.assertEquals(2, getErrorSize("password"));
verifyInputForward();
}
@Test
public void testManagePreviewFailureLoginNameWithSpace() throws Exception {
addActionAndMethod(Methods.preview.toString());
setRequestData();
addRequestParameter("loginName", "XYZ PQR");
actionPerform();
Assert.assertEquals(1, getErrorSize(PersonnelConstants.INVALID_USER_NAME));
verifyInputForward();
}
@Test
public void testManagePreviewFailureWrongPasswordAndReaptPassword() throws Exception {
addActionAndMethod(Methods.preview.toString());
setRequestData();
addRequestParameter("userPassword", "XXXXXX");
addRequestParameter("passwordRepeat", "XXXXXZ");
actionPerform();
Assert.assertEquals(1, getErrorSize("password"));
verifyInputForward();
}
@Test
public void testLoadUnLockUser() throws Exception {
addActionAndMethod(Methods.loadUnLockUser.toString());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
actionPerform();
verifyNoActionErrors();
verifyNoActionMessages();
verifyForward(ActionForwards.loadUnLockUser_success.toString());
Assert.assertEquals(LoginConstants.MAXTRIES, SessionUtils.getAttribute(PersonnelConstants.LOGIN_ATTEMPTS_COUNT,
request));
}
@Test
public void testUnLockUser() throws Exception {
createPersonnelAndSetInSession(getBranchOffice(), PersonnelLevel.LOAN_OFFICER);
addActionAndMethod(Methods.unLockUserAccount.toString());
addRequestParameter(Constants.CURRENTFLOWKEY, (String) request.getAttribute(Constants.CURRENTFLOWKEY));
actionPerform();
verifyNoActionErrors();
verifyNoActionMessages();
verifyForward(ActionForwards.unLockUserAccount_success.toString());
Assert.assertFalse(personnel.isLocked());
Assert.assertEquals(0, personnel.getNoOfTries().intValue());
}
private void createPersonnelAndSetInSession(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");
Name name = new Name("XYZ", null, null, "Last Name");
Date date = new Date();
personnel = new PersonnelBO(personnelLevel, office, Integer.valueOf("1"), Short.valueOf("1"), "ABCD", "XYZ",
"xyz@yahoo.com", null, customFieldDto, name, "111111", date, Integer.valueOf("1"),
Integer.valueOf("1"), date, date, address, userContext.getId(), new Date(), new HashSet());
IntegrationTestObjectMother.createPersonnel(personnel);
personnel = IntegrationTestObjectMother.findPersonnelById(personnel.getPersonnelId());
SessionUtils.setAttribute(Constants.BUSINESS_KEY, personnel, request);
}
@Override
public OfficeBO getBranchOffice() {
return TestObjectFactory.getOffice(TestObjectFactory.SAMPLE_BRANCH_OFFICE);
}
private void setRequestData() throws InvalidDateException {
addRequestParameter("firstName", "Jim");
addRequestParameter("lastName", "khan");
addRequestParameter("gender", "1");
addRequestParameter("level", "1");
addRequestParameter("title", "1");
addRequestParameter("emailId", "1@1.com");
addRequestDateParameter("dob", "20/03/76");
addRequestParameter("loginName", "tarzen");
addRequestParameter("personnelRoles", "1");
addRequestParameter("preferredLocale", "1");
}
@SuppressWarnings("unchecked")
@Test
public void testLoadChangeLog() throws Exception {
addActionAndMethod(Methods.get.toString());
addRequestParameter("globalPersonnelNum", "1");
actionPerform();
flowKey = request.getAttribute(Constants.CURRENTFLOWKEY).toString();
// personnel = (PersonnelBO) SessionUtils.getAttribute(Constants.BUSINESS_KEY, request);
// Changed the PersonnelBO to PersonnelInformationDto as the former is no longer stored in session using
// business key
PersonnelInformationDto personnel = (PersonnelInformationDto) SessionUtils.getAttribute(
"personnelInformationDto", request);
AuditLog auditLog = new AuditLog(personnel.getPersonnelId().intValue(), EntityType.PERSONNEL.getValue(),
"Mifos", new java.sql.Date(System.currentTimeMillis()), Short.valueOf("3"));
Set<AuditLogRecord> auditLogRecords = new HashSet<AuditLogRecord>();
AuditLogRecord auditLogRecord = new AuditLogRecord("ColumnName_1", "test_1", "new_test_1", auditLog);
auditLogRecords.add(auditLogRecord);
auditLog.addAuditLogRecords(auditLogRecords);
legacyAuditDao.save(auditLog);
setRequestPathInfo("/PersonAction.do");
addRequestParameter(Constants.CURRENTFLOWKEY, flowKey);
addRequestParameter("method", "loadChangeLog");
addRequestParameter("entityType", "Personnel");
addRequestParameter("entityId", personnel.getPersonnelId().toString());
actionPerform();
Assert.assertEquals(1, ((List) request.getSession().getAttribute(AuditConstants.AUDITLOGRECORDS)).size());
verifyForward("viewPersonnelChangeLog");
personnel = null;
}
@Test
public void testCancelChangeLog() {
setRequestPathInfo("/PersonAction.do");
addRequestParameter("method", "cancelChangeLog");
addRequestParameter("entityType", "Personnel");
actionPerform();
verifyForward("cancelPersonnelChangeLog");
personnel = null;
}
}