mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 06:55:59 +00:00
Update UI tests (#730)
* Update snapshots. * Fix timeline grouping and UI tests. * Remove German UI tests with double-length pseudolanguage. Avoids tests breaking when translations are updated.
This commit is contained in:
@@ -14,6 +14,154 @@
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
@testable import ElementX
|
||||
import XCTest
|
||||
|
||||
class RoomScreenViewModelTests: XCTestCase { }
|
||||
@MainActor
|
||||
class RoomScreenViewModelTests: XCTestCase {
|
||||
func testMessageGrouping() {
|
||||
// Given 3 messages from Bob.
|
||||
let items = [
|
||||
TextRoomTimelineItem(text: "Message 1",
|
||||
sender: "bob"),
|
||||
TextRoomTimelineItem(text: "Message 2",
|
||||
sender: "bob"),
|
||||
TextRoomTimelineItem(text: "Message 3",
|
||||
sender: "bob")
|
||||
]
|
||||
|
||||
// When showing them in a timeline.
|
||||
let timelineController = MockRoomTimelineController()
|
||||
timelineController.timelineItems = items
|
||||
let viewModel = RoomScreenViewModel(timelineController: timelineController,
|
||||
mediaProvider: MockMediaProvider(),
|
||||
roomName: nil)
|
||||
|
||||
// Then the messages should be grouped together.
|
||||
XCTAssertEqual(viewModel.state.items[0].timelineGroupStyle, .first, "Nothing should prevent the first message from being grouped.")
|
||||
XCTAssertEqual(viewModel.state.items[1].timelineGroupStyle, .middle, "Nothing should prevent the middle message from being grouped.")
|
||||
XCTAssertEqual(viewModel.state.items[2].timelineGroupStyle, .last, "Nothing should prevent the last message from being grouped.")
|
||||
}
|
||||
|
||||
func testMessageGroupingMultipleSenders() {
|
||||
// Given some interleaved messages from Bob and Alice.
|
||||
let items = [
|
||||
TextRoomTimelineItem(text: "Message 1",
|
||||
sender: "alice"),
|
||||
TextRoomTimelineItem(text: "Message 2",
|
||||
sender: "bob"),
|
||||
TextRoomTimelineItem(text: "Message 3",
|
||||
sender: "alice"),
|
||||
TextRoomTimelineItem(text: "Message 4",
|
||||
sender: "alice"),
|
||||
TextRoomTimelineItem(text: "Message 5",
|
||||
sender: "bob"),
|
||||
TextRoomTimelineItem(text: "Message 6",
|
||||
sender: "bob")
|
||||
]
|
||||
|
||||
// When showing them in a timeline.
|
||||
let timelineController = MockRoomTimelineController()
|
||||
timelineController.timelineItems = items
|
||||
let viewModel = RoomScreenViewModel(timelineController: timelineController,
|
||||
mediaProvider: MockMediaProvider(),
|
||||
roomName: nil)
|
||||
|
||||
// Then the messages should be grouped by sender.
|
||||
XCTAssertEqual(viewModel.state.items[0].timelineGroupStyle, .single, "A message should not be grouped when the sender changes.")
|
||||
XCTAssertEqual(viewModel.state.items[1].timelineGroupStyle, .single, "A message should not be grouped when the sender changes.")
|
||||
XCTAssertEqual(viewModel.state.items[2].timelineGroupStyle, .first, "A group should start with a new sender if there are more messages from that sender.")
|
||||
XCTAssertEqual(viewModel.state.items[3].timelineGroupStyle, .last, "A group should be ended when the sender changes in the next message.")
|
||||
XCTAssertEqual(viewModel.state.items[4].timelineGroupStyle, .first, "A group should start with a new sender if there are more messages from that sender.")
|
||||
XCTAssertEqual(viewModel.state.items[5].timelineGroupStyle, .last, "A group should be ended when the sender changes in the next message.")
|
||||
}
|
||||
|
||||
func testMessageGroupingWithLeadingReactions() {
|
||||
// Given 3 messages from Bob where the first message has a reaction.
|
||||
let items = [
|
||||
TextRoomTimelineItem(text: "Message 1",
|
||||
sender: "bob",
|
||||
addReactions: true),
|
||||
TextRoomTimelineItem(text: "Message 2",
|
||||
sender: "bob"),
|
||||
TextRoomTimelineItem(text: "Message 3",
|
||||
sender: "bob")
|
||||
]
|
||||
|
||||
// When showing them in a timeline.
|
||||
let timelineController = MockRoomTimelineController()
|
||||
timelineController.timelineItems = items
|
||||
let viewModel = RoomScreenViewModel(timelineController: timelineController,
|
||||
mediaProvider: MockMediaProvider(),
|
||||
roomName: nil)
|
||||
|
||||
// Then the first message should not be grouped but the other two should.
|
||||
XCTAssertEqual(viewModel.state.items[0].timelineGroupStyle, .single, "When the first message has reactions it should not be grouped.")
|
||||
XCTAssertEqual(viewModel.state.items[1].timelineGroupStyle, .first, "A new group should be made when the preceding message has reactions.")
|
||||
XCTAssertEqual(viewModel.state.items[2].timelineGroupStyle, .last, "Nothing should prevent the last message from being grouped.")
|
||||
}
|
||||
|
||||
func testMessageGroupingWithInnerReactions() {
|
||||
// Given 3 messages from Bob where the middle message has a reaction.
|
||||
let items = [
|
||||
TextRoomTimelineItem(text: "Message 1",
|
||||
sender: "bob"),
|
||||
TextRoomTimelineItem(text: "Message 2",
|
||||
sender: "bob",
|
||||
addReactions: true),
|
||||
TextRoomTimelineItem(text: "Message 3",
|
||||
sender: "bob")
|
||||
]
|
||||
|
||||
// When showing them in a timeline.
|
||||
let timelineController = MockRoomTimelineController()
|
||||
timelineController.timelineItems = items
|
||||
let viewModel = RoomScreenViewModel(timelineController: timelineController,
|
||||
mediaProvider: MockMediaProvider(),
|
||||
roomName: nil)
|
||||
|
||||
// Then the first and second messages should be grouped and the last one should not.
|
||||
XCTAssertEqual(viewModel.state.items[0].timelineGroupStyle, .first, "Nothing should prevent the first message from being grouped.")
|
||||
XCTAssertEqual(viewModel.state.items[1].timelineGroupStyle, .last, "When the message has reactions, the group should end here.")
|
||||
XCTAssertEqual(viewModel.state.items[2].timelineGroupStyle, .single, "The last message should not be grouped when the preceding message has reactions.")
|
||||
}
|
||||
|
||||
func testMessageGroupingWithTrailingReactions() {
|
||||
// Given 3 messages from Bob where the last message has a reaction.
|
||||
let items = [
|
||||
TextRoomTimelineItem(text: "Message 1",
|
||||
sender: "bob"),
|
||||
TextRoomTimelineItem(text: "Message 2",
|
||||
sender: "bob"),
|
||||
TextRoomTimelineItem(text: "Message 3",
|
||||
sender: "bob",
|
||||
addReactions: true)
|
||||
]
|
||||
|
||||
// When showing them in a timeline.
|
||||
let timelineController = MockRoomTimelineController()
|
||||
timelineController.timelineItems = items
|
||||
let viewModel = RoomScreenViewModel(timelineController: timelineController,
|
||||
mediaProvider: MockMediaProvider(),
|
||||
roomName: nil)
|
||||
|
||||
// Then the messages should be grouped together.
|
||||
XCTAssertEqual(viewModel.state.items[0].timelineGroupStyle, .first, "Nothing should prevent the first message from being grouped.")
|
||||
XCTAssertEqual(viewModel.state.items[1].timelineGroupStyle, .middle, "Nothing should prevent the second message from being grouped.")
|
||||
XCTAssertEqual(viewModel.state.items[2].timelineGroupStyle, .last, "Reactions on the last message should not prevent it from being grouped.")
|
||||
}
|
||||
}
|
||||
|
||||
private extension TextRoomTimelineItem {
|
||||
init(text: String, sender: String, addReactions: Bool = false) {
|
||||
self.init(id: UUID().uuidString,
|
||||
body: text,
|
||||
timestamp: "10:47 am",
|
||||
isOutgoing: sender == "bob",
|
||||
isEditable: sender == "bob",
|
||||
sender: .init(id: "@\(sender):server.com", displayName: sender),
|
||||
properties: RoomTimelineItemProperties(reactions: addReactions ? [
|
||||
AggregatedReaction(key: "🦄", count: 1, isHighlighted: false)
|
||||
] : []))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user