package org.openlmis.core.service; import com.google.gson.JsonElement; import com.google.gson.JsonParser; import com.google.inject.AbstractModule; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.openlmis.core.LMISTestRunner; import org.openlmis.core.exceptions.LMISException; import org.openlmis.core.manager.UserInfoMgr; import org.openlmis.core.model.Program; import org.openlmis.core.model.ProgramDataForm; import org.openlmis.core.model.ProgramDataFormItem; import org.openlmis.core.model.Signature; import org.openlmis.core.model.User; import org.openlmis.core.model.builder.ProgramDataColumnBuilder; import org.openlmis.core.model.builder.ProgramDataFormBuilder; import org.openlmis.core.model.repository.ProgramRepository; import org.openlmis.core.network.adapter.ProgramDataFormAdapter; import org.openlmis.core.utils.Constants; import org.openlmis.core.utils.DateUtil; import org.openlmis.core.utils.JsonFileReader; import org.robolectric.RuntimeEnvironment; import roboguice.RoboGuice; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.roboguice.shaded.goole.common.collect.Lists.newArrayList; @RunWith(LMISTestRunner.class) public class ProgramDataFormAdapterTest { private ProgramDataFormAdapter programDataAdapter; private ProgramRepository mockProgramRepository; private Program program; @Before public void setUp() throws LMISException { mockProgramRepository = mock(ProgramRepository.class); RoboGuice.overrideApplicationInjector(RuntimeEnvironment.application, new MyTestModule()); programDataAdapter = RoboGuice.getInjector(RuntimeEnvironment.application).getInstance(ProgramDataFormAdapter.class); UserInfoMgr.getInstance().setUser(new User("user", "password")); program = new Program(); program.setProgramCode(Constants.RAPID_TEST_CODE); when(mockProgramRepository.queryByCode(Constants.RAPID_TEST_CODE)).thenReturn(program); } @Test @Ignore public void shouldDeserializeProgramDataFormJson() throws LMISException { String json = JsonFileReader.readJson(getClass(), "SyncDownRapidTestsResponse.json"); ProgramDataForm programDataForm = programDataAdapter.deserialize(new JsonParser().parse(json), null, null); assertThat(programDataForm.getProgram(), is(program)); assertThat(programDataForm.getPeriodBegin(), is(DateUtil.parseString("2016-02-21", DateUtil.DB_DATE_FORMAT))); assertThat(programDataForm.getPeriodEnd(), is(DateUtil.parseString("2016-03-20", DateUtil.DB_DATE_FORMAT))); assertThat(programDataForm.getStatus(), is(ProgramDataForm.STATUS.AUTHORIZED)); assertThat(programDataForm.isSynced(), is(true)); assertThat(programDataForm.getSubmittedTime(), is(DateUtil.parseString("2016-11-25 12:03:00", DateUtil.DATE_TIME_FORMAT))); assertThat(programDataForm.getProgramDataFormItemListWrapper().size(), is(8)); assertThat(programDataForm.getProgramDataFormItemListWrapper().get(0).getForm(), is(programDataForm)); assertThat(programDataForm.getProgramDataFormItemListWrapper().get(0).getName(), is("PUB_PHARMACY")); assertThat(programDataForm.getProgramDataFormItemListWrapper().get(0).getProgramDataColumn().getCode(), is("HIV-DETERMINE-CONSUME")); assertThat(programDataForm.getProgramDataFormItemListWrapper().get(0).getValue(), is(10)); assertThat(programDataForm.getSignaturesWrapper().get(0).getSignature(), is("mystique")); assertThat(programDataForm.getSignaturesWrapper().get(0).getType(), is(Signature.TYPE.SUBMITTER)); assertThat(programDataForm.getSignaturesWrapper().get(0).getForm(), is(programDataForm)); } @Test public void shouldSerializeProgramDataFormToJson() throws LMISException { User user = new User(); user.setFacilityId("123"); UserInfoMgr.getInstance().setUser(user); ProgramDataForm programDataForm = new ProgramDataFormBuilder().setProgram(program) .setPeriod(DateUtil.parseString("2016-03-21", DateUtil.DB_DATE_FORMAT)) .setStatus(ProgramDataForm.STATUS.AUTHORIZED) .setSubmittedTime(DateUtil.parseString("2016-11-25 12:03:00", DateUtil.DATE_TIME_FORMAT)) .setSignatures("mystique", Signature.TYPE.SUBMITTER) .setSignatures("magneto", Signature.TYPE.APPROVER) .setSynced(false).build(); ProgramDataFormItem programDataFormItem1 = new ProgramDataFormItem("PUBLIC_PHARMACY", new ProgramDataColumnBuilder().setCode("HIV-DETERMINE-CONSUME").build(), 50); ProgramDataFormItem programDataFormItem2 = new ProgramDataFormItem("PUBLIC_PHARMACY", new ProgramDataColumnBuilder().setCode("HIV-DETERMINE-POSITIVE").build(), 20); ProgramDataFormItem programDataFormItem3 = new ProgramDataFormItem("WARD", new ProgramDataColumnBuilder().setCode("HIV-UNIGOLD-CONSUME").build(), 60); ProgramDataFormItem programDataFormItem4 = new ProgramDataFormItem("WARD",new ProgramDataColumnBuilder().setCode("HIV-UNIGOLD-POSITIVE").build(), 20); programDataForm.setProgramDataFormItemListWrapper(newArrayList(programDataFormItem1, programDataFormItem2, programDataFormItem3, programDataFormItem4)); JsonElement jsonElement = programDataAdapter.serialize(programDataForm, null, null); assertThat(jsonElement.getAsJsonObject().get("facilityId").getAsInt(), is(123)); assertThat(jsonElement.getAsJsonObject().get("programCode").getAsString(), is(Constants.RAPID_TEST_CODE)); assertThat(jsonElement.getAsJsonObject().get("periodBegin").getAsString(), is("2016-03-21")); assertThat(jsonElement.getAsJsonObject().get("periodEnd").getAsString(), is("2016-04-20")); assertThat(jsonElement.getAsJsonObject().get("submittedTime").getAsString(), startsWith("20161125T120300.000")); assertThat(jsonElement.getAsJsonObject().get("programDataFormSignatures").getAsJsonArray().get(0).getAsJsonObject().get("type").toString(), is("\"SUBMITTER\"")); assertThat(jsonElement.getAsJsonObject().get("programDataFormSignatures").getAsJsonArray().get(0).getAsJsonObject().get("text").toString(), is("\"mystique\"")); assertThat(jsonElement.getAsJsonObject().get("programDataFormItems").getAsJsonArray().size(), is(4)); assertThat(jsonElement.getAsJsonObject().get("programDataFormItems").getAsJsonArray().get(0).getAsJsonObject().get("name").toString(), is("\"PUBLIC_PHARMACY\"")); assertThat(jsonElement.getAsJsonObject().get("programDataFormItems").getAsJsonArray().get(0).getAsJsonObject().get("columnCode").toString(), is("\"HIV-DETERMINE-CONSUME\"")); assertThat(jsonElement.getAsJsonObject().get("programDataFormItems").getAsJsonArray().get(0).getAsJsonObject().get("value").getAsInt(), is(50)); } public class MyTestModule extends AbstractModule { @Override protected void configure() { bind(ProgramRepository.class).toInstance(mockProgramRepository); } } }