package org.openlmis.distribution.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.domain.*;
import org.openlmis.core.repository.mapper.*;
import org.openlmis.db.categories.IntegrationTests;
import org.openlmis.distribution.domain.Distribution;
import org.openlmis.distribution.domain.Facilitator;
import org.openlmis.distribution.domain.FacilityVisit;
import org.openlmis.distribution.domain.ReasonForNotVisiting;
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 java.util.Arrays.asList;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.openlmis.core.builder.DeliveryZoneBuilder.defaultDeliveryZone;
import static org.openlmis.core.builder.FacilityBuilder.code;
import static org.openlmis.core.builder.FacilityBuilder.defaultFacility;
import static org.openlmis.core.builder.ProcessingPeriodBuilder.defaultProcessingPeriod;
import static org.openlmis.core.builder.ProcessingPeriodBuilder.scheduleId;
import static org.openlmis.core.builder.ProcessingScheduleBuilder.defaultProcessingSchedule;
import static org.openlmis.core.builder.ProgramBuilder.defaultProgram;
import static org.openlmis.distribution.builder.DistributionBuilder.*;
@Category(IntegrationTests.class)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:test-applicationContext-distribution.xml")
@TransactionConfiguration(defaultRollback = true, transactionManager = "openLmisTransactionManager")
@Transactional
public class FacilityVisitMapperIT {
@Autowired
FacilityVisitMapper mapper;
@Autowired
FacilityMapper facilityMapper;
@Autowired
DistributionMapper distributionMapper;
@Autowired
private ProcessingScheduleMapper scheduleMapper;
@Autowired
DeliveryZoneMapper deliveryZoneMapper;
@Autowired
ProgramMapper programMapper;
@Autowired
ProcessingPeriodMapper periodMapper;
DeliveryZone zone;
Program program1;
ProcessingPeriod processingPeriod;
Facility facility;
Distribution distribution;
@Before
public void setUp() throws Exception {
zone = make(a(defaultDeliveryZone));
program1 = make(a(defaultProgram));
ProcessingSchedule schedule = make(a(defaultProcessingSchedule));
scheduleMapper.insert(schedule);
processingPeriod = make(a(defaultProcessingPeriod, with(scheduleId, schedule.getId())));
deliveryZoneMapper.insert(zone);
programMapper.insert(program1);
periodMapper.insert(processingPeriod);
facility = make(a(defaultFacility));
facilityMapper.insert(facility);
distribution = make(a(initiatedDistribution,
with(deliveryZone, zone),
with(period, processingPeriod),
with(program, program1)));
distributionMapper.insert(distribution);
}
@Test
public void shouldInsertFacilityVisit() {
FacilityVisit facilityVisit = new FacilityVisit(facility, distribution);
mapper.insert(facilityVisit);
FacilityVisit actualFacilityVisit = mapper.getBy(facilityVisit.getFacilityId(), facilityVisit.getDistributionId());
facilityVisit.setSynced(false);
assertThat(actualFacilityVisit, is(facilityVisit));
assertThat(actualFacilityVisit.getCreatedBy(), is(1l));
}
@Test
public void shouldUpdateFacilityVisit() {
FacilityVisit facilityVisit = new FacilityVisit(facility, distribution);
Facilitator confirmedBy = new Facilitator("Barack", "President");
Facilitator verifiedBy = new Facilitator("ManMohan", "Spectator");
facilityVisit.setReasonForNotVisiting(ReasonForNotVisiting.OTHER);
facilityVisit.setOtherReasonDescription("Manmohan will not be PM again");
mapper.insert(facilityVisit);
facilityVisit.setConfirmedBy(confirmedBy);
facilityVisit.setVerifiedBy(verifiedBy);
facilityVisit.setObservations("I observed something");
mapper.update(facilityVisit);
FacilityVisit actualFacilityVisit = mapper.getBy(facility.getId(), distribution.getId());
assertThat(actualFacilityVisit, is(facilityVisit));
}
@Test
public void shouldGetFacilityVisitById() {
FacilityVisit facilityVisit = new FacilityVisit(facility, distribution);
mapper.insert(facilityVisit);
FacilityVisit savedFacilityVisit = mapper.getById(facilityVisit.getId());
facilityVisit.setSynced(false);
assertThat(savedFacilityVisit, is(facilityVisit));
}
@Test
public void shouldGetFacilityVisitsWhichAreNotSyncedYet() {
FacilityVisit facilityVisit1 = new FacilityVisit(facility, distribution);
mapper.insert(facilityVisit1);
facilityVisit1.setSynced(true);
mapper.update(facilityVisit1);
Facility facility1 = make(a(defaultFacility, with(code, "F999")));
facilityMapper.insert(facility1);
FacilityVisit facilityVisit2 = new FacilityVisit(facility1, distribution);
facilityVisit2.setSynced(false);
mapper.insert(facilityVisit2);
List<FacilityVisit> unSyncedFacilities = mapper.getUnSyncedFacilities(distribution.getId());
assertThat(unSyncedFacilities, is(asList(facilityVisit2)));
}
@Test
public void shouldGetCountOfUnsyncedFacilities() {
FacilityVisit facilityVisit1 = new FacilityVisit(facility, distribution);
mapper.insert(facilityVisit1);
facilityVisit1.setSynced(true);
mapper.update(facilityVisit1);
Facility facility1 = make(a(defaultFacility, with(code, "F999")));
facilityMapper.insert(facility1);
FacilityVisit facilityVisit2 = new FacilityVisit(facility1, distribution);
facilityVisit2.setSynced(false);
mapper.insert(facilityVisit2);
Integer unsyncedFacilityCountForDistribution = mapper.getUnsyncedFacilityCountForDistribution(distribution.getId());
assertThat(unsyncedFacilityCountForDistribution, is(1));
}
}