Skip to content
This repository has been archived by the owner on Aug 2, 2024. It is now read-only.

Commit

Permalink
Introduce ResolvedSubscriber and fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
AAverin committed Jun 26, 2016
1 parent be96bb3 commit 2fe7f0b
Show file tree
Hide file tree
Showing 7 changed files with 129 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package pro.averin.anton.clean.android.cookbook.data.common.resolution

import pro.averin.anton.clean.android.cookbook.ui.common.resolution.Resolution
import retrofit2.adapter.rxjava.HttpException
import rx.Subscriber


class ResolvedSubscriber<T> constructor(
val resolution: Resolution,
val onNextFunc: (T) -> Unit,
val onCompletedFunc: () -> Unit = {},
val onErrorFunc: (Throwable?) -> Unit = {}) : Subscriber<T>() {

override fun onNext(p0: T) {
if (!isUnsubscribed) {
onNextFunc(p0)
}
}

override fun onCompleted() {
onCompletedFunc()
}

override fun onError(throwable: Throwable?) {
when (throwable) {
is HttpException -> resolution.onHttpException(throwable)
// let your location implementation throw a custom exception on timeout, for example
// is NetworkLocationTimeoutException -> resolution.onNetworkLocationError()
else -> throwable?.apply { resolution.onGenericRxException(this) }
}

onErrorFunc(throwable)
}

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package pro.averin.anton.clean.android.cookbook.ui.common.view

import pro.averin.anton.clean.android.cookbook.ui.common.MainLifecycleDelegate
import pro.averin.anton.clean.android.cookbook.ui.common.resolution.Resolution


interface ViewContract

interface ScreenContract : ViewContract

interface ResolvedScreenContract : ScreenContract {
fun getResolution(): Resolution?
}

interface ViewExtension : MainLifecycleDelegate

interface EventsDelegate
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package pro.averin.anton.clean.android.cookbook.ui.googlemaps.presenter

import pro.averin.anton.clean.android.cookbook.data.common.resolution.ResolvedSubscriber
import pro.averin.anton.clean.android.cookbook.data.common.rx.Schedulers
import pro.averin.anton.clean.android.cookbook.data.flickr.FlickrRepo
import pro.averin.anton.clean.android.cookbook.di.ActivityScope
Expand Down Expand Up @@ -30,12 +31,10 @@ class GoogleMapsPresenter @Inject constructor(
flickrRepo.searchPhotos(latitude, longitude, testRadius)
.subscribeOn(schedulers.io)
.observeOn(schedulers.mainThread)
.subscribe({
googleMapViewExtension.addPhotoMarkers(it)
}, {
it.printStackTrace()
}, {
googleMapViewExtension.navigateTo(latitude, longitude)
})
.subscribe(ResolvedSubscriber(view?.getResolution()!!, {
googleMapViewExtension.addPhotoMarkers(it)
}, onCompletedFunc = {
googleMapViewExtension.navigateTo(latitude, longitude)
}))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import android.view.View
import android.view.ViewGroup
import pro.averin.anton.clean.android.cookbook.databinding.FragmentGmapsBinding
import pro.averin.anton.clean.android.cookbook.di.ActivityComponent
import pro.averin.anton.clean.android.cookbook.ui.common.resolution.Resolution
import pro.averin.anton.clean.android.cookbook.ui.common.resolution.UIResolution
import pro.averin.anton.clean.android.cookbook.ui.common.view.BaseFragment
import pro.averin.anton.clean.android.cookbook.ui.googlemaps.presenter.GoogleMapsPresenter
import javax.inject.Inject
Expand All @@ -15,6 +17,7 @@ class GoogleMapsFragment : BaseFragment(), GoogleMapsScreenContract {

@Inject lateinit var googleMapViewExtension: GoogleMapViewExtension
@Inject lateinit var presenter: GoogleMapsPresenter
@Inject lateinit var uiResolution: UIResolution

companion object Builder {
@JvmStatic fun create(): GoogleMapsFragment {
Expand Down Expand Up @@ -44,4 +47,8 @@ class GoogleMapsFragment : BaseFragment(), GoogleMapsScreenContract {
binding = FragmentGmapsBinding.inflate(inflater, container, false)
return binding.root
}

override fun getResolution(): Resolution? {
return uiResolution
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package pro.averin.anton.clean.android.cookbook.ui.googlemaps.view

import pro.averin.anton.clean.android.cookbook.ui.common.view.ScreenContract
import pro.averin.anton.clean.android.cookbook.ui.common.view.ResolvedScreenContract


interface GoogleMapsScreenContract : ScreenContract {
interface GoogleMapsScreenContract : ResolvedScreenContract {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package pro.averin.anton.clean.android.cookbook.data.common.resolution

import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import pro.averin.anton.clean.android.cookbook.kotlin.test.verify
import pro.averin.anton.clean.android.cookbook.ui.common.resolution.Resolution
import pro.averin.anton.clean.android.cookbook.ui.common.resolution.UIResolver
import retrofit2.adapter.rxjava.HttpException

@RunWith(PowerMockRunner::class)
@PrepareForTest(HttpException::class, UIResolver::class)
class ResolvedSubscriberTest {

@Mock lateinit var resolution: Resolution
@Mock lateinit var obj: Throwable

@Mock lateinit var httpException: HttpException
@Mock lateinit var genericRxException: Throwable

var onNextFunc: (Throwable) -> Unit = {
it.printStackTrace()
}

var onCompletedFunc: () -> Unit = {

}

lateinit var classToTest: ResolvedSubscriber<Throwable>

@Before
fun setup() {
classToTest = ResolvedSubscriber(resolution, onNextFunc, onCompletedFunc)
}

@Test
fun onNextCallsOnNextFunc() {
// when
classToTest.onNext(obj)

// then
verify(obj).printStackTrace()
}

@Test
fun onErrorCallsHttpResolutionOnHttpException() {
// when
classToTest.onError(httpException)

// then
verify(resolution).onHttpException(httpException)
}

@Test
fun onErrorCallsGenericResolutionOnGenericRxException() {
// when
classToTest.onError(genericRxException)

// then
verify(resolution).onGenericRxException(genericRxException)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ import pro.averin.anton.clean.android.cookbook.kotlin.test.any
import pro.averin.anton.clean.android.cookbook.kotlin.test.eq
import pro.averin.anton.clean.android.cookbook.kotlin.test.given
import pro.averin.anton.clean.android.cookbook.kotlin.test.verify
import pro.averin.anton.clean.android.cookbook.ui.common.resolution.Resolution
import pro.averin.anton.clean.android.cookbook.ui.googlemaps.view.GoogleMapViewExtensionContract
import pro.averin.anton.clean.android.cookbook.ui.googlemaps.view.GoogleMapsScreenContract
import rx.Observable

@RunWith(PowerMockRunner::class)
Expand All @@ -24,6 +26,9 @@ class GoogleMapsPresenterTest {

@Mock private lateinit var flickrRepo: FlickrRepo
@Mock private lateinit var googleMapViewExtension: GoogleMapViewExtensionContract

@Mock private lateinit var view: GoogleMapsScreenContract
@Mock private lateinit var resolution: Resolution
val schedulers = MockSchedulers()

val lat = 1.0
Expand All @@ -38,10 +43,13 @@ class GoogleMapsPresenterTest {
flickrRepo,
schedulers
)
classToTest.view = view
classToTest.googleMapViewExtension = googleMapViewExtension

given(view.getResolution()).willReturn(resolution)
given(flickrRepo.searchPhotos(any(), any(), any()))
.willReturn(Observable.just(listPhoto))

}

@Test
Expand Down

0 comments on commit 2fe7f0b

Please sign in to comment.