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.exceptions.LMISException; import org.openlmis.core.model.Program; import org.openlmis.core.model.ProgramDataForm; import org.openlmis.core.model.ProgramDataFormItem; import org.openlmis.core.model.ProgramDataFormSignature; import org.openlmis.core.model.Signature; import org.openlmis.core.model.builder.ProgramDataColumnBuilder; import org.openlmis.core.model.builder.ProgramDataFormBuilder; import org.openlmis.core.utils.DateUtil; import org.robolectric.RuntimeEnvironment; import java.util.List; import roboguice.RoboGuice; import static junit.framework.Assert.assertNull; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(LMISTestRunner.class) public class ProgramDataFormRepositoryTest extends LMISRepositoryUnitTest { private ProgramRepository mockProgramRepository; private ProgramDataFormRepository programDataFormRepository; private Program programRapidTest; @Before public void setup() throws LMISException { mockProgramRepository = mock(ProgramRepository.class); RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new MyTestModule()); programDataFormRepository = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(ProgramDataFormRepository.class); programRapidTest = new Program("RapidTest", "Rapid Test", null, false, null); programRapidTest.setId(1L); } public class MyTestModule extends AbstractModule { @Override protected void configure() { bind(ProgramRepository.class).toInstance(mockProgramRepository); } } @Test public void shouldSaveProgramDataFormsAndListAllProgramDataForms() throws Exception { ProgramDataForm programDataForm1 = new ProgramDataFormBuilder() .setPeriod(DateUtil.parseString("2016-09-23", DateUtil.DB_DATE_FORMAT)) .setStatus(ProgramDataForm.STATUS.SUBMITTED) .setProgram(programRapidTest) .setSignatures("signature", ProgramDataFormSignature.TYPE.SUBMITTER) .build(); ProgramDataFormItem dataFormItem1 = new ProgramDataFormItem("name1", new ProgramDataColumnBuilder().setCode("POSITIVE_SYPHILLIS").build(), 1); ProgramDataFormItem dataFormItem2 = new ProgramDataFormItem("name2", new ProgramDataColumnBuilder().setCode("CONSUME_SYPHILLIS").build(), 9); dataFormItem1.setForm(programDataForm1); dataFormItem2.setForm(programDataForm1); programDataForm1.getProgramDataFormItemListWrapper().add(dataFormItem1); programDataForm1.getProgramDataFormItemListWrapper().add(dataFormItem2); ProgramDataForm programDataForm2 = new ProgramDataFormBuilder() .setPeriod(DateUtil.parseString("2016-10-23", DateUtil.DB_DATE_FORMAT)) .setProgram(programRapidTest) .setStatus(ProgramDataForm.STATUS.SUBMITTED) .build(); programDataFormRepository.batchCreateOrUpdate(programDataForm1); programDataFormRepository.batchCreateOrUpdate(programDataForm2); when(mockProgramRepository.queryByCode("RapidTest")).thenReturn(programRapidTest); List<ProgramDataForm> programDataFormRetrieved = programDataFormRepository.listByProgramCode("RapidTest"); assertThat(programDataFormRetrieved.get(0).getPeriodBegin(), is(programDataForm1.getPeriodBegin())); assertThat(programDataFormRetrieved.get(0).getPeriodEnd(), is(programDataForm1.getPeriodEnd())); assertThat(programDataFormRetrieved.get(0).getProgramDataFormItemListWrapper().get(0).getName(), is("name1")); assertThat(programDataFormRetrieved.get(0).getProgramDataFormItemListWrapper().get(0).getProgramDataColumn().getCode(), is("POSITIVE_SYPHILLIS")); assertThat(programDataFormRetrieved.get(0).getProgramDataFormItemListWrapper().get(0).getValue(), is(1)); assertThat(programDataFormRetrieved.get(0).getProgramDataFormItemListWrapper().get(1).getName(), is("name2")); assertThat(programDataFormRetrieved.get(0).getProgramDataFormItemListWrapper().get(1).getProgramDataColumn().getCode(), is("CONSUME_SYPHILLIS")); assertThat(programDataFormRetrieved.get(0).getProgramDataFormItemListWrapper().get(1).getValue(), is(9)); assertThat(programDataFormRetrieved.get(0).getSignaturesWrapper().get(0).getSignature(), is("signature")); assertThat(programDataFormRetrieved.get(0).getSignaturesWrapper().get(0).getType(), is(Signature.TYPE.SUBMITTER)); assertThat(programDataFormRetrieved.get(1).getPeriodBegin(), is(programDataForm2.getPeriodBegin())); assertThat(programDataFormRetrieved.get(1).getStatus(), is(programDataForm2.getStatus())); List<ProgramDataForm> programDataNonExist = programDataFormRepository.listByProgramCode("Some other program"); assertThat(programDataNonExist.size(), is(0)); //update programDataForm1.setStatus(ProgramDataForm.STATUS.AUTHORIZED); programDataForm1.setPeriodBegin(DateUtil.parseString("2015-09-30", DateUtil.DB_DATE_FORMAT)); programDataForm1.getProgramDataFormItemListWrapper().clear(); ProgramDataFormItem dataFormItem3 = new ProgramDataFormItem("name3", new ProgramDataColumnBuilder().setCode("POSITIVE_MALARIA").build(), 100); ProgramDataFormItem dataFormItem4 = new ProgramDataFormItem("name4", new ProgramDataColumnBuilder().setCode("CONSUME_MALARIA").build(), 900); dataFormItem3.setForm(programDataForm1); dataFormItem4.setForm(programDataForm1); programDataForm1.getProgramDataFormItemListWrapper().add(dataFormItem3); programDataForm1.getProgramDataFormItemListWrapper().add(dataFormItem4); programDataFormRepository.batchCreateOrUpdate(programDataForm1); List<ProgramDataForm> programDataFormRetrievedAfterRevision = programDataFormRepository.listByProgramCode("RapidTest"); assertThat(programDataFormRetrievedAfterRevision.get(0).getPeriodBegin(), is(programDataForm1.getPeriodBegin())); assertThat(programDataFormRetrievedAfterRevision.get(0).getStatus(), is(ProgramDataForm.STATUS.AUTHORIZED)); assertThat(programDataFormRetrievedAfterRevision.get(0).getProgramDataFormItemListWrapper().size(), is(2)); assertThat(programDataFormRetrievedAfterRevision.get(0).getProgramDataFormItemListWrapper().get(0).getName(), is("name3")); assertThat(programDataFormRetrievedAfterRevision.get(0).getProgramDataFormItemListWrapper().get(0).getProgramDataColumn().getCode(), is("POSITIVE_MALARIA")); assertThat(programDataFormRetrievedAfterRevision.get(0).getProgramDataFormItemListWrapper().get(0).getValue(), is(100)); assertThat(programDataFormRetrievedAfterRevision.get(0).getProgramDataFormItemListWrapper().get(1).getName(), is("name4")); assertThat(programDataFormRetrievedAfterRevision.get(0).getProgramDataFormItemListWrapper().get(1).getProgramDataColumn().getCode(), is("CONSUME_MALARIA")); assertThat(programDataFormRetrievedAfterRevision.get(0).getProgramDataFormItemListWrapper().get(1).getValue(), is(900)); } @Test public void shouldQueryFormById() throws Exception { ProgramDataForm programDataForm1 = new ProgramDataFormBuilder() .setPeriod(DateUtil.parseString("2016-09-23", DateUtil.DB_DATE_FORMAT)) .setStatus(ProgramDataForm.STATUS.SUBMITTED) .setProgram(programRapidTest) .build(); ProgramDataForm programDataForm2 = new ProgramDataFormBuilder() .setPeriod(DateUtil.parseString("2016-10-23", DateUtil.DB_DATE_FORMAT)) .setProgram(programRapidTest) .setStatus(ProgramDataForm.STATUS.SUBMITTED) .build(); programDataFormRepository.batchCreateOrUpdate(programDataForm1); programDataFormRepository.batchCreateOrUpdate(programDataForm2); when(mockProgramRepository.queryByCode("RapidTest")).thenReturn(programRapidTest); ProgramDataForm programDataFormQueried1 = programDataFormRepository.queryById(1L); ProgramDataForm programDataFormQueried2 = programDataFormRepository.queryById(2L); assertThat(programDataFormQueried1.getPeriodBegin(), is(programDataForm1.getPeriodBegin())); assertThat(programDataFormQueried1.getPeriodEnd(), is(programDataForm1.getPeriodEnd())); assertThat(programDataFormQueried2.getPeriodBegin(), is(programDataForm2.getPeriodBegin())); assertThat(programDataFormQueried2.getStatus(), is(programDataForm2.getStatus())); } @Test public void shouldListProgramDataItemsByFormId() throws Exception { ProgramDataForm programDataForm1 = new ProgramDataFormBuilder() .setPeriod(DateUtil.parseString("2016-09-23", DateUtil.DB_DATE_FORMAT)) .setStatus(ProgramDataForm.STATUS.SUBMITTED) .setProgram(programRapidTest) .build(); ProgramDataFormItem dataFormItem1 = new ProgramDataFormItem("name1", new ProgramDataColumnBuilder().setCode("POSITIVE_HIVDETERMINE").build(), 1); ProgramDataFormItem dataFormItem2 = new ProgramDataFormItem("name2", new ProgramDataColumnBuilder().setCode("CONSUME_HIVDETERMINE").build(), 9); dataFormItem1.setForm(programDataForm1); dataFormItem2.setForm(programDataForm1); programDataForm1.getProgramDataFormItemListWrapper().add(dataFormItem1); programDataForm1.getProgramDataFormItemListWrapper().add(dataFormItem2); programDataFormRepository.batchCreateOrUpdate(programDataForm1); List<ProgramDataFormItem> programDataFormItemList = programDataFormRepository.listProgramDataItemsByFormId(programDataForm1.getId()); assertEquals(2, programDataFormItemList.size()); assertEquals("name1", programDataFormItemList.get(0).getName()); assertEquals("POSITIVE_HIVDETERMINE", programDataFormItemList.get(0).getProgramDataColumn().getCode()); assertEquals(1, programDataFormItemList.get(0).getValue()); assertEquals("name2", programDataFormItemList.get(1).getName()); assertEquals("CONSUME_HIVDETERMINE", programDataFormItemList.get(1).getProgramDataColumn().getCode()); assertEquals(9, programDataFormItemList.get(1).getValue()); } @Test public void shouldDelete() throws Exception { ProgramDataForm programDataForm1 = new ProgramDataFormBuilder() .setPeriod(DateUtil.parseString("2016-09-23", DateUtil.DB_DATE_FORMAT)) .setStatus(ProgramDataForm.STATUS.SUBMITTED) .setProgram(programRapidTest) .build(); ProgramDataFormItem dataFormItem1 = new ProgramDataFormItem("name1", new ProgramDataColumnBuilder().setCode("POSITIVE_HIVDETERMINE").build(), 1); ProgramDataFormItem dataFormItem2 = new ProgramDataFormItem("name2", new ProgramDataColumnBuilder().setCode("CONSUME_HIVDETERMINE").build(), 9); dataFormItem1.setForm(programDataForm1); dataFormItem2.setForm(programDataForm1); programDataForm1.getProgramDataFormItemListWrapper().add(dataFormItem1); programDataForm1.getProgramDataFormItemListWrapper().add(dataFormItem2); programDataFormRepository.batchCreateOrUpdate(programDataForm1); programDataFormRepository.delete(programDataForm1); assertNull(programDataFormRepository.queryById(programDataForm1.getId())); assertEquals(0, programDataFormRepository.listProgramDataItemsByFormId(programDataForm1.getId()).size()); } }