* Fix people icon size * Disable dismiss when loading in StartChatScreen * Reduce debounce on search * Add padding to invite button * Add show/hide bottom bar behaviour * Fix bg color in StartChatScreen form * Update localisations * Update search users results to 10 * Fix form background in InviteUsersScreen * Fix invites list bg color * Add mxid in InvitesScreenCell * Refactor InvitesScreenCell design * Fix separator spacing * Add more design fixes * Refine InvitesScreenCell layout * Refactor UserProfileCell design * Refactor FormRowAccessory * Update localisations * Fix camera size and security section padding * Change create button style * Refine InviteUsersScreenSelectedItem * Refine CreateRoomScreen * Refine UserProfileCell padding * Amend preview name * delete test code * Add separator in security section * Fix spacing in InviteUsersScreenSelectedItem * Revert confirmationAction in CreateRoomScreen * Refine HomeScreenInvitesButton * Add dismiss keyboard in InviteUsersScreen * Refactor FormRowAccessory * Remove isDisabled from FormButtonStyles * Update localisations * Cleanup RoomDetailsEditScreen * UI fixes on horizontal user carousel * Refactor InviteUsersScreenSelectedItem * Try fix flaky tests * Fix typo * Update snapshot tests * Fix flaky UTs * Fix HomeScreen ui tests * Fix scroll on selection * Refactor RoomFlowCoordinatorTests
129 lines
6.1 KiB
Swift
129 lines
6.1 KiB
Swift
//
|
|
// Copyright 2023 New Vector Ltd
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
|
|
import XCTest
|
|
|
|
import Combine
|
|
@testable import ElementX
|
|
|
|
@MainActor
|
|
class RoomFlowCoordinatorTests: XCTestCase {
|
|
var roomFlowCoordinator: RoomFlowCoordinator!
|
|
var navigationStackCoordinator: NavigationStackCoordinator!
|
|
private var cancellables: Set<AnyCancellable> = .init()
|
|
|
|
override func setUp() async throws {
|
|
let clientProxy = MockClientProxy(userID: "hi@bob", roomSummaryProvider: MockRoomSummaryProvider(state: .loaded(.mockRooms)))
|
|
let mediaProvider = MockMediaProvider()
|
|
let userSession = MockUserSession(clientProxy: clientProxy, mediaProvider: mediaProvider)
|
|
|
|
let navigationSplitCoordinator = NavigationSplitCoordinator(placeholderCoordinator: SplashScreenCoordinator())
|
|
navigationStackCoordinator = NavigationStackCoordinator()
|
|
navigationSplitCoordinator.setDetailCoordinator(navigationStackCoordinator)
|
|
|
|
roomFlowCoordinator = RoomFlowCoordinator(userSession: userSession,
|
|
roomTimelineControllerFactory: MockRoomTimelineControllerFactory(),
|
|
navigationStackCoordinator: navigationStackCoordinator,
|
|
navigationSplitCoordinator: navigationSplitCoordinator,
|
|
emojiProvider: EmojiProvider())
|
|
}
|
|
|
|
func testRoomPresentation() async {
|
|
await process(route: .room(roomID: "1"), expectedAction: .presentedRoom("1"))
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomScreenCoordinator)
|
|
|
|
await process(route: .roomList, expectedAction: .dismissedRoom)
|
|
XCTAssertNil(navigationStackCoordinator.rootCoordinator)
|
|
|
|
await process(route: .room(roomID: "1"), expectedAction: .presentedRoom("1"))
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomScreenCoordinator)
|
|
|
|
await process(route: .room(roomID: "2"), expectedAction: .presentedRoom("2"))
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomScreenCoordinator)
|
|
|
|
await process(route: .roomList, expectedAction: .dismissedRoom)
|
|
XCTAssertNil(navigationStackCoordinator.rootCoordinator)
|
|
}
|
|
|
|
func testRoomDetailsPresentation() async {
|
|
await process(route: .roomDetails(roomID: "1"), expectedAction: .presentedRoom("1"))
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomDetailsScreenCoordinator)
|
|
|
|
await process(route: .roomList, expectedAction: .dismissedRoom)
|
|
XCTAssertNil(navigationStackCoordinator.rootCoordinator)
|
|
}
|
|
|
|
func testStackUnwinding() async {
|
|
await process(route: .roomDetails(roomID: "1"), expectedAction: .presentedRoom("1"))
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomDetailsScreenCoordinator)
|
|
|
|
await process(route: .room(roomID: "2"), expectedAction: .presentedRoom("2"))
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomScreenCoordinator)
|
|
}
|
|
|
|
func testNoOp() async {
|
|
await process(route: .roomDetails(roomID: "1"), expectedAction: .presentedRoom("1"))
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomDetailsScreenCoordinator)
|
|
roomFlowCoordinator.handleAppRoute(.roomDetails(roomID: "1"), animated: true)
|
|
await Task.yield()
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomDetailsScreenCoordinator)
|
|
}
|
|
|
|
func testSwitchToDifferentDetails() async {
|
|
await process(route: .roomDetails(roomID: "1"), expectedAction: .presentedRoom("1"))
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomDetailsScreenCoordinator)
|
|
|
|
await process(route: .roomDetails(roomID: "2"), expectedAction: .presentedRoom("2"))
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomDetailsScreenCoordinator)
|
|
}
|
|
|
|
func testPushDetails() async {
|
|
await process(route: .room(roomID: "1"), expectedAction: .presentedRoom("1"))
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomScreenCoordinator)
|
|
|
|
await process(route: .roomDetails(roomID: "1"), expectedAction: .presentedRoom("1"))
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomScreenCoordinator)
|
|
XCTAssertEqual(navigationStackCoordinator.stackCoordinators.count, 1)
|
|
XCTAssert(navigationStackCoordinator.stackCoordinators.first is RoomDetailsScreenCoordinator)
|
|
}
|
|
|
|
func testReplaceDetailsWithTimeline() async {
|
|
await process(route: .roomDetails(roomID: "1"), expectedAction: .presentedRoom("1"))
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomDetailsScreenCoordinator)
|
|
|
|
await process(route: .room(roomID: "1"), expectedActions: [.dismissedRoom, .presentedRoom("1")])
|
|
XCTAssert(navigationStackCoordinator.rootCoordinator is RoomScreenCoordinator)
|
|
}
|
|
|
|
// MARK: - Private
|
|
|
|
private func process(route: AppRoute, expectedAction: RoomFlowCoordinatorAction) async {
|
|
await process(route: route, expectedActions: [expectedAction])
|
|
}
|
|
|
|
private func process(route: AppRoute, expectedActions: [RoomFlowCoordinatorAction]) async {
|
|
Task {
|
|
await Task.yield()
|
|
self.roomFlowCoordinator.handleAppRoute(route, animated: true)
|
|
}
|
|
|
|
if !expectedActions.isEmpty {
|
|
let actions = await roomFlowCoordinator.actions.collect(expectedActions.count).values.first()
|
|
XCTAssertEqual(actions, expectedActions)
|
|
}
|
|
}
|
|
}
|