package org.openlmis.core.model.repository;
import com.google.inject.AbstractModule;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openlmis.core.LMISRepositoryUnitTest;
import org.openlmis.core.LMISTestRunner;
import org.openlmis.core.model.ProductProgram;
import org.openlmis.core.model.builder.ProductBuilder;
import org.openlmis.core.model.builder.ProductProgramBuilder;
import org.robolectric.RuntimeEnvironment;
import java.util.Arrays;
import java.util.List;
import roboguice.RoboGuice;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static org.assertj.core.util.Lists.newArrayList;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyList;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(LMISTestRunner.class)
public class ProductProgramRepositoryTest extends LMISRepositoryUnitTest {
private ProductProgramRepository repository;
private ProductRepository productRepository;
@Before
public void setUp() throws Exception {
productRepository = mock(ProductRepository.class);
RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new AbstractModule() {
@Override
protected void configure() {
bind(ProductRepository.class).toInstance(productRepository);
}
});
repository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(ProductProgramRepository.class);
}
@Test
public void shouldBatchSaveAndQueryProductPrograms() throws Exception {
List<ProductProgram> productPrograms = Arrays.asList(
new ProductProgramBuilder().setProgramCode("PR1").setProductCode("P1").setActive(true).build(),
new ProductProgramBuilder().setProgramCode("PR1").setProductCode("P2").setActive(false).build(),
new ProductProgramBuilder().setProgramCode("PR2").setProductCode("P1").setActive(true).build()
);
repository.batchSave(productPrograms);
ProductProgram productProgram = repository.queryByCode("P2", "PR1");
assertFalse(productProgram.isActive());
}
@Test
public void shouldNotCreateDuplicateProductProgram() throws Exception {
List<ProductProgram> productPrograms = Arrays.asList(
new ProductProgramBuilder().setProgramCode("PR1").setProductCode("P1").setActive(true).build(),
new ProductProgramBuilder().setProgramCode("PR1").setProductCode("P1").setActive(false).build()
);
repository.batchSave(productPrograms);
assertEquals(1, repository.listAll().size());
ProductProgram productProgram = repository.queryByCode("P1", "PR1");
assertFalse(productProgram.isActive());
}
@Test
public void shouldListActiveProductProgramsByProgramCode() throws Exception {
List<ProductProgram> productPrograms = Arrays.asList(
new ProductProgramBuilder().setProgramCode("PR1").setProductCode("P1").setActive(true).build(),
new ProductProgramBuilder().setProgramCode("PR2").setProductCode("P1").setActive(false).build()
);
repository.batchSave(productPrograms);
List<ProductProgram> queriedProductPrograms = repository.listActiveProductProgramsByProgramCodes(Arrays.asList("PR1", "PR2"));
assertEquals(1, queriedProductPrograms.size());
assertEquals("PR1", queriedProductPrograms.get(0).getProgramCode());
}
@Test
public void shouldQueryActiveProductIdsByProgramsWithKits() throws Exception {
List<ProductProgram> productPrograms = Arrays.asList(
new ProductProgramBuilder().setProgramCode("PR1").setProductCode("P1").setActive(true).build(),
new ProductProgramBuilder().setProgramCode("PR1").setProductCode("P2").setActive(false).build(),
new ProductProgramBuilder().setProgramCode("PR2").setProductCode("P1").setActive(true).build()
);
repository.batchSave(productPrograms);
when(productRepository.queryActiveProductsByCodesWithKits(anyList(), anyBoolean())).thenReturn(newArrayList(
new ProductBuilder().setCode("P1").setProductId(100L).build()
));
List<Long> productIds = repository.queryActiveProductIdsByProgramsWithKits(newArrayList("PR1"), false);
assertThat(productIds.size(), is(1));
assertThat(productIds.get(0), is(100L));
}
@Test
public void shouldQueryByProgramCodesAndProductCode() throws Exception {
List<ProductProgram> productPrograms = Arrays.asList(
new ProductProgramBuilder().setProgramCode("PR1").setProductCode("P1").build(),
new ProductProgramBuilder().setProgramCode("PR1").setProductCode("P2").build(),
new ProductProgramBuilder().setProgramCode("PR2").setProductCode("P1").build()
);
repository.batchSave(productPrograms);
List<String> programCodes = newArrayList("PR1", "PR2");
ProductProgram productProgram = repository.queryByCode("P1", programCodes);
assertEquals(productProgram.getProductCode(), "P1");
assertEquals(productProgram.getProgramCode(), "PR1");
}
@Test
public void shouldCreateOrUpdateProductPrograms() throws Exception {
List<ProductProgram> productPrograms = Arrays.asList(
new ProductProgramBuilder().setProgramCode("PR1").setProductCode("P1").setCategory("Adult").build(),
new ProductProgramBuilder().setProgramCode("PR1").setProductCode("P2").setCategory("Children").build(),
new ProductProgramBuilder().setProgramCode("PR2").setProductCode("P1").setCategory("Adult").build()
);
repository.batchSave(productPrograms);
ProductProgram updateProductPrograms =
new ProductProgramBuilder().setProgramCode("PR1").setProductCode("P1").setCategory("Other").build();
repository.createOrUpdate(updateProductPrograms);
ProductProgram queriedProductProgram = repository.queryByCode("P1", "PR1");
assertEquals(queriedProductProgram.getCategory(), "Other");
}
}