package org.openlmis.core.view.holder;
import android.graphics.drawable.ColorDrawable;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.openlmis.core.LMISTestRunner;
import org.openlmis.core.R;
import org.openlmis.core.model.Period;
import org.openlmis.core.model.Program;
import org.openlmis.core.model.RnRForm;
import org.openlmis.core.model.RnrFormItem;
import org.openlmis.core.persistence.DbUtil;
import org.openlmis.core.utils.Constants;
import org.openlmis.core.utils.DateUtil;
import org.openlmis.core.view.viewmodel.RnRFormViewModel;
import org.robolectric.RuntimeEnvironment;
import java.sql.SQLException;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.mock;
@RunWith(LMISTestRunner.class)
public class RnRFormViewHolderTest {
private Program program;
private RnRFormViewHolder viewHolder;
private RnRFormViewHolder.RnRFormItemClickListener mockedListener;
@Before
public void setup() {
mockedListener = mock(RnRFormViewHolder.RnRFormItemClickListener.class);
program = new Program();
program.setProgramCode("MMIA");
program.setProgramName("MMIA");
}
private RnRFormViewHolder getViewHolderByType(int viewType) {
if (viewType == RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL || viewType == RnRFormViewModel.TYPE_CANNOT_DO_MONTHLY_INVENTORY) {
return new RnRFormViewHolder(LayoutInflater.from(RuntimeEnvironment.application).inflate(R.layout.item_report_no_button, null, false), mockedListener);
} else {
return new RnRFormViewHolder(LayoutInflater.from(RuntimeEnvironment.application).inflate(R.layout.item_report, null, false), mockedListener);
}
}
@Test
public void shouldShowDraftStyle() {
RnRForm form = RnRForm.init(program, DateUtil.today());
form.setStatus(RnRForm.STATUS.DRAFT);
RnRFormViewModel viewModel = RnRFormViewModel.buildNormalRnrViewModel(form);
viewHolder = getViewHolderByType(RnRFormViewModel.TYPE_CREATED_BUT_UNCOMPLETED);
viewHolder.populate(viewModel);
assertThat(viewHolder.tvPeriod.getText().toString(), is(viewModel.getTitle()));
assertThat(viewHolder.tvMessage.getText().toString(), is(getStringResource(R.string.label_incomplete_requisition, viewModel.getName())));
assertThat(((ColorDrawable) viewHolder.tvPeriod.getBackground()).getColor(), is(getColorResource(R.color.color_draft_title)));
assertThat(viewHolder.btnView.getText().toString(), is(getStringResource(R.string.btn_view_incomplete_requisition, viewModel.getName())));
assertThat(viewHolder.ivDelete.getVisibility(), is(View.GONE));
}
@Test
public void shouldShowUnSyncedStyle() {
RnRForm form = RnRForm.init(program, DateUtil.today());
form.setStatus(RnRForm.STATUS.AUTHORIZED);
form.setSynced(false);
RnRFormViewModel viewModel = RnRFormViewModel.buildNormalRnrViewModel(form);
viewHolder = getViewHolderByType(RnRFormViewModel.TYPE_UNSYNCED_HISTORICAL);
viewHolder.btnView = mock(TextView.class);
viewHolder.populate(viewModel);
assertThat(viewHolder.tvPeriod.getText().toString(), is(viewModel.getTitle()));
assertThat(viewHolder.tvMessage.getText().toString(), is(getStringResource(R.string.label_unsynced_mmia_requisition)));
assertThat(((ColorDrawable) viewHolder.tvPeriod.getBackground()).getColor(), is(getColorResource(R.color.color_red)));
}
@Test
public void shouldShowUnCompleteInventory() {
RnRFormViewModel viewModel = new RnRFormViewModel(new Period(new DateTime()), "MMIA", RnRFormViewModel.TYPE_UNCOMPLETE_INVENTORY_IN_CURRENT_PERIOD);
viewHolder = getViewHolderByType(RnRFormViewModel.TYPE_UNCOMPLETE_INVENTORY_IN_CURRENT_PERIOD);
viewHolder.populate(viewModel);
assertThat(viewHolder.tvPeriod.getText().toString(), is(viewModel.getTitle()));
assertThat(viewHolder.tvMessage.getText().toString(), is(getStringResource(R.string.label_uncompleted_mmia_physical_inventory_message, viewModel.getName())));
assertThat(((ColorDrawable) viewHolder.tvPeriod.getBackground()).getColor(), is(getColorResource(R.color.color_draft_title)));
assertThat(viewHolder.btnView.getText().toString(), is(getStringResource(R.string.btn_view_uncompleted_physical_inventory, viewModel.getName())));
assertThat(viewHolder.ivDelete.getVisibility(), is(View.GONE));
}
@Test
public void shouldShowCompletedInventory() {
RnRFormViewModel viewModel = new RnRFormViewModel(new Period(new DateTime()), "MMIA", RnRFormViewModel.TYPE_CLOSE_OF_PERIOD_SELECTED);
viewHolder = getViewHolderByType(RnRFormViewModel.TYPE_CLOSE_OF_PERIOD_SELECTED);
viewHolder.populate(viewModel);
assertThat(viewHolder.tvPeriod.getText().toString(), is(viewModel.getTitle()));
assertThat(viewHolder.tvMessage.getText().toString(), is(getStringResource(R.string.label_completed_mmia_physical_inventory_message, viewModel.getName())));
assertThat(((ColorDrawable) viewHolder.tvPeriod.getBackground()).getColor(), is(getColorResource(R.color.color_draft_title)));
assertThat(viewHolder.btnView.getText().toString(), is(getStringResource(R.string.btn_view_completed_physical_inventory, viewModel.getName())));
assertThat(viewHolder.ivDelete.getVisibility(), is(View.GONE));
}
@Test
public void shouldShowCompleteStyle() {
RnRForm form = RnRForm.init(program, DateUtil.today());
form.setStatus(RnRForm.STATUS.AUTHORIZED);
form.setSynced(true);
RnRFormViewModel viewModel = RnRFormViewModel.buildNormalRnrViewModel(form);
viewHolder = getViewHolderByType(RnRFormViewModel.TYPE_SYNCED_HISTORICAL);
viewHolder.populate(viewModel);
assertThat(viewHolder.tvPeriod.getText().toString(), is(viewModel.getTitle()));
assertThat(viewHolder.tvMessage.getText().toString(), is(getStringResource(R.string.label_mmia_submitted_message, viewModel.getSyncedTime())));
assertThat(viewHolder.btnView.getText().toString(), is(getStringResource(R.string.btn_view_requisition, viewModel.getName())));
assertThat(viewHolder.ivDelete.getVisibility(), is(View.VISIBLE));
assertNull(viewHolder.tvDrugCount);
}
@Test
public void shouldShowTvDrugCountWhenIsHistoricalEmergency() throws SQLException {
program.setProgramCode(Constants.ESS_PROGRAM_CODE);
RnRForm form = RnRForm.init(program, DateUtil.today());
form.setStatus(RnRForm.STATUS.AUTHORIZED);
form.setSynced(true);
form.setSubmittedTime(DateUtil.parseString("2016-01-22 11:33:44", DateUtil.DATE_TIME_FORMAT));
form.setEmergency(true);
DbUtil.initialiseDao(RnRForm.class).assignEmptyForeignCollection(form, "rnrFormItemList");
form.getRnrFormItemList().add(new RnrFormItem());
RnRFormViewModel viewModel = RnRFormViewModel.buildEmergencyViewModel(form);
viewHolder = getViewHolderByType(RnRFormViewModel.TYPE_SYNCED_HISTORICAL);
viewHolder.populate(viewModel);
assertThat(viewHolder.tvDrugCount.getVisibility(), is(View.VISIBLE));
assertThat(viewHolder.tvDrugCount.getText().toString(), is("1 drug ordered"));
assertTrue(viewHolder.tvPeriod.getText().toString().equals("Emergency Requisition – 22 Jan 2016 11:33"));
assertThat(viewHolder.tvMessage.getText().toString(), is(getStringResource(R.string.label_submitted_message, "Emergency requisition balancete", viewModel.getSyncedTime())));
assertThat(viewHolder.btnView.getText().toString(), is(getStringResource(R.string.btn_view_requisition, "Emergency requisition balancete")));
assertThat(viewHolder.ivDelete.getVisibility(), is(View.VISIBLE));
form.getRnrFormItemList().add(new RnrFormItem());
viewHolder.populate(viewModel);
assertThat(viewHolder.tvDrugCount.getText().toString(), is("2 drugs ordered"));
}
@Test
public void shouldShowCanNotDoPhysicalInventoryType() {
RnRFormViewModel viewModel = new RnRFormViewModel(Period.of(DateUtil.today()), program.getProgramCode(), RnRFormViewModel.TYPE_CANNOT_DO_MONTHLY_INVENTORY);
viewHolder = getViewHolderByType(RnRFormViewModel.TYPE_CANNOT_DO_MONTHLY_INVENTORY);
viewHolder.btnView = mock(TextView.class);
viewHolder.populate(viewModel);
assertThat(viewHolder.tvPeriod.getText().toString(), is(viewModel.getTitle()));
assertThat(viewHolder.tvMessage.getText().toString(), is(getStringResource(R.string.label_can_not_create_mmia_rnr, DateUtil.getMonthAbbrByDate(viewModel.getPeriodEndMonth().toDate()))));
}
@SuppressWarnings("ConstantConditions")
private String getStringResource(int resId, Object... param) {
return Html.fromHtml(RuntimeEnvironment.application.getApplicationContext().getResources().getString(resId, param)).toString();
}
private int getColorResource(int resId) {
return RuntimeEnvironment.application.getApplicationContext().getResources().getColor(resId);
}
}