-
Notifications
You must be signed in to change notification settings - Fork 496
/
QueryAsFlowTest.kt
127 lines (107 loc) · 3.36 KB
/
QueryAsFlowTest.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package app.cash.sqldelight.coroutines
import app.cash.sqldelight.coroutines.Employee.Companion.MAPPER
import app.cash.sqldelight.coroutines.Employee.Companion.SELECT_EMPLOYEES
import app.cash.sqldelight.coroutines.Employee.Companion.USERNAME
import app.cash.sqldelight.coroutines.TestDb.Companion.TABLE_EMPLOYEE
import app.cash.turbine.test
import kotlinx.coroutines.CoroutineStart.UNDISPATCHED
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.yield
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue
class QueryAsFlowTest : DbTest {
override suspend fun setupDb(): TestDb = TestDb(testDriver())
@Test fun query() = runTest { db ->
db.createQuery(TABLE_EMPLOYEE, SELECT_EMPLOYEES, MAPPER)
.asFlow()
.test {
awaitItem().assert {
hasRow("alice", "Alice Allison")
hasRow("bob", "Bob Bobberson")
hasRow("eve", "Eve Evenson")
}
cancel()
}
}
@Test fun queryEmitsWithoutSuspending() = runTest { db ->
val flow = db.createQuery(TABLE_EMPLOYEE, SELECT_EMPLOYEES, MAPPER).asFlow()
var seenValue = false
val collectJob = launch(start = UNDISPATCHED) {
flow.collect {
seenValue = true
}
}
assertTrue(seenValue)
collectJob.cancel()
}
@Test fun queryObservesNotification() = runTest { db ->
db.createQuery(TABLE_EMPLOYEE, SELECT_EMPLOYEES, MAPPER)
.asFlow()
.test {
awaitItem().assert {
hasRow("alice", "Alice Allison")
hasRow("bob", "Bob Bobberson")
hasRow("eve", "Eve Evenson")
}
db.employee(Employee("john", "John Johnson"))
awaitItem().assert {
hasRow("alice", "Alice Allison")
hasRow("bob", "Bob Bobberson")
hasRow("eve", "Eve Evenson")
hasRow("john", "John Johnson")
}
cancel()
}
}
@Test fun queryNotNotifiedAfterCancel() = runTest { db ->
db.createQuery(TABLE_EMPLOYEE, SELECT_EMPLOYEES, MAPPER)
.asFlow()
.test {
awaitItem().assert {
hasRow("alice", "Alice Allison")
hasRow("bob", "Bob Bobberson")
hasRow("eve", "Eve Evenson")
}
cancel()
db.employee(Employee("john", "John Johnson"))
yield() // Ensure any events can be delivered.
expectNoEvents()
}
}
@Test fun queryOnlyNotifiedAfterCollect() = runTest { db ->
val flow = db.createQuery(TABLE_EMPLOYEE, SELECT_EMPLOYEES, MAPPER)
.asFlow()
db.employee(Employee("john", "John Johnson"))
flow.test {
awaitItem().assert {
hasRow("alice", "Alice Allison")
hasRow("bob", "Bob Bobberson")
hasRow("eve", "Eve Evenson")
hasRow("john", "John Johnson")
}
cancel()
}
}
@Test fun queryCanBeCollectedMoreThanOnce() = runTest { db ->
val flow = db.createQuery(TABLE_EMPLOYEE, "$SELECT_EMPLOYEES WHERE $USERNAME = 'john'", MAPPER)
.asFlow()
.mapToOneNotNull(Dispatchers.DEFAULT)
val employee = Employee("john", "John Johnson")
val timesCancelled = AtomicInt(0)
repeat(5) {
launch {
flow.test {
assertEquals(employee, awaitItem())
cancel()
timesCancelled.increment()
}
}
}
db.employee(employee)
while (timesCancelled.value != 5) {
yield()
}
}
}