/* * 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.reports.struts.action; import java.io.IOException; import java.util.ArrayList; import java.util.List; import junit.framework.Assert; import org.apache.struts.Globals; import org.apache.struts.action.ActionErrors; import org.apache.struts.upload.FormFile; import org.junit.Before; import org.junit.Test; import org.mifos.application.master.business.LookUpEntity; import org.mifos.application.master.business.LookUpValueEntity; import org.mifos.application.master.persistence.LegacyMasterDao; import org.mifos.application.util.helpers.ActionForwards; import org.mifos.core.MifosRuntimeException; import org.mifos.framework.MifosMockStrutsTestCase; import org.mifos.framework.TestUtils; import org.mifos.framework.exceptions.PersistenceException; import org.mifos.framework.hibernate.helper.StaticHibernateUtil; import org.mifos.framework.util.helpers.Constants; import org.mifos.reports.business.MockFormFile; import org.mifos.reports.business.ReportsBO; import org.mifos.reports.business.ReportsCategoryBO; import org.mifos.reports.business.ReportsJasperMap; import org.mifos.reports.persistence.ReportsPersistence; import org.mifos.reports.struts.actionforms.BirtReportsUploadActionForm; import org.mifos.reports.util.helpers.ReportsConstants; import org.mifos.security.AddActivity; import org.mifos.security.rolesandpermission.business.ActivityEntity; import org.mifos.security.rolesandpermission.business.RoleBO; import org.mifos.security.rolesandpermission.business.service.RolesPermissionsBusinessService; import org.mifos.security.rolesandpermission.persistence.LegacyRolesPermissionsDao; import org.mifos.security.util.ActivityContext; import org.mifos.security.util.SecurityConstants; import org.mifos.security.util.UserContext; import org.springframework.beans.factory.annotation.Autowired; public class BirtReportsUploadActionStrutsTest extends MifosMockStrutsTestCase { @Autowired LegacyMasterDao legacyMasterDao; @Autowired LegacyRolesPermissionsDao legacyRolesPermissionsDao; @Before public void setUp() throws Exception { } @Override protected void setStrutsConfig() throws IOException { super.setStrutsConfig(); setConfigFile("/WEB-INF/struts-config.xml,/WEB-INF/reports-struts-config.xml"); } @Test public void testGetBirtReportsUploadPage() { setRequestPathInfo("/birtReportsUploadAction.do"); addRequestParameter("method", "getBirtReportsUploadPage"); addRequestParameter("viewPath", "administerreports_path"); actionPerform(); verifyForward("load_success"); verifyNoActionErrors(); } @Test public void testEdit() { setRequestPathInfo("/birtReportsUploadAction.do"); addRequestParameter("method", "edit"); addRequestParameter("reportId", "1"); actionPerform(); ReportsBO report = (ReportsBO) request.getAttribute(Constants.BUSINESS_KEY); Assert.assertEquals("1", report.getReportId().toString()); verifyNoActionErrors(); verifyForward(ActionForwards.edit_success.toString()); } @Test public void testShouldEditPreviewFailureWhenReportTitleIsEmpty() { setRequestPathInfo("/birtReportsUploadAction.do"); addRequestParameter("method", "editpreview"); addRequestParameter("reportTitle", ""); addRequestParameter("reportCategoryId", "1"); addRequestParameter("isActive", "1"); actionPerform(); verifyForwardPath("/birtReportsUploadAction.do?method=validate"); } @Test public void testShouldEditPreviewFailureWhenReportCategoryIdIsEmpty() { setRequestPathInfo("/birtReportsUploadAction.do"); addRequestParameter("method", "editpreview"); addRequestParameter("reportTitle", "editPreviewFailureWhenReportCategoryIdIsEmpty"); addRequestParameter("reportCategoryId", ""); addRequestParameter("isActive", "1"); actionPerform(); verifyForwardPath("/birtReportsUploadAction.do?method=validate"); } @Test public void testShouldEditPreviewFailureWhenIsActiveIsEmpty() { setRequestPathInfo("/birtReportsUploadAction.do"); addRequestParameter("method", "editpreview"); addRequestParameter("reportTitle", "editPreviewFailureWhenIsActiveIsEmpty"); addRequestParameter("reportCategoryId", "1"); addRequestParameter("isActive", ""); actionPerform(); verifyForwardPath("/birtReportsUploadAction.do?method=validate"); } @Test public void testUpgradePathNotRuined() throws Exception { // TODO Temporary solution to avoid unsuccessful test on some machines // Retrieve initial activities information List<ActivityEntity> activities = new RolesPermissionsBusinessService().getActivities(); int newActivityId = activities.get(activities.size() - 1).getId() + 1; // Upload a report creating an activity for the report FormFile file = new MockFormFile("testFilename.rptdesign"); BirtReportsUploadActionForm actionForm = new BirtReportsUploadActionForm(); setRequestPathInfo("/birtReportsUploadAction.do"); addRequestParameter("method", "upload"); actionForm.setFile(file); actionForm.setReportTitle("exsitTitle"); actionForm.setReportCategoryId("1"); actionForm.setIsActive("1"); setActionForm(actionForm); actionPerform(); Assert.assertEquals(0, getErrorSize()); Assert.assertNotNull(request.getAttribute("report")); // Simulate an future activities upgrade AddActivity activity = null; try { activity = new AddActivity((short) newActivityId, SecurityConstants.ORGANIZATION_MANAGEMENT, "no name"); activity.upgrade(StaticHibernateUtil.getSessionTL().connection()); } catch (Exception e) { legacyRolesPermissionsDao.delete(request.getAttribute("report")); StaticHibernateUtil.flushSession(); throw e; } // Undo ReportsBO report = (ReportsBO) request.getAttribute("report"); removeReport(report.getReportId()); } @Test public void testShouldCreateFailureWhenActivityIdOutOfRange() throws Exception { ActivityEntity activityEntity = insertActivityForTest(Short.MIN_VALUE); FormFile file = new MockFormFile("testFilename"); BirtReportsUploadActionForm actionForm = new BirtReportsUploadActionForm(); setRequestPathInfo("/birtReportsUploadAction.do"); addRequestParameter("method", "upload"); actionForm.setFile(file); actionForm.setReportTitle("existingTitle"); actionForm.setReportCategoryId("1"); actionForm.setIsActive("1"); setActionForm(actionForm); actionPerform(); verifyForward("preview_failure"); String[] errors = { ReportsConstants.ERROR_NOMOREDYNAMICACTIVITYID }; verifyActionErrors(errors); deleteActivityForTest(activityEntity); } @Test public void testShouldPreviewSuccessWithReportTemplate() throws Exception { setRequestPathInfo("/birtReportsUploadAction.do"); BirtReportsUploadActionForm form = new BirtReportsUploadActionForm(); form.setFile(new MockFormFile("testFileName1.rptdesign")); form.setIsActive("1"); form.setReportCategoryId("1"); form.setReportTitle("testReportTitle1"); setActionForm(form); addRequestParameter("method", "preview"); actionPerform(); verifyNoActionErrors(); verifyForward("preview_success"); } @Test public void testShouldPreviewFailureWithOutReportTemplate() throws Exception { setRequestPathInfo("/birtReportsUploadAction.do"); BirtReportsUploadActionForm form = new BirtReportsUploadActionForm(); form.setIsActive("1"); form.setReportCategoryId("1"); form.setReportTitle("testReportTitle2"); setActionForm(form); addRequestParameter("method", "preview"); actionPerform(); String[] errors = { ReportsConstants.ERROR_FILE }; verifyActionErrors(errors); } @Test public void testShouldSubmitSucessWhenUploadNewReport() throws Exception { setRequestPathInfo("/birtReportsUploadAction.do"); BirtReportsUploadActionForm form = new BirtReportsUploadActionForm(); form.setReportTitle("testShouldSubmitSucessWhenUploadNewReport"); form.setReportCategoryId("1"); form.setIsActive("1"); form.setFile(new MockFormFile("testFileName1.rptdesign")); setActionForm(form); addRequestParameter("method", "upload"); actionPerform(); ReportsBO report = (ReportsBO) request.getAttribute("report"); Assert.assertNotNull(report); ReportsPersistence rp = new ReportsPersistence(); ReportsJasperMap jasper = rp.getPersistentObject(ReportsJasperMap.class, report .getReportsJasperMap().getReportId()); Assert.assertNotNull(jasper); verifyNoActionErrors(); verifyForward("create_success"); removeReport(report.getReportId()); } @Test public void testShouldSubmitSuccessAfterEdit() throws Exception { setRequestPathInfo("/birtReportsUploadAction.do"); ReportsPersistence persistence = new ReportsPersistence(); ReportsBO report = new ReportsBO(); report.setReportName("testShouldSubmitSuccessAfterEdit"); report.setReportsCategoryBO(persistence.getPersistentObject(ReportsCategoryBO.class, (short) 1)); report.setIsActive((short) 1); short newActivityId = (short) legacyRolesPermissionsDao.calculateDynamicActivityId(); legacyRolesPermissionsDao.createActivityForReports((short) 1, "test" + "testShouldSubmitSuccessAfterEdit"); report.setActivityId(newActivityId); ReportsJasperMap reportJasperMap = report.getReportsJasperMap(); reportJasperMap.setReportJasper("testFileName_EDIT.rptdesign"); report.setReportsJasperMap(reportJasperMap); persistence.createOrUpdate(report); BirtReportsUploadActionForm editForm = new BirtReportsUploadActionForm(); editForm.setReportId(report.getReportId().toString()); editForm.setReportTitle("newTestShouldSubmitSuccessAfterEdit"); editForm.setReportCategoryId("2"); editForm.setIsActive("0"); editForm.setFile(new MockFormFile("newTestShouldSubmitSuccessAfterEdit.rptdesign")); setActionForm(editForm); addRequestParameter("method", "editThenUpload"); actionPerform(); ReportsBO newReport = persistence.getReport(report.getReportId()); Assert.assertEquals("newTestShouldSubmitSuccessAfterEdit", newReport.getReportName()); Assert.assertEquals(2, newReport.getReportsCategoryBO().getReportCategoryId().shortValue()); Assert.assertEquals(0, newReport.getIsActive().shortValue()); Assert.assertEquals("newTestShouldSubmitSuccessAfterEdit.rptdesign", newReport.getReportsJasperMap().getReportJasper()); ReportsJasperMap jasper = persistence.getPersistentObject(ReportsJasperMap.class, report .getReportsJasperMap().getReportId()); Assert.assertEquals("newTestShouldSubmitSuccessAfterEdit.rptdesign", jasper.getReportJasper()); removeReport(newReport.getReportId()); } @Test public void testEditWithPermissionIsAllowed() throws Exception { setupReportEditPermission(true); actionPerform(); verifyForward(ActionForwards.edit_success.toString()); } @Test public void testEditWithoutPermissionIsDenied() throws Exception { setupReportEditPermission(false); actionPerform(); Assert.assertNotNull(request.getAttribute(Globals.ERROR_KEY)); ActionErrors errors = (ActionErrors) request.getAttribute(Globals.ERROR_KEY); Assert.assertNotNull(errors.get(SecurityConstants.KEY_ACTIVITY_NOT_ALLOWED)); } private void setupReportEditPermission(boolean allowReportEdit) throws Exception { UserContext userContext = TestUtils.makeUser(); request.getSession().setAttribute(Constants.USERCONTEXT, userContext); ActivityContext ac = new ActivityContext((short) 0, userContext.getBranchId().shortValue(), userContext.getId().shortValue()); request.getSession(false).setAttribute(Constants.ACTIVITYCONTEXT, ac); RoleBO role = legacyRolesPermissionsDao.getRole(userContext.getRoles().iterator().next()); List<ActivityEntity> roleActivities = new ArrayList<ActivityEntity>(role.getActivities()); List<ActivityEntity> updatedRoleActivities = new ArrayList<ActivityEntity>(); for (ActivityEntity ae : roleActivities) { if (ae.getId() != SecurityConstants.EDIT_REPORT_INFORMATION || allowReportEdit) { updatedRoleActivities.add(ae); } } try { StaticHibernateUtil.startTransaction(); role.update(userContext.getId(), "test", updatedRoleActivities); legacyRolesPermissionsDao.save(role); StaticHibernateUtil.flushSession(); for(ActivityEntity ae : legacyRolesPermissionsDao.getActivities()) { StaticHibernateUtil.getSessionTL().refresh(ae); } StaticHibernateUtil.commitTransaction(); } catch (Exception e) { StaticHibernateUtil.rollbackTransaction(); throw new MifosRuntimeException(e); } finally { StaticHibernateUtil.closeSession(); } setRequestPathInfo("/birtReportsUploadAction.do"); addRequestParameter("method", "edit"); addRequestParameter("reportId", "1"); } private void removeReport(Short reportId) throws PersistenceException { ReportsPersistence reportPersistence = new ReportsPersistence(); reportPersistence.getSession().clear(); ReportsBO report = reportPersistence.getPersistentObject(ReportsBO.class, reportId); ActivityEntity activityEntity = legacyRolesPermissionsDao.getPersistentObject(ActivityEntity.class, report.getActivityId()); reportPersistence.delete(report); LookUpValueEntity anLookUp = activityEntity.getActivityNameLookupValues(); legacyRolesPermissionsDao.delete(activityEntity); legacyRolesPermissionsDao.delete(anLookUp); StaticHibernateUtil.flushSession(); } private ActivityEntity insertActivityForTest(short activityId) throws PersistenceException { LookUpValueEntity anLookUp = new LookUpValueEntity(); LookUpEntity lookUpEntity = legacyMasterDao.getPersistentObject(LookUpEntity.class, Short .valueOf((short) LookUpEntity.ACTIVITY)); anLookUp.setLookUpEntity(lookUpEntity); ActivityEntity parent = legacyMasterDao.getPersistentObject(ActivityEntity.class, (short) 13); ActivityEntity activityEntity = new ActivityEntity(activityId, parent, anLookUp); legacyRolesPermissionsDao.createOrUpdate(anLookUp); legacyRolesPermissionsDao.createOrUpdate(activityEntity); return activityEntity; } private void deleteActivityForTest(ActivityEntity activityEntity) throws PersistenceException { legacyRolesPermissionsDao.getSession().clear(); LookUpValueEntity anLookUp = activityEntity.getActivityNameLookupValues(); legacyRolesPermissionsDao.delete(activityEntity); legacyRolesPermissionsDao.delete(anLookUp); } }