@@ -5,8 +5,9 @@ import Testing
55@MainActor
66struct DefaultRoomOccupancyTests {
77 // @spec CHA-O3
8+ // @spec CHA-O7b
89 @Test
9- func requestOccupancyCheck ( ) async throws {
10+ func occupancyGet ( ) async throws {
1011 // Given
1112 let realtime = MockRealtime {
1213 MockHTTPPaginatedResponse (
@@ -25,7 +26,7 @@ struct DefaultRoomOccupancyTests {
2526 chatAPI: chatAPI,
2627 roomName: " basketball " ,
2728 logger: TestLogger ( ) ,
28- options: . init( )
29+ options: . init( enableEvents : true )
2930 )
3031
3132 // When
@@ -34,18 +35,38 @@ struct DefaultRoomOccupancyTests {
3435 // Then
3536 #expect( occupancyInfo. connections == 5 )
3637 #expect( occupancyInfo. presenceMembers == 2 )
38+
39+ let currentOccupancy = try defaultOccupancy. current ( )
40+ #expect( currentOccupancy == nil )
3741 }
3842
3943 // @specUntested CHA-O4e - We chose to implement this failure with an idiomatic fatalError instead of throwing, but we can’t test this.
4044
4145 // @spec CHA-O4a
4246 // @spec CHA-O4c
47+ // @spec CHA-O7a
4348 @Test
4449 func usersCanSubscribeToRealtimeOccupancyUpdates( ) async throws {
4550 // Given
4651 let realtime = MockRealtime ( )
4752 let chatAPI = ChatAPI ( realtime: realtime)
48- let channel = MockRealtimeChannel ( name: " basketball::$chat " )
53+ let channel = MockRealtimeChannel (
54+ name: " basketball::$chat " ,
55+ messageToEmitOnSubscribe: {
56+ let message = ARTMessage ( )
57+ message. action = . create // arbitrary
58+ message. serial = " " // arbitrary
59+ message. clientId = " " // arbitrary
60+ message. data = [
61+ " metrics " : [
62+ " connections " : 5 , // arbitrary
63+ " presenceMembers " : 2 , // arbitrary
64+ ] ,
65+ ]
66+ message. version = " 0 " // arbitrary
67+ return message
68+ } ( )
69+ )
4970 let defaultOccupancy = DefaultOccupancy (
5071 channel: channel,
5172 chatAPI: chatAPI,
@@ -54,17 +75,19 @@ struct DefaultRoomOccupancyTests {
5475 options: . init( enableEvents: true )
5576 )
5677
57- // CHA-O4a, CHA-O4c
78+ // CHA-O4a, CHA-O4c, CHA-O7a
5879
5980 // When
6081 let subscription = defaultOccupancy. subscribe ( )
61- let occupancyData = OccupancyData ( connections: 5 , presenceMembers: 2 )
62- subscription. emit ( OccupancyEvent ( type: . updated, occupancy: occupancyData) )
6382
6483 // Then
6584 let occupancyEvent = try #require( await subscription. first { @Sendable _ in true } )
6685 #expect( occupancyEvent. occupancy. connections == 5 )
6786 #expect( occupancyEvent. occupancy. presenceMembers == 2 )
87+
88+ let currentOccupancy = try defaultOccupancy. current ( )
89+ #expect( currentOccupancy? . connections == 5 )
90+ #expect( currentOccupancy? . presenceMembers == 2 )
6891 }
6992
7093 // @spec CHA-O4g
@@ -98,4 +121,32 @@ struct DefaultRoomOccupancyTests {
98121 #expect( occupancyEvent. occupancy. connections == 0 )
99122 #expect( occupancyEvent. occupancy. presenceMembers == 0 )
100123 }
124+
125+ // @spec CHA-O7c
126+ @Test
127+ func occupancyCurrentThrowsError( ) async throws {
128+ // Given
129+ let realtime = MockRealtime ( )
130+ let chatAPI = ChatAPI ( realtime: realtime)
131+ let channel = MockRealtimeChannel ( name: " basketball::$chat " )
132+ let defaultOccupancy = DefaultOccupancy (
133+ channel: channel,
134+ chatAPI: chatAPI,
135+ roomName: " basketball " ,
136+ logger: TestLogger ( ) ,
137+ // Wnen
138+ options: . init( ) // enableEvents: false
139+ )
140+
141+ // Then
142+ // TODO: avoids compiler crash (https://github.com/ably/ably-chat-swift/issues/233), revert once Xcode 16.3 released
143+ let doIt = {
144+ _ = try defaultOccupancy. current ( )
145+ }
146+ await #expect {
147+ try await doIt ( )
148+ } throws: { error in
149+ error as? ARTErrorInfo == ARTErrorInfo ( chatError: . occupancyEventsNotEnabled)
150+ }
151+ }
101152}
0 commit comments