package org.openlmis.core.model.repository; 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.exceptions.LMISException; import org.openlmis.core.model.Product; import org.openlmis.core.model.Product.IsKit; import org.openlmis.core.model.Program; import org.openlmis.core.model.builder.ProgramBuilder; import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; import java.util.List; import roboguice.RoboGuice; import static junit.framework.Assert.assertTrue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; @RunWith(LMISTestRunner.class) public class ProgramRepositoryTest extends LMISRepositoryUnitTest { ProgramRepository programRepository; ProductRepository productRepository; ArrayList<Product> products = new ArrayList<>(); @Before public void setup() throws LMISException { programRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(ProgramRepository.class); productRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(ProductRepository.class); Product product = new Product(); product.setCode("test code"); product.setPrimaryName("Test Product"); product.setStrength("200"); product.setActive(true); productRepository.createOrUpdate(product); products.add(product); } @Test public void shouldSaveProgramWithProductsSuccessful() throws LMISException { //given Program program = new Program(); program.setProgramCode("TB"); program.setProgramName("TB"); program.setProducts(products); ArrayList<Program> programs = new ArrayList<Program>(); programs.add(program); //when add new program and products programRepository.createOrUpdateProgramWithProduct(programs); //then assertThat(programRepository.list().size(), is(11)); // 10 initialized programs + 1 new TB assertThat(productRepository.listActiveProducts(IsKit.No).size(), is(1)); //when add product to existing program Product newProduct = new Product(); newProduct.setCode("new product code"); newProduct.setPrimaryName("Test Product2"); newProduct.setActive(true); products.add(newProduct); programRepository.createOrUpdateProgramWithProduct(programs); //then assertThat(programRepository.list().size(), is(11)); // 10 initialized programs + 1 new TB assertThat(productRepository.listActiveProducts(IsKit.No).size(), is(2)); assertThat(productRepository.listActiveProducts(IsKit.No).get(1).getPrimaryName(), is("Test Product2")); //when createOrUpdateWithItems existing product newProduct.setPrimaryName("Test Product2 Updated"); programRepository.createOrUpdateProgramWithProduct(programs); //then assertThat(programRepository.list().size(), is(11)); // 10 initialized programs + 1 new TB assertThat(productRepository.listActiveProducts(IsKit.No).size(), is(2)); assertThat(productRepository.listActiveProducts(IsKit.No).get(1).getPrimaryName(), is("Test Product2 Updated")); } @Test public void shouldQueryProgramIdsByProgramCodeOrParentCode() throws Exception { insertProgram("MMIA", "MMIA Program", null); insertProgram("PTV", "ptv Program", "MMIA"); insertProgram("TARV", "tarv Program", "MMIA"); insertProgram("VIA", "VIA Program", null); insertProgram("TB", "Nutrition Program", "VIA"); List<Long> viaProgramIds = programRepository.queryProgramIdsByProgramCodeOrParentCode("VIA"); List<Long> mmiaProgramIds = programRepository.queryProgramIdsByProgramCodeOrParentCode("MMIA"); assertThat(viaProgramIds.size(), is(7)); // 6 initialized VIA programs + TB assertThat(mmiaProgramIds.size(), is(3)); // TARV + PTV + MMIA } @Test public void shouldQueryProgramCodesByProgramCodeOrParentCode() throws Exception { insertProgram("MMIA", "MMIA Program", null); insertProgram("PTV", "ptv Program", "MMIA"); insertProgram("TARV", "tarv Program", "MMIA"); insertProgram("VIA", "VIA Program", null); insertProgram("TB", "Nutrition Program", "VIA"); List<String> viaProgramCodes = programRepository.queryProgramCodesByProgramCodeOrParentCode("VIA"); List<String> mmiaProgramCodes = programRepository.queryProgramCodesByProgramCodeOrParentCode("MMIA"); assertThat(viaProgramCodes.size(), is(7)); assertTrue(viaProgramCodes.contains("TB")); assertThat(mmiaProgramCodes.size(), is(3)); assertTrue(mmiaProgramCodes.contains("PTV") && mmiaProgramCodes.contains("MMIA")); } private void insertProgram(String programCode, String programName, String parentCode) throws LMISException { Program program = new ProgramBuilder() .setProgramCode(programCode) .setProgramName(programName) .setParentCode(parentCode).build(); programRepository.createOrUpdate(program); } }