|
6 | 6 | //
|
7 | 7 |
|
8 | 8 | import InlineSnapshotTesting
|
| 9 | +import TestHelpers |
9 | 10 | import XCTest
|
10 | 11 | import XCTestDynamicOverlay
|
11 | 12 |
|
@@ -128,4 +129,67 @@ final class RealtimeChannelTests: XCTestCase {
|
128 | 129 | """
|
129 | 130 | }
|
130 | 131 | }
|
| 132 | + |
| 133 | + @MainActor |
| 134 | + func testPresenceEnabledDuringSubscribe() async { |
| 135 | + // Create fake WebSocket for testing |
| 136 | + let (client, server) = FakeWebSocket.fakes() |
| 137 | + |
| 138 | + let socket = RealtimeClientV2( |
| 139 | + url: URL(string: "https://localhost:54321/realtime/v1")!, |
| 140 | + options: RealtimeClientOptions( |
| 141 | + headers: ["apikey": "test-key"], |
| 142 | + accessToken: { "test-token" } |
| 143 | + ), |
| 144 | + wsTransport: { _, _ in client }, |
| 145 | + http: HTTPClientMock() |
| 146 | + ) |
| 147 | + |
| 148 | + // Create a channel without presence callback initially |
| 149 | + let channel = socket.channel("test-topic") |
| 150 | + |
| 151 | + // Initially presence should be disabled |
| 152 | + XCTAssertFalse(channel.config.presence.enabled) |
| 153 | + |
| 154 | + // Connect the socket |
| 155 | + await socket.connect() |
| 156 | + |
| 157 | + // Add a presence callback before subscribing |
| 158 | + let presenceSubscription = channel.onPresenceChange { _ in } |
| 159 | + |
| 160 | + // Verify that presence callback exists |
| 161 | + XCTAssertTrue(channel.callbackManager.callbacks.contains(where: { $0.isPresence })) |
| 162 | + |
| 163 | + // Start subscription process |
| 164 | + Task { |
| 165 | + await channel.subscribe() |
| 166 | + } |
| 167 | + |
| 168 | + // Wait for the join message to be sent |
| 169 | + await Task.megaYield() |
| 170 | + |
| 171 | + // Check the sent events to verify presence enabled is set correctly |
| 172 | + let joinEvents = server.receivedEvents.compactMap { $0.realtimeMessage }.filter { |
| 173 | + $0.event == "phx_join" |
| 174 | + } |
| 175 | + |
| 176 | + // Should have at least one join event |
| 177 | + XCTAssertGreaterThan(joinEvents.count, 0) |
| 178 | + |
| 179 | + // Check that the presence enabled flag is set to true in the join payload |
| 180 | + if let joinEvent = joinEvents.first, |
| 181 | + let config = joinEvent.payload["config"]?.objectValue, |
| 182 | + let presence = config["presence"]?.objectValue, |
| 183 | + let enabled = presence["enabled"]?.boolValue |
| 184 | + { |
| 185 | + XCTAssertTrue(enabled, "Presence should be enabled when presence callback exists") |
| 186 | + } else { |
| 187 | + XCTFail("Could not find presence enabled flag in join payload") |
| 188 | + } |
| 189 | + |
| 190 | + // Clean up |
| 191 | + presenceSubscription.cancel() |
| 192 | + await channel.unsubscribe() |
| 193 | + socket.disconnect() |
| 194 | + } |
131 | 195 | }
|
0 commit comments