Skip to content

Commit ccd4350

Browse files
Add E2E tests for bi-directional scrolling in Thread (#2576)
1 parent 54bf8ed commit ccd4350

File tree

12 files changed

+681
-103
lines changed

12 files changed

+681
-103
lines changed

StreamChatUITestsAppUITests/Pages/ThreadPage.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import XCTest
88
class ThreadPage: MessageListPage {
99

1010
static var alsoSendInChannelCheckbox: XCUIElement { app.otherElements["CheckboxControl"] }
11+
static var repliesCountLabel: XCUIElement { app.staticTexts["textLabel"] }
1112

1213
enum NavigationBar {
1314

StreamChatUITestsAppUITests/Robots/UserRobot+Asserts.swift

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,27 @@ extension UserRobot {
195195
XCTAssertEqual(text, actualText, file: file, line: line)
196196
return self
197197
}
198+
199+
@discardableResult
200+
func assertOldestLoadedMessage(
201+
isEqual: Bool,
202+
to text: String,
203+
file: StaticString = #filePath,
204+
line: UInt = #line
205+
) -> Self {
206+
if let topMessageCell = cells.lastMatch {
207+
let message = attributes.text(in: topMessageCell).wait()
208+
let actualText = message.text
209+
if isEqual {
210+
XCTAssertEqual(text, actualText, file: file, line: line)
211+
} else {
212+
XCTAssertNotEqual(text, actualText, file: file, line: line)
213+
}
214+
} else {
215+
XCTFail("lastMessageCell cannot be found")
216+
}
217+
return self
218+
}
198219

199220
@discardableResult
200221
func assertPushNotification(
@@ -466,7 +487,7 @@ extension UserRobot {
466487
if deliveryStatus == .failed || deliveryStatus == nil {
467488
XCTAssertFalse(checkmark.exists, "Checkmark is visible", file: file, line: line)
468489
} else {
469-
XCTAssertTrue(checkmark.wait(timeout: 10).exists, "Checkmark is not visible", file: file, line: line)
490+
XCTAssertTrue(checkmark.wait(timeout: 15).exists, "Checkmark is not visible", file: file, line: line)
470491
}
471492

472493
return self
@@ -675,7 +696,7 @@ extension UserRobot {
675696
XCTAssertEqual(quotedText, actualText)
676697
XCTAssertTrue(message.exists, "Quoted message was not showed")
677698
XCTAssertFalse(message.isEnabled, "Quoted message should be disabled")
678-
XCTAssertTrue(message.isHittable, "Quoted message is not visible")
699+
XCTAssertTrue(message.waitForHitPoint().isHittable, "Quoted message is not visible")
679700

680701
if !replyText.isEmpty {
681702
let message = attributes.text(replyText, in: messageCell).wait()
@@ -795,13 +816,56 @@ extension UserRobot {
795816
at messageCellIndex: Int? = nil,
796817
file: StaticString = #filePath,
797818
line: UInt = #line
819+
) -> Self {
820+
assertThreadReplyCountButton(at: messageCellIndex, replies: 0, file: file, line: line)
821+
}
822+
823+
@discardableResult
824+
func assertThreadReplyCountButton(
825+
at messageCellIndex: Int? = nil,
826+
replies: Int,
827+
file: StaticString = #filePath,
828+
line: UInt = #line
798829
) -> Self {
799830
let messageCell = messageCell(withIndex: messageCellIndex, file: file, line: line)
800831
let threadReplyCountButton = attributes.threadReplyCountButton(in: messageCell).wait()
801832
XCTAssertTrue(threadReplyCountButton.exists,
802833
"There is no thread reply count button",
803834
file: file,
804835
line: line)
836+
if replies > 0 {
837+
let expectedText = "\(replies) Thread Replies"
838+
XCTAssertEqual(expectedText, threadReplyCountButton.waitForText(expectedText).text)
839+
}
840+
return self
841+
}
842+
843+
@discardableResult
844+
func assertThreadRepliesCountLabel(
845+
_ count: Int,
846+
file: StaticString = #filePath,
847+
line: UInt = #line
848+
) -> Self {
849+
let expectedLabel = "\(count) REPLIES"
850+
let repliesCountLabel = ThreadPage.repliesCountLabel.waitForText(expectedLabel).text
851+
XCTAssertEqual(repliesCountLabel, repliesCountLabel, file: file, line: line)
852+
return self
853+
}
854+
855+
@discardableResult
856+
func assertParentMessageInThread(
857+
withText text: String,
858+
isLoaded: Bool,
859+
file: StaticString = #filePath,
860+
line: UInt = #line
861+
) -> Self {
862+
if isLoaded {
863+
XCTAssertTrue(ThreadPage.repliesCountLabel.wait().exists, file: file, line: line)
864+
assertOldestLoadedMessage(isEqual: true, to: text)
865+
} else {
866+
XCTAssertFalse(ThreadPage.repliesCountLabel.exists, file: file, line: line)
867+
assertOldestLoadedMessage(isEqual: false, to: text)
868+
}
805869
return self
806870
}
807871
}

StreamChatUITestsAppUITests/Robots/UserRobot.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ extension UserRobot {
7373

7474
@discardableResult
7575
func openContextMenu(messageCellIndex: Int = 0) -> Self {
76-
messageCell(withIndex: messageCellIndex).safePress(forDuration: 1)
76+
messageCell(withIndex: messageCellIndex).waitForHitPoint().safePress(forDuration: 1)
7777
return self
7878
}
7979

StreamChatUITestsAppUITests/Tests/Message Delivery Status/MessageDeliveryStatus_Tests.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ extension MessageDeliveryStatus_Tests {
346346
userRobot.replyToMessageInThread(threadReply)
347347
}
348348
AND("participant reads the user's thread reply") {
349-
participantRobot.readMessageAfterDelay()
349+
participantRobot.readMessageInThreadAfterDelay()
350350
}
351351
THEN("user spots double checkmark below the message") {
352352
userRobot.assertMessageDeliveryStatus(.read)
@@ -356,8 +356,10 @@ extension MessageDeliveryStatus_Tests {
356356
}
357357
}
358358

359-
func test_doubleCheckmarkShownInThreadReply_whenNewParticipantAdded() {
359+
func test_doubleCheckmarkShownInThreadReply_whenNewParticipantAdded() throws {
360360
linkToScenario(withId: 154)
361+
362+
try XCTSkipIf(ProcessInfo().operatingSystemVersion.majorVersion == 12, "Flaky on iOS 12")
361363

362364
GIVEN("user opens the channel") {
363365
userRobot
@@ -398,7 +400,7 @@ extension MessageDeliveryStatus_Tests {
398400
userRobot.replyToMessageInThread(threadReply)
399401
}
400402
AND("thread reply is read by participant") {
401-
participantRobot.readMessageAfterDelay()
403+
participantRobot.readMessageInThreadAfterDelay()
402404
userRobot
403405
.assertMessageDeliveryStatus(.read)
404406
.assertMessageReadCount(readBy: 1)

StreamChatUITestsAppUITests/Tests/MessageList_Tests.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,13 @@ final class MessageList_Tests: StreamTestCase {
210210
let isIpad = UIDevice.current.userInterfaceIdiom == .pad
211211
let typingIndicatorTimeout = isIpad ? 10 : XCUIElement.waitTimeout
212212
let typingEventsTimeout: Double = 3
213+
let message = "message"
213214

214215
GIVEN("user opens the channel") {
215-
userRobot.login().openChannel()
216+
userRobot
217+
.login()
218+
.openChannel()
219+
.sendMessage(message)
216220
}
217221
WHEN("participant starts typing") {
218222
participantRobot.wait(typingEventsTimeout).startTyping()

0 commit comments

Comments
 (0)