11package com.pubnub.test.integration
22
33import com.pubnub.api.PubNubException
4+ import com.pubnub.api.enums.PNStatusCategory
5+ import com.pubnub.api.models.consumer.PNStatus
46import com.pubnub.api.models.consumer.objects.PNPage
57import com.pubnub.api.models.consumer.objects.channel.PNChannelMetadata
68import com.pubnub.api.models.consumer.pubsub.objects.PNDeleteChannelMetadataEventMessage
79import com.pubnub.api.models.consumer.pubsub.objects.PNObjectEventResult
810import com.pubnub.api.models.consumer.pubsub.objects.PNSetChannelMetadataEventMessage
911import com.pubnub.kmp.PLATFORM
1012import com.pubnub.kmp.createCustomObject
13+ import com.pubnub.kmp.createStatusListener
1114import com.pubnub.kmp.readAllBytes
1215import com.pubnub.kmp.stringToUploadable
1316import com.pubnub.test.BaseIntegrationTest
@@ -22,6 +25,10 @@ import kotlin.test.assertNotNull
2225import kotlin.test.assertTrue
2326import kotlin.time.Duration.Companion.seconds
2427
28+ private const val PN_CONNECTED_CATEGORY = " PNConnectedCategory"
29+
30+ private const val PN_DISCONNECTED_CATEGORY = " PNDisconnectedCategory"
31+
2532class ChannelMetadataTest : BaseIntegrationTest () {
2633 private val channel = " myChannel" + randomString()
2734 private val name = randomString()
@@ -32,6 +39,108 @@ class ChannelMetadataTest : BaseIntegrationTest() {
3239 private val includeCustom = true
3340 private val type = randomString()
3441
42+ @Test
43+ fun test_disconnect () = runTest(timeout = 30 .seconds) {
44+ val channelName = " myChannel"
45+ var disconnectStatus: PNStatus ? = null
46+
47+ val statusListener = createStatusListener(pubnub) { _, status ->
48+ if (status.category == PNStatusCategory .PNDisconnectedCategory ) {
49+ disconnectStatus = status
50+ }
51+ }
52+
53+ pubnub.test(backgroundScope) {
54+ try {
55+ pubnub.addListener(statusListener)
56+
57+ val channel = pubnub.channel(channelName)
58+ channel.subscription().subscribe()
59+
60+ // Wait for connection status
61+ val connectStatus = nextStatus()
62+ assertEquals(false , connectStatus.error)
63+ assertEquals(PN_CONNECTED_CATEGORY , connectStatus.category.toString())
64+
65+ // Disconnect and wait for disconnect status
66+ pubnub.disconnect()
67+
68+ // Wait for disconnect status using nextStatus() (from test infrastructure)
69+ val disconnectStatusFromQueue = nextStatus()
70+ assertEquals(false , disconnectStatusFromQueue.error)
71+ assertEquals(PN_DISCONNECTED_CATEGORY , disconnectStatusFromQueue.category.toString())
72+
73+ // Verify our listener also captured the disconnect status
74+ assertNotNull(disconnectStatus)
75+ assertEquals(PN_DISCONNECTED_CATEGORY , disconnectStatus!! .category.toString())
76+ } finally {
77+ // Cleanup
78+ pubnub.removeListener(statusListener)
79+ }
80+ }
81+ }
82+
83+ @Test
84+ fun test_reconnect () = runTest(timeout = 30 .seconds) {
85+ val channelName = " myChannel"
86+ var disconnectStatus: PNStatus ? = null
87+ var reconnectStatus: PNStatus ? = null
88+
89+ val statusListener = createStatusListener(pubnub) { _, status ->
90+ when (status.category) {
91+ PNStatusCategory .PNDisconnectedCategory -> {
92+ disconnectStatus = status
93+ }
94+ PNStatusCategory .PNConnectedCategory -> {
95+ // Only capture reconnect status (not initial connect)
96+ if (disconnectStatus != null ) {
97+ reconnectStatus = status
98+ }
99+ }
100+ else -> {
101+ // Ignore other status categories
102+ }
103+ }
104+ }
105+
106+ pubnub.test(backgroundScope) {
107+ try {
108+ pubnub.addListener(statusListener)
109+
110+ val channel = pubnub.channel(channelName)
111+ channel.subscription().subscribe()
112+
113+ // Wait for connection status
114+ val connectStatus = nextStatus()
115+ assertEquals(false , connectStatus.error)
116+ assertEquals(PN_CONNECTED_CATEGORY , connectStatus.category.toString())
117+
118+ // Disconnect and wait for disconnect status
119+ pubnub.disconnect()
120+
121+ val disconnectStatusFromQueue = nextStatus()
122+ assertEquals(false , disconnectStatusFromQueue.error)
123+ assertEquals(PN_DISCONNECTED_CATEGORY , disconnectStatusFromQueue.category.toString())
124+
125+ // Reconnect and wait for reconnect status
126+ pubnub.reconnect()
127+
128+ val reconnectStatusFromQueue = nextStatus()
129+ assertEquals(false , reconnectStatusFromQueue.error)
130+ assertEquals(PN_CONNECTED_CATEGORY , reconnectStatusFromQueue.category.toString())
131+
132+ // Verify our listener captured both statuses
133+ assertNotNull(disconnectStatus)
134+ assertEquals(PN_DISCONNECTED_CATEGORY , disconnectStatus!! .category.toString())
135+ assertNotNull(reconnectStatus)
136+ assertEquals(PN_CONNECTED_CATEGORY , reconnectStatus!! .category.toString())
137+ } finally {
138+ // Cleanup
139+ pubnub.removeListener(statusListener)
140+ }
141+ }
142+ }
143+
35144 @Test
36145 fun can_set_metadata () = runTest {
37146 // when
0 commit comments