/*
* PatientView
*
* Copyright (c) Worth Solutions Limited 2004-2013
*
* This file is part of PatientView.
*
* PatientView is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
* PatientView is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License along with PatientView in a file
* titled COPYING. If not, see <http://www.gnu.org/licenses/>.
*
* @package PatientView
* @link http://www.patientview.org
* @author PatientView <info@patientview.org>
* @copyright Copyright (c) 2004-2013, Worth Solutions Limited
* @license http://www.gnu.org/licenses/gpl-3.0.html The GNU General Public License V3.0
*/
package org.patientview.test.utils;
import org.apache.commons.collections.CollectionUtils;
import org.junit.Before;
import org.junit.Test;
import org.patientview.model.Specialty;
import org.patientview.model.Unit;
import org.patientview.patientview.model.User;
import org.patientview.patientview.model.UserMapping;
import org.patientview.patientview.unit.UnitUtils;
import org.patientview.repository.UnitDao;
import org.patientview.repository.UserMappingDao;
import org.patientview.service.*;
import org.patientview.test.helpers.SecurityHelpers;
import org.patientview.test.helpers.ServiceHelpers;
import org.patientview.test.service.BaseServiceTest;
import org.springframework.mock.web.MockHttpServletRequest;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.*;
public class UnitUtilsTest extends BaseServiceTest {
@Inject
private ServiceHelpers serviceHelpers;
@Inject
private SecurityUserManager securityUserManager;
@Inject
private SecurityHelpers securityHelpers;
@Inject
private UnitDao unitDao;
@Inject
private UserMappingDao userMappingDao;
// Test suite wide references
private User unitadmin, superadmin,radaradmin,comboAdmin;
private Specialty specialty1;
/**
* create users and units, set relationships user and unit.
* 4 users('unitadmin', 'superadmin', 'radaradmin', 'comboAdmin'),
* 4 units('RADAR1', 'RADAR2', 'RENAL1', 'RENAL2') and 1 specialty
* 'radaradmin' is in 'RADAR1' unit, 'comboAdmin' in 'RADAR1', 'RENAL1' and 'RENAL2' units, 'unitadmin' in 'RENAL2'
*/
@Before
public void initDatas() {
unitadmin = serviceHelpers.createUser("unitadmin", "username@test.com", "pass", "Test User");
superadmin = serviceHelpers.createUser("superadmin", "username@test.com", "pass", "Test User");
radaradmin = serviceHelpers.createUser("radaradmin", "username@test.com", "pass", "Test User");
comboAdmin = serviceHelpers.createUser("comboAdmin", "username@test.com", "pass", "Test User");
specialty1 = serviceHelpers.createSpecialty("Specialty 1", "Specialty1", "Test description");
serviceHelpers.createSpecialtyUserRole(specialty1, superadmin, "superadmin");
serviceHelpers.createSpecialtyUserRole(specialty1, unitadmin, "unitadmin");
serviceHelpers.createSpecialtyUserRole(specialty1, comboAdmin, "unitadmin");
serviceHelpers.createSpecialtyUserRole(specialty1, radaradmin, "radaradmin");
UserMapping userMapping = new UserMapping();
userMapping.setNhsno("123");
userMapping.setUsername("radaradmin");
userMapping.setSpecialty(specialty1);
userMapping.setUnitcode("RADAR1");
userMappingDao.save(userMapping);
userMapping = new UserMapping();
userMapping.setNhsno("1234");
userMapping.setSpecialty(specialty1);
userMapping.setUsername("comboAdmin");
userMapping.setUnitcode("RADAR1");
userMappingDao.save(userMapping);
userMapping = new UserMapping();
userMapping.setNhsno("12345");
userMapping.setSpecialty(specialty1);
userMapping.setUsername("comboAdmin");
userMapping.setUnitcode("RENAL2");
userMappingDao.save(userMapping);
userMapping = new UserMapping();
userMapping.setNhsno("12346");
userMapping.setSpecialty(specialty1);
userMapping.setUsername("comboAdmin");
userMapping.setUnitcode("RENAL1");
userMappingDao.save(userMapping);
userMapping = new UserMapping();
userMapping.setNhsno("12347");
userMapping.setSpecialty(specialty1);
userMapping.setUsername("unitadmin");
userMapping.setUnitcode("RENAL2");
userMappingDao.save(userMapping);
Unit unit = new Unit();
unit.setSpecialty(specialty1);
// required fields
unit.setUnitcode("RADAR1");
unit.setName("z");
unit.setShortname("nam1");
unit.setSourceType("radargroup");
unitDao.save(unit);
unit = new Unit();
unit.setSpecialty(specialty1);
// required fields
unit.setUnitcode("RADAR2");
unit.setName("y");
unit.setShortname("nam2");
unit.setSourceType("radargroup");
unitDao.save(unit);
unit = new Unit();
unit.setSpecialty(specialty1);
// required fields
unit.setUnitcode("RENAL1");
unit.setName("x");
unit.setShortname("nam3");
unit.setSourceType("renalunit");
unitDao.save(unit);
unit = new Unit();
unit.setSpecialty(specialty1);
// required fields
unit.setUnitcode("RENAL2");
unit.setName("w");
unit.setShortname("nam4");
unit.setSourceType("renalunit");
unitDao.save(unit);
}
/**
* test UnitUtils.setUserUnits method, this method is used by LogonAddInputAction and UnitAdminAddAction.
* this method will search units depend on login user's role and sourceType of unit('radargroup', 'renalunit').
* superadmin will get all 'radargroup' and 'renalunit' units, unitadmin will get all units which he belongs to,
* other role user won't get any unit, like radaradmin.
* searching result will be as a attribute in request.
*/
@Test
public void testSetUserUnits() {
//superadmin will get all 4 units.
loginAsUser(superadmin.getUsername(), specialty1);
assertTrue("superadmin should be present", securityUserManager.isRolePresent("superadmin"));
MockHttpServletRequest request = new MockHttpServletRequest();
UnitUtils.setUserUnits(request);
List<Unit> units = (List<Unit>) request.getAttribute("units");
assertEquals("units size is wrong.", 4, units.size());
List<String> unitcodes = new ArrayList<String>();
for (Unit unit : units) {
unitcodes.add(unit.getUnitcode());
}
assertEquals("searching result[" + unitcodes.toString() +
"] is wrong", 0,
CollectionUtils.subtract(Arrays.asList(new String[]{"RADAR1", "RADAR2", "RENAL1", "RENAL2"}),
unitcodes).size());
logout();
// unitadmin will get one unit.
loginAsUser(unitadmin.getUsername(), specialty1);
assertTrue("unitadmin should be present", securityUserManager.isRolePresent("unitadmin"));
request = new MockHttpServletRequest();
UnitUtils.setUserUnits(request);
List<Unit> unitadminUnits = (List<Unit>) request.getAttribute("units");
assertEquals("units size is wrong.", 1, ((List)request.getAttribute("units")).size());
assertEquals("searching result is wrong", "RENAL2", unitadminUnits.get(0).getUnitcode());
logout();
// comboAdmin will get 3 units.
loginAsUser(comboAdmin.getUsername(), specialty1);
assertTrue("comboAdmin should be present", securityUserManager.isRolePresent("unitadmin"));
request = new MockHttpServletRequest();
UnitUtils.setUserUnits(request);
List<Unit> comboAdminUnits = (List<Unit>) request.getAttribute("units");
assertEquals("units size is wrong.",3, comboAdminUnits.size());
List<String> comboAdminUnitcodes = new ArrayList<String>();
for (Unit unit : comboAdminUnits) {
comboAdminUnitcodes.add(unit.getUnitcode());
}
assertEquals("searching result is wrong", 0,
CollectionUtils.subtract(Arrays.asList(new String[]{"RADAR1", "RENAL1", "RENAL2"}),
comboAdminUnitcodes).size());
logout();
//radaradmin won't get any unit.
loginAsUser(radaradmin.getUsername(), specialty1);
assertTrue("radaradmin should be present", securityUserManager.isRolePresent("radaradmin"));
request = new MockHttpServletRequest();
UnitUtils.setUserUnits(request);
assertEquals("units size is wrong.", 0, ((List) request.getAttribute("units")).size());
logout();
}
/**
* test UnitUtils.setUserRenalUnits method, this method is used by PatientAddInputAction.
* this method will search units depend on login user's role and 'renalunit' unit
* superadmin will get all 'renalunit' units, unitadmin will get all 'renalunit' units which he belongs to,
* other role user won't get any unit, like radaradmin.
* searching result will be as a attribute in request.
*/
@Test
public void testSetUserRenalUnits() {
//superadmin will get 2 units.
loginAsUser(superadmin.getUsername(), specialty1);
assertTrue("superadmin should be present", securityUserManager.isRolePresent("superadmin"));
MockHttpServletRequest request = new MockHttpServletRequest();
UnitUtils.setUserRenalUnits(request);
List<Unit> units = (List<Unit>) request.getAttribute("units");
assertEquals("units size is wrong.", 2, units.size());
List<String> unitcodes = new ArrayList<String>();
for (Unit unit : units) {
unitcodes.add(unit.getUnitcode());
}
assertEquals("searching result is wrong", 0,
CollectionUtils.subtract(Arrays.asList(new String[]{"RENAL1", "RENAL2"}),
unitcodes).size());
logout();
// unitadmin will get one unit.
loginAsUser(unitadmin.getUsername(), specialty1);
assertTrue("unitadmin should be present", securityUserManager.isRolePresent("unitadmin"));
request = new MockHttpServletRequest();
UnitUtils.setUserRenalUnits(request);
List<Unit> unitadminUnits = (List<Unit>) request.getAttribute("units");
assertEquals("units size is wrong.", 1, ((List)request.getAttribute("units")).size());
assertEquals("searching result is wrong", "RENAL2", unitadminUnits.get(0).getUnitcode());
logout();
// comboAdmin will get 2 units.
loginAsUser(comboAdmin.getUsername(), specialty1);
assertTrue("comboAdmin should be present", securityUserManager.isRolePresent("unitadmin"));
request = new MockHttpServletRequest();
UnitUtils.setUserRenalUnits(request);
List<Unit> comboAdminUnits = (List<Unit>) request.getAttribute("units");
assertEquals("units size is wrong.",2, comboAdminUnits.size());
List<String> comboAdminUnitcodes = new ArrayList<String>();
for (Unit unit : comboAdminUnits) {
comboAdminUnitcodes.add(unit.getUnitcode());
}
assertEquals("searching result is wrong", 0,
CollectionUtils.subtract(Arrays.asList(new String[]{"RENAL1", "RENAL2"}),
comboAdminUnitcodes).size());
logout();
//radaradmin won't get any unit.
loginAsUser(radaradmin.getUsername(), specialty1);
assertTrue("radaradmin should be present", securityUserManager.isRolePresent("radaradmin"));
request = new MockHttpServletRequest();
UnitUtils.setUserRenalUnits(request);
assertEquals("units size is wrong.", null, request.getAttribute("units"));
logout();
}
private void loginAsUser(String username, Specialty specialty) {
securityHelpers.loginAsUser(username, specialty);
}
private void logout() {
securityHelpers.logout();
}
}