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