From 334746edb3a1afce11ff3026dcace700f264df7f Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Wed, 8 Oct 2025 11:26:36 +0300 Subject: [PATCH] Add unit test for the in-timeline space permalink handling --- ElementX/Sources/Mocks/ClientProxyMock.swift | 8 ++++---- .../Sources/UITests/UITestsAppCoordinator.swift | 2 +- .../Sources/RoomFlowCoordinatorTests.swift | 17 ++++++++++++++++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/ElementX/Sources/Mocks/ClientProxyMock.swift b/ElementX/Sources/Mocks/ClientProxyMock.swift index 6eaefa481..2bec93ac4 100644 --- a/ElementX/Sources/Mocks/ClientProxyMock.swift +++ b/ElementX/Sources/Mocks/ClientProxyMock.swift @@ -14,7 +14,7 @@ struct ClientProxyMockConfiguration { var userID: String = RoomMemberProxyMock.mockMe.userID var deviceID: String? var roomSummaryProvider: RoomSummaryProviderProtocol = RoomSummaryProviderMock(.init()) - var joinedSpaceRooms: [SpaceRoomProxyProtocol] = [] + var spaceServiceConfiguration: SpaceServiceProxyMock.Configuration = .init() var roomPreviews: [RoomPreviewProxyProtocol]? var roomDirectorySearchProxy: RoomDirectorySearchProxyProtocol? @@ -92,15 +92,15 @@ extension ClientProxyMock { secureBackupController = SecureBackupControllerMock(.init(recoveryState: configuration.recoveryState)) resetIdentityReturnValue = .success(IdentityResetHandleSDKMock(.init())) - spaceService = SpaceServiceProxyMock(.init()) + spaceService = SpaceServiceProxyMock(configuration.spaceServiceConfiguration) roomForIdentifierClosure = { [weak self] identifier in if let room = self?.roomSummaryProvider.roomListPublisher.value.first(where: { $0.id == identifier }) { let roomProxy = await JoinedRoomProxyMock(.init(id: room.id, name: room.name)) roomProxy.loadOrFetchEventDetailsForReturnValue = .success(TimelineEventSDKMock()) return .joined(roomProxy) - } else if let spaceRoomProxy = configuration.joinedSpaceRooms.first(where: { $0.id == identifier }) { - let roomProxy = await JoinedRoomProxyMock(.init(id: spaceRoomProxy.id, name: spaceRoomProxy.name)) + } else if let spaceRoomProxy = configuration.spaceServiceConfiguration.joinedSpaces.first(where: { $0.id == identifier }) { + let roomProxy = await JoinedRoomProxyMock(.init(id: spaceRoomProxy.id, name: spaceRoomProxy.name, isSpace: spaceRoomProxy.isSpace)) roomProxy.loadOrFetchEventDetailsForReturnValue = .success(TimelineEventSDKMock()) return .joined(roomProxy) } else { diff --git a/ElementX/Sources/UITests/UITestsAppCoordinator.swift b/ElementX/Sources/UITests/UITestsAppCoordinator.swift index afc8d5323..53b9f87c9 100644 --- a/ElementX/Sources/UITests/UITestsAppCoordinator.swift +++ b/ElementX/Sources/UITests/UITestsAppCoordinator.swift @@ -589,7 +589,7 @@ class MockScreen: Identifiable { let clientProxy = ClientProxyMock(.init(userID: "@mock:client.com", deviceID: "MOCKCLIENT", roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))), - joinedSpaceRooms: .mockSingleRoom, + spaceServiceConfiguration: .init(joinedSpaces: .mockSingleRoom), roomPreviews: [SpaceRoomProxyProtocol].mockSpaceList.map(RoomPreviewProxyMock.init))) // The tab bar remains hidden for the non-spaces tests as we don't supply any mock spaces. diff --git a/UnitTests/Sources/RoomFlowCoordinatorTests.swift b/UnitTests/Sources/RoomFlowCoordinatorTests.swift index 52f3d3bd5..8e781fe6f 100644 --- a/UnitTests/Sources/RoomFlowCoordinatorTests.swift +++ b/UnitTests/Sources/RoomFlowCoordinatorTests.swift @@ -378,6 +378,19 @@ class RoomFlowCoordinatorTests: XCTestCase { try await fulfillment.fulfill() } + // MARK: - Spaces + + func testSpacePermalink() async throws { + setupRoomFlowCoordinator() + + try await process(route: .room(roomID: "1", via: [])) + XCTAssert(navigationStackCoordinator.rootCoordinator is RoomScreenCoordinator) + + try await process(route: .childRoom(roomID: "space1", via: [])) + XCTAssert(navigationStackCoordinator.rootCoordinator is RoomScreenCoordinator) + XCTAssert(navigationStackCoordinator.stackCoordinators.first is SpaceScreenCoordinator) + } + // MARK: - Private private func process(route: AppRoute) async throws { @@ -420,7 +433,9 @@ class RoomFlowCoordinatorTests: XCTestCase { private func setupRoomFlowCoordinator(asChildFlow: Bool = false, roomType: RoomType? = nil) { cancellables.removeAll() - clientProxy = ClientProxyMock(.init(userID: "hi@bob", roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))))) + clientProxy = ClientProxyMock(.init(userID: "hi@bob", + roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))), + spaceServiceConfiguration: .populated)) timelineControllerFactory = TimelineControllerFactoryMock(.init()) clientProxy.roomPreviewForIdentifierViaClosure = { [roomType] roomID, _ in