Skip to content

Commit b83ac17

Browse files
committed
Add missing test coverage to the event notification centre
1 parent b4d1c1a commit b83ac17

File tree

4 files changed

+124
-4
lines changed

4 files changed

+124
-4
lines changed

Sources/StreamChat/Workers/EventNotificationCenter.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,6 @@ class EventNotificationCenter: NotificationCenter, @unchecked Sendable {
6666

6767
database.write({ session in
6868
events.forEach { event in
69-
guard let eventDTO = event as? EventDTO else {
70-
middlewareEvents.append(event)
71-
return
72-
}
7369
if let manualEvent = self.manualEventHandler.handle(event) {
7470
manualHandlingEvents.append(manualEvent)
7571
} else {

StreamChat.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1618,6 +1618,7 @@
16181618
AD7C76752E3D0486009250FB /* DemoLivestreamReactionsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD7C76742E3D047E009250FB /* DemoLivestreamReactionsListView.swift */; };
16191619
AD7C76812E4275B3009250FB /* LivestreamChannelController_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD7C76802E4275B3009250FB /* LivestreamChannelController_Tests.swift */; };
16201620
AD7C76832E42C0B5009250FB /* LivestreamChannelController+Combine_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD7C76822E42C0B5009250FB /* LivestreamChannelController+Combine_Tests.swift */; };
1621+
AD7C76852E42CDF6009250FB /* ManualEventHandler_Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD7C76842E42CDF6009250FB /* ManualEventHandler_Mock.swift */; };
16211622
AD7CF1712694ABCE00F3101D /* ComposerVC_Documentation_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD7CF16F2694ABC500F3101D /* ComposerVC_Documentation_Tests.swift */; };
16221623
AD7DFC3625D2FA8100DD9DA3 /* CurrentUserUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD7DFC3525D2FA8100DD9DA3 /* CurrentUserUpdater.swift */; };
16231624
AD7EFDA72C7796D400625FC5 /* PollCommentListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD7EFDA52C77749300625FC5 /* PollCommentListVC.swift */; };
@@ -4419,6 +4420,7 @@
44194420
AD7C76742E3D047E009250FB /* DemoLivestreamReactionsListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoLivestreamReactionsListView.swift; sourceTree = "<group>"; };
44204421
AD7C76802E4275B3009250FB /* LivestreamChannelController_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LivestreamChannelController_Tests.swift; sourceTree = "<group>"; };
44214422
AD7C76822E42C0B5009250FB /* LivestreamChannelController+Combine_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "LivestreamChannelController+Combine_Tests.swift"; sourceTree = "<group>"; };
4423+
AD7C76842E42CDF6009250FB /* ManualEventHandler_Mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManualEventHandler_Mock.swift; sourceTree = "<group>"; };
44224424
AD7CF16F2694ABC500F3101D /* ComposerVC_Documentation_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposerVC_Documentation_Tests.swift; sourceTree = "<group>"; };
44234425
AD7D633225AF577E0051219B /* UserUpdateResponse+MissingUser.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "UserUpdateResponse+MissingUser.json"; sourceTree = "<group>"; };
44244426
AD7DFBEB25D2AE7400DD9DA3 /* TestDataModel2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = TestDataModel2.xcdatamodel; sourceTree = "<group>"; };
@@ -7320,6 +7322,7 @@
73207322
A364D09727D0C5940029857A /* Workers */ = {
73217323
isa = PBXGroup;
73227324
children = (
7325+
AD7C76842E42CDF6009250FB /* ManualEventHandler_Mock.swift */,
73237326
882C5762252C7F6500E60C44 /* ChannelMemberListUpdater_Mock.swift */,
73247327
88F6DF96252C88BB009A8AF0 /* ChannelMemberUpdater_Mock.swift */,
73257328
F62D143D24DD70190081D241 /* ChannelUpdater_Mock.swift */,
@@ -11432,6 +11435,7 @@
1143211435
A3C3BC3F27E87F5C00224761 /* ChannelListUpdater_Spy.swift in Sources */,
1143311436
A3C3BC6427E8AA0A00224761 /* ChannelId+Unique.swift in Sources */,
1143411437
82F714A12B077F3300442A74 /* XCTestCase+iOS13.swift in Sources */,
11438+
AD7C76852E42CDF6009250FB /* ManualEventHandler_Mock.swift in Sources */,
1143511439
A3C3BC7127E8AA4300224761 /* TestFetchedResultsController.swift in Sources */,
1143611440
82E655392B06775D00D64906 /* MockFunc.swift in Sources */,
1143711441
A344078927D753530044F150 /* UserPayload.swift in Sources */,
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//
2+
// Copyright © 2025 Stream.io Inc. All rights reserved.
3+
//
4+
5+
@testable import StreamChat
6+
@testable import StreamChatTestTools
7+
import XCTest
8+
9+
final class ManualEventHandler_Mock: ManualEventHandler {
10+
init() {
11+
super.init(
12+
database: DatabaseContainer_Spy()
13+
)
14+
}
15+
16+
static func mock() -> Self {
17+
Self()
18+
}
19+
20+
var registerCallCount = 0
21+
var registerCalledWith: [ChannelId] = []
22+
23+
override func register(channelId: ChannelId) {
24+
registerCallCount += 1
25+
registerCalledWith.append(channelId)
26+
}
27+
28+
var unregisterCallCount = 0
29+
var unregisterCalledWith: [ChannelId] = []
30+
31+
override func unregister(channelId: ChannelId) {
32+
unregisterCallCount += 1
33+
unregisterCalledWith.append(channelId)
34+
}
35+
36+
var handleCallCount = 0
37+
var handleCalledWith: [Event] = []
38+
var handleReturnValue: Event?
39+
40+
override func handle(_ event: Event) -> Event? {
41+
handleCallCount += 1
42+
handleCalledWith.append(event)
43+
return handleReturnValue
44+
}
45+
}

Tests/StreamChatTests/Workers/EventNotificationCenter_Tests.swift

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,4 +275,79 @@ final class EventNotificationCenter_Tests: XCTestCase {
275275
center.process(events)
276276
}
277277
}
278+
279+
// MARK: - Manual Event Handling Tests
280+
281+
func test_registerManualEventHandling_callsManualEventHandler() {
282+
let mockHandler = ManualEventHandler_Mock()
283+
let center = EventNotificationCenter(database: database, manualEventHandler: mockHandler)
284+
let cid: ChannelId = .unique
285+
286+
center.registerManualEventHandling(for: cid)
287+
288+
XCTAssertEqual(mockHandler.registerCallCount, 1)
289+
XCTAssertEqual(mockHandler.registerCalledWith, [cid])
290+
}
291+
292+
func test_unregisterManualEventHandling_callsManualEventHandler() {
293+
let mockHandler = ManualEventHandler_Mock()
294+
let center = EventNotificationCenter(database: database, manualEventHandler: mockHandler)
295+
let cid: ChannelId = .unique
296+
297+
center.unregisterManualEventHandling(for: cid)
298+
299+
XCTAssertEqual(mockHandler.unregisterCallCount, 1)
300+
XCTAssertEqual(mockHandler.unregisterCalledWith, [cid])
301+
}
302+
303+
func test_process_whenManualEventHandlerReturnsEvent_eventIsAddedToEventsToPost() {
304+
let mockHandler = ManualEventHandler_Mock()
305+
let center = EventNotificationCenter(database: database, manualEventHandler: mockHandler)
306+
307+
// Create event logger to check published events
308+
let eventLogger = EventLogger(center)
309+
310+
// Create test event and mock return value
311+
let originalEvent = TestEvent()
312+
let manualEvent = TestEvent()
313+
mockHandler.handleReturnValue = manualEvent
314+
315+
// Process event
316+
center.process(originalEvent)
317+
318+
// Verify manual handler was called with original event
319+
AssertAsync {
320+
Assert.willBeEqual(mockHandler.handleCallCount, 1)
321+
Assert.willBeEqual(mockHandler.handleCalledWith as? [TestEvent], [originalEvent])
322+
// Verify manual event was posted
323+
Assert.willBeEqual(eventLogger.events as? [TestEvent], [manualEvent])
324+
}
325+
}
326+
327+
func test_process_whenManualEventHandlerReturnsNil_eventIsProcessedByMiddlewares() {
328+
let mockHandler = ManualEventHandler_Mock()
329+
let center = EventNotificationCenter(database: database, manualEventHandler: mockHandler)
330+
331+
// Create event logger to check published events
332+
let eventLogger = EventLogger(center)
333+
334+
// Create test event
335+
let originalEvent = TestEvent()
336+
mockHandler.handleReturnValue = nil // Manual handler doesn't handle this event
337+
338+
// Add a middleware that will process the event
339+
let middleware = EventMiddleware_Mock { event, _ in event }
340+
center.add(middleware: middleware)
341+
342+
// Process event
343+
center.process(originalEvent)
344+
345+
// Verify manual handler was called with original event
346+
AssertAsync {
347+
Assert.willBeEqual(mockHandler.handleCallCount, 1)
348+
Assert.willBeEqual(mockHandler.handleCalledWith as? [TestEvent], [originalEvent])
349+
// Verify original event was posted (processed by middleware)
350+
Assert.willBeEqual(eventLogger.events as? [TestEvent], [originalEvent])
351+
}
352+
}
278353
}

0 commit comments

Comments
 (0)