package org.openlmis.core.model;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openlmis.core.LMISTestApp;
import org.openlmis.core.LMISTestRunner;
import org.openlmis.core.model.Product.IsKit;
import org.openlmis.core.model.builder.ProductBuilder;
import org.openlmis.core.model.builder.RnrFormItemBuilder;
import org.openlmis.core.utils.Constants;
import org.openlmis.core.utils.DateUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.roboguice.shaded.goole.common.collect.Lists.newArrayList;
@RunWith(LMISTestRunner.class)
public class RnRFormTest {
private RnRForm rnRForm;
@Before
public void setUp() throws Exception {
rnRForm = new RnRForm();
}
@Test
public void shouldReturnListWithDeactivatedItemsWhenDeactivateProgramToggleOn() {
Product activeSupportedProduct = new ProductBuilder().setCode("P1").setIsActive(true).build();
Product inactiveProduct = new ProductBuilder().setCode("P2").setIsActive(false).build();
Product unsupportedProduct = new ProductBuilder().setCode("P3").setIsActive(true).build();
RnrFormItem activeRnrProduct = new RnrFormItemBuilder().setProduct(activeSupportedProduct).build();
RnrFormItem inactiveRnrProduct = new RnrFormItemBuilder().setProduct(inactiveProduct).build();
RnrFormItem unsupportedRnrProduct = new RnrFormItemBuilder().setProduct(unsupportedProduct).build();
rnRForm.setRnrFormItemListWrapper(newArrayList(activeRnrProduct, inactiveRnrProduct, unsupportedRnrProduct));
List<RnrFormItem> rnrFormDeactivatedItemList = rnRForm.getDeactivatedAndUnsupportedProductItems(Arrays.asList("P1", "P2"));
assertEquals(2, rnrFormDeactivatedItemList.size());
assertEquals(false, rnrFormDeactivatedItemList.get(0).getProduct().isActive());
}
@Test
public void shouldGetNonKitFormItemAndKitFormItem() throws Exception {
Product kitProduct = new ProductBuilder().setIsActive(true).setIsKit(true).setCode("kit").build();
Product product = new ProductBuilder().setIsActive(true).setIsKit(false).setCode("product").build();
RnrFormItem kitRnrProduct = new RnrFormItemBuilder().setProduct(kitProduct).build();
RnrFormItem rnrProduct = new RnrFormItemBuilder().setProduct(product).build();
rnRForm.setRnrFormItemListWrapper(newArrayList(rnrProduct, kitRnrProduct));
List<RnrFormItem> rnrNonKitItems = rnRForm.getRnrItems(IsKit.No);
assertEquals(1, rnrNonKitItems.size());
assertFalse(rnrNonKitItems.get(0).getProduct().isKit());
List<RnrFormItem> rnrKitItems = rnRForm.getRnrItems(IsKit.Yes);
assertEquals(1, rnrKitItems.size());
assertTrue(rnrKitItems.get(0).getProduct().isKit());
}
@Test
public void shouldGenerateRnRFromByLastPeriod() throws Exception {
Date generateDate = DateUtil.parseString("10/06/2015", DateUtil.SIMPLE_DATE_FORMAT);
RnRForm rnRForm = RnRForm.init(new Program(), generateDate);
assertThat(DateUtil.formatDate(rnRForm.getPeriodBegin(), DateUtil.SIMPLE_DATE_FORMAT), is("21/05/2015"));
assertThat(DateUtil.formatDate(rnRForm.getPeriodEnd(), DateUtil.SIMPLE_DATE_FORMAT), is("20/06/2015"));
generateDate = DateUtil.parseString("30/05/2015", DateUtil.SIMPLE_DATE_FORMAT);
rnRForm = RnRForm.init(new Program(), generateDate);
assertThat(DateUtil.formatDate(rnRForm.getPeriodBegin(), DateUtil.SIMPLE_DATE_FORMAT), is("21/05/2015"));
assertThat(DateUtil.formatDate(rnRForm.getPeriodEnd(), DateUtil.SIMPLE_DATE_FORMAT), is("20/06/2015"));
generateDate = DateUtil.parseString("25/01/2015", DateUtil.SIMPLE_DATE_FORMAT);
rnRForm = RnRForm.init(new Program(), generateDate);
assertThat(DateUtil.formatDate(rnRForm.getPeriodBegin(), DateUtil.SIMPLE_DATE_FORMAT), is("21/12/2014"));
assertThat(DateUtil.formatDate(rnRForm.getPeriodEnd(), DateUtil.SIMPLE_DATE_FORMAT), is("20/01/2015"));
}
@Test
public void shouldGenerateRnRFromByCurrentPeriod() throws Exception {
Date generateDate = DateUtil.parseString("30/06/2015", DateUtil.SIMPLE_DATE_FORMAT);
RnRForm rnRForm = RnRForm.init(new Program(), generateDate);
assertThat(DateUtil.formatDate(rnRForm.getPeriodBegin(), DateUtil.SIMPLE_DATE_FORMAT), is("21/06/2015"));
assertThat(DateUtil.formatDate(rnRForm.getPeriodEnd(), DateUtil.SIMPLE_DATE_FORMAT), is("20/07/2015"));
generateDate = DateUtil.parseString("05/07/2015", DateUtil.SIMPLE_DATE_FORMAT);
rnRForm = RnRForm.init(new Program(), generateDate);
assertThat(DateUtil.formatDate(rnRForm.getPeriodBegin(), DateUtil.SIMPLE_DATE_FORMAT), is("21/06/2015"));
assertThat(DateUtil.formatDate(rnRForm.getPeriodEnd(), DateUtil.SIMPLE_DATE_FORMAT), is("20/07/2015"));
generateDate = DateUtil.parseString("28/12/2015", DateUtil.SIMPLE_DATE_FORMAT);
rnRForm = RnRForm.init(new Program(), generateDate);
assertThat(DateUtil.formatDate(rnRForm.getPeriodBegin(), DateUtil.SIMPLE_DATE_FORMAT), is("21/12/2015"));
assertThat(DateUtil.formatDate(rnRForm.getPeriodEnd(), DateUtil.SIMPLE_DATE_FORMAT), is("20/01/2016"));
}
@Test
public void shouldInitFormMissedStatusWhenHasMissed() throws Exception {
Program program = new Program();
program.setId(123);
program.setProgramCode(Constants.MMIA_PROGRAM_CODE);
DateTime periodBegin = new DateTime(DateUtil.parseString("2015-06-21 10:10:10", DateUtil.DATE_TIME_FORMAT));
DateTime periodEnd = new DateTime(DateUtil.parseString("2015-07-21 11:11:11", DateUtil.DATE_TIME_FORMAT));
LMISTestApp.getInstance().setCurrentTimeMillis(DateUtil.parseString("2015-07-26 10:10:10", DateUtil.DATE_TIME_FORMAT).getTime());
RnRForm form = RnRForm.init(program, new Period(periodBegin, periodEnd), false);
assertTrue(form.isMissed());
LMISTestApp.getInstance().setCurrentTimeMillis(DateUtil.parseString("2015-07-25 10:10:10", DateUtil.DATE_TIME_FORMAT).getTime());
form = RnRForm.init(program, new Period(periodBegin, periodEnd), false);
assertFalse(form.isMissed());
LMISTestApp.getInstance().setCurrentTimeMillis(DateUtil.parseString("2015-06-25 10:10:10", DateUtil.DATE_TIME_FORMAT).getTime());
form = RnRForm.init(program, new Period(periodBegin, periodEnd), false);
assertFalse(form.isMissed());
}
@Test
public void shouldInitEmergencyForm() throws Exception {
Program program = new Program();
program.setId(123);
program.setProgramCode(Constants.MMIA_PROGRAM_CODE);
DateTime periodBegin = new DateTime(DateUtil.parseString("2015-06-21 10:10:10", DateUtil.DATE_TIME_FORMAT));
DateTime periodEnd = new DateTime(DateUtil.parseString("2015-07-21 11:11:11", DateUtil.DATE_TIME_FORMAT));
LMISTestApp.getInstance().setCurrentTimeMillis(DateUtil.parseString("2015-07-26 10:10:10", DateUtil.DATE_TIME_FORMAT).getTime());
RnRForm form = RnRForm.init(program, new Period(periodBegin, periodEnd), true);
assertFalse(form.isMissed());
assertTrue(form.isEmergency());
}
@Test
public void shouldSortRnrFormItemByProductCode() throws Exception {
List<RnrFormItem> rnrFormItems = new ArrayList<>();
rnrFormItems.add(generateRnrFormItem("03A02", false));
rnrFormItems.add(generateRnrFormItem("01A02", false));
rnrFormItems.add(generateRnrFormItem("10B02", false));
rnRForm.setStatus(RnRForm.STATUS.AUTHORIZED);
rnRForm.setRnrFormItemListWrapper(rnrFormItems);
List<RnrFormItem> sortedRnrFormItems = rnRForm.getRnrFormItemListWrapper();
assertEquals("01A02", sortedRnrFormItems.get(0).getProduct().getCode());
assertEquals("03A02", sortedRnrFormItems.get(1).getProduct().getCode());
assertEquals("10B02", sortedRnrFormItems.get(2).getProduct().getCode());
}
@Test
public void shouldSortRnrByCategoryFirst() throws Exception {
List<RnrFormItem> rnrFormItems = new ArrayList<>();
rnrFormItems.add(generateRnrFormItem("A3", false));
rnrFormItems.add(generateRnrFormItem("B3", true));
rnrFormItems.add(generateRnrFormItem("B1", false));
rnrFormItems.add(generateRnrFormItem("A2", true));
rnrFormItems.add(generateRnrFormItem("B2", false));
rnrFormItems.add(generateRnrFormItem("A1", false));
rnRForm.setStatus(RnRForm.STATUS.DRAFT);
rnRForm.setRnrFormItemListWrapper(rnrFormItems);
List<RnrFormItem> sortedRnrFormItems = rnRForm.getRnrFormItemListWrapper();
assertEquals("A1", sortedRnrFormItems.get(0).getProduct().getCode());
assertEquals("A3", sortedRnrFormItems.get(1).getProduct().getCode());
assertEquals("B1", sortedRnrFormItems.get(2).getProduct().getCode());
assertEquals("B2", sortedRnrFormItems.get(3).getProduct().getCode());
assertEquals("A2", sortedRnrFormItems.get(4).getProduct().getCode());
assertEquals("B3", sortedRnrFormItems.get(5).getProduct().getCode());
}
private RnrFormItem generateRnrFormItem(String productCode, boolean manualAdd) {
return new RnrFormItemBuilder().setProduct(new ProductBuilder().setCode(productCode).build()).setManualAdd(manualAdd).build();
}
@Test
public void shouldAddSignature() throws Exception {
rnRForm.setStatus(RnRForm.STATUS.DRAFT);
rnRForm.addSignature("signature1");
assertEquals(RnRForm.STATUS.SUBMITTED, rnRForm.getStatus());
assertEquals(rnRForm.getSignaturesWrapper().get(0).getSignature(), "signature1");
rnRForm.addSignature("signature2");
assertEquals(RnRForm.STATUS.AUTHORIZED, rnRForm.getStatus());
assertEquals(rnRForm.getSignaturesWrapper().get(1).getSignature(), "signature2");
rnRForm = new RnRForm();
rnRForm.setStatus(RnRForm.STATUS.DRAFT_MISSED);
rnRForm.addSignature("signature1");
assertEquals(RnRForm.STATUS.SUBMITTED_MISSED, rnRForm.getStatus());
assertEquals(rnRForm.getSignaturesWrapper().get(0).getSignature(), "signature1");
rnRForm.addSignature("signature2");
assertEquals(RnRForm.STATUS.AUTHORIZED, rnRForm.getStatus());
assertEquals(rnRForm.getSignaturesWrapper().get(1).getSignature(), "signature2");
}
}