package com.hitherejoe.androidboilerplate;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.contrib.RecyclerViewActions;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.LargeTest;
import com.hitherejoe.androidboilerplate.data.model.Character;
import com.hitherejoe.androidboilerplate.ui.activity.MainActivity;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.RuleChain;
import org.junit.rules.TestRule;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import timber.log.Timber;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class MainActivityTest {
public final TestComponentRule component =
new TestComponentRule(InstrumentationRegistry.getTargetContext());
public final ActivityTestRule<MainActivity> main =
new ActivityTestRule<>(MainActivity.class, false, false);
@Rule
public TestRule chain = RuleChain.outerRule(component).around(main);
@Test
public void loadCharactersShowsCharactersFeed() {
Context context = InstrumentationRegistry.getTargetContext();
int[] characterIds =
context.getResources().getIntArray(R.array.characters);
List<Character> mockCharacters =
MockModelFabric.makeListOfMockCharacters(characterIds.length);
stubMockCharacters(Observable.just(mockCharacters));
main.launchActivity(null);
try {
Thread.sleep(2000);
} catch (InterruptedException error) {
Timber.e(error, "Interrupted exception occurred");
}
checkCharactersDisplayOnRecyclerView(mockCharacters);
}
@Test
public void loadCharactersErrorShowsEmptyMessage() {
doReturn(Observable.<List<Character>>empty())
.when(component.getMockDataManager())
.getCharacters(any(int[].class));
Character mockCharacter = MockModelFabric.makeMockCharacter();
List<Character> mockCharacters = new ArrayList<>();
mockCharacters.add(mockCharacter);
stubMockCharacters(Observable.just(mockCharacters));
main.launchActivity(null);
checkCharactersDisplayOnRecyclerView(mockCharacters);
}
@Test
public void characterScreenOpensWhenClickingOnCard() {
Context context = InstrumentationRegistry.getTargetContext();
int[] characterIds =
context.getResources().getIntArray(R.array.characters);
List<Character> mockCharacters =
MockModelFabric.makeListOfMockCharacters(characterIds.length);
stubMockCharacters(Observable.just(mockCharacters));
main.launchActivity(null);
onView(withText(mockCharacters.get(0).name))
.perform(click());
onView(withText(com.hitherejoe.androidboilerplate.R.string.text_lorem_ipsum))
.check(matches(isDisplayed()));
}
@Test
public void characterDetailsScreenOpens() {
doReturn(Observable.<List<Character>>empty())
.when(component.getMockDataManager())
.getCharacters(any(int[].class));
Character mockCharacter = MockModelFabric.makeMockCharacter();
List<Character> mockCharacters = new ArrayList<>();
mockCharacters.add(mockCharacter);
stubMockCharacters(Observable.just(mockCharacters));
main.launchActivity(null);
onView(withText("View"))
.perform(click());
onView(withText(com.hitherejoe.androidboilerplate.R.string.text_lorem_ipsum))
.check(matches(isDisplayed()));
}
@Test
public void collectionsScreenOpens() {
doReturn(Observable.<List<Character>>empty())
.when(component.getMockDataManager())
.getCharacters(any(int[].class));
Character mockCharacter = MockModelFabric.makeMockCharacter();
List<Character> mockCharacters = new ArrayList<>();
mockCharacters.add(mockCharacter);
stubMockCharacters(Observable.just(mockCharacters));
main.launchActivity(null);
onView(withText("Collections"))
.perform(click());
onView(withText("Films"))
.check(matches(isDisplayed()));
}
private void checkCharactersDisplayOnRecyclerView(List<Character> charactersToCheck) {
for (int i = 0; i < charactersToCheck.size(); i++) {
onView(withId(R.id.recycler_characters))
.perform(RecyclerViewActions.scrollToPosition(i));
checkCharacterDisplays(charactersToCheck.get(i));
}
}
private void checkCharacterDisplays(Character character) {
onView(withText(character.name))
.check(matches(isDisplayed()));
}
private void stubMockCharacters(Observable<List<Character>> observable) {
when(component.getMockDataManager().getCharacters(any(int[].class)))
.thenReturn(observable);
}
}