Skip to content

Commit

Permalink
Extract the presentation to a module
Browse files Browse the repository at this point in the history
There are still some issues with the Android P tests
The View/ViewObject models are still not mapped or extracted
  (the UI should not use the FavoriteView anywhere)

#29
  • Loading branch information
JoaquimLey committed Apr 21, 2018
1 parent 7770ce2 commit 7b30a00
Show file tree
Hide file tree
Showing 38 changed files with 370 additions and 127 deletions.
5 changes: 3 additions & 2 deletions transport-eta-android/mobile-ui/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ android {
vectorDrawables.useSupportLibrary = true
testInstrumentationRunner "com.joaquimley.transporteta.ui.test.TestRunner"

missingDimensionStrategy 'environment', 'mock', 'prod'
missingDimensionStrategy 'environment', ['prod', 'mock']
}

packagingOptions {
Expand All @@ -36,7 +36,7 @@ android {
testLogging {
events 'passed', 'skipped', 'failed', 'standardOut', 'standardError'
}
jvmArgs '-noverify'
// jvmArgs '-noverify'
}

buildTypes {
Expand Down Expand Up @@ -72,6 +72,7 @@ androidExtensions {
dependencies {
// Modules
implementation project(':sms')
implementation project(':presentation')
// Javax
implementation deps.javax.inject
compileOnly deps.javax.annotation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,12 @@ import android.support.test.runner.AndroidJUnit4
import com.joaquimley.transporteta.R
import com.joaquimley.transporteta.ui.di.module.TestFavoriteFragmentModule
import com.joaquimley.transporteta.ui.home.favorite.FavoritesFragment
import com.joaquimley.transporteta.ui.model.FavoriteView
import com.joaquimley.transporteta.ui.model.data.Resource
import com.joaquimley.transporteta.presentation.data.Resource
import com.joaquimley.transporteta.ui.presentation.home.favorite.FavoritesViewModel
import com.joaquimley.transporteta.ui.test.util.RecyclerViewMatcher
import com.joaquimley.transporteta.ui.testing.TestFragmentActivity
import com.joaquimley.transporteta.ui.testing.factory.TestFactoryFavoriteView
import org.junit.Before
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
Expand Down Expand Up @@ -73,19 +72,19 @@ class FavoritesFragmentTest {
}

@Test
fun whenErrorOccursNoDataErrorViewStateIsShown() {
fun whenThereIsNoDataAndErrorOccursErrorViewStateIsShown() {
// When empty
results.postValue(Resource.empty())
// Error occurs
val errorMessage = "Test for error message"
results.postValue(Resource.error(errorMessage))
// Then
onView(withId(R.id.message_view)).check(doesNotExist())
onView(withId(R.id.message_view)).check(matches(isDisplayed()))
onView(withId(R.id.recycler_view)).check(doesNotExist())
}

@Test
fun whenErrorOccursWithDataDisplayedErrorMessageIsShown() {
fun whenThereIsDataAndErrorOccursErrorMessageIsShown() {
// When there is data
val resultsList = TestFactoryFavoriteView.generateFavoriteViewList()
results.postValue(Resource.success(resultsList))
Expand All @@ -102,7 +101,7 @@ class FavoritesFragmentTest {
}

@Test
fun whenFabIsClickedCreateFavoriteScreenIsShown() {
fun whenCreateFabIsClickedCreateFavoriteScreenIsShown() {
// When
onView(withId(R.id.fab)).perform(click())
// Check dialog is showing
Expand Down Expand Up @@ -139,6 +138,7 @@ class FavoritesFragmentTest {
onView(withText(R.string.create_favorite_title)).check(matches(isDisplayed()))
// Error message is shown
onView(withText(R.string.error_create_favorite_code_required)).check(matches(isDisplayed()))
// onView(allOf(withParent(R.id.txtPhoneNumber), withText("error text"))).check(matches(isDisplayed()))
}

@Test
Expand All @@ -155,16 +155,15 @@ class FavoritesFragmentTest {


@Test
@Ignore("Test ignored: Not yet implemented, can't currently mock ViewModel")
fun whenDataComesInItIsCorrectlyDisplayedOnTheList() {
fun whenThereIsDataItIsCorrectlyDisplayedOnTheList() {
// When
val resultsList = TestFactoryFavoriteView.generateFavoriteViewList()
results.postValue(Resource.success(resultsList))
// onView(RecyclerViewMatcher.withRecyclerView(R.id.recycler_view).atPosition(0))
// .check(matches(hasDescendant(withText(resultsList[0].latestEta))))
// onView(RecyclerViewMatcher.withRecyclerView(R.id.recycler_view).atPosition(0)).check(matches(hasDescendant(withText(resultsList[0].code.toString()))))
// onView(withId(R.id.progress_bar)).check(matches(not(isDisplayed())))
// onView(withText(resultsList[0].code.toString())).check(matches(isDisplayed()))
// viewModel.getFavourites()
// Then
onView(RecyclerViewMatcher.withRecyclerView(R.id.recycler_view).atPosition(0)).check(matches(hasDescendant(withText(resultsList[0].latestEta))))
onView(RecyclerViewMatcher.withRecyclerView(R.id.recycler_view).atPosition(0)).check(matches(hasDescendant(withText(resultsList[0].code.toString()))))
// Assert
onView(withId(R.id.progress_bar)).check(doesNotExist())
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@ package com.joaquimley.transporteta.ui.test
import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MutableLiveData
import com.joaquimley.transporteta.sms.SmsController
import com.joaquimley.transporteta.ui.model.FavoriteView
import com.joaquimley.transporteta.ui.model.data.Resource
import com.joaquimley.transporteta.presentation.data.Resource
import com.joaquimley.transporteta.ui.presentation.home.favorite.FavoritesViewModel
import com.joaquimley.transporteta.ui.testing.factory.TestFactoryFavoriteView

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.joaquimley.transporteta.ui.test.util

import android.app.Activity
import android.support.test.espresso.Espresso.onView
import android.support.test.espresso.action.ViewActions
import android.support.test.espresso.action.ViewActions.typeText
import android.support.test.espresso.assertion.ViewAssertions.matches
import android.support.test.espresso.matcher.RootMatchers.withDecorView
import android.support.test.espresso.matcher.ViewMatchers.*
import android.support.test.rule.ActivityTestRule
import org.hamcrest.CoreMatchers.not

fun Int.click() = onView(withId(this)).perform(ViewActions.click())
fun Int.write(text: String) = onView(withId(this)).perform(typeText(text))
fun Int.textEquals(text: String) = onView(withId(this)).check(matches(withText(text)))

infix fun <T : Activity> ActivityTestRule<T>.containsToast(message: String) =
onView(withText(message))
.inRoot(withDecorView(not(activity.window.decorView)))
.check(matches(isDisplayed()))
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.joaquimley.transporteta.ui.testing.factory

import android.support.annotation.RestrictTo
import com.joaquimley.transporteta.ui.model.FavoriteView
import com.joaquimley.transporteta.presentation.model.FavoriteView
import com.joaquimley.transporteta.ui.testing.factory.ui.DataFactory

@RestrictTo(RestrictTo.Scope.TESTS)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.joaquimley.transporteta.ui.di.module

import com.joaquimley.transporteta.presentation.home.favorite.FavoritesViewModelFactory
import com.joaquimley.transporteta.presentation.home.favorite.FavoritesViewModelFactoryImpl
import com.joaquimley.transporteta.sms.SmsController
import com.joaquimley.transporteta.ui.presentation.home.favorite.FavoritesViewModelFactory
import dagger.Module
import dagger.Provides

Expand All @@ -10,6 +11,6 @@ class FavoriteFragmentModule {

@Provides
fun provideFavouritesViewModelFactory(smsController: SmsController): FavoritesViewModelFactory {
return FavoritesViewModelFactory(smsController)
return FavoritesViewModelFactoryImpl(smsController)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ import android.support.v4.app.Fragment
import android.support.v4.content.ContextCompat
import android.support.v7.app.AppCompatActivity
import com.joaquimley.transporteta.R
import com.joaquimley.transporteta.presentation.home.HomeViewModel
import com.joaquimley.transporteta.presentation.home.HomeViewModelImpl
import com.joaquimley.transporteta.ui.home.favorite.FavoritesFragment
import com.joaquimley.transporteta.ui.presentation.home.HomeViewModel
import dagger.android.AndroidInjection
import dagger.android.AndroidInjector
import dagger.android.DispatchingAndroidInjector
Expand Down Expand Up @@ -42,7 +43,8 @@ class HomeActivity : AppCompatActivity(), HasSupportFragmentInjector/*, BottomNa
}

private fun setupViewModel() {
viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)
// Create a HomeViewModelFactory to abstract the HomeViewModelImpl class
viewModel = ViewModelProviders.of(this).get(HomeViewModelImpl::class.java)
}

/**
Expand Down Expand Up @@ -71,7 +73,7 @@ class HomeActivity : AppCompatActivity(), HasSupportFragmentInjector/*, BottomNa


// private val favouritesFragment = FavoritesFragment.newInstance("")
// lateinit var viewModel: HomeViewModel
// lateinit var viewModel: HomeViewModelImpl
//
// override fun onCreate(savedInstanceState: Bundle?) {
// super.onCreate(savedInstanceState)
Expand All @@ -93,7 +95,7 @@ class HomeActivity : AppCompatActivity(), HasSupportFragmentInjector/*, BottomNa
//
//
// private fun setupViewModel() {
// viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)
// viewModel = ViewModelProviders.of(this).get(HomeViewModelImpl::class.java)
// }
//
// private fun setupNavigationView() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.joaquimley.transporteta.R
import com.joaquimley.transporteta.ui.model.FavoriteView
import com.joaquimley.transporteta.presentation.model.FavoriteView
import com.joaquimley.transporteta.ui.util.load
import kotlinx.android.synthetic.main.item_favorite.view.*

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.joaquimley.transporteta.R
import com.joaquimley.transporteta.ui.model.FavoriteView
import com.joaquimley.transporteta.presentation.home.favorite.FavoritesViewModel
import com.joaquimley.transporteta.presentation.home.favorite.FavoritesViewModelFactory
import com.joaquimley.transporteta.presentation.model.FavoriteView
import com.joaquimley.transporteta.ui.model.data.ResourceState
import com.joaquimley.transporteta.ui.presentation.home.favorite.FavoritesViewModel
import com.joaquimley.transporteta.ui.presentation.home.favorite.FavoritesViewModelFactory
import com.joaquimley.transporteta.ui.util.clear
import com.joaquimley.transporteta.ui.util.isEmpty
import com.joaquimley.transporteta.ui.util.onChange
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.joaquimley.transporteta.ui.model

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
class FavoriteViewObject(val code: Int = -1, val latestEta: String = "", val originalText: String = ""): Parcelable
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
package com.joaquimley.transporteta.ui.model.data

open class Resource<out T> constructor(val status: ResourceState, val data: T? = null, val message: String? = null) {

companion object {
fun <T> success(data: T): Resource<T> {
return Resource(ResourceState.SUCCESS, data, null)
}

fun <T> empty(): Resource<T> {
return Resource(ResourceState.EMPTY, null, null)
}

fun <T> error(message: String): Resource<T> {
return Resource(ResourceState.ERROR, null, message)
}

fun <T> loading(): Resource<T> {
return Resource(ResourceState.LOADING, null, null)
}
}
}
//package com.joaquimley.transporteta.ui.model.data
//
//open class Resource<out T> constructor(val status: ResourceState, val data: T? = null, val message: String? = null) {
//
// companion object {
// fun <T> success(data: T): com.joaquimley.transporteta.presentation.data.Resource<T> {
// return Resource(ResourceState.SUCCESS, data, null)
// }
//
// fun <T> empty(): com.joaquimley.transporteta.presentation.data.Resource<T> {
// return Resource(ResourceState.EMPTY, null, null)
// }
//
// fun <T> error(message: String): com.joaquimley.transporteta.presentation.data.Resource<T> {
// return Resource(ResourceState.ERROR, null, message)
// }
//
// fun <T> loading(): com.joaquimley.transporteta.presentation.data.Resource<T> {
// return Resource(ResourceState.LOADING, null, null)
// }
// }
//}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.joaquimley.transporteta.ui.model.data

/**
* Represents the state in which a [Resource] is currently in
*/
enum class ResourceState {
LOADING, SUCCESS, EMPTY, ERROR
}
//package com.joaquimley.transporteta.ui.model.data
//
///**
// * Represents the state in which a [Resource] is currently in
// */
//enum class ResourceState {
// LOADING, SUCCESS, EMPTY, ERROR
//}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
<string name="favorites_fragment_title">Favorites</string>
<string name="station_code_placeholder">Station: %s</string>

<!-- Create Favorite -->
<!-- Create FavoriteViewObject -->
<string name="create_favorite_title">Create favorite</string>
<string name="create_favorite_code_hint">Bus station code *</string>
<string name="create_favorite_title_hint">Bus station title</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@ import android.arch.core.executor.testing.InstantTaskExecutorRule
import android.arch.lifecycle.Observer
import com.joaquimley.transporteta.sms.SmsController
import com.joaquimley.transporteta.sms.model.SmsModel
import com.joaquimley.transporteta.ui.model.FavoriteView
import com.joaquimley.transporteta.ui.model.data.Resource
import com.joaquimley.transporteta.presentation.data.Resource
import com.joaquimley.transporteta.ui.model.data.ResourceState
import com.joaquimley.transporteta.ui.presentation.home.favorite.FavoritesViewModelImpl
import com.joaquimley.transporteta.presentation.home.favorite.FavoritesViewModelImpl
import com.nhaarman.mockito_kotlin.times
import com.nhaarman.mockito_kotlin.verify
import io.reactivex.Observable.just
Expand Down
1 change: 1 addition & 0 deletions transport-eta-android/presentation/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
Loading

0 comments on commit 7b30a00

Please sign in to comment.