Knock Polishing part 4 (#3779)

* added decline and block and inviter redesign

* improved testing

* improved testing

* code improvement

* code improvement

* improved the code
This commit is contained in:
Mauro
2025-02-10 18:31:12 +01:00
committed by GitHub
parent 6f3b4feade
commit c0dd301fdb
43 changed files with 231 additions and 91 deletions

View File

@@ -11,7 +11,15 @@ import XCTest
@MainActor
class JoinRoomScreenViewModelTests: XCTestCase {
private enum TestMode {
case joined
case knocked
case invited
case banned
}
var viewModel: JoinRoomScreenViewModelProtocol!
var clientProxy: ClientProxyMock!
var context: JoinRoomScreenViewModelType.Context {
viewModel.context
@@ -19,6 +27,7 @@ class JoinRoomScreenViewModelTests: XCTestCase {
override func tearDown() {
viewModel = nil
clientProxy = nil
AppSettings.resetAllSettings()
}
@@ -39,17 +48,22 @@ class JoinRoomScreenViewModelTests: XCTestCase {
}
func testDeclineInviteInteraction() async throws {
setupViewModel()
setupViewModel(mode: .invited)
try await deferFulfillment(viewModel.context.$viewState) { $0.roomDetails != nil }.fulfill()
context.send(viewAction: .declineInvite)
XCTAssertEqual(viewModel.context.alertInfo?.id, .declineInvite)
let deferred = deferFulfillment(viewModel.actionsPublisher) { action in
action == .dismiss
}
context.alertInfo?.secondaryButton?.action?()
try await deferred.fulfill()
}
func testKnockedState() async throws {
setupViewModel(knocked: true)
setupViewModel(mode: .knocked)
try await deferFulfillment(viewModel.context.$viewState) { state in
state.mode == .knocked
@@ -57,7 +71,7 @@ class JoinRoomScreenViewModelTests: XCTestCase {
}
func testCancelKnock() async throws {
setupViewModel(knocked: true)
setupViewModel(mode: .knocked)
try await deferFulfillment(viewModel.context.$viewState) { state in
state.mode == .knocked
@@ -73,14 +87,51 @@ class JoinRoomScreenViewModelTests: XCTestCase {
try await deferred.fulfill()
}
private func setupViewModel(throwing: Bool = false, knocked: Bool = false) {
func testDeclineAndBlockInviteInteraction() async throws {
setupViewModel(mode: .invited)
let expectation = expectation(description: "Wait for the user to be ignored")
clientProxy.ignoreUserClosure = { userID in
defer { expectation.fulfill() }
XCTAssertEqual(userID, "@test:matrix.org")
return .success(())
}
try await deferFulfillment(viewModel.context.$viewState) { $0.roomDetails != nil }.fulfill()
context.send(viewAction: .declineInviteAndBlock(userID: "@test:matrix.org"))
XCTAssertEqual(viewModel.context.alertInfo?.id, .declineInviteAndBlock)
let deferred = deferFulfillment(viewModel.actionsPublisher) { action in
action == .dismiss
}
context.alertInfo?.secondaryButton?.action?()
try await deferred.fulfill()
await fulfillment(of: [expectation], timeout: 10)
}
func testForgetRoom() async throws {
setupViewModel(mode: .banned)
try await deferFulfillment(viewModel.context.$viewState) { $0.roomDetails != nil }.fulfill()
let deferred = deferFulfillment(viewModel.actionsPublisher) { action in
action == .dismiss
}
context.send(viewAction: .forget)
try await deferred.fulfill()
}
private func setupViewModel(throwing: Bool = false, mode: TestMode = .joined) {
ServiceLocator.shared.settings.knockingEnabled = true
let clientProxy = ClientProxyMock(.init())
clientProxy = ClientProxyMock(.init())
clientProxy.joinRoomViaReturnValue = throwing ? .failure(.sdkError(ClientProxyMockError.generic)) : .success(())
if knocked {
switch mode {
case .knocked:
clientProxy.roomPreviewForIdentifierViaReturnValue = .success(RoomPreviewProxyMock.knocked)
clientProxy.roomForIdentifierClosure = { _ in
@@ -89,8 +140,22 @@ class JoinRoomScreenViewModelTests: XCTestCase {
roomProxy.cancelKnockUnderlyingReturnValue = .success(())
return .knocked(roomProxy)
}
} else {
case .joined:
clientProxy.roomPreviewForIdentifierViaReturnValue = .success(RoomPreviewProxyMock.joinable)
case .invited:
clientProxy.roomPreviewForIdentifierViaReturnValue = .success(RoomPreviewProxyMock.invited())
clientProxy.roomForIdentifierClosure = { _ in
let roomProxy = InvitedRoomProxyMock(.init())
roomProxy.rejectInvitationReturnValue = .success(())
return .invited(roomProxy)
}
case .banned:
clientProxy.roomPreviewForIdentifierViaReturnValue = .success(RoomPreviewProxyMock.banned)
clientProxy.roomForIdentifierClosure = { _ in
let roomProxy = BannedRoomProxyMock(.init())
roomProxy.forgetRoomReturnValue = .success(())
return .banned(roomProxy)
}
}
viewModel = JoinRoomScreenViewModel(roomID: "1",