1
1
package com.pubnub.test.integration
2
2
3
3
import com.pubnub.api.PubNubException
4
+ import com.pubnub.api.enums.PNStatusCategory
5
+ import com.pubnub.api.models.consumer.PNStatus
4
6
import com.pubnub.api.models.consumer.objects.PNPage
5
7
import com.pubnub.api.models.consumer.objects.channel.PNChannelMetadata
6
8
import com.pubnub.api.models.consumer.pubsub.objects.PNDeleteChannelMetadataEventMessage
7
9
import com.pubnub.api.models.consumer.pubsub.objects.PNObjectEventResult
8
10
import com.pubnub.api.models.consumer.pubsub.objects.PNSetChannelMetadataEventMessage
9
11
import com.pubnub.kmp.PLATFORM
10
12
import com.pubnub.kmp.createCustomObject
13
+ import com.pubnub.kmp.createStatusListener
11
14
import com.pubnub.kmp.readAllBytes
12
15
import com.pubnub.kmp.stringToUploadable
13
16
import com.pubnub.test.BaseIntegrationTest
@@ -22,6 +25,10 @@ import kotlin.test.assertNotNull
22
25
import kotlin.test.assertTrue
23
26
import kotlin.time.Duration.Companion.seconds
24
27
28
+ private const val PN_CONNECTED_CATEGORY = " PNConnectedCategory"
29
+
30
+ private const val PN_DISCONNECTED_CATEGORY = " PNDisconnectedCategory"
31
+
25
32
class ChannelMetadataTest : BaseIntegrationTest () {
26
33
private val channel = " myChannel" + randomString()
27
34
private val name = randomString()
@@ -32,6 +39,108 @@ class ChannelMetadataTest : BaseIntegrationTest() {
32
39
private val includeCustom = true
33
40
private val type = randomString()
34
41
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
+
35
144
@Test
36
145
fun can_set_metadata () = runTest {
37
146
// when
0 commit comments