/* * This program is part of the OpenLMIS logistics management information system platform software. * Copyright © 2013 VillageReach * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. *   * This program 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 Affero General Public License for more details. * You should have received a copy of the GNU Affero General Public License along with this program.  If not, see http://www.gnu.org/licenses.  For additional information contact info@OpenLMIS.org.  */ package org.openlmis.core.repository.mapper; import org.hamcrest.CoreMatchers; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import org.openlmis.core.builder.FacilityBuilder; import org.openlmis.core.builder.SupervisoryNodeBuilder; import org.openlmis.core.domain.*; import org.openlmis.db.categories.IntegrationTests; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.transaction.TransactionConfiguration; import org.springframework.transaction.annotation.Transactional; import java.util.List; import static com.natpryce.makeiteasy.MakeItEasy.*; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.openlmis.core.builder.ProgramBuilder.defaultProgram; import static org.openlmis.core.builder.ProgramBuilder.programCode; import static org.openlmis.core.builder.RequisitionGroupBuilder.defaultRequisitionGroup; import static org.openlmis.core.builder.SupervisoryNodeBuilder.*; import static org.openlmis.core.builder.UserBuilder.defaultUser; import static org.openlmis.core.builder.UserBuilder.facilityId; import static org.openlmis.core.domain.RightName.CONFIGURE_RNR; import static org.openlmis.core.domain.RightName.CREATE_REQUISITION; @Category(IntegrationTests.class) @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:test-applicationContext-core.xml") @Transactional @TransactionConfiguration(defaultRollback = true, transactionManager = "openLmisTransactionManager") public class SupervisoryNodeMapperIT { SupervisoryNode supervisoryNode; Facility facility; @Autowired SupervisoryNodeMapper supervisoryNodeMapper; @Autowired RoleAssignmentMapper roleAssignmentMapper; @Autowired FacilityMapper facilityMapper; @Autowired RoleRightsMapper roleRightsMapper; @Autowired ProgramMapper programMapper; @Autowired UserMapper userMapper; @Autowired RequisitionGroupMapper requisitionGroupMapper; @Before public void setUp() throws Exception { supervisoryNode = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode)); facility = make(a(FacilityBuilder.defaultFacility)); facilityMapper.insert(facility); supervisoryNode.setFacility(facility); } @Test public void shouldInsertSupervisoryNode() throws Exception { supervisoryNodeMapper.insert(supervisoryNode); SupervisoryNode resultSupervisoryNode = supervisoryNodeMapper.getSupervisoryNode(supervisoryNode.getId()); assertThat(resultSupervisoryNode, is(notNullValue())); assertThat(resultSupervisoryNode.getCode(), CoreMatchers.is(SUPERVISORY_NODE_CODE)); assertThat(resultSupervisoryNode.getName(), CoreMatchers.is(SupervisoryNodeBuilder.SUPERVISORY_NODE_NAME)); assertThat(resultSupervisoryNode.getFacility().getId(), is(facility.getId())); } @Test public void shouldUpdateSupervisoryNode() throws Exception { supervisoryNodeMapper.insert(supervisoryNode); SupervisoryNode supervisoryNodeParent = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(SupervisoryNodeBuilder.code, "PN"))); supervisoryNodeParent.setFacility(facility); supervisoryNodeMapper.insert(supervisoryNodeParent); supervisoryNode.setCode("updated code"); supervisoryNode.setName("updated name"); supervisoryNode.setDescription("updated description"); supervisoryNode.setParent(supervisoryNodeParent); supervisoryNodeMapper.update(supervisoryNode); SupervisoryNode resultSupervisoryNode = supervisoryNodeMapper.getSupervisoryNode(supervisoryNode.getId()); assertThat(resultSupervisoryNode, is(notNullValue())); assertThat(resultSupervisoryNode.getCode(), is("updated code")); assertThat(resultSupervisoryNode.getName(), is("updated name")); assertThat(resultSupervisoryNode.getDescription(), is("updated description")); assertThat(resultSupervisoryNode.getParent().getId(), is(supervisoryNodeParent.getId())); } @Test public void shouldGetSupervisoryNodeIdByCode() throws Exception { supervisoryNodeMapper.insert(supervisoryNode); Long fetchedId = supervisoryNodeMapper.getIdForCode(supervisoryNode.getCode()); assertThat(fetchedId, is(supervisoryNode.getId())); } @Test public void shouldGetSupervisoryNodeByCode() throws Exception { supervisoryNodeMapper.insert(supervisoryNode); SupervisoryNode result = supervisoryNodeMapper.getByCode(supervisoryNode); assertThat(result, is(supervisoryNode)); } @Test public void shouldGetAllSupervisoryNodesInTheHierarchyForAUserAndProgramWithAppropriateRight() { Program program1 = insertProgram(make(a(defaultProgram, with(programCode, "p1")))); Program program2 = insertProgram(make(a(defaultProgram, with(programCode, "p2")))); User user = insertUser(); Role createRole = new Role("create role", "random description"); roleRightsMapper.insertRole(createRole); Role configureRnrRole = new Role("configure rnr", "random description"); roleRightsMapper.insertRole(configureRnrRole); roleRightsMapper.createRoleRight(createRole, CREATE_REQUISITION); roleRightsMapper.createRoleRight(configureRnrRole, CONFIGURE_RNR); supervisoryNodeMapper.insert(supervisoryNode); SupervisoryNode supervisoryNode1 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN1"))); supervisoryNode1.setFacility(facility); supervisoryNode1 = insertSupervisoryNode(supervisoryNode1); SupervisoryNode childNode = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "CN1"))); childNode.setFacility(facility); childNode.setParent(supervisoryNode); childNode = insertSupervisoryNode(childNode); insertRoleAssignments(program1, user, createRole, supervisoryNode); insertRoleAssignments(program1, user, configureRnrRole, supervisoryNode1); insertRoleAssignments(program2, user, createRole, supervisoryNode); insertRoleAssignments(program1, user, createRole, null); List<SupervisoryNode> userSupervisoryNodes = supervisoryNodeMapper.getAllSupervisoryNodesInHierarchyBy(user.getId(), program1.getId(), "{CREATE_REQUISITION}"); assertThat(userSupervisoryNodes.size(), is(2)); assertTrue(userSupervisoryNodes.contains(supervisoryNode)); assertTrue(userSupervisoryNodes.contains(childNode)); } @Test public void shouldGetAllSupervisoryNodesInTheHierarchyForAUserWithAppropriateRight() { Program program1 = insertProgram(make(a(defaultProgram, with(programCode, "p1")))); Program program2 = insertProgram(make(a(defaultProgram, with(programCode, "p2")))); User user = insertUser(); Role createRole = new Role("create role", "random description"); roleRightsMapper.insertRole(createRole); Role configureRnrRole = new Role("configure rnr", "random description"); roleRightsMapper.insertRole(configureRnrRole); roleRightsMapper.createRoleRight(createRole, CREATE_REQUISITION); roleRightsMapper.createRoleRight(configureRnrRole, CONFIGURE_RNR); supervisoryNodeMapper.insert(supervisoryNode); SupervisoryNode supervisoryNode1 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN1"))); supervisoryNode1.setFacility(facility); supervisoryNode1 = insertSupervisoryNode(supervisoryNode1); SupervisoryNode childNode = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "CN1"))); childNode.setFacility(facility); childNode.setParent(supervisoryNode); childNode = insertSupervisoryNode(childNode); insertRoleAssignments(program1, user, createRole, supervisoryNode); insertRoleAssignments(program1, user, configureRnrRole, supervisoryNode1); insertRoleAssignments(program2, user, createRole, supervisoryNode); insertRoleAssignments(program1, user, createRole, null); List<SupervisoryNode> userSupervisoryNodes = supervisoryNodeMapper.getAllSupervisoryNodesInHierarchyByUserAndRights(user.getId(), "{CREATE_REQUISITION}"); assertThat(userSupervisoryNodes.size(), is(2)); assertTrue(userSupervisoryNodes.contains(supervisoryNode)); assertTrue(userSupervisoryNodes.contains(childNode)); } @Test public void shouldGetSupervisoryNodeForRG() { supervisoryNodeMapper.insert(supervisoryNode); RequisitionGroup requisitionGroup = make(a(defaultRequisitionGroup)); requisitionGroup.setSupervisoryNode(supervisoryNode); requisitionGroupMapper.insert(requisitionGroup); SupervisoryNode actualSupervisoryNode = supervisoryNodeMapper.getFor(requisitionGroup.getCode()); assertThat(actualSupervisoryNode, is(supervisoryNode)); } @Test public void shouldGetParentForAGiveSupervisoryNode() throws Exception { SupervisoryNode parentNode = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN1"))); parentNode.setFacility(facility); insertSupervisoryNode(parentNode); SupervisoryNode childNode = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "CN1"))); childNode.setFacility(facility); childNode.setParent(parentNode); insertSupervisoryNode(childNode); final SupervisoryNode parent = supervisoryNodeMapper.getParent(childNode.getId()); assertThat(parent, is(parentNode)); } @Test public void shouldGetAllSupervisoryNodes() throws Exception { supervisoryNodeMapper.insert(supervisoryNode); List<SupervisoryNode> fetchedSupervisoryNodes = supervisoryNodeMapper.getAll(); assertThat(fetchedSupervisoryNodes.size(), is(1)); assertThat(fetchedSupervisoryNodes.get(0).getCode(), is("N1")); } @Test public void shouldGetAllSupervisoryNodesInHierarchy() throws Exception { SupervisoryNode supervisoryNode1 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN1"))); supervisoryNode1.setFacility(facility); insertSupervisoryNode(supervisoryNode1); SupervisoryNode supervisoryNode2 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "CN1"))); supervisoryNode2.setFacility(facility); supervisoryNode2.setParent(supervisoryNode1); insertSupervisoryNode(supervisoryNode2); SupervisoryNode supervisoryNode3 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "CN2"))); supervisoryNode3.setFacility(facility); supervisoryNode3.setParent(supervisoryNode2); insertSupervisoryNode(supervisoryNode3); List<SupervisoryNode> result = supervisoryNodeMapper.getAllParentSupervisoryNodesInHierarchy(supervisoryNode3); assertThat(result.size(), is(3)); assertThat(result.get(0).getId(), is(supervisoryNode3.getId())); assertThat(result.get(1).getId(), is(supervisoryNode2.getId())); assertThat(result.get(2).getId(), is(supervisoryNode1.getId())); } @Test public void shouldGetPaginatedSupervisoryNodesByNameSearch() { insertSupervisoryNode(supervisoryNode); SupervisoryNode supervisoryNode1 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN1"), with(name, "Approval Point 2"))); supervisoryNode1.setFacility(facility); insertSupervisoryNode(supervisoryNode1); SupervisoryNode supervisoryNode2 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "CN1"), with(name, "Not Matching Search"))); supervisoryNode2.setFacility(facility); insertSupervisoryNode(supervisoryNode2); Pagination pagination = new Pagination(1, 10); List<SupervisoryNode> searchResults = supervisoryNodeMapper.getSupervisoryNodesBy("Approval", pagination); assertThat(searchResults.size(), is(2)); } @Test public void shouldGetPaginatedSupervisoryNodesByParentNameSearch() { SupervisoryNode supervisoryNode1 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN1"), with(name, "Parent"))); supervisoryNode1.setFacility(facility); insertSupervisoryNode(supervisoryNode1); supervisoryNode.setParent(supervisoryNode1); insertSupervisoryNode(supervisoryNode); SupervisoryNode supervisoryNode2 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "CN1"), with(name, "Another"))); supervisoryNode2.setFacility(facility); insertSupervisoryNode(supervisoryNode2); SupervisoryNode supervisoryNode3 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "CN2"), with(name, "Child with not matching"))); supervisoryNode3.setFacility(facility); supervisoryNode3.setParent(supervisoryNode2); insertSupervisoryNode(supervisoryNode3); Pagination pagination = new Pagination(1, 10); List<SupervisoryNode> searchResults = supervisoryNodeMapper.getSupervisoryNodesBy("Parent", pagination); assertThat(searchResults.size(), is(1)); } @Test public void shouldGetSupervisoryNodesCountByNameSearch() { insertSupervisoryNode(supervisoryNode); SupervisoryNode supervisoryNode1 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN1"), with(name, "Approval Point 2"))); supervisoryNode1.setFacility(facility); insertSupervisoryNode(supervisoryNode1); SupervisoryNode supervisoryNode2 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "CN1"), with(name, "Not Matching Search"))); supervisoryNode2.setFacility(facility); insertSupervisoryNode(supervisoryNode2); Integer resultCount = supervisoryNodeMapper.getTotalSearchResultCount("Approval"); assertThat(resultCount, is(2)); } @Test public void shouldGetSupervisoryNodesCountByParentNameSearch() { SupervisoryNode supervisoryNode1 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN1"), with(name, "Parent"))); supervisoryNode1.setFacility(facility); insertSupervisoryNode(supervisoryNode1); supervisoryNode.setParent(supervisoryNode1); insertSupervisoryNode(supervisoryNode); SupervisoryNode supervisoryNode2 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "CN1"), with(name, "Another"))); supervisoryNode2.setFacility(facility); insertSupervisoryNode(supervisoryNode2); SupervisoryNode supervisoryNode3 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "CN2"), with(name, "Child with not matching"))); supervisoryNode3.setFacility(facility); supervisoryNode3.setParent(supervisoryNode2); insertSupervisoryNode(supervisoryNode3); Integer resultCount = supervisoryNodeMapper.getTotalParentSearchResultCount("Parent"); assertThat(resultCount, is(1)); } @Test public void shouldGetSupervisoryNodeWithParentAndAssociatedFacility() { SupervisoryNode supervisoryNode1 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN1"), with(name, "Parent"))); supervisoryNode1.setFacility(facility); insertSupervisoryNode(supervisoryNode1); supervisoryNode.setParent(supervisoryNode1); insertSupervisoryNode(supervisoryNode); SupervisoryNode savedNode = supervisoryNodeMapper.getSupervisoryNode(supervisoryNode.getId()); assertThat(savedNode.getParent(), is(supervisoryNode1)); } @Test public void shouldFilterSupervisoryNodesByName() { SupervisoryNode supervisoryNode1 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN1"), with(name, "gillAge Dispensary"))); supervisoryNode1.setFacility(facility); insertSupervisoryNode(supervisoryNode1); SupervisoryNode supervisoryNode2 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN2"), with(name, "Village 2 Dispensary"))); supervisoryNode2.setFacility(facility); insertSupervisoryNode(supervisoryNode2); SupervisoryNode supervisoryNode3 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN3"), with(name, "City Dispensary"))); supervisoryNode3.setFacility(facility); insertSupervisoryNode(supervisoryNode3); SupervisoryNode supervisoryNode4 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN4"), with(name, "Village 1 Dispensary"))); supervisoryNode4.setFacility(facility); insertSupervisoryNode(supervisoryNode4); SupervisoryNode supervisoryNode5 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN5"), with(name, "Central Hospital"))); supervisoryNode5.setFacility(facility); insertSupervisoryNode(supervisoryNode5); String param = "age"; List<SupervisoryNode> supervisoryNodeList = supervisoryNodeMapper.getFilteredSupervisoryNodesByName(param); assertThat(supervisoryNodeList.size(), is(3)); assertThat(supervisoryNodeList.get(0), is(supervisoryNode1)); assertThat(supervisoryNodeList.get(1), is(supervisoryNode4)); assertThat(supervisoryNodeList.get(2), is(supervisoryNode2)); } @Test public void shouldSearchTopLevelSupervisoryNodesByName() { SupervisoryNode supervisoryNode1 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN1"), with(name, "gillAge Dispensary"))); supervisoryNode1.setFacility(facility); insertSupervisoryNode(supervisoryNode1); SupervisoryNode supervisoryNode2 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN2"), with(name, "Village 2 Dispensary"))); supervisoryNode2.setFacility(facility); insertSupervisoryNode(supervisoryNode2); SupervisoryNode supervisoryNode3 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN3"), with(name, "City Dispensary"))); supervisoryNode3.setFacility(facility); supervisoryNode3.setParent(supervisoryNode1); insertSupervisoryNode(supervisoryNode3); SupervisoryNode supervisoryNode4 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN4"), with(name, "Village 1 Dispensary"))); supervisoryNode4.setFacility(facility); insertSupervisoryNode(supervisoryNode4); SupervisoryNode supervisoryNode5 = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode, with(code, "SN5"), with(name, "Central Hospital"))); supervisoryNode5.setFacility(facility); supervisoryNode5.setParent(supervisoryNode1); insertSupervisoryNode(supervisoryNode5); String param = "age"; List<SupervisoryNode> supervisoryNodeList = supervisoryNodeMapper.searchTopLevelSupervisoryNodesByName(param); assertThat(supervisoryNodeList.size(), is(3)); assertThat(supervisoryNodeList.get(0), is(supervisoryNode1)); assertThat(supervisoryNodeList.get(1), is(supervisoryNode4)); assertThat(supervisoryNodeList.get(2), is(supervisoryNode2)); } private SupervisoryNode insertSupervisoryNode(SupervisoryNode supervisoryNode) { supervisoryNodeMapper.insert(supervisoryNode); return supervisoryNode; } private Program insertProgram(Program program) { programMapper.insert(program); return program; } private Role insertRoleAssignments(Program program, User user, Role role, SupervisoryNode supervisoryNode) { Long supervisoryNodeId = supervisoryNode == null ? null : supervisoryNode.getId(); roleAssignmentMapper.insertRoleAssignment(user.getId(), program.getId(), supervisoryNodeId, role.getId()); return role; } private User insertUser() { User user = make(a(defaultUser, with(facilityId, facility.getId()))); userMapper.insert(user); return user; } }