Skip to content

Commit 964a48e

Browse files
added tests for the channel data source
1 parent 48a3804 commit 964a48e

File tree

3 files changed

+231
-0
lines changed

3 files changed

+231
-0
lines changed

StreamChatSwiftUI.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
842383E02767394200888CFC /* ChatChannelDataSource_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842383DF2767394200888CFC /* ChatChannelDataSource_Tests.swift */; };
1011
84335014274BAB15007A1B81 /* ViewFactoryExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84335013274BAB15007A1B81 /* ViewFactoryExamples.swift */; };
1112
84335016274BABF3007A1B81 /* NewChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84335015274BABF3007A1B81 /* NewChatView.swift */; };
1213
84335018274BAD4B007A1B81 /* NewChatViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84335017274BAD4B007A1B81 /* NewChatViewModel.swift */; };
@@ -275,6 +276,7 @@
275276

276277
/* Begin PBXFileReference section */
277278
4A65451E274BA170003C5FA8 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
279+
842383DF2767394200888CFC /* ChatChannelDataSource_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatChannelDataSource_Tests.swift; sourceTree = "<group>"; };
278280
842E979C275E0AD000A52E7B /* StreamChatSwiftUI.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = StreamChatSwiftUI.xctestplan; sourceTree = "<group>"; };
279281
84335013274BAB15007A1B81 /* ViewFactoryExamples.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewFactoryExamples.swift; sourceTree = "<group>"; };
280282
84335015274BABF3007A1B81 /* NewChatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewChatView.swift; sourceTree = "<group>"; };
@@ -1023,6 +1025,7 @@
10231025
84C94D65275A660B007FE2B9 /* MessageActionsViewModel_Tests.swift */,
10241026
84DEC8DE2760A1D100172876 /* MessageView_Tests.swift */,
10251027
848399F127601231003075E4 /* ReactionsOverlayView_Tests.swift */,
1028+
842383DF2767394200888CFC /* ChatChannelDataSource_Tests.swift */,
10261029
84C94D4E2758FE59007FE2B9 /* ChatChannelTestHelpers.swift */,
10271030
);
10281031
path = ChatChannel;
@@ -1393,6 +1396,7 @@
13931396
84C94CDD27578B92007FE2B9 /* MemberPayload.swift in Sources */,
13941397
84C94D1127578BF2007FE2B9 /* ChannelId.swift in Sources */,
13951398
84C94CD927578B92007FE2B9 /* ChatChannelMember_Mock.swift in Sources */,
1399+
842383E02767394200888CFC /* ChatChannelDataSource_Tests.swift in Sources */,
13961400
84DEC8DF2760A1D100172876 /* MessageView_Tests.swift in Sources */,
13971401
84C94CDA27578B92007FE2B9 /* ChatUser_Mock.swift in Sources */,
13981402
84C94D2C275796F7007FE2B9 /* RequestRecorderURLProtocol.swift in Sources */,
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
//
2+
// Copyright © 2021 Stream.io Inc. All rights reserved.
3+
//
4+
5+
import SnapshotTesting
6+
@testable import StreamChat
7+
@testable import StreamChatSwiftUI
8+
import SwiftUI
9+
import XCTest
10+
11+
class ChatChannelDataSource_Tests: XCTestCase {
12+
13+
private var chatClient: ChatClient = {
14+
let client = ChatClient.mock()
15+
client.currentUserId = .unique
16+
return client
17+
}()
18+
19+
private let message = ChatMessage.mock(
20+
id: .unique,
21+
cid: .unique,
22+
text: "message",
23+
author: ChatUser.mock(id: .unique)
24+
)
25+
26+
private let reply = ChatMessage.mock(
27+
id: .unique,
28+
cid: .unique,
29+
text: "reply",
30+
author: ChatUser.mock(id: .unique)
31+
)
32+
33+
private var streamChat: StreamChat?
34+
35+
override func setUp() {
36+
super.setUp()
37+
streamChat = StreamChat(chatClient: chatClient)
38+
}
39+
40+
func test_channelDataSource_messages() {
41+
// Given
42+
let expected: [ChatMessage] = [message]
43+
let channelDataSource = makeChannelDataSource(messages: expected)
44+
45+
// When
46+
let messages = channelDataSource.messages
47+
48+
// Then
49+
XCTAssert(messages[0] == expected[0])
50+
XCTAssert(messages.count == expected.count)
51+
}
52+
53+
func test_channelDataSource_updatedMessages() {
54+
// Given
55+
let handler = MockMessagesDataSourceHandler()
56+
let expected: [ChatMessage] = [message]
57+
let controller = makeChannelController(messages: expected)
58+
let channelDataSource = ChatChannelDataSource(controller: controller)
59+
channelDataSource.delegate = handler
60+
61+
// When
62+
let noMessagesCall = handler.updateMessagesCalled
63+
controller.simulate(messages: expected, changes: [])
64+
let messagesCall = handler.updateMessagesCalled
65+
let noChannelCall = handler.updateChannelCalled
66+
67+
// Then
68+
XCTAssert(noMessagesCall == false)
69+
XCTAssert(messagesCall == true)
70+
XCTAssert(noChannelCall == false)
71+
}
72+
73+
func test_channelDataSource_updatedChannel() {
74+
// Given
75+
let channel = ChatChannel.mockDMChannel()
76+
let handler = MockMessagesDataSourceHandler()
77+
let expected: [ChatMessage] = [message]
78+
let controller = makeChannelController(messages: expected)
79+
let channelDataSource = ChatChannelDataSource(controller: controller)
80+
channelDataSource.delegate = handler
81+
82+
// When
83+
let noChannelCall = handler.updateChannelCalled
84+
controller.simulate(
85+
channel: channel,
86+
change: .update(channel),
87+
typingUsers: []
88+
)
89+
let noMessagesCall = handler.updateMessagesCalled
90+
let channelCall = handler.updateChannelCalled
91+
92+
// Then
93+
XCTAssert(noMessagesCall == false)
94+
XCTAssert(channelCall == true)
95+
XCTAssert(noChannelCall == false)
96+
}
97+
98+
func test_messageThreadDataSource_messages() {
99+
// Given
100+
let channel = ChatChannel.mockDMChannel()
101+
let expected: [ChatMessage] = [message]
102+
let messageController = ChatMessageController_Mock(
103+
client: chatClient,
104+
cid: channel.cid,
105+
messageId: message.id
106+
)
107+
let threadDataSource = makeMessageThreadDataSource(
108+
messages: expected,
109+
messageController: messageController
110+
)
111+
112+
// When
113+
var messages = threadDataSource.messages
114+
let initialCount = messages.count
115+
messageController.simulate(replies: [reply], changes: [])
116+
messages = threadDataSource.messages
117+
let count = messages.count
118+
119+
// Then
120+
XCTAssert(initialCount == 0)
121+
XCTAssert(count == 1)
122+
XCTAssert(messages[0] == reply)
123+
}
124+
125+
func test_messageThreadDataSource_updatedMessages() {
126+
// Given
127+
let channel = ChatChannel.mockDMChannel()
128+
let expected: [ChatMessage] = [message]
129+
let messageController = ChatMessageController_Mock(
130+
client: chatClient,
131+
cid: channel.cid,
132+
messageId: message.id
133+
)
134+
let handler = MockMessagesDataSourceHandler()
135+
let threadDataSource = makeMessageThreadDataSource(
136+
messages: expected,
137+
messageController: messageController
138+
)
139+
threadDataSource.delegate = handler
140+
141+
// When
142+
let noMessagesCall = handler.updateMessagesCalled
143+
messageController.simulate(replies: [reply], changes: [])
144+
let messagesCall = handler.updateMessagesCalled
145+
146+
// Then
147+
XCTAssert(noMessagesCall == false)
148+
XCTAssert(messagesCall == true)
149+
}
150+
151+
// MARK: - private
152+
153+
private class MockMessagesDataSourceHandler: MessagesDataSource {
154+
155+
var updateMessagesCalled = false
156+
var updateChannelCalled = false
157+
158+
func dataSource(channelDataSource: ChannelDataSource, didUpdateMessages messages: LazyCachedMapCollection<ChatMessage>) {
159+
updateMessagesCalled = true
160+
}
161+
162+
func dataSource(
163+
channelDataSource: ChannelDataSource,
164+
didUpdateChannel channel: EntityChange<ChatChannel>,
165+
channelController: ChatChannelController
166+
) {
167+
updateChannelCalled = true
168+
}
169+
}
170+
171+
private func makeChannelDataSource(messages: [ChatMessage]) -> ChatChannelDataSource {
172+
let channelController = makeChannelController(messages: messages)
173+
let channelDataSource = ChatChannelDataSource(controller: channelController)
174+
return channelDataSource
175+
}
176+
177+
private func makeMessageThreadDataSource(
178+
messages: [ChatMessage],
179+
messageController: ChatMessageController_Mock
180+
) -> MessageThreadDataSource {
181+
let channelController = makeChannelController(messages: messages)
182+
let threadDataSource = MessageThreadDataSource(
183+
channelController: channelController,
184+
messageController: messageController
185+
)
186+
187+
return threadDataSource
188+
}
189+
190+
private func makeChannelController(messages: [ChatMessage]) -> ChatChannelController_Mock {
191+
let channelController = ChatChannelTestHelpers.makeChannelController(
192+
chatClient: chatClient,
193+
messages: messages
194+
)
195+
channelController.simulateInitial(
196+
channel: .mockDMChannel(),
197+
messages: messages,
198+
state: .initialized
199+
)
200+
return channelController
201+
}
202+
}

StreamChatSwiftUITests/Tests/Utils/ViewFactory_Tests.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,31 @@ class ViewFactory_Tests: XCTestCase {
404404
// Then
405405
XCTAssert(view is ReactionsOverlayView<DefaultViewFactory>)
406406
}
407+
408+
func test_viewFactory_makeMessageThreadHeaderViewModifier() {
409+
// Given
410+
let viewFactory = DefaultViewFactory.shared
411+
412+
// When
413+
let viewModifier = viewFactory.makeMessageThreadHeaderViewModifier()
414+
415+
// Then
416+
XCTAssert(viewModifier is DefaultMessageThreadHeaderModifier)
417+
}
418+
419+
func test_viewFactory_makeSendInChannelView() {
420+
// Given
421+
let viewFactory = DefaultViewFactory.shared
422+
423+
// When
424+
let view = viewFactory.makeSendInChannelView(
425+
showReplyInChannel: .constant(true),
426+
isDirectMessage: true
427+
)
428+
429+
// Then
430+
XCTAssert(view is SendInChannelView)
431+
}
407432
}
408433

409434
extension ChannelAction: Equatable {

0 commit comments

Comments
 (0)