1
+ package org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.bookkeeper
2
+
3
+ import dev.mokkery.answering.returns
4
+ import dev.mokkery.everySuspend
5
+ import dev.mokkery.matcher.eq
6
+ import dev.mokkery.mock
7
+ import dev.mokkery.verifySuspend
8
+ import kotlinx.coroutines.test.runTest
9
+ import org.mobilenativefoundation.trails.xplat.lib.db.*
10
+ import org.mobilenativefoundation.trails.xplat.lib.models.post.Post
11
+ import org.mobilenativefoundation.trails.xplat.lib.repositories.post.impl.store.db.PostBookkeepingDAO
12
+ import kotlin.test.Test
13
+ import kotlin.test.assertEquals
14
+ import kotlin.test.assertNull
15
+
16
+ class RealPostBookkeepingReaderTest {
17
+
18
+ private val bookkeepingDAO = mock<PostBookkeepingDAO >()
19
+ private val bookkeepingReader = RealPostBookkeepingReader (bookkeepingDAO)
20
+
21
+ @Test
22
+ fun findLastFailedUpdate_givenNormalBookkeepingDAOAndFailedUpdate_whenCalled_thenShouldReturnTimestamp () = runTest {
23
+ // Given
24
+ val failedUpdate = GetFailedUpdates (1L )
25
+
26
+ everySuspend {
27
+ bookkeepingDAO.getAllFailedUpdates()
28
+ }.returns(listOf (failedUpdate))
29
+
30
+ everySuspend {
31
+ bookkeepingDAO.getAllFailedDeletes()
32
+ }.returns(emptyList())
33
+
34
+ // When
35
+ val timestamp = bookkeepingReader.findLastFailedUpdate()
36
+
37
+ // Then
38
+ verifySuspend { bookkeepingDAO.getAllFailedUpdates() }
39
+ verifySuspend { bookkeepingDAO.getAllFailedDeletes() }
40
+ assertEquals(failedUpdate.timestamp, timestamp)
41
+ }
42
+
43
+ @Test
44
+ fun findLastFailedUpdate_givenNormalBookkeepingDAOAndFailedDelete_whenCalled_thenShouldReturnTimestamp () = runTest {
45
+ // Given
46
+ val failedDelete = GetFailedDeletes (1L )
47
+
48
+ everySuspend {
49
+ bookkeepingDAO.getAllFailedUpdates()
50
+ }.returns(emptyList())
51
+
52
+ everySuspend {
53
+ bookkeepingDAO.getAllFailedDeletes()
54
+ }.returns(listOf (failedDelete))
55
+
56
+ // When
57
+ val timestamp = bookkeepingReader.findLastFailedUpdate()
58
+
59
+ // Then
60
+ verifySuspend { bookkeepingDAO.getAllFailedUpdates() }
61
+ verifySuspend { bookkeepingDAO.getAllFailedDeletes() }
62
+ assertEquals(failedDelete.timestamp, timestamp)
63
+ }
64
+
65
+ @Test
66
+ fun findLastFailedUpdate_givenNormalBookkeepingDAOAndNoFailedSyncs_whenCalled_thenShouldReturnNull () = runTest {
67
+ // Given
68
+
69
+ everySuspend {
70
+ bookkeepingDAO.getAllFailedUpdates()
71
+ }.returns(emptyList())
72
+
73
+ everySuspend {
74
+ bookkeepingDAO.getAllFailedDeletes()
75
+ }.returns(emptyList())
76
+
77
+ // When
78
+ val timestamp = bookkeepingReader.findLastFailedUpdate()
79
+
80
+ // Then
81
+ verifySuspend { bookkeepingDAO.getAllFailedUpdates() }
82
+ verifySuspend { bookkeepingDAO.getAllFailedDeletes() }
83
+ assertNull(timestamp)
84
+ }
85
+
86
+ @Test
87
+ fun findLastFailedUpdate_givenNormalBookkeepingDAOAndFailedUpdate_whenCalledWithMultipleKeys_thenShouldReturnTimestamp () =
88
+ runTest {
89
+ // Given
90
+ val keys = listOf (Post .Key (1 ))
91
+ val ids = keys.map { it.id }
92
+ val failedUpdate = GetManyFailedUpdates (1L )
93
+
94
+ everySuspend {
95
+ bookkeepingDAO.getManyFailedUpdates(eq(ids))
96
+ }.returns(listOf (failedUpdate))
97
+
98
+ everySuspend {
99
+ bookkeepingDAO.getManyFailedDeletes(eq(ids))
100
+ }.returns(emptyList())
101
+
102
+ // When
103
+ val timestamp = bookkeepingReader.findLastFailedUpdate(keys)
104
+
105
+ // Then
106
+ verifySuspend { bookkeepingDAO.getManyFailedUpdates(eq(ids)) }
107
+ verifySuspend { bookkeepingDAO.getManyFailedDeletes(eq(ids)) }
108
+ assertEquals(failedUpdate.timestamp, timestamp)
109
+ }
110
+
111
+
112
+ @Test
113
+ fun findLastFailedUpdate_givenNormalBookkeepingDAOAndFailedDelete_whenCalledWithMultipleKeys_thenShouldReturnTimestamp () =
114
+ runTest {
115
+ // Given
116
+ val keys = listOf (Post .Key (1 ))
117
+ val ids = keys.map { it.id }
118
+ val failedDelete = GetManyFailedDeletes (1L )
119
+
120
+ everySuspend {
121
+ bookkeepingDAO.getManyFailedUpdates(eq(ids))
122
+ }.returns(emptyList())
123
+
124
+ everySuspend {
125
+ bookkeepingDAO.getManyFailedDeletes(eq(ids))
126
+ }.returns(listOf (failedDelete))
127
+
128
+ // When
129
+ val timestamp = bookkeepingReader.findLastFailedUpdate(keys)
130
+
131
+ // Then
132
+ verifySuspend { bookkeepingDAO.getManyFailedUpdates(eq(ids)) }
133
+ verifySuspend { bookkeepingDAO.getManyFailedDeletes(eq(ids)) }
134
+ assertEquals(failedDelete.timestamp, timestamp)
135
+ }
136
+
137
+
138
+ @Test
139
+ fun findLastFailedUpdate_givenNormalBookkeepingDAOAndNoFailedSyncs_whenCalledWithMultipleKeys_thenShouldReturnNull () =
140
+ runTest {
141
+ // Given
142
+ val keys = listOf (Post .Key (1 ))
143
+ val ids = keys.map { it.id }
144
+
145
+ everySuspend {
146
+ bookkeepingDAO.getManyFailedUpdates(eq(ids))
147
+ }.returns(emptyList())
148
+
149
+ everySuspend {
150
+ bookkeepingDAO.getManyFailedDeletes(eq(ids))
151
+ }.returns(emptyList())
152
+
153
+ // When
154
+ val timestamp = bookkeepingReader.findLastFailedUpdate(keys)
155
+
156
+ // Then
157
+ verifySuspend { bookkeepingDAO.getManyFailedUpdates(eq(ids)) }
158
+ verifySuspend { bookkeepingDAO.getManyFailedDeletes(eq(ids)) }
159
+ assertNull(timestamp)
160
+ }
161
+
162
+ @Test
163
+ fun findLastFailedUpdate_givenNormalBookkeepingDAOAndFailedUpdate_whenCalledWithSingleKey_thenShouldReturnTimestamp () =
164
+ runTest {
165
+ // Given
166
+ val key = Post .Key (1 )
167
+ val failedUpdate = GetOneFailedUpdate (1L )
168
+
169
+ everySuspend {
170
+ bookkeepingDAO.getOneFailedUpdate(key.id)
171
+ }.returns(failedUpdate)
172
+
173
+ everySuspend {
174
+ bookkeepingDAO.getOneFailedDelete(key.id)
175
+ }.returns(null )
176
+
177
+ // When
178
+ val timestamp = bookkeepingReader.findLastFailedUpdate(key)
179
+
180
+ // Then
181
+ verifySuspend { bookkeepingDAO.getOneFailedUpdate(key.id) }
182
+ verifySuspend { bookkeepingDAO.getOneFailedDelete(key.id) }
183
+ assertEquals(failedUpdate.timestamp, timestamp)
184
+ }
185
+
186
+
187
+ @Test
188
+ fun findLastFailedUpdate_givenNormalBookkeepingDAOAndFailedDelete_whenCalledWithSingleKey_thenShouldReturnTimestamp () =
189
+ runTest {
190
+ // Given
191
+ val key = Post .Key (1 )
192
+ val failedDelete = GetOneFailedDelete (1L )
193
+
194
+ everySuspend {
195
+ bookkeepingDAO.getOneFailedUpdate(key.id)
196
+ }.returns(null )
197
+
198
+ everySuspend {
199
+ bookkeepingDAO.getOneFailedDelete(key.id)
200
+ }.returns(failedDelete)
201
+
202
+ // When
203
+ val timestamp = bookkeepingReader.findLastFailedUpdate(key)
204
+
205
+ // Then
206
+ verifySuspend { bookkeepingDAO.getOneFailedUpdate(key.id) }
207
+ verifySuspend { bookkeepingDAO.getOneFailedDelete(key.id) }
208
+ assertEquals(failedDelete.timestamp, timestamp)
209
+ }
210
+
211
+
212
+ @Test
213
+ fun findLastFailedUpdate_givenNormalBookkeepingDAOAndNoFailedSyncs_whenCalledWithSingleKey_thenShouldReturnNull () =
214
+ runTest {
215
+ // Given
216
+ val key = Post .Key (1 )
217
+
218
+ everySuspend {
219
+ bookkeepingDAO.getOneFailedUpdate(key.id)
220
+ }.returns(null )
221
+
222
+ everySuspend {
223
+ bookkeepingDAO.getOneFailedDelete(key.id)
224
+ }.returns(null )
225
+
226
+ // When
227
+ val timestamp = bookkeepingReader.findLastFailedUpdate(key)
228
+
229
+ // Then
230
+ verifySuspend { bookkeepingDAO.getOneFailedUpdate(key.id) }
231
+ verifySuspend { bookkeepingDAO.getOneFailedDelete(key.id) }
232
+ assertNull(timestamp)
233
+ }
234
+
235
+ }
0 commit comments