/*
* 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.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.ProgramBuilder;
import org.openlmis.core.builder.SupervisoryNodeBuilder;
import org.openlmis.core.context.CoreTestContext;
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 junit.framework.Assert.assertNotNull;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.openlmis.core.builder.FacilityBuilder.defaultFacility;
import static org.openlmis.core.builder.FacilityBuilder.name;
@Category(IntegrationTests.class)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:test-applicationContext-core.xml")
@Transactional
@TransactionConfiguration(defaultRollback = true, transactionManager = "openLmisTransactionManager")
public class SupplyLineMapperIT extends CoreTestContext {
@Autowired
SupplyLineMapper mapper;
@Autowired
ProgramMapper programMapper;
@Autowired
SupervisoryNodeMapper supervisoryNodeMapper;
@Autowired
FacilityMapper facilityMapper;
SupplyLine supplyLine;
Facility facility;
SupervisoryNode supervisoryNode;
Program program;
@Before
public void setUp() throws Exception {
facility = make(a(defaultFacility));
facilityMapper.insert(facility);
program = make(a(ProgramBuilder.defaultProgram));
programMapper.insert(program);
supervisoryNode = make(a(SupervisoryNodeBuilder.defaultSupervisoryNode));
supervisoryNode.setFacility(facility);
supervisoryNodeMapper.insert(supervisoryNode);
supplyLine = new SupplyLine();
supplyLine.setSupplyingFacility(facility);
supplyLine.setProgram(program);
supplyLine.setSupervisoryNode(supervisoryNode);
supplyLine.setExportOrders(Boolean.TRUE);
}
@Test
public void shouldInsertSupplyLine() {
Integer id = mapper.insert(supplyLine);
assertNotNull(id);
}
@Test
public void shouldReturnSupplyLineForASupervisoryNodeAndProgram() {
mapper.insert(supplyLine);
SupplyLine returnedSupplyLine = mapper.getSupplyLineBy(supervisoryNode, program);
assertThat(returnedSupplyLine.getId(), is(supplyLine.getId()));
}
@Test
public void shouldUpdateSupplyLine() throws Exception {
mapper.insert(supplyLine);
supplyLine.setDescription("New Description");
supplyLine.setExportOrders(Boolean.FALSE);
supplyLine.setModifiedBy(2L);
mapper.update(supplyLine);
SupplyLine supplyLineFromDataBase = mapper.getSupplyLineBy(supervisoryNode, program);
assertThat(supplyLineFromDataBase.getDescription(), is("New Description"));
assertThat(supplyLineFromDataBase.getModifiedBy(), is(2L));
assertThat(supplyLineFromDataBase.getExportOrders(), is(Boolean.FALSE));
}
@Test
public void shouldReturnSupplyLineBySupervisoryNodeProgramAndFacility() throws Exception {
mapper.insert(supplyLine);
SupplyLine supplyLineReturned = mapper.getSupplyLineBySupervisoryNodeProgramAndFacility(supplyLine);
assertThat(supplyLineReturned.getProgram().getId(), is(program.getId()));
assertThat(supplyLineReturned.getSupplyingFacility().getId(), is(facility.getId()));
assertThat(supplyLineReturned.getSupervisoryNode().getId(), is(supervisoryNode.getId()));
}
@Test
public void shouldGetSupplyLineByIdFilledWithSupplyingFacility() throws Exception {
mapper.insert(supplyLine);
SupplyLine supplyLineReturned = mapper.getById(supplyLine.getId());
assertThat(supplyLineReturned.getProgram().getId(), is(program.getId()));
assertThat(supplyLineReturned.getProgram().getName(), is(program.getName()));
assertThat(supplyLineReturned.getSupplyingFacility().getId(), is(facility.getId()));
assertThat(supplyLineReturned.getSupervisoryNode().getId(), is(supervisoryNode.getId()));
assertThat(supplyLineReturned.getSupervisoryNode().getName(), is(supervisoryNode.getName()));
assertThat(supplyLineReturned.getSupplyingFacility().getName(), is(facility.getName()));
assertThat(supplyLineReturned.getSupplyingFacility().getCode(), is(facility.getCode()));
}
@Test
public void shouldGetPaginatedSupplyLinesSearchedBySupplyingFacilityName() throws Exception {
String searchParam = "Apollo";
String column = "facility";
Facility f100 = make(a(defaultFacility, with(FacilityBuilder.code, "F100"), with(name, "Facility100")));
facilityMapper.insert(f100);
Program hivProgram = programMapper.getByCode("HIV");
Program malariaProgram = programMapper.getByCode("MALARIA");
Program tbProgram = programMapper.getByCode("TB");
SupplyLine supplyLine1 = insertSupplyLine(facility, supervisoryNode, program);
insertSupplyLine(facility, supervisoryNode, hivProgram);
insertSupplyLine(facility, supervisoryNode, malariaProgram);
insertSupplyLine(f100, supervisoryNode, tbProgram);
Pagination pagination = new Pagination(2, 2);
List<SupplyLine> supplyLines = mapper.search(searchParam, column, pagination);
assertThat(supplyLines.size(), is(1));
assertThat(supplyLines.get(0).getId(), is(supplyLine1.getId()));
assertThat(supplyLines.get(0).getDescription(), is(supplyLine1.getDescription()));
assertThat(supplyLines.get(0).getProgram().getName(), is(program.getName()));
assertThat(supplyLines.get(0).getSupplyingFacility().getName(), is(facility.getName()));
assertThat(supplyLines.get(0).getSupervisoryNode().getName(), is(supervisoryNode.getName()));
}
@Test
public void shouldGetCountOfRecordsWhenSearchedByFacilityName() throws Exception {
String searchParam = "Apollo";
String column = "facility";
Facility f100 = make(a(defaultFacility, with(FacilityBuilder.code, "F100"), with(name, "Facility100")));
facilityMapper.insert(f100);
Program hivProgram = programMapper.getByCode("HIV");
Program malariaProgram = programMapper.getByCode("MALARIA");
Program tbProgram = programMapper.getByCode("TB");
insertSupplyLine(facility, supervisoryNode, program);
insertSupplyLine(facility, supervisoryNode, hivProgram);
insertSupplyLine(facility, supervisoryNode, malariaProgram);
insertSupplyLine(f100, supervisoryNode, tbProgram);
Integer count = mapper.getSearchedSupplyLinesCount(searchParam, column);
assertThat(count, is(3));
}
@Test
public void shouldGetPaginatedSupplyLinesSearchedBySupervisoryNodeName() throws Exception {
String searchParam = "nod";
String column = "supervisoryNode";
SupervisoryNode supervisoryNode2 = insertSupervisoryNode("N2", "Node2", facility);
SupervisoryNode supervisoryNode3 = insertSupervisoryNode("N3", "Node3", facility);
SupervisoryNode supervisoryNode4 = insertSupervisoryNode("N4", "Node4", facility);
Program hivProgram = programMapper.getByCode("HIV");
Program malariaProgram = programMapper.getByCode("MALARIA");
Program tbProgram = programMapper.getByCode("TB");
insertSupplyLine(facility, supervisoryNode, program);
insertSupplyLine(facility, supervisoryNode3, hivProgram);
SupplyLine supplyLine = insertSupplyLine(facility, supervisoryNode4, malariaProgram);
insertSupplyLine(facility, supervisoryNode2, tbProgram);
Pagination pagination = new Pagination(2, 2);
List<SupplyLine> supplyLines = mapper.search(searchParam, column, pagination);
assertThat(supplyLines.size(), is(1));
assertThat(supplyLines.get(0).getId(), is(supplyLine.getId()));
assertThat(supplyLines.get(0).getDescription(), is(supplyLine.getDescription()));
assertThat(supplyLines.get(0).getProgram().getName(), is(malariaProgram.getName()));
assertThat(supplyLines.get(0).getSupplyingFacility().getName(), is(facility.getName()));
assertThat(supplyLines.get(0).getSupervisoryNode().getName(), is(supervisoryNode4.getName()));
}
@Test
public void shouldGetCountOfRecordsWhenSearchedBySupervisoryNodeName() throws Exception {
String searchParam = "nod";
String column = "supervisoryNode";
SupervisoryNode supervisoryNode2 = insertSupervisoryNode("N2", "Node2", facility);
SupervisoryNode supervisoryNode3 = insertSupervisoryNode("N3", "Node3", facility);
SupervisoryNode supervisoryNode4 = insertSupervisoryNode("N4", "Node4", facility);
Program hivProgram = programMapper.getByCode("HIV");
Program malariaProgram = programMapper.getByCode("MALARIA");
Program tbProgram = programMapper.getByCode("TB");
insertSupplyLine(facility, supervisoryNode, program);
insertSupplyLine(facility, supervisoryNode2, hivProgram);
insertSupplyLine(facility, supervisoryNode3, malariaProgram);
insertSupplyLine(facility, supervisoryNode4, tbProgram);
Integer count = mapper.getSearchedSupplyLinesCount(searchParam, column);
assertThat(count, is(3));
}
@Test
public void shouldGetPaginatedSupplyLinesSearchedByProgramName() throws Exception {
String searchParam = "mal";
String column = "program";
SupervisoryNode supervisoryNode2 = insertSupervisoryNode("N2", "Node2", facility);
Program malaria = programMapper.getByCode("MALARIA");
insertSupplyLine(facility, supervisoryNode, program);
SupplyLine supplyLine2 = insertSupplyLine(facility, supervisoryNode2, malaria);
SupplyLine supplyLine3 = insertSupplyLine(facility, supervisoryNode, malaria);
insertSupplyLine(facility, supervisoryNode2, program);
Pagination pagination = new Pagination(1, 2);
List<SupplyLine> supplyLines = mapper.search(searchParam, column, pagination);
assertThat(supplyLines.size(), is(2));
assertThat(supplyLines.get(0).getId(), is(supplyLine3.getId()));
assertThat(supplyLines.get(0).getDescription(), is(supplyLine3.getDescription()));
assertThat(supplyLines.get(0).getProgram().getName(), is(malaria.getName()));
assertThat(supplyLines.get(0).getSupplyingFacility().getName(), is(facility.getName()));
assertThat(supplyLines.get(0).getSupervisoryNode().getName(), is(supervisoryNode.getName()));
assertThat(supplyLines.get(1).getId(), is(supplyLine2.getId()));
assertThat(supplyLines.get(1).getDescription(), is(supplyLine2.getDescription()));
assertThat(supplyLines.get(1).getProgram().getName(), is(malaria.getName()));
assertThat(supplyLines.get(1).getSupplyingFacility().getName(), is(facility.getName()));
assertThat(supplyLines.get(1).getSupervisoryNode().getName(), is(supervisoryNode2.getName()));
}
@Test
public void shouldGetCountOfRecordsWhenSearchedByProgramName() throws Exception {
String searchParam = "mal";
String column = "program";
SupervisoryNode supervisoryNode2 = insertSupervisoryNode("N2", "Node2", facility);
SupervisoryNode supervisoryNode3 = insertSupervisoryNode("N3", "Node3", facility);
Program malaria = programMapper.getByCode("MALARIA");
insertSupplyLine(facility, supervisoryNode, program);
insertSupplyLine(facility, supervisoryNode2, malaria);
insertSupplyLine(facility, supervisoryNode, malaria);
insertSupplyLine(facility, supervisoryNode2, program);
insertSupplyLine(facility, supervisoryNode3, malaria);
Integer count = mapper.getSearchedSupplyLinesCount(searchParam, column);
assertThat(count, is(3));
}
}