@@ -19,12 +19,19 @@ package io.getstream.chat.android.offline.plugin.listener.internal
1919import io.getstream.chat.android.client.persistance.repository.MessageRepository
2020import io.getstream.chat.android.client.persistance.repository.UserRepository
2121import io.getstream.chat.android.client.setup.state.ClientState
22+ import io.getstream.chat.android.models.MessageType
23+ import io.getstream.chat.android.models.ModerationAction
2224import io.getstream.chat.android.models.SyncStatus
2325import io.getstream.chat.android.randomCID
2426import io.getstream.chat.android.randomMessage
27+ import io.getstream.chat.android.randomModeration
28+ import io.getstream.chat.android.randomUser
2529import io.getstream.result.Error
2630import io.getstream.result.Result
31+ import kotlinx.coroutines.flow.MutableStateFlow
2732import kotlinx.coroutines.test.runTest
33+ import org.junit.jupiter.api.Assertions.assertTrue
34+ import org.junit.jupiter.api.BeforeEach
2835import org.junit.jupiter.api.Test
2936import org.mockito.kotlin.any
3037import org.mockito.kotlin.argThat
@@ -37,11 +44,16 @@ internal class DeleteMessageListenerDatabaseTest {
3744
3845 private val clientState: ClientState = mock()
3946
40- private val messageRepository: MessageRepository = mock()
47+ private lateinit var messageRepository: MessageRepository
4148 private val userRepository: UserRepository = mock()
4249
43- private val deleteMessageListenerState: DeleteMessageListenerDatabase =
44- DeleteMessageListenerDatabase (clientState, messageRepository, userRepository)
50+ private lateinit var deleteMessageListenerState: DeleteMessageListenerDatabase
51+
52+ @BeforeEach
53+ fun setUp () {
54+ messageRepository = mock()
55+ deleteMessageListenerState = DeleteMessageListenerDatabase (clientState, messageRepository, userRepository)
56+ }
4557
4658 @Test
4759 fun `when internet is available, the message should be updated as in progress before the request` () = runTest {
@@ -122,4 +134,135 @@ internal class DeleteMessageListenerDatabaseTest {
122134 },
123135 )
124136 }
137+
138+ @Test
139+ fun `onMessageDeletePrecondition when message not found locally should return Success` () = runTest {
140+ val currentUser = randomUser()
141+
142+ whenever(clientState.user) doReturn MutableStateFlow (currentUser)
143+ whenever(messageRepository.selectMessage(any())) doReturn null
144+
145+ val result = deleteMessageListenerState.onMessageDeletePrecondition(" unknown-message-id" )
146+
147+ assertTrue(result is Result .Success )
148+ }
149+
150+ @Test
151+ fun `onMessageDeletePrecondition when message has moderation bounce should return Failure and delete from repo` () =
152+ runTest {
153+ val currentUser = randomUser()
154+ val testMessage = randomMessage(
155+ id = " msg-1" ,
156+ cid = randomCID(),
157+ user = currentUser,
158+ type = MessageType .ERROR ,
159+ moderation = randomModeration(action = ModerationAction .bounce),
160+ )
161+
162+ whenever(clientState.user) doReturn MutableStateFlow (currentUser)
163+ whenever(messageRepository.selectMessage(any())) doReturn testMessage
164+
165+ val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id)
166+
167+ assertTrue(result is Result .Failure )
168+ verify(messageRepository).deleteChannelMessage(argThat { id == testMessage.id })
169+ }
170+
171+ @Test
172+ fun `onMessageDeletePrecondition when message is error type should return Failure and delete from repo` () =
173+ runTest {
174+ val currentUser = randomUser()
175+ val testMessage = randomMessage(
176+ id = " msg-1" ,
177+ cid = randomCID(),
178+ type = MessageType .ERROR ,
179+ syncStatus = SyncStatus .COMPLETED ,
180+ )
181+
182+ whenever(clientState.user) doReturn MutableStateFlow (currentUser)
183+ whenever(messageRepository.selectMessage(any())) doReturn testMessage
184+
185+ val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id)
186+
187+ assertTrue(result is Result .Failure )
188+ verify(messageRepository).deleteChannelMessage(argThat { id == testMessage.id })
189+ }
190+
191+ @Test
192+ fun `onMessageDeletePrecondition when message is ephemeral type should return Failure and delete from repo` () =
193+ runTest {
194+ val currentUser = randomUser()
195+ val testMessage = randomMessage(
196+ id = " msg-1" ,
197+ cid = randomCID(),
198+ type = MessageType .EPHEMERAL ,
199+ syncStatus = SyncStatus .COMPLETED ,
200+ )
201+
202+ whenever(clientState.user) doReturn MutableStateFlow (currentUser)
203+ whenever(messageRepository.selectMessage(any())) doReturn testMessage
204+
205+ val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id)
206+
207+ assertTrue(result is Result .Failure )
208+ verify(messageRepository).deleteChannelMessage(argThat { id == testMessage.id })
209+ }
210+
211+ @Test
212+ fun `onMessageDeletePrecondition when message has SYNC_NEEDED should return Failure and delete from repo` () =
213+ runTest {
214+ val currentUser = randomUser()
215+ val testMessage = randomMessage(
216+ id = " msg-1" ,
217+ cid = randomCID(),
218+ type = MessageType .REGULAR ,
219+ syncStatus = SyncStatus .SYNC_NEEDED ,
220+ )
221+
222+ whenever(clientState.user) doReturn MutableStateFlow (currentUser)
223+ whenever(messageRepository.selectMessage(any())) doReturn testMessage
224+
225+ val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id)
226+
227+ assertTrue(result is Result .Failure )
228+ verify(messageRepository).deleteChannelMessage(argThat { id == testMessage.id })
229+ }
230+
231+ @Test
232+ fun `onMessageDeletePrecondition when message has FAILED_PERMANENTLY should return Failure and delete from repo` () =
233+ runTest {
234+ val currentUser = randomUser()
235+ val testMessage = randomMessage(
236+ id = " msg-1" ,
237+ cid = randomCID(),
238+ type = MessageType .REGULAR ,
239+ syncStatus = SyncStatus .FAILED_PERMANENTLY ,
240+ )
241+
242+ whenever(clientState.user) doReturn MutableStateFlow (currentUser)
243+ whenever(messageRepository.selectMessage(any())) doReturn testMessage
244+
245+ val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id)
246+
247+ assertTrue(result is Result .Failure )
248+ verify(messageRepository).deleteChannelMessage(argThat { id == testMessage.id })
249+ }
250+
251+ @Test
252+ fun `onMessageDeletePrecondition when message is COMPLETED regular should return Success` () = runTest {
253+ val currentUser = randomUser()
254+ val testMessage = randomMessage(
255+ id = " msg-1" ,
256+ cid = randomCID(),
257+ type = MessageType .REGULAR ,
258+ syncStatus = SyncStatus .COMPLETED ,
259+ )
260+
261+ whenever(clientState.user) doReturn MutableStateFlow (currentUser)
262+ whenever(messageRepository.selectMessage(any())) doReturn testMessage
263+
264+ val result = deleteMessageListenerState.onMessageDeletePrecondition(testMessage.id)
265+
266+ assertTrue(result is Result .Success )
267+ }
125268}
0 commit comments