package org.openlmis.core.model.repository;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openlmis.core.LMISTestRunner;
import org.openlmis.core.exceptions.LMISException;
import org.openlmis.core.model.Cmm;
import org.openlmis.core.model.StockCard;
import org.robolectric.RuntimeEnvironment;
import java.util.List;
import roboguice.RoboGuice;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.*;
@RunWith(LMISTestRunner.class)
public class CmmRepositoryTest {
private CmmRepository cmmRepository;
@Before
public void setup() throws LMISException {
cmmRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(CmmRepository.class);
}
@Test
public void shouldSaveCmm() throws Exception {
//given
Cmm cmm = createDummyCmm("2016-01-21", "2016-02-20", 7788, 123);
assertThat(cmmRepository.list().size(), is(0));
//when
cmmRepository.save(cmm);
//then
assertThat(cmmRepository.list().size(), is(1));
}
@Test
public void shouldUpdateInsteadOfCreateCmmEntryForSameStockCardInSamePeriod() throws LMISException {
//given
Cmm cmm = createDummyCmm("2016-01-21", "2016-02-20", 7788, 123);
//when
cmmRepository.save(cmm);
//then
assertThat(cmmRepository.list().size(), is(1));
assertThat(cmmRepository.list().get(0).getCmmValue(), is(123f));
//when
Cmm cmmOfSameCardSamePeriod = createDummyCmm("2016-01-21", "2016-02-20", 7788, 456);
cmmRepository.save(cmmOfSameCardSamePeriod);
//then
assertThat(cmmRepository.list().size(), is(1));
assertThat(cmmRepository.list().get(0).getCmmValue(), is(456f));
}
@Test
public void shouldSaveSameCardDifferentPeriodCmmsAsSeparateEntries() throws LMISException {
//given
Cmm cmm = createDummyCmm("2016-01-21", "2016-02-20", 7788, 123);
//when
cmmRepository.save(cmm);
//then
assertThat(cmmRepository.list().size(), is(1));
assertThat(cmmRepository.list().get(0).getCmmValue(), is(123f));
//when
Cmm cmmOfSameCardSamePeriod = createDummyCmm("2016-02-21", "2016-03-20", 7788, 456);
cmmRepository.save(cmmOfSameCardSamePeriod);
//then
assertThat(cmmRepository.list().size(), is(2));
assertThat(cmmRepository.list().get(1).getCmmValue(), is(456f));
}
@Test
public void shouldListUnsyncedCmms() throws Exception {
//given
Cmm cmm1 = createDummyCmm("2016-01-21", "2016-02-20", 7788, 123);
Cmm cmm2 = createDummyCmm("2016-01-21", "2016-02-20", 8899, 123);
cmm1.setSynced(true);
cmm2.setSynced(false);
cmmRepository.save(cmm1);
cmmRepository.save(cmm2);
//when
List<Cmm> allCmms = cmmRepository.list();
List<Cmm> unsyncedCmms = cmmRepository.listUnsynced();
//then
assertThat(unsyncedCmms.size(), is(1));
assertThat(allCmms.size(), is(2));
}
private Cmm createDummyCmm(String start, String end, int cardId, int cmmValue) {
StockCard stockCard = new StockCard();
stockCard.setId(cardId);
Cmm cmm = new Cmm();
cmm.setStockCard(stockCard);
cmm.setCmmValue(cmmValue);
cmm.setPeriodBegin(DateTime.parse(start).toDate());
cmm.setPeriodEnd(DateTime.parse(end).toDate());
return cmm;
}
}