package com.airbnb.epoxy; import android.widget.TextView; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import java.util.ArrayList; import java.util.List; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) public class BindModelIntegrationTest { private Model_ model; class TestAdapter extends BaseEpoxyAdapter { private boolean diffPayloadsEnabled; private List<EpoxyModel<?>> models; TestAdapter(boolean diffPayloadsEnabled) { this.diffPayloadsEnabled = diffPayloadsEnabled; this.models = new ArrayList<>(); models.add(model); } @Override List<EpoxyModel<?>> getCurrentModels() { return models; } @Override boolean diffPayloadsEnabled() { return diffPayloadsEnabled; } } @Before public void before() { model = spy(new Model_()).id(1); } @Test public void bindNoPayloads() { TestAdapter adapter = new TestAdapter(false); EpoxyViewHolder viewHolder = ControllerLifecycleHelper.createViewHolder(adapter, 0); adapter.onBindViewHolder(viewHolder, 0); verify(model).bind((TextView) viewHolder.itemView); verify(model, never()).bind(any(TextView.class), any(List.class)); verify(model, never()).bind(any(TextView.class), any(EpoxyModel.class)); } @Test public void bindWithPayloads() { TestAdapter adapter = new TestAdapter(false); EpoxyViewHolder viewHolder = ControllerLifecycleHelper.createViewHolder(adapter, 0); ArrayList<Object> payloads = new ArrayList<>(); payloads.add("hello"); adapter.onBindViewHolder(viewHolder, 0, payloads); verify(model).bind((TextView) viewHolder.itemView, payloads); // This is called if the payloads bind call isn't implemented verify(model).bind(any(TextView.class)); verify(model, never()).bind(any(TextView.class), any(EpoxyModel.class)); } @Test public void bindWithDiffPayload() { TestAdapter adapter = new TestAdapter(true); EpoxyViewHolder viewHolder = ControllerLifecycleHelper.createViewHolder(adapter, 0); Model_ originallyBoundModel = new Model_(); originallyBoundModel.id(model.id()); List<Object> payloads = DiffPayloadTestUtil.payloadsWithChangedModels(originallyBoundModel); adapter.onBindViewHolder(viewHolder, 0, payloads); verify(model).bind((TextView) viewHolder.itemView, originallyBoundModel); // This is called if the payloads bind call isn't implemented verify(model).bind(any(TextView.class)); verify(model, never()).bind(any(TextView.class), any(List.class)); } }