// // Copyright 2026 Element Creations Ltd. // // SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. // Please see LICENSE files in the repository root for full details. // @testable import ElementX import Foundation import Testing final class HealthChatInviteMemberScreenViewModelTests { private let apiService = HealthChatAPIServiceMock() private let viewModel: HealthChatInviteMemberScreenViewModel init() { viewModel = HealthChatInviteMemberScreenViewModel(apiService: apiService, userIndicatorController: UserIndicatorControllerMock()) } @Test func sendingRequiresValidEmailAndNote() { #expect(!viewModel.context.viewState.canSend) viewModel.context.email = "new@example.ch" viewModel.context.personalNote = "Zu kurz" #expect(!viewModel.context.viewState.canSend) viewModel.context.personalNote = "Bitte tritt unserem Netzwerk bei!" #expect(viewModel.context.viewState.canSend) viewModel.context.email = "not-an-email" #expect(!viewModel.context.viewState.canSend) } @Test func sendSuccessDismisses() async throws { apiService.inviteMemberEmailPersonalNoteReturnValue = .success(()) viewModel.context.email = "new@example.ch" viewModel.context.personalNote = "Bitte tritt unserem Netzwerk bei!" let deferred = deferFulfillment(viewModel.actionsPublisher) { action in guard case .dismiss = action else { return false } return true } viewModel.context.send(viewAction: .send) try await deferred.fulfill() let arguments = try #require(apiService.inviteMemberEmailPersonalNoteReceivedArguments) #expect(arguments.email == "new@example.ch") #expect(arguments.personalNote == "Bitte tritt unserem Netzwerk bei!") } @Test func sendFailureShowsAlert() async throws { apiService.inviteMemberEmailPersonalNoteReturnValue = .failure(.networkFailure) viewModel.context.email = "new@example.ch" viewModel.context.personalNote = "Bitte tritt unserem Netzwerk bei!" let deferred = deferFulfillment(viewModel.context.observe(\.viewState.bindings.alertInfo)) { $0 != nil } viewModel.context.send(viewAction: .send) try await deferred.fulfill() } @Test func cancelDismisses() async throws { let deferred = deferFulfillment(viewModel.actionsPublisher) { action in guard case .dismiss = action else { return false } return true } viewModel.context.send(viewAction: .cancel) try await deferred.fulfill() } }