Skip to content

Commit e186962

Browse files
committed
Update the E2E test framework to support bi-directional scrolling
1 parent 39d450d commit e186962

File tree

7 files changed

+522
-196
lines changed

7 files changed

+522
-196
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+
820A61A029D6D78E002257FB /* QuotedReply_Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 820A619F29D6D78E002257FB /* QuotedReply_Tests.swift */; };
1011
825AADF4283CCDB000237498 /* ThreadPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 825AADF3283CCDB000237498 /* ThreadPage.swift */; };
1112
827352FD290BE91100A87385 /* NotificationsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8492974827ABDDBF00A8EEB0 /* NotificationsHandler.swift */; };
1213
829AB4D228578ACF002DC629 /* StreamTestCase+Tags.swift in Sources */ = {isa = PBXBuildFile; fileRef = 829AB4D128578ACF002DC629 /* StreamTestCase+Tags.swift */; };
@@ -414,6 +415,7 @@
414415

415416
/* Begin PBXFileReference section */
416417
4A65451E274BA170003C5FA8 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
418+
820A619F29D6D78E002257FB /* QuotedReply_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuotedReply_Tests.swift; sourceTree = "<group>"; };
417419
825AADF3283CCDB000237498 /* ThreadPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadPage.swift; sourceTree = "<group>"; };
418420
829AB4D128578ACF002DC629 /* StreamTestCase+Tags.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StreamTestCase+Tags.swift"; sourceTree = "<group>"; };
419421
829AB4D32858A532002DC629 /* Reactions_Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Reactions_Tests.swift; sourceTree = "<group>"; };
@@ -1534,6 +1536,7 @@
15341536
82A1814528FD69E8005F9D43 /* Message Delivery Status */,
15351537
82A1813F28FD691B005F9D43 /* Ephemeral_Messages_Tests.swift */,
15361538
82A1814128FD694A005F9D43 /* PushNotification_Tests.swift */,
1539+
820A619F29D6D78E002257FB /* QuotedReply_Tests.swift */,
15371540
);
15381541
path = Tests;
15391542
sourceTree = "<group>";
@@ -1829,6 +1832,7 @@
18291832
A3600B37283E9EC900E1C930 /* StreamChatSwiftUITests.swift in Sources */,
18301833
A3600B2A283E9E1900E1C930 /* UserRobot.swift in Sources */,
18311834
829CD5CE2848CA6B003C3877 /* Settings.swift in Sources */,
1835+
820A61A029D6D78E002257FB /* QuotedReply_Tests.swift in Sources */,
18321836
8463D9262836617F002B1894 /* ChannelListPage.swift in Sources */,
18331837
A3600B32283E9E4700E1C930 /* MessageList_Tests.swift in Sources */,
18341838
82A1813E28FD68A3005F9D43 /* ChannelList_Tests.swift in Sources */,

StreamChatSwiftUITestsAppTests/Pages/MessageListPage.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ class MessageListPage {
3434
static var scrollToBottomButton: XCUIElement {
3535
app.buttons["ScrollToBottomButton"]
3636
}
37+
38+
static var scrollToBottomButtonUnreadCount: XCUIElement {
39+
app.staticTexts["ScrollToBottomButton"]
40+
}
3741

3842
enum NavigationBar {
3943

StreamChatSwiftUITestsAppTests/Robots/UserRobot+Asserts.swift

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,40 @@ extension UserRobot {
356356
XCTAssertEqual(author, actualAuthor, file: file, line: line)
357357
return self
358358
}
359+
360+
@discardableResult
361+
func assertScrollToBottomButton(
362+
isVisible: Bool,
363+
file: StaticString = #filePath,
364+
line: UInt = #line
365+
) -> Self {
366+
var btn = MessageListPage.scrollToBottomButton
367+
btn = isVisible ? btn.wait() : btn.waitForDisappearance()
368+
XCTAssertEqual(isVisible,
369+
btn.exists,
370+
"Scroll to bottom button should be \(isVisible ? "visible" : "hidden")",
371+
file: file,
372+
line: line)
373+
return self
374+
}
375+
376+
@discardableResult
377+
func assertScrollToBottomButtonUnreadCount(
378+
_ expectedCount: Int,
379+
file: StaticString = #filePath,
380+
line: UInt = #line
381+
) -> Self {
382+
let unreadCount = MessageListPage.scrollToBottomButtonUnreadCount
383+
let unreadCountShouldBeVisible = expectedCount > 0
384+
if unreadCountShouldBeVisible {
385+
XCTAssertEqual("\(expectedCount)", unreadCount.wait().label)
386+
} else {
387+
if unreadCount.exists {
388+
XCTAssertEqual("\(expectedCount)", unreadCount.label)
389+
}
390+
}
391+
return self
392+
}
359393

360394
@discardableResult
361395
func assertTypingIndicatorShown(
@@ -609,21 +643,51 @@ extension UserRobot {
609643
XCTAssertTrue(link.isHittable, "Link itself is not clickable")
610644
return self
611645
}
646+
647+
@discardableResult
648+
func waitForMessageVisibility(at messageCellIndex: Int) -> Self {
649+
_ = messageCell(withIndex: messageCellIndex).waitForHitPoint()
650+
return self
651+
}
612652
}
613653

614654
// MARK: Quoted Messages
615655
extension UserRobot {
616656

617657
@discardableResult
618658
func assertQuotedMessage(
619-
replyText: String,
659+
replyText: String = "", // empty text by default for attachment messages
620660
quotedText: String,
621661
at messageCellIndex: Int? = nil,
622662
file: StaticString = #filePath,
623663
line: UInt = #line
624664
) -> Self {
625-
assertMessage(replyText, file: file, line: line)
626-
assertQuotedMessage(quotedText, file: file, line: line)
665+
let messageCell = messageCell(withIndex: messageCellIndex, file: file, line: line)
666+
let message = attributes.quotedText(quotedText, in: messageCell).wait()
667+
let actualText = message.waitForText(quotedText).text
668+
XCTAssertEqual(quotedText, actualText)
669+
XCTAssertTrue(message.exists, "Quoted message was not showed")
670+
671+
if !replyText.isEmpty {
672+
let message = attributes.text(in: messageCell).wait()
673+
let actualText = message.waitForText(replyText).text
674+
XCTAssertEqual(replyText, actualText)
675+
}
676+
return self
677+
}
678+
679+
@discardableResult
680+
func assertQuotedMessageWithAttachment(
681+
quotedText: String,
682+
at messageCellIndex: Int? = nil,
683+
file: StaticString = #filePath,
684+
line: UInt = #line
685+
) -> Self {
686+
let messageCell = messageCell(withIndex: messageCellIndex, file: file, line: line)
687+
let quotedMessage = attributes.quotedText(quotedText, in: messageCell).wait()
688+
XCTAssertTrue(quotedMessage.exists, "Quoted message was not showed", file: file, line: line)
689+
XCTAssertFalse(quotedMessage.isEnabled, "Quoted message should be disabled", file: file, line: line)
690+
XCTAssertTrue(quotedMessage.isHittable, "Quoted message is not visible", file: file, line: line)
627691
return self
628692
}
629693
}

StreamChatSwiftUITestsAppTests/Robots/UserRobot.swift

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -193,11 +193,11 @@ extension UserRobot {
193193
}
194194

195195
@discardableResult
196-
func replyToMessage(_ text: String,
197-
messageCellIndex: Int = 0,
198-
waitForAppearance: Bool = true,
199-
file: StaticString = #filePath,
200-
line: UInt = #line) -> Self {
196+
func quoteMessage(_ text: String,
197+
messageCellIndex: Int = 0,
198+
waitForAppearance: Bool = true,
199+
file: StaticString = #filePath,
200+
line: UInt = #line) -> Self {
201201
selectOptionFromContextMenu(option: .reply, forMessageAtIndex: messageCellIndex)
202202
sendMessage(text,
203203
at: messageCellIndex,
@@ -221,6 +221,18 @@ extension UserRobot {
221221
ThreadPage.alsoSendInChannelCheckbox.wait()
222222
return self
223223
}
224+
225+
@discardableResult
226+
func tapOnQuotedMessage(_ text: String, at messageCellIndex: Int? = 0) -> Self {
227+
let messageCell = messageCell(withIndex: messageCellIndex)
228+
MessageListPage
229+
.Attributes
230+
.quotedText(text, in: messageCell)
231+
.wait()
232+
.waitForHitPoint()
233+
.safeTap()
234+
return self
235+
}
224236

225237
@discardableResult
226238
func tapOnMessage(at messageCellIndex: Int? = 0) -> Self {
@@ -296,20 +308,26 @@ extension UserRobot {
296308
}
297309

298310
@discardableResult
299-
func scrollMessageListDown() -> Self {
300-
MessageListPage.list.swipeUp()
311+
func scrollMessageListDown(times: Int = 1) -> Self {
312+
for _ in 1...times {
313+
MessageListPage.list.swipeUp()
314+
}
301315
return self
302316
}
303317

304318
@discardableResult
305-
func scrollMessageListUp() -> Self {
306-
MessageListPage.list.swipeDown()
319+
func scrollMessageListUp(times: Int = 1) -> Self {
320+
for _ in 1...times {
321+
MessageListPage.list.swipeDown()
322+
}
307323
return self
308324
}
309325

310326
@discardableResult
311-
func scrollMessageListUpSlow() -> Self {
312-
MessageListPage.list.swipeDown(velocity: .slow)
327+
func scrollMessageListUpSlow(times: Int = 1) -> Self {
328+
for _ in 1...times {
329+
MessageListPage.list.swipeDown(velocity: .slow)
330+
}
313331
return self
314332
}
315333

StreamChatSwiftUITestsAppTests/Tests/ChannelList_Tests.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -258,13 +258,14 @@ extension ChannelList_Tests {
258258
userRobot.login().openChannel()
259259
}
260260
WHEN("user truncates the channel with system message") {
261-
// userRobot.truncateChannel(withMessage: true)
261+
userRobot.truncateChannel(withMessage: true)
262262
}
263263
THEN("user observes only the system message") {
264-
userRobot.assertMessage(message)
265-
}
266-
AND("previous messages are no longer visible") {
267-
userRobot.assertMessageCount(1)
264+
userRobot
265+
.assertMessage(message)
266+
.assertMessageCount(1)
267+
.assertScrollToBottomButton(isVisible: false)
268+
.assertScrollToBottomButtonUnreadCount(0)
268269
}
269270
WHEN("user goes to channel list") {
270271
userRobot.tapOnBackButton()

0 commit comments

Comments
 (0)