Swift Testing for Unit Tests PART 1 (#5119)

* migrated a lot of unit tests to Swift Testing and added a new implementation for deferred fulfillment

more tests migration

Cleaned the code manually to establish some good patterns

more code improvements

some more code improvements

removed empty tests

update project

* more pr suggestions and cleanups

* removed the TestSetup pattern

* fixing claude not reusing tests

* pr suggestion + added indent rule to swiftformat so that we can prevent AIs to change that
This commit is contained in:
Mauro
2026-02-19 16:20:47 +01:00
committed by GitHub
parent fc03e05697
commit 7982aef855
118 changed files with 4630 additions and 4129 deletions
@@ -7,29 +7,32 @@
//
@testable import ElementX
import XCTest
import Testing
@MainActor
class SoftLogoutScreenViewModelTests: XCTestCase {
let credentials = SoftLogoutScreenCredentials(userID: "mock_user_id",
homeserverName: "https://example.com",
userDisplayName: "mock_username",
deviceID: "ABCDEFGH")
@Suite
struct SoftLogoutScreenViewModelTests {
private let credentials = SoftLogoutScreenCredentials(userID: "mock_user_id",
homeserverName: "https://example.com",
userDisplayName: "mock_username",
deviceID: "ABCDEFGH")
func testInitialStateForBasicServer() {
@Test
func initialStateForBasicServer() {
let viewModel = SoftLogoutScreenViewModel(credentials: credentials,
homeserver: .mockBasicServer,
keyBackupNeeded: false)
let context = viewModel.context
// Given a view model where the user hasn't yet sent the verification email.
XCTAssert(context.password.isEmpty, "The view model should start with an empty password.")
XCTAssertFalse(context.viewState.canSubmit, "The view model should start with an invalid password.")
XCTAssertEqual(context.viewState.loginMode, .password, "The view model should show login form for the given homeserver.")
XCTAssertFalse(context.viewState.showRecoverEncryptionKeysMessage, "The view model should not show recover encryption keys message.")
#expect(context.password.isEmpty, "The view model should start with an empty password.")
#expect(!context.viewState.canSubmit, "The view model should start with an invalid password.")
#expect(context.viewState.loginMode == .password, "The view model should show login form for the given homeserver.")
#expect(!context.viewState.showRecoverEncryptionKeysMessage, "The view model should not show recover encryption keys message.")
}
func testInitialStateForBasicServerPasswordEntered() {
@Test
func initialStateForBasicServerPasswordEntered() {
let viewModel = SoftLogoutScreenViewModel(credentials: credentials,
homeserver: .mockBasicServer,
keyBackupNeeded: true,
@@ -37,34 +40,36 @@ class SoftLogoutScreenViewModelTests: XCTestCase {
let context = viewModel.context
// Given a view model where the user hasn't yet sent the verification email.
XCTAssertTrue(context.viewState.canSubmit, "The view model should start with a valid password.")
XCTAssertEqual(context.viewState.loginMode, .password, "The view model should show login form for the given homeserver.")
XCTAssert(context.viewState.showRecoverEncryptionKeysMessage, "The view model should show recover encryption keys message.")
#expect(context.viewState.canSubmit, "The view model should start with a valid password.")
#expect(context.viewState.loginMode == .password, "The view model should show login form for the given homeserver.")
#expect(context.viewState.showRecoverEncryptionKeysMessage, "The view model should show recover encryption keys message.")
}
func testInitialStateForOIDC() {
@Test
func initialStateForOIDC() {
let viewModel = SoftLogoutScreenViewModel(credentials: credentials,
homeserver: .mockMatrixDotOrg,
keyBackupNeeded: false)
let context = viewModel.context
// Given a view model where the user hasn't yet sent the verification email.
XCTAssert(context.password.isEmpty, "The view model should start with an empty password.")
XCTAssertFalse(context.viewState.canSubmit, "The view model should start with an invalid password.")
XCTAssertTrue(context.viewState.loginMode.supportsOIDCFlow, "The view model should show OIDC button for the given homeserver.")
XCTAssertFalse(context.viewState.showRecoverEncryptionKeysMessage, "The view model should not show recover encryption keys message.")
#expect(context.password.isEmpty, "The view model should start with an empty password.")
#expect(!context.viewState.canSubmit, "The view model should start with an invalid password.")
#expect(context.viewState.loginMode.supportsOIDCFlow, "The view model should show OIDC button for the given homeserver.")
#expect(!context.viewState.showRecoverEncryptionKeysMessage, "The view model should not show recover encryption keys message.")
}
func testInitialStateForUnsupported() {
@Test
func initialStateForUnsupported() {
let viewModel = SoftLogoutScreenViewModel(credentials: credentials,
homeserver: .mockUnsupported,
keyBackupNeeded: false)
let context = viewModel.context
// Given a view model where the user hasn't yet sent the verification email.
XCTAssert(context.password.isEmpty, "The view model should start with an empty password.")
XCTAssertFalse(context.viewState.canSubmit, "The view model should start with an invalid password.")
XCTAssertEqual(context.viewState.loginMode, .unsupported, "The view model should show unsupported text for the given homeserver.")
XCTAssertFalse(context.viewState.showRecoverEncryptionKeysMessage, "The view model should not show recover encryption keys message.")
#expect(context.password.isEmpty, "The view model should start with an empty password.")
#expect(!context.viewState.canSubmit, "The view model should start with an invalid password.")
#expect(context.viewState.loginMode == .unsupported, "The view model should show unsupported text for the given homeserver.")
#expect(!context.viewState.showRecoverEncryptionKeysMessage, "The view model should not show recover encryption keys message.")
}
}