@@ -3,6 +3,7 @@ package com.ably.chat
3
3
import com.google.gson.JsonObject
4
4
import io.ably.lib.realtime.AblyRealtime.Channels
5
5
import io.ably.lib.realtime.Channel
6
+ import io.ably.lib.realtime.ChannelBase
6
7
import io.ably.lib.realtime.ChannelState
7
8
import io.ably.lib.realtime.ChannelStateListener
8
9
import io.ably.lib.realtime.buildChannelStateChange
@@ -14,6 +15,8 @@ import io.mockk.mockk
14
15
import io.mockk.slot
15
16
import io.mockk.spyk
16
17
import io.mockk.verify
18
+ import java.lang.reflect.Field
19
+ import java.util.HashMap
17
20
import kotlinx.coroutines.runBlocking
18
21
import kotlinx.coroutines.test.runTest
19
22
import org.junit.Assert.assertEquals
@@ -36,14 +39,10 @@ class MessagesTest {
36
39
fun setUp () {
37
40
every { realtimeChannels.get(any(), any()) } returns realtimeChannel
38
41
39
- every { realtimeChannel.on(ChannelState .attached, capture(channelStateListenerSlot)) } answers {
42
+ every { realtimeChannel.on(capture(channelStateListenerSlot)) } answers {
40
43
println (" Channel state listener registered" )
41
44
}
42
45
43
- every { realtimeChannel.once(ChannelState .attached, capture(channelStateOnceSlot)) } answers {
44
- println (" Channel state once listener registered" )
45
- }
46
-
47
46
messages = DefaultMessages (
48
47
roomId = " room1" ,
49
48
realtimeChannels = realtimeChannels,
@@ -185,4 +184,43 @@ class MessagesTest {
185
184
186
185
assertEquals(" channel-serial-2" , subscription1.fromSerialProvider().await())
187
186
}
187
+
188
+ @Test
189
+ fun `subscription should invoke once for each incoming message` () = runTest {
190
+ val listener1 = mockk<Messages .Listener >(relaxed = true )
191
+ val listener2 = mockk<Messages .Listener >(relaxed = true )
192
+
193
+ messages.subscribe(listener1)
194
+
195
+ messages.channel.channelMulticaster.onMessage(buildDummyPubSubMessage())
196
+
197
+ verify(exactly = 1 ) { listener1.onEvent(any()) }
198
+
199
+ messages.subscribe(listener2)
200
+
201
+ messages.channel.channelMulticaster.onMessage(buildDummyPubSubMessage())
202
+
203
+ verify(exactly = 2 ) { listener1.onEvent(any()) }
204
+ verify(exactly = 1 ) { listener2.onEvent(any()) }
205
+ }
206
+ }
207
+
208
+ private val Channel .channelMulticaster: ChannelBase .MessageListener get() {
209
+ val field: Field = (ChannelBase ::class .java).getDeclaredField(" eventListeners" )
210
+ field.isAccessible = true
211
+ val eventListeners = field.get(this ) as HashMap <* , * >
212
+ return eventListeners[" message.created" ] as ChannelBase .MessageListener
213
+ }
214
+
215
+ private fun buildDummyPubSubMessage () = PubSubMessage ().apply {
216
+ data = JsonObject ().apply {
217
+ addProperty(" text" , " dummy text" )
218
+ }
219
+ clientId = " dummy"
220
+ timestamp = 1000L
221
+ extras = MessageExtras (
222
+ JsonObject ().apply {
223
+ addProperty(" timeserial" , " abcdefghij@1672531200000-123" )
224
+ },
225
+ )
188
226
}
0 commit comments