1
+ package com.example.githubfirebaseissue.ui.viewmodel
2
+
3
+ import com.example.githubfirebaseissue.model.Issue
4
+ import com.example.githubfirebaseissue.testutil.Rx2SchedulersOverrideRule
5
+ import com.example.githubfirebaseissue.usecase.GetFireBaseIssueUseCase
6
+ import io.reactivex.Single
7
+ import org.junit.Before
8
+
9
+ import org.junit.Rule
10
+ import org.junit.Test
11
+ import org.mockito.Mock
12
+ import org.mockito.Mockito.`when`
13
+ import org.mockito.MockitoAnnotations
14
+ import androidx.arch.core.executor.testing.InstantTaskExecutorRule
15
+ import androidx.lifecycle.Observer
16
+ import com.example.githubfirebaseissue.common.Event
17
+ import com.jraska.livedata.TestObserver
18
+ import junit.framework.Assert.assertEquals
19
+ import org.junit.rules.TestRule
20
+ import org.junit.runner.RunWith
21
+ import org.mockito.Mockito.verify
22
+ import org.mockito.junit.MockitoJUnitRunner
23
+
24
+
25
+ @RunWith(MockitoJUnitRunner ::class )
26
+ class MainViewModelTest {
27
+
28
+ @JvmField
29
+ @Rule
30
+ val rx2SchedulersOverrideRule = Rx2SchedulersOverrideRule ()
31
+
32
+ @JvmField
33
+ @Rule
34
+ var rule: TestRule = InstantTaskExecutorRule ()
35
+
36
+ @Mock
37
+ lateinit var fireBaseUseCase: GetFireBaseIssueUseCase
38
+
39
+
40
+ private lateinit var viewModel: MainViewModel
41
+ private lateinit var loadingJraskaTestObserver: TestObserver <Boolean >
42
+ private lateinit var loadingJraskaTestStates: List <Boolean >
43
+
44
+
45
+ @Mock lateinit var dataObserver: Observer <Event <List <Issue >>>
46
+ @Mock lateinit var loadingObserver: Observer <Boolean >
47
+ @Mock lateinit var errorObserver: Observer <Event <Throwable >>
48
+
49
+ @Before
50
+ fun setUp () {
51
+ MockitoAnnotations .initMocks(this )
52
+ viewModel = MainViewModel (fireBaseUseCase)
53
+ }
54
+
55
+
56
+
57
+ @Test
58
+ fun `should return issues when fetching FireBase ios issue using Jraska Library way` () {
59
+ // Assemble
60
+ val issueList = listOf<Issue >()
61
+ `when `(fireBaseUseCase.getFireBaseIosIssues()).thenReturn(Single .just(issueList))
62
+
63
+ loadingJraskaTestObserver = TestObserver .test(viewModel.loadingState)
64
+ loadingJraskaTestStates = loadingJraskaTestObserver.valueHistory()
65
+
66
+ val dataObserver = TestObserver .test(viewModel.issueLiveData)
67
+
68
+ // Act
69
+ viewModel.fetchFireBaseIosIssueList()
70
+
71
+ // Assert
72
+ loadingJraskaTestObserver.assertHistorySize(2 )
73
+ assertEquals(true , loadingJraskaTestStates[0 ])
74
+ assertEquals(false , loadingJraskaTestStates[1 ])
75
+ assertEquals(dataObserver.value().getContentIfNotHandled(),issueList)
76
+ }
77
+
78
+ @Test
79
+ fun `should return error when fetching FireBase ios issue using Jraska Library way` () {
80
+ // Assemble
81
+ val throwable = Throwable (" Something went wrong" )
82
+ `when `(fireBaseUseCase.getFireBaseIosIssues()).thenReturn(Single .error(throwable))
83
+
84
+ loadingJraskaTestObserver = TestObserver .test(viewModel.loadingState)
85
+ loadingJraskaTestStates = loadingJraskaTestObserver.valueHistory()
86
+
87
+ val errorObserver = TestObserver .test(viewModel.apiError)
88
+
89
+ // Act
90
+ viewModel.fetchFireBaseIosIssueList()
91
+
92
+ // Assert
93
+ loadingJraskaTestObserver.assertHistorySize(3 )
94
+ assertEquals(true , loadingJraskaTestStates[0 ])
95
+ assertEquals(false , loadingJraskaTestStates[1 ])
96
+ assertEquals(false , loadingJraskaTestStates[2 ])
97
+ assertEquals(errorObserver.value().getContentIfNotHandled(),throwable)
98
+ }
99
+
100
+ @Test
101
+ fun `should return issues when fetching FireBase ios issue using observer way` () {
102
+ // Assemble
103
+ val issueList = listOf<Issue >()
104
+ `when `(fireBaseUseCase.getFireBaseIosIssues()).thenReturn(Single .just(issueList))
105
+
106
+ viewModel.issueLiveData.observeForever(dataObserver)
107
+ viewModel.loadingState.observeForever(loadingObserver)
108
+ viewModel.apiError.observeForever(errorObserver)
109
+
110
+ // Act
111
+ viewModel.fetchFireBaseIosIssueList()
112
+
113
+ // Assert
114
+ verify(loadingObserver).onChanged(true )
115
+ verify(loadingObserver).onChanged(false )
116
+ assertEquals(viewModel.issueLiveData.value?.getContentIfNotHandled(), issueList)
117
+ assertEquals(viewModel.apiError.value?.getContentIfNotHandled(), null )
118
+ }
119
+
120
+ @Test
121
+ fun `should return error when fetching FireBase ios issue using observer way` () {
122
+ // Assemble
123
+ val throwable = Throwable (" Something went wrong" )
124
+ `when `(fireBaseUseCase.getFireBaseIosIssues()).thenReturn(Single .error(throwable))
125
+
126
+ viewModel.issueLiveData.observeForever(dataObserver)
127
+ viewModel.loadingState.observeForever(loadingObserver)
128
+ viewModel.apiError.observeForever(errorObserver)
129
+
130
+ // Act
131
+ viewModel.fetchFireBaseIosIssueList()
132
+
133
+ // Assert
134
+ verify(loadingObserver).onChanged(true )
135
+ assertEquals(viewModel.issueLiveData.value?.getContentIfNotHandled(), null )
136
+ assertEquals(viewModel.apiError.value?.getContentIfNotHandled(), throwable)
137
+ }
138
+ }
0 commit comments