package org.openlmis.distribution.domain;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;
import org.openlmis.core.domain.Facility;
import org.openlmis.core.domain.FacilityProgramProduct;
import org.openlmis.core.domain.ProductGroup;
import org.openlmis.core.domain.ProgramSupported;
import org.openlmis.db.categories.UnitTests;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;
import java.util.Date;
import java.util.List;
import static java.util.Arrays.asList;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.powermock.api.mockito.PowerMockito.*;
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(BlockJUnit4ClassRunner.class)
@Category(UnitTests.class)
@PrepareForTest(FacilityProgramProduct.class)
public class EpiUseTest {
@Test
public void shouldNotGetProductGroupForAllInactiveProducts() throws Exception {
Facility facility = new Facility(2L);
ProgramSupported programSupported = new ProgramSupported(1L, true, new Date());
FacilityProgramProduct facilityProgramProduct1 = mock(FacilityProgramProduct.class);
FacilityProgramProduct facilityProgramProduct2 = mock(FacilityProgramProduct.class);
when(facilityProgramProduct1.getActiveProductGroup()).thenReturn(new ProductGroup("PG1", "PG1"));
when(facilityProgramProduct2.getActiveProductGroup()).thenReturn(null);
List<FacilityProgramProduct> programProducts = asList(facilityProgramProduct1, facilityProgramProduct2);
programSupported.setProgramProducts(programProducts);
facility.setSupportedPrograms(asList(programSupported));
mockStatic(FacilityProgramProduct.class);
when(FacilityProgramProduct.filterActiveProducts(programProducts)).thenReturn(programProducts);
FacilityVisit facilityVisit = new FacilityVisit();
EpiUse epiUse = new EpiUse(facility, facilityVisit);
List<EpiUseLineItem> lineItems = epiUse.getLineItems();
assertThat(lineItems.size(), is(1));
assertThat(lineItems.get(0).getProductGroup().getCode(), is("PG1"));
assertThat(lineItems.get(0).getProductGroup().getName(), is("PG1"));
}
@Test
public void shouldSortLineItemsByProductGroupCode() throws Exception {
Facility facility = new Facility(2L);
ProgramSupported programSupported = new ProgramSupported(1L, true, new Date());
FacilityProgramProduct facilityProgramProduct1 = mock(FacilityProgramProduct.class);
FacilityProgramProduct facilityProgramProduct2 = mock(FacilityProgramProduct.class);
FacilityProgramProduct facilityProgramProduct3 = mock(FacilityProgramProduct.class);
ProductGroup productGroup1 = new ProductGroup("PG3", "PG3");
ProductGroup productGroup2 = new ProductGroup("PG1", "PG1");
when(facilityProgramProduct1.getActiveProductGroup()).thenReturn(productGroup1);
when(facilityProgramProduct2.getActiveProductGroup()).thenReturn(null);
when(facilityProgramProduct3.getActiveProductGroup()).thenReturn(productGroup2);
List<FacilityProgramProduct> programProducts = asList(facilityProgramProduct1, facilityProgramProduct2, facilityProgramProduct3);
programSupported.setProgramProducts(programProducts);
facility.setSupportedPrograms(asList(programSupported));
mockStatic(FacilityProgramProduct.class);
when(FacilityProgramProduct.filterActiveProducts(programProducts)).thenReturn(programProducts);
FacilityVisit facilityVisit = new FacilityVisit();
EpiUse epiUse = new EpiUse(facility, facilityVisit);
List<EpiUseLineItem> lineItems = epiUse.getLineItems();
assertThat(lineItems.size(), is(2));
assertThat(lineItems.get(0).getProductGroup().getCode(), is(productGroup2.getCode()));
assertThat(lineItems.get(0).getProductGroup().getName(), is(productGroup2.getName()));
assertThat(lineItems.get(1).getProductGroup().getCode(), is(productGroup1.getCode()));
assertThat(lineItems.get(1).getProductGroup().getName(), is(productGroup1.getName()));
}
}