package com.artemzin.qualitymatters.ui.adapters;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.artemzin.qualitymatters.QualityMattersRobolectricUnitTestRunner;
import com.artemzin.qualitymatters.R;
import com.artemzin.qualitymatters.api.entities.Item;
import com.artemzin.qualitymatters.models.QualityMattersImageLoader;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.List;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
@RunWith(QualityMattersRobolectricUnitTestRunner.class)
public class ItemsAdapterTest {
private LayoutInflater layoutInflater;
private QualityMattersImageLoader imageLoader;
private ItemsAdapter adapter;
@Before
public void beforeEachTest() {
layoutInflater = mock(LayoutInflater.class);
imageLoader = mock(QualityMattersImageLoader.class);
adapter = new ItemsAdapter(layoutInflater, imageLoader);
}
@Test
public void getItemCount_shouldBeZeroByDefault() {
assertThat(adapter.getItemCount()).isEqualTo(0);
}
@Test
public void getItemCount_shouldReturnCorrectValueAfterSetData() {
adapter.setData(asList(mock(Item.class), mock(Item.class)));
assertThat(adapter.getItemCount()).isEqualTo(2);
}
@Test
public void setData_shouldNotifyObserversAboutChange() {
RecyclerView.AdapterDataObserver observer = mock(RecyclerView.AdapterDataObserver.class);
adapter.registerAdapterDataObserver(observer);
adapter.setData(emptyList());
verify(observer).onChanged();
verifyNoMoreInteractions(observer);
}
@Test
public void onCreateViewHolder_shouldCreateViewHolder() {
ViewGroup parent = mock(ViewGroup.class);
View itemView = mock(View.class);
ImageView imageView = mock(ImageView.class);
when(itemView.findViewById(R.id.list_item_image_view)).thenReturn(imageView);
TextView titleTextView = mock(TextView.class);
when(itemView.findViewById(R.id.list_item_title_text_view)).thenReturn(titleTextView);
TextView shortDescriptionTextView = mock(TextView.class);
when(itemView.findViewById(R.id.list_item_short_description_text_view)).thenReturn(shortDescriptionTextView);
when(layoutInflater.inflate(R.layout.list_item, parent, false)).thenReturn(itemView);
ItemViewHolder viewHolder = adapter.onCreateViewHolder(parent, 0);
verify(layoutInflater).inflate(R.layout.list_item, parent, false);
assertThat(viewHolder.itemView).isSameAs(itemView);
// Also, we don't expect exceptions here.
}
@Test
public void onBindViewHolder_shouldBindItemsToTheViewHolders() {
List<Item> items = asList(
Item.builder().id("1").imagePreviewUrl("https://url1").title("t1").shortDescription("s1").build(),
Item.builder().id("2").imagePreviewUrl("https://url2").title("t2").shortDescription("s2").build(),
Item.builder().id("3").imagePreviewUrl("https://url3").title("t3").shortDescription("s3").build()
);
adapter.setData(items);
for (int position = 0, size = items.size(); position < size; position++) {
ItemViewHolder itemViewHolder = mock(ItemViewHolder.class);
adapter.onBindViewHolder(itemViewHolder, position);
verify(itemViewHolder).bind(items.get(position));
}
}
}