Skip to content

Commit 5f3a576

Browse files
committed
use kotlinx-coroutines-test latest apis for tests
1 parent 28d9da2 commit 5f3a576

File tree

4 files changed

+97
-33
lines changed

4 files changed

+97
-33
lines changed

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ dependencies {
106106
androidTestImplementation "com.google.truth:truth:1.1.3"
107107

108108
// for testing coroutines
109-
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.0"
110-
androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.0"
109+
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.1"
110+
androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.1"
111111

112112
// mockito
113113
testImplementation 'org.mockito:mockito-core:3.3.3'

app/src/main/java/com/raghav/mynotes/ui/AllTasksVM.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,18 @@ class AllTasksVM @Inject constructor(
5050
}
5151

5252
fun saveSortCheckBoxState(isChecked: Boolean) {
53-
viewModelScope.launch {
53+
viewModelScope.launch(dispatchers.main) {
5454
repository.saveSortCheckBoxState(isChecked)
5555
}
5656
}
5757

5858
fun getSortCheckBoxState() {
59-
viewModelScope.launch {
59+
viewModelScope.launch(dispatchers.main) {
6060
_checkBoxState.value = repository.getSortCheckBoxState()
6161
}
6262
}
63+
64+
fun clear() {
65+
this.onCleared()
66+
}
6367
}

app/src/test/java/com/raghav/mynotes/ui/AllTasksVMTest.kt

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,18 @@ package com.raghav.mynotes.ui
33
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
44
import com.google.common.truth.Truth.assertThat
55
import com.raghav.mynotes.models.TaskEntity
6-
import com.raghav.mynotes.repository.TasksRepository
7-
import com.raghav.mynotes.utils.Resource
6+
import com.raghav.mynotes.utils.FakeTaskRepositoryImpl
87
import com.raghav.mynotes.utils.TestDispatchers
98
import getOrAwaitValueTest
109
import kotlinx.coroutines.ExperimentalCoroutinesApi
11-
import kotlinx.coroutines.flow.flow
12-
import kotlinx.coroutines.runBlocking
10+
import kotlinx.coroutines.test.UnconfinedTestDispatcher
11+
import kotlinx.coroutines.test.runTest
12+
import org.junit.After
1313
import org.junit.Before
1414
import org.junit.Rule
1515
import org.junit.Test
16-
import org.junit.runner.RunWith
17-
import org.mockito.Mock
18-
import org.mockito.Mockito.`when`
19-
import org.mockito.junit.MockitoJUnitRunner
2016

2117
@ExperimentalCoroutinesApi
22-
@RunWith(MockitoJUnitRunner::class)
2318
class AllTasksVMTest {
2419

2520
/**
@@ -29,11 +24,9 @@ class AllTasksVMTest {
2924
@get:Rule
3025
var instantTaskExecutorRule = InstantTaskExecutorRule()
3126
private lateinit var allTasksVM: AllTasksVM
32-
33-
@Mock
34-
private lateinit var mockRepository: TasksRepository
27+
private val fakeTaskRepositoryImpl = FakeTaskRepositoryImpl()
3528
private val dispatchers = TestDispatchers()
36-
private val tasksList: List<TaskEntity> = listOf(
29+
private val tasksList = mutableListOf(
3730
TaskEntity(
3831
id = 0,
3932
title = "task1",
@@ -45,38 +38,60 @@ class AllTasksVMTest {
4538
title = "task2",
4639
description = "des2",
4740
deadLine = "Friday, 29 April 2022"
48-
),
41+
)
4942
)
43+
private val sampleTask = tasksList[0]
5044

5145
@Before
52-
fun setUp() {
53-
allTasksVM = AllTasksVM(mockRepository, dispatchers)
46+
fun setupViewModel() {
47+
allTasksVM = AllTasksVM(fakeTaskRepositoryImpl, dispatchers)
48+
}
49+
50+
@After
51+
fun clearViewModel() {
52+
allTasksVM.clear()
5453
}
5554

5655
/**
5756
* Test cases follow naming convention:
5857
* unitUnderTest_inputProvidedToUnit_resultExpected
5958
* */
6059
@Test
61-
fun getTasks_notSortedByDeadline_returnsUnSortedTasksList() = runBlocking {
62-
val testFlow = flow { emit(tasksList) }
60+
fun getTasks_notSortedByDeadline_returnsUnSortedTasksList() =
61+
runTest(UnconfinedTestDispatcher()) {
62+
allTasksVM.getTasks(false)
63+
val receivedList = allTasksVM.tasks.getOrAwaitValueTest().data
64+
assertThat(receivedList).isEqualTo(tasksList)
65+
}
6366

64-
`when`(mockRepository.getAllTasks()).thenReturn(testFlow)
65-
allTasksVM.getTasks()
66-
val value = allTasksVM.tasks.getOrAwaitValueTest()
67-
68-
assertThat(value.data).isEqualTo(Resource.Success(tasksList).data)
67+
@Test
68+
fun getTasks_sortedByDeadline_returnsSortedTasksList() = runTest(UnconfinedTestDispatcher()) {
69+
allTasksVM.getTasks(true)
70+
val receivedList = allTasksVM.tasks.getOrAwaitValueTest().data
71+
assertThat(receivedList).isEqualTo(tasksList.reversed())
6972
}
7073

7174
@Test
72-
fun getTasks_sortedByDeadline_returnsSortedTasksList() = runBlocking {
73-
val testFlow = flow { emit(tasksList) }
75+
fun deleteTask_task_taskDeleted() = runTest(UnconfinedTestDispatcher()) {
76+
allTasksVM.deleteTask(sampleTask)
77+
allTasksVM.getTasks()
78+
val receivedList = allTasksVM.tasks.getOrAwaitValueTest().data
79+
assertThat(receivedList).doesNotContain(sampleTask)
80+
}
7481

75-
`when`(mockRepository.getAllTasks()).thenReturn(testFlow)
76-
allTasksVM.getTasks(true)
77-
val value = allTasksVM.tasks.getOrAwaitValueTest()
82+
@Test
83+
fun getSortCheckBoxState_returnsFalseIfNull() = runTest(UnconfinedTestDispatcher()) {
84+
allTasksVM.getSortCheckBoxState()
85+
val state = allTasksVM.checkBoxState.getOrAwaitValueTest()
86+
assertThat(state).isFalse()
87+
}
7888

79-
assertThat(value.data).isEqualTo(Resource.Success(tasksList).data?.reversed())
89+
@Test
90+
fun saveSortCheckBoxState_true_stateSaved() = runTest(UnconfinedTestDispatcher()) {
91+
allTasksVM.saveSortCheckBoxState(true)
92+
allTasksVM.getSortCheckBoxState()
93+
val state = allTasksVM.checkBoxState.getOrAwaitValueTest()
94+
assertThat(state).isTrue()
8095
}
8196
}
8297

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.raghav.mynotes.utils
2+
3+
import com.raghav.mynotes.models.TaskEntity
4+
import com.raghav.mynotes.repository.TasksRepository
5+
import kotlinx.coroutines.flow.Flow
6+
import kotlinx.coroutines.flow.flow
7+
8+
class FakeTaskRepositoryImpl : TasksRepository {
9+
10+
private val tasksList = mutableListOf(
11+
TaskEntity(
12+
id = 0,
13+
title = "task1",
14+
description = "des1",
15+
deadLine = "Saturday, 30 April 2022"
16+
),
17+
TaskEntity(
18+
id = 1,
19+
title = "task2",
20+
description = "des2",
21+
deadLine = "Friday, 29 April 2022"
22+
)
23+
)
24+
private var checkBoxState: Boolean = false
25+
26+
override suspend fun saveTask(task: TaskEntity) {
27+
tasksList.add(task)
28+
}
29+
30+
override fun getAllTasks(): Flow<List<TaskEntity>> {
31+
return flow { emit(tasksList) }
32+
}
33+
34+
override suspend fun deleteTask(task: TaskEntity) {
35+
tasksList.remove(task)
36+
}
37+
38+
override suspend fun saveSortCheckBoxState(checkBoxState: Boolean) {
39+
this.checkBoxState = checkBoxState
40+
}
41+
42+
override suspend fun getSortCheckBoxState(): Boolean {
43+
return checkBoxState
44+
}
45+
}

0 commit comments

Comments
 (0)