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