Implement the flow for leaving a space. (#4568)

This commit is contained in:
Doug
2025-10-03 16:37:09 +01:00
committed by GitHub
parent 886f35ed5c
commit 465c533e59
36 changed files with 933 additions and 42 deletions

View File

@@ -17,6 +17,7 @@ class SpaceScreenViewModelTests: XCTestCase {
let mockSpaceRooms = [SpaceRoomProxyProtocol].mockSpaceList
var clientProxy: ClientProxyMock!
var paginationStateSubject: CurrentValueSubject<SpaceRoomListPaginationState, Never> = .init(.idle(endReached: true))
var rustLeaveHandle: LeaveSpaceHandleSDKMock!
var viewModel: SpaceScreenViewModelProtocol!
@@ -192,6 +193,37 @@ class SpaceScreenViewModelTests: XCTestCase {
}
}
func testLeavingSpace() async throws {
setupViewModel()
XCTAssertNil(context.leaveHandle)
let deferredHandle = deferFulfillment(context.observe(\.leaveHandle)) { $0 != nil }
context.send(viewAction: .leaveSpace)
try await deferredHandle.fulfill()
XCTAssertNotNil(context.leaveHandle, "The leave action should show the leave view.")
let handle = try XCTUnwrap(context.leaveHandle)
let selectedCount = handle.selectedCount
let firstSelectedRoom = try XCTUnwrap(handle.rooms.first { $0.isSelected })
XCTAssertGreaterThan(selectedCount, 0, "The leave view should have selected rooms to begin with")
context.send(viewAction: .deselectAllLeaveRoomDetails)
XCTAssertEqual(handle.selectedCount, 0, "Deselecting all should result in no selected rooms.")
context.send(viewAction: .toggleLeaveSpaceRoomDetails(id: firstSelectedRoom.spaceRoomProxy.id))
XCTAssertEqual(handle.selectedCount, 1, "Toggling a room should result in 1 selected room")
// Confirming the leave should leave the selected room and then the space.
let deferredAction = deferFulfillment(viewModel.actionsPublisher) { $0.isLeftSpace }
context.send(viewAction: .confirmLeaveSpace)
try await deferredAction.fulfill()
XCTAssertNil(context.leaveHandle)
XCTAssertTrue(rustLeaveHandle.leaveRoomIdsCalled)
XCTAssertEqual(rustLeaveHandle.leaveRoomIdsReceivedRoomIds,
[firstSelectedRoom.spaceRoomProxy.id, spaceRoomListProxy.spaceRoomProxy.id],
"Confirming the leave should first leave the selected room and then the space.")
}
// MARK: - Helpers
private func setupViewModel(paginationResponses: [[SpaceRoomProxyProtocol]] = []) {
@@ -204,6 +236,11 @@ class SpaceScreenViewModelTests: XCTestCase {
guard let spaceRoomProxy = mockSpaceRooms.first(where: { $0.id == spaceID }) else { return .failure(.missingSpace) }
return .success(SpaceRoomListProxyMock(.init(spaceRoomProxy: spaceRoomProxy)))
}
let rustLeaveHandle = LeaveSpaceHandleSDKMock(.init())
spaceServiceProxy.leaveSpaceSpaceIDClosure = { spaceID in
.success(LeaveSpaceHandleProxy(spaceID: spaceID, leaveHandle: rustLeaveHandle))
}
self.rustLeaveHandle = rustLeaveHandle
clientProxy = ClientProxyMock(.init())
@@ -214,3 +251,12 @@ class SpaceScreenViewModelTests: XCTestCase {
userIndicatorController: UserIndicatorControllerMock())
}
}
private extension SpaceScreenViewModelAction {
var isLeftSpace: Bool {
switch self {
case .leftSpace: true
default: false
}
}
}