Add some tests.

# Conflicts:
#	ElementX.xcodeproj/project.pbxproj
This commit is contained in:
Doug
2026-08-25 17:22:17 +01:00
committed by Stefan Ceriu
parent c812b723dc
commit fbb5632896
4 changed files with 63 additions and 1 deletions
@@ -6,6 +6,7 @@
// Please see LICENSE files in the repository root for full details.
//
import Combine
@testable import ElementX
import Testing
@@ -16,12 +17,16 @@ final class JoinRoomScreenViewModelTests {
case knocked
case invited
case banned
case alreadyJoined
}
var viewModel: JoinRoomScreenViewModelProtocol!
var clientProxy: ClientProxyMock!
/// Backs the client's static room summary provider so tests can push membership changes.
var roomListSubject: CurrentValueSubject<[RoomSummary], Never>!
var context: JoinRoomScreenViewModelType.Context {
viewModel.context
}
@@ -35,6 +40,7 @@ final class JoinRoomScreenViewModelTests {
isolated deinit {
viewModel = nil
clientProxy = nil
roomListSubject = nil
}
@Test
@@ -114,6 +120,26 @@ final class JoinRoomScreenViewModelTests {
try await deferred.fulfill()
}
@Test
func alreadyJoinedRoomAdvancesTheScreen() async throws {
setupViewModel(mode: .alreadyJoined)
let deferred = deferFulfillment(viewModel.actionsPublisher) { $0 == .joined(.roomID("1")) }
try await deferred.fulfill()
}
@Test
func membershipChangeWhileInvitedAdvancesTheScreen() async throws {
setupViewModel(mode: .invited)
try await deferFulfillment(viewModel.context.$viewState) { $0.mode == .invited(isDM: false) }.fulfill()
// Simulate the server-side join arriving through the room list.
clientProxy.roomForIdentifierClosure = { .joined(JoinedRoomProxyMock(.init(id: $0))) }
let deferred = deferFulfillment(viewModel.actionsPublisher) { $0 == .joined(.roomID("1")) }
roomListSubject.send([.mock(id: "1", name: "Test")])
try await deferred.fulfill()
}
@Test
func declineAndBlockInviteLegacyInteraction() async throws {
setupViewModel(mode: .invited)
@@ -169,6 +195,11 @@ final class JoinRoomScreenViewModelTests {
private func setupViewModel(throwing: Bool = false, mode: TestMode = .joined) {
clientProxy = ClientProxyMock(.init())
roomListSubject = .init([])
let summaryProvider = RoomSummaryProviderMock(.init())
summaryProvider.roomListPublisher = roomListSubject.asCurrentValuePublisher()
clientProxy.staticRoomSummaryProvider = summaryProvider
clientProxy.joinRoomViaReturnValue = throwing ? .failure(.sdkError(ClientProxyMockError.generic)) : .success(())
clientProxy.joinRoomAliasReturnValue = clientProxy.joinRoomViaReturnValue
@@ -198,6 +229,11 @@ final class JoinRoomScreenViewModelTests {
roomProxy.forgetRoomReturnValue = .success(())
return .banned(roomProxy)
}
case .alreadyJoined:
clientProxy.roomPreviewForIdentifierViaReturnValue = .success(RoomPreviewProxyMock.joinable)
clientProxy.roomForIdentifierClosure = { roomID in
.joined(JoinedRoomProxyMock(.init(id: roomID)))
}
}
viewModel = JoinRoomScreenViewModel(source: .generic(roomID: "1", via: []),