package in.mvpstarter.sample;
import android.support.test.InstrumentationRegistry;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
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.List;
import in.mvpstarter.sample.common.TestComponentRule;
import in.mvpstarter.sample.common.TestDataFactory;
import in.mvpstarter.sample.data.model.NamedResource;
import in.mvpstarter.sample.data.model.Pokemon;
import in.mvpstarter.sample.ui.main.MainActivity;
import in.mvpstarter.sample.util.ErrorTestUtil;
import io.reactivex.Single;
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.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.when;
@RunWith(AndroidJUnit4.class)
public class MainActivityTest {
private final TestComponentRule mComponent =
new TestComponentRule(InstrumentationRegistry.getTargetContext());
private final ActivityTestRule<MainActivity> mMain =
new ActivityTestRule<>(MainActivity.class, false, false);
// TestComponentRule needs to go first to make sure the Dagger ApplicationTestComponent is set
// in the Application before any Activity is launched.
@Rule
public TestRule chain = RuleChain.outerRule(mComponent).around(mMain);
@Test
public void checkPokemonsDisplay() {
List<NamedResource> namedResourceList = TestDataFactory.makeNamedResourceList(5);
List<String> pokemonList = TestDataFactory.makePokemonNameList(namedResourceList);
stubDataManagerGetPokemonList(Single.just(pokemonList));
mMain.launchActivity(null);
for (NamedResource pokemonName : namedResourceList) {
onView(withText(pokemonName.name))
.check(matches(isDisplayed()));
}
}
@Test
public void clickingPokemonLaunchesDetailActivity() {
List<NamedResource> namedResourceList = TestDataFactory.makeNamedResourceList(5);
List<String> pokemonList = TestDataFactory.makePokemonNameList(namedResourceList);
stubDataManagerGetPokemonList(Single.just(pokemonList));
stubDataManagerGetPokemon(Single.just(TestDataFactory.makePokemon("id")));
mMain.launchActivity(null);
onView(withText(pokemonList.get(0)))
.perform(click());
onView(withId(R.id.image_pokemon))
.check(matches(isDisplayed()));
}
@Test
public void checkErrorViewDisplays() {
stubDataManagerGetPokemonList(Single.error(new RuntimeException()));
mMain.launchActivity(null);
ErrorTestUtil.checkErrorViewsDisplay();
}
public void stubDataManagerGetPokemonList(Single<List<String>> single) {
when(mComponent.getMockDataManager().getPokemonList(anyInt()))
.thenReturn(single);
}
public void stubDataManagerGetPokemon(Single<Pokemon> single) {
when(mComponent.getMockDataManager().getPokemon(anyString()))
.thenReturn(single);
}
}