Skip to content

Commit c885758

Browse files
committedSep 12, 2017
Added UserListPresenterTest and ImmediateSchedulerRule
1 parent 67f54b4 commit c885758

File tree

2 files changed

+165
-0
lines changed

2 files changed

+165
-0
lines changed
 
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package com.example.tamaskozmer.kotlinrxexample.presentation.presenters
2+
3+
import com.example.tamaskozmer.kotlinrxexample.domain.interactors.GetUsers
4+
import com.example.tamaskozmer.kotlinrxexample.presentation.view.UserListView
5+
import com.example.tamaskozmer.kotlinrxexample.presentation.view.viewmodels.UserViewModel
6+
import com.example.tamaskozmer.kotlinrxexample.testutil.ImmediateSchedulerRule
7+
import io.reactivex.Single
8+
import org.junit.Before
9+
import org.junit.Rule
10+
import org.junit.Test
11+
import org.mockito.Mock
12+
import org.mockito.Mockito.anyBoolean
13+
import org.mockito.Mockito.anyInt
14+
import org.mockito.Mockito.times
15+
import org.mockito.Mockito.verify
16+
import org.mockito.MockitoAnnotations
17+
import org.mockito.Mockito.`when` as whenever
18+
19+
/**
20+
* Created by Tamas_Kozmer on 7/21/2017.
21+
*/
22+
class UserListPresenterTest {
23+
24+
@Rule @JvmField
25+
val immediateSchedulerRule = ImmediateSchedulerRule()
26+
27+
@Mock
28+
lateinit var mockGetUsers: GetUsers
29+
30+
@Mock
31+
lateinit var mockView: UserListView
32+
33+
lateinit var userListPresenter: UserListPresenter
34+
35+
@Before
36+
fun setUp() {
37+
MockitoAnnotations.initMocks(this)
38+
userListPresenter = UserListPresenter(mockGetUsers)
39+
}
40+
41+
@Test
42+
fun testGetUsers_errorCase_showError() {
43+
// Given
44+
val error = "Test error"
45+
val single: Single<List<UserViewModel>> = Single.create {
46+
emitter ->
47+
emitter.onError(Exception(error))
48+
}
49+
50+
// When
51+
whenever(mockGetUsers.execute(anyInt(), anyBoolean())).thenReturn(single)
52+
53+
userListPresenter.attachView(mockView)
54+
userListPresenter.getUsers()
55+
56+
// Then
57+
verify(mockView).hideLoading()
58+
verify(mockView).showEmptyListError()
59+
}
60+
61+
@Test
62+
fun testGetUsers_successCaseFirstPage_clearList() {
63+
// Given
64+
val users = listOf(UserViewModel(1, "Name", 1000, ""))
65+
val single: Single<List<UserViewModel>> = Single.create {
66+
emitter ->
67+
emitter.onSuccess(users)
68+
}
69+
70+
// When
71+
whenever(mockGetUsers.execute(anyInt(), anyBoolean())).thenReturn(single)
72+
73+
userListPresenter.attachView(mockView)
74+
userListPresenter.getUsers()
75+
76+
// Then
77+
verify(mockView).clearList()
78+
}
79+
80+
@Test
81+
fun testGetUsers_successCaseMultipleTimes_clearListOnlyOnce() {
82+
// Given
83+
val users = listOf(UserViewModel(1, "Name", 1000, ""))
84+
val single: Single<List<UserViewModel>> = Single.create {
85+
emitter ->
86+
emitter.onSuccess(users)
87+
}
88+
89+
// When
90+
whenever(mockGetUsers.execute(anyInt(), anyBoolean())).thenReturn(single)
91+
92+
userListPresenter.attachView(mockView)
93+
userListPresenter.getUsers()
94+
userListPresenter.getUsers()
95+
96+
// Then
97+
verify(mockView).clearList()
98+
verify(mockView, times(2)).hideLoading()
99+
verify(mockView, times(2)).addUsersToList(users)
100+
}
101+
102+
@Test
103+
fun testGetUsers_forcedSuccessCaseMultipleTimes_clearListEveryTime() {
104+
// Given
105+
val users = listOf(UserViewModel(1, "Name", 1000, ""))
106+
val single: Single<List<UserViewModel>> = Single.create {
107+
emitter ->
108+
emitter.onSuccess(users)
109+
}
110+
111+
// When
112+
whenever(mockGetUsers.execute(anyInt(), anyBoolean())).thenReturn(single)
113+
114+
userListPresenter.attachView(mockView)
115+
userListPresenter.getUsers(forced = true)
116+
userListPresenter.getUsers(forced = true)
117+
118+
// Then
119+
verify(mockView, times(2)).clearList()
120+
verify(mockView, times(2)).hideLoading()
121+
verify(mockView, times(2)).addUsersToList(users)
122+
}
123+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.example.tamaskozmer.kotlinrxexample.testutil
2+
3+
import io.reactivex.Scheduler
4+
import io.reactivex.android.plugins.RxAndroidPlugins
5+
import io.reactivex.internal.schedulers.ExecutorScheduler
6+
import io.reactivex.plugins.RxJavaPlugins
7+
import org.junit.rules.TestRule
8+
import org.junit.runner.Description
9+
import org.junit.runners.model.Statement
10+
import java.util.concurrent.Executor
11+
12+
13+
/**
14+
* Created by Tamas_Kozmer on 7/21/2017.
15+
*/
16+
class ImmediateSchedulerRule : TestRule {
17+
private val immediate = object : Scheduler() {
18+
override fun createWorker(): Worker {
19+
return ExecutorScheduler.ExecutorWorker(Executor { it.run() })
20+
}
21+
}
22+
23+
override fun apply(base: Statement, d: Description): Statement {
24+
return object : Statement() {
25+
@Throws(Throwable::class)
26+
override fun evaluate() {
27+
RxJavaPlugins.setInitIoSchedulerHandler { immediate }
28+
RxJavaPlugins.setInitComputationSchedulerHandler { immediate }
29+
RxJavaPlugins.setInitNewThreadSchedulerHandler { immediate }
30+
RxJavaPlugins.setInitSingleSchedulerHandler { immediate }
31+
RxAndroidPlugins.setInitMainThreadSchedulerHandler { immediate }
32+
33+
try {
34+
base.evaluate()
35+
} finally {
36+
RxJavaPlugins.reset()
37+
RxAndroidPlugins.reset()
38+
}
39+
}
40+
}
41+
}
42+
}

0 commit comments

Comments
 (0)