package uk.ivanc.archimvvm; import android.view.View; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import rx.Observable; import rx.schedulers.Schedulers; import uk.ivanc.archimvvm.model.GithubService; import uk.ivanc.archimvvm.model.Repository; import uk.ivanc.archimvvm.model.User; import uk.ivanc.archimvvm.util.MockModelFabric; import uk.ivanc.archimvvm.viewmodel.RepositoryViewModel; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21) public class RepositoryViewModelTest { GithubService githubService; ArchiApplication application; Repository repository; User owner; RepositoryViewModel viewModel; @Before public void setUp() { githubService = mock(GithubService.class); application = (ArchiApplication) RuntimeEnvironment.application; // Mock the retrofit service so we don't call the API directly application.setGithubService(githubService); // Change the default subscribe schedulers so all observables // will now run on the same thread application.setDefaultSubscribeScheduler(Schedulers.immediate()); // Default behaviour is to load a mock owner when the view model is instantiated repository = MockModelFabric.newRepository("Repository"); owner = MockModelFabric.newUser("owner"); when(githubService.userFromUrl(repository.owner.url)) .thenReturn(Observable.just(owner)); viewModel = new RepositoryViewModel(application, repository); } @Test public void shouldGetDescription() { assertEquals(repository.description, viewModel.getDescription()); } @Test public void shouldGetHomepage() { assertEquals(repository.homepage, viewModel.getHomepage()); } @Test public void shouldGetLanguage() { assertEquals(application.getString(R.string.text_language, repository.language), viewModel.getLanguage()); } @Test public void shouldReturnHomepageVisibilityGone() { repository.homepage = null; assertEquals(View.GONE, viewModel.getHomepageVisibility()); } @Test public void shouldReturnLanguageVisibilityGone() { repository.language = null; assertEquals(View.GONE, viewModel.getLanguageVisibility()); } @Test public void shouldReturnForkVisibilityVisible() { repository.fork = true; assertEquals(View.VISIBLE, viewModel.getForkVisibility()); } @Test public void shouldReturnForkVisibilityGone() { repository.fork = false; assertEquals(View.GONE, viewModel.getForkVisibility()); } @Test public void shouldLoadFullOwnerOnInstantiation() { assertEquals(owner.name, viewModel.ownerName.get()); assertEquals(owner.email, viewModel.ownerEmail.get()); assertEquals(owner.location, viewModel.ownerLocation.get()); assertEquals(View.VISIBLE, viewModel.ownerEmailVisibility.get()); assertEquals(View.VISIBLE, viewModel.ownerLocationVisibility.get()); assertEquals(View.VISIBLE, viewModel.ownerLayoutVisibility.get()); } }