Skip to content

Commit

Permalink
Merge pull request #286 from woocommerce/issue/fix-ui-tests
Browse files Browse the repository at this point in the history
Fix the UI tests
  • Loading branch information
AmandaRiu authored Jul 23, 2018
2 parents 6aa2d71 + 5d51f24 commit a15b404
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import javax.inject.Singleton
ReleaseWCNetworkModule::class,
ReleaseOkHttpClientModule::class,
MockedActivityBindingModule::class,
SelectedSiteModule::class,
MockedSelectedSiteModule::class,
LoginAnalyticsModule::class,
LoginServiceModule::class))
interface AppComponentTest : AppComponent {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.woocommerce.android.di

import com.woocommerce.android.ui.dashboard.DashboardModule
import com.woocommerce.android.ui.login.LoginActivity
import com.woocommerce.android.ui.login.LoginEpilogueActivity
import com.woocommerce.android.ui.login.LoginEpilogueModule
import com.woocommerce.android.ui.login.MagicLinkInterceptActivity
import com.woocommerce.android.ui.main.MainActivity
import com.woocommerce.android.ui.main.MockedMainModule
Expand All @@ -15,6 +18,7 @@ abstract class MockedActivityBindingModule {
@ActivityScope
@ContributesAndroidInjector(modules = arrayOf(
MockedMainModule::class,
DashboardModule::class,
OrderListModule::class,
OrderDetailModule::class))
abstract fun provideMainActivityInjector(): MainActivity
Expand All @@ -23,6 +27,10 @@ abstract class MockedActivityBindingModule {
@ContributesAndroidInjector(modules = arrayOf(LoginFragmentModule::class))
abstract fun provideLoginActivityInjector(): LoginActivity

@ActivityScope
@ContributesAndroidInjector(modules = arrayOf(LoginEpilogueModule::class))
abstract fun provideLoginEpilogueActivityInjector(): LoginEpilogueActivity

@ActivityScope
@ContributesAndroidInjector
abstract fun provideMagicLinkInterceptActivityInjector(): MagicLinkInterceptActivity
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.woocommerce.android.di

import android.content.Context
import com.nhaarman.mockito_kotlin.mock
import com.woocommerce.android.tools.SelectedSite
import dagger.Module
import dagger.Provides
import org.wordpress.android.fluxc.model.SiteModel
import javax.inject.Singleton

@Module
object MockedSelectedSiteModule {
private var siteModel: SiteModel? = null

fun setSiteModel(siteModel: SiteModel) {
this.siteModel = siteModel
}

@JvmStatic
@Provides
@Singleton
fun provideSelectedSite(context: Context): SelectedSite {
val selectedSite = SelectedSite(context, mock())
siteModel?.let {
selectedSite.set(it)
}
return selectedSite
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,28 +10,29 @@ import android.support.test.filters.LargeTest
import android.support.test.rule.ActivityTestRule
import android.support.test.runner.AndroidJUnit4
import com.woocommerce.android.R.id.bottom_nav
import com.woocommerce.android.di.MockedSelectedSiteModule
import com.woocommerce.android.ui.TestBase
import org.junit.Assert.fail
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.wordpress.android.fluxc.model.SiteModel

@RunWith(AndroidJUnit4::class)
@LargeTest
class AppNavigationTest : TestBase() {
class MainActivityTestRule : ActivityTestRule<MainActivity>(MainActivity::class.java, false, false) {
override fun launchActivity(startIntent: Intent?): MainActivity {
return launchActivity(startIntent, false)
}

fun launchActivity(startIntent: Intent?, userIsLoggedIn: Boolean): MainActivity {
fun launchMainActivityLoggedIn(startIntent: Intent?, siteModel: SiteModel): MainActivity {
// Configure the mocked MainPresenter to pretend the user is logged in.
// We normally wouldn't need the MockedMainModule method, and just configure the mocked presenter directly
// using whenever(activityTestRule.activity.presenter.userIsLoggedIn()).thenReturn(true)
// In this case, however, userIsLoggedIn() is called in the activity's onCreate(), which means after
// launchActivity() is too late, but the activity's presenter is null before that.
// So, we need to configure this at the moment the injection is happening: when the presenter is initialized.
MockedMainModule.setUserIsLoggedInResponse(userIsLoggedIn)
MockedMainModule.setUserIsLoggedInResponse(true)
// Preload the SelectedSite with a SiteModel, to satisfy the expectation that it was set during login
// The reason for doing this here is the same as for the MockedMainModule
MockedSelectedSiteModule.setSiteModel(siteModel)
return super.launchActivity(startIntent)
}
}
Expand All @@ -41,14 +42,14 @@ class AppNavigationTest : TestBase() {

@Test
fun pressingBackOnMainScreenExitsApp() {
activityTestRule.launchActivity(null, userIsLoggedIn = true)
activityTestRule.launchMainActivityLoggedIn(null, SiteModel())

assertPressingBackExitsApp()
}

@Test
fun bottomBarShouldBeVisibleOnLoggedInLaunch() {
activityTestRule.launchActivity(null, userIsLoggedIn = true)
activityTestRule.launchMainActivityLoggedIn(null, SiteModel())

// Since the MainPresenter is telling us the user is logged in, we should see the main activity and bottom bar
// (and not the login screen)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.woocommerce.android.ui.main
import com.nhaarman.mockito_kotlin.mock
import com.nhaarman.mockito_kotlin.whenever
import com.woocommerce.android.di.ActivityScope
import com.woocommerce.android.ui.base.UIMessageResolver
import dagger.Module
import dagger.Provides

Expand All @@ -22,4 +23,11 @@ object MockedMainModule {
whenever(mockedMainPresenter.userIsLoggedIn()).thenReturn(userIsLoggedIn)
return mockedMainPresenter
}

@JvmStatic
@ActivityScope
@Provides
fun provideUiMessageResolver(mainUIMessageResolver: MainUIMessageResolver): UIMessageResolver {
return mainUIMessageResolver
}
}

0 comments on commit a15b404

Please sign in to comment.