/
TodoItesmRepositoryTest.kt
108 lines (90 loc) · 3.34 KB
/
TodoItesmRepositoryTest.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.tomerpacific.todo
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.core.DataStoreFactory
import androidx.datastore.dataStoreFile
import androidx.test.core.app.ApplicationProvider
import org.junit.runner.RunWith
import androidx.test.runner.AndroidJUnit4
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.TestCoroutineScope
import kotlinx.coroutines.test.runTest
import org.junit.After
import org.junit.Before
import org.junit.Test
import service.TodoItemsRepository
import service.TodoItemsSerializer
import java.io.File
import java.util.UUID
const val TEST_DATA_STORE_FILE_NAME = "testStore.pb"
const val TEST_TODO_ITEM_DESCRIPTION = "test todo item"
private val testContext: Context = ApplicationProvider.getApplicationContext()
@OptIn(ExperimentalCoroutinesApi::class)
private val dispatcher = TestCoroutineDispatcher()
@OptIn(ExperimentalCoroutinesApi::class)
private val testScope = TestCoroutineScope(dispatcher)
@RunWith(AndroidJUnit4::class)
class TodoItemsRepositoryTest {
private lateinit var dataStore: DataStore<TodoItems>
private lateinit var repository: TodoItemsRepository
private fun createDataStore() {
dataStore = DataStoreFactory.create(
produceFile = {
testContext.dataStoreFile(TEST_DATA_STORE_FILE_NAME)
},
serializer = TodoItemsSerializer
)
repository = TodoItemsRepository(dataStore)
}
@Before
fun setup() {
createDataStore()
}
@OptIn(ExperimentalCoroutinesApi::class)
@Test
fun repository_testFetchInitialTodoItems() {
runTest {
testScope.launch {
val items = repository.todoItemsFlow.first().itemsList
assert(items.size == 0)
}
}
}
@OptIn(ExperimentalCoroutinesApi::class)
@Test
fun repository_testAdditionOfTodoItem() {
runTest {
testScope.launch {
val todoItem: TodoItem = TodoItem.newBuilder().setItemId(UUID.randomUUID().toString())
.setItemDescription(TEST_TODO_ITEM_DESCRIPTION).build()
repository.updateTodoItems(todoItem)
val todoItems = repository.todoItemsFlow.first().itemsList
assert(todoItems.size == 1)
assert(todoItems[0].itemDescription.equals(TEST_TODO_ITEM_DESCRIPTION))
}
}
}
@OptIn(ExperimentalCoroutinesApi::class)
@Test
fun repository_testRemovalOfTodoItem() {
runTest {
testScope.launch {
val todoItem: TodoItem = TodoItem.newBuilder().setItemId(UUID.randomUUID().toString())
.setItemDescription(TEST_TODO_ITEM_DESCRIPTION).build()
repository.updateTodoItems(todoItem)
var todoItems = repository.todoItemsFlow.first().itemsList
assert(todoItems.size == 1)
repository.removeTodoItem(todoItem)
todoItems = repository.todoItemsFlow.first().itemsList
assert(todoItems.size == 0)
}
}
}
@After
fun cleanup() {
File(testContext.filesDir, "datastore").deleteRecursively()
}
}