Skip to content

Commit 47a8578

Browse files
committed
Add Thread List Item test coverage
1 parent accd20f commit 47a8578

File tree

10 files changed

+139
-0
lines changed

10 files changed

+139
-0
lines changed

β€ŽSources/StreamChatSwiftUI/ChatThreadList/ChatThreadListItem.swiftβ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public struct ChatThreadListItem: View {
3535
var parentMessageText: String
3636
if thread.parentMessage.isDeleted {
3737
parentMessageText = L10n.Message.deletedMessagePlaceholder
38+
} else if let threadTitle = thread.title {
39+
parentMessageText = threadTitle
3840
} else {
3941
let formatter = MessagePreviewFormatter()
4042
parentMessageText = formatter.formatContent(for: thread.parentMessage)

β€ŽStreamChatSwiftUI.xcodeproj/project.pbxprojβ€Ž

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,7 @@
520520
ADE0F5622CB8556F0053B8B9 /* ChatThreadListFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE0F5612CB8556F0053B8B9 /* ChatThreadListFooterView.swift */; };
521521
ADE0F5642CB9609E0053B8B9 /* ChatThreadListHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE0F5632CB9609E0053B8B9 /* ChatThreadListHeaderView.swift */; };
522522
ADE0F5662CB962470053B8B9 /* ActionBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE0F5652CB962470053B8B9 /* ActionBannerView.swift */; };
523+
ADE442F22CBDAAC40066CDF7 /* ChatThreadListItemView_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE442F12CBDAAC40066CDF7 /* ChatThreadListItemView_Tests.swift */; };
523524
C14A465B284665B100EF498E /* SDKIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = C14A465A284665B100EF498E /* SDKIdentifier.swift */; };
524525
E3A1C01C282BAC66002D1E26 /* Sentry in Frameworks */ = {isa = PBXBuildFile; productRef = E3A1C01B282BAC66002D1E26 /* Sentry */; };
525526
/* End PBXBuildFile section */
@@ -1109,6 +1110,7 @@
11091110
ADE0F5612CB8556F0053B8B9 /* ChatThreadListFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatThreadListFooterView.swift; sourceTree = "<group>"; };
11101111
ADE0F5632CB9609E0053B8B9 /* ChatThreadListHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatThreadListHeaderView.swift; sourceTree = "<group>"; };
11111112
ADE0F5652CB962470053B8B9 /* ActionBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionBannerView.swift; sourceTree = "<group>"; };
1113+
ADE442F12CBDAAC40066CDF7 /* ChatThreadListItemView_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatThreadListItemView_Tests.swift; sourceTree = "<group>"; };
11121114
C14A465A284665B100EF498E /* SDKIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKIdentifier.swift; sourceTree = "<group>"; };
11131115
/* End PBXFileReference section */
11141116

@@ -2072,6 +2074,7 @@
20722074
84E6EC24279AEE9F0017207B /* StreamChatTestCase.swift */,
20732075
84C94C7D27567CC2007FE2B9 /* ChatChannelList */,
20742076
84C94D472758BDB2007FE2B9 /* ChatChannel */,
2077+
ADE442EC2CBDAA320066CDF7 /* ChatThreadList */,
20752078
4F6D83522C108D470098C298 /* CommonViews */,
20762079
84C94D52275A135F007FE2B9 /* Utils */,
20772080
);
@@ -2260,6 +2263,7 @@
22602263
path = ChatThreadList;
22612264
sourceTree = "<group>";
22622265
};
2266+
ADE442F12CBDAAC40066CDF7 /* ChatThreadListItemView_Tests.swift */,
22632267
/* End PBXGroup section */
22642268

22652269
/* Begin PBXHeadersBuildPhase section */
@@ -2978,6 +2982,7 @@
29782982
84CC3732290B0A4000689B73 /* StreamChatModel.xcdatamodeld in Sources */,
29792983
84E04790284A444E00BAFA17 /* CDNClient_Mock.swift in Sources */,
29802984
84E04796284A444E00BAFA17 /* EventBatcherMock.swift in Sources */,
2985+
ADE442F22CBDAAC40066CDF7 /* ChatThreadListItemView_Tests.swift in Sources */,
29812986
84E57C5B28103822002213C1 /* TestDataModel.xcdatamodeld in Sources */,
29822987
84E04792284A444E00BAFA17 /* MockBackgroundTaskScheduler.swift in Sources */,
29832988
84C94D1327578BF2007FE2B9 /* XCTestCase+MockJSON.swift in Sources */,
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
//
2+
// Copyright Β© 2024 Stream.io Inc. All rights reserved.
3+
//
4+
5+
import SnapshotTesting
6+
@testable import StreamChat
7+
@testable import StreamChatSwiftUI
8+
@testable import StreamChatTestTools
9+
import StreamSwiftTestHelpers
10+
import XCTest
11+
12+
final class ChatThreadListItemView_Tests: StreamChatTestCase {
13+
var mockThread: ChatThread!
14+
15+
var mockYoda = ChatUser.mock(id: .unique, name: "Yoda", imageURL: nil)
16+
var currentUser: ChatUser!
17+
18+
override func setUp() {
19+
super.setUp()
20+
let circleImage = UIImage.circleImage
21+
streamChat?.utils.channelHeaderLoader.placeholder1 = circleImage
22+
streamChat?.utils.channelHeaderLoader.placeholder2 = circleImage
23+
streamChat?.utils.channelHeaderLoader.placeholder3 = circleImage
24+
streamChat?.utils.channelHeaderLoader.placeholder4 = circleImage
25+
26+
currentUser = ChatUser.mock(id: StreamChatTestCase.currentUserId, name: "Vader", imageURL: nil)
27+
28+
mockThread = .mock(
29+
parentMessage: .mock(text: "Parent Message", author: mockYoda),
30+
channel: .mock(cid: .unique, name: "Star Wars Channel"),
31+
createdBy: currentUser,
32+
replyCount: 3,
33+
participantCount: 2,
34+
threadParticipants: [
35+
.mock(user: mockYoda),
36+
.mock(user: currentUser)
37+
],
38+
lastMessageAt: .unique,
39+
createdAt: .unique,
40+
updatedAt: .unique,
41+
title: nil,
42+
latestReplies: [
43+
.mock(text: "First Message", author: mockYoda),
44+
.mock(text: "Second Message", author: currentUser),
45+
.mock(text: "Third Message", author: mockYoda)
46+
],
47+
reads: [],
48+
extraData: [:]
49+
)
50+
}
51+
52+
func test_threadListItem_default() throws {
53+
let view = ChatThreadListItem(thread: mockThread)
54+
.frame(width: defaultScreenSize.width)
55+
56+
assertSnapshot(matching: view, as: .image(perceptualPrecision: precision))
57+
}
58+
59+
func test_threadListItem_withUnreads() throws {
60+
let thread = mockThread
61+
.with(reads: [.mock(user: currentUser, lastReadAt: .unique, unreadMessagesCount: 4)])
62+
63+
let view = ChatThreadListItem(thread: thread)
64+
.frame(width: defaultScreenSize.width)
65+
66+
assertSnapshot(matching: view, as: .image(perceptualPrecision: precision))
67+
}
68+
69+
func test_threadListItem_withTitle() throws {
70+
let thread = mockThread
71+
.with(title: "Thread title")
72+
73+
let view = ChatThreadListItem(thread: thread)
74+
.frame(width: defaultScreenSize.width)
75+
76+
assertSnapshot(matching: view, as: .image(perceptualPrecision: precision))
77+
}
78+
79+
func test_threadListItem_withParentMessageDeleted() throws {
80+
let thread = mockThread
81+
.with(parentMessage: .mock(text: "Parent Message", deletedAt: .unique))
82+
83+
let view = ChatThreadListItem(thread: thread)
84+
.frame(width: defaultScreenSize.width)
85+
86+
assertSnapshot(matching: view, as: .image(perceptualPrecision: precision))
87+
}
88+
89+
func test_threadListItem_withLastReplyDeleted() throws {
90+
let thread = mockThread
91+
.with(latestReplies: [
92+
.mock(text: "First Message", author: mockYoda),
93+
.mock(text: "Second Message", author: currentUser),
94+
.mock(text: "Third Message", author: mockYoda, deletedAt: .unique)
95+
])
96+
97+
let view = ChatThreadListItem(thread: thread)
98+
.frame(width: defaultScreenSize.width)
99+
100+
assertSnapshot(matching: view, as: .image(perceptualPrecision: precision))
101+
}
102+
103+
func test_threadListItem_whenAttachments() throws {
104+
let thread = mockThread
105+
.with(
106+
parentMessage: .mock(text: "", attachments: [.dummy(type: .giphy)]),
107+
latestReplies: [
108+
.mock(text: "", author: mockYoda, attachments: [.dummy(type: .audio)])
109+
]
110+
)
111+
112+
let view = ChatThreadListItem(thread: thread)
113+
.frame(width: defaultScreenSize.width)
114+
115+
assertSnapshot(matching: view, as: .image(perceptualPrecision: precision))
116+
}
117+
118+
func test_threadListItem_whenAttachmentIsPoll() throws {
119+
let thread = mockThread
120+
.with(
121+
parentMessage: .mock(text: "", poll: .mock(name: "Who is better?")),
122+
latestReplies: [
123+
.mock(text: "", author: mockYoda, poll: .mock(name: "Who is worse?"))
124+
]
125+
)
126+
127+
let view = ChatThreadListItem(thread: thread)
128+
.frame(width: defaultScreenSize.width)
129+
130+
assertSnapshot(matching: view, as: .image(perceptualPrecision: precision))
131+
}
132+
}
39.4 KB
Loading
Loading
Loading
Loading
Loading
37.7 KB
Loading
40.6 KB
Loading

0 commit comments

Comments
Β (0)