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,17 +7,20 @@
//
@testable import ElementX
import XCTest
import Testing
import UIKit
@MainActor
class BugReportScreenViewModelTests: XCTestCase {
@Suite
struct BugReportScreenViewModelTests {
let logFiles: [URL] = [URL(filePath: "/path/to/file1.log"), URL(filePath: "/path/to/file2.log")]
enum TestError: Error {
case testError
}
func testInitialState() {
@Test
func initialState() {
let clientProxy = ClientProxyMock(.init(userID: "@mock.client.com"))
let viewModel = BugReportScreenViewModel(bugReportService: BugReportServiceMock(),
clientProxy: clientProxy,
@@ -26,12 +29,13 @@ class BugReportScreenViewModelTests: XCTestCase {
isModallyPresented: false)
let context = viewModel.context
XCTAssertEqual(context.reportText, "")
XCTAssertNil(context.viewState.screenshot)
XCTAssertTrue(context.sendingLogsEnabled)
#expect(context.reportText == "")
#expect(context.viewState.screenshot == nil)
#expect(context.sendingLogsEnabled)
}
func testClearScreenshot() {
@Test
func clearScreenshot() {
let clientProxy = ClientProxyMock(.init(userID: "@mock.client.com"))
let viewModel = BugReportScreenViewModel(bugReportService: BugReportServiceMock(),
clientProxy: clientProxy,
@@ -41,10 +45,11 @@ class BugReportScreenViewModelTests: XCTestCase {
let context = viewModel.context
context.send(viewAction: .removeScreenshot)
XCTAssertNil(context.viewState.screenshot)
#expect(context.viewState.screenshot == nil)
}
func testAttachScreenshot() {
@Test
func attachScreenshot() {
let clientProxy = ClientProxyMock(.init(userID: "@mock.client.com"))
let viewModel = BugReportScreenViewModel(bugReportService: BugReportServiceMock(),
clientProxy: clientProxy,
@@ -52,12 +57,13 @@ class BugReportScreenViewModelTests: XCTestCase {
screenshot: nil,
isModallyPresented: false)
let context = viewModel.context
XCTAssertNil(context.viewState.screenshot)
#expect(context.viewState.screenshot == nil)
context.send(viewAction: .attachScreenshot(UIImage.actions))
XCTAssert(context.viewState.screenshot == UIImage.actions)
#expect(context.viewState.screenshot == UIImage.actions)
}
func testSendReportWithSuccess() async throws {
@Test
func sendReportWithSuccess() async throws {
let mockService = BugReportServiceMock()
mockService.submitBugReportProgressListenerClosure = { _, _ in
await Task.yield()
@@ -88,19 +94,20 @@ class BugReportScreenViewModelTests: XCTestCase {
context.send(viewAction: .submit)
try await deferred.fulfill()
XCTAssert(mockService.submitBugReportProgressListenerCallsCount == 1)
XCTAssertEqual(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.userID, "@mock.client.com")
XCTAssertEqual(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.deviceID, "ABCDEFGH")
XCTAssertEqual(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.curve25519, "THECURVEKEYKEY")
XCTAssertEqual(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.ed25519, "THEEDKEYKEY")
XCTAssertEqual(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.text, "This will succeed")
XCTAssertEqual(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.logFiles, logFiles)
XCTAssertEqual(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.canContact, false)
XCTAssertEqual(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.githubLabels, [])
XCTAssertEqual(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.files, [])
#expect(mockService.submitBugReportProgressListenerCallsCount == 1)
#expect(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.userID == "@mock.client.com")
#expect(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.deviceID == "ABCDEFGH")
#expect(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.curve25519 == "THECURVEKEYKEY")
#expect(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.ed25519 == "THEEDKEYKEY")
#expect(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.text == "This will succeed")
#expect(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.logFiles == logFiles)
#expect(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.canContact == false)
#expect(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.githubLabels == [])
#expect(mockService.submitBugReportProgressListenerReceivedArguments?.bugReport.files == [])
}
func testSendReportWithError() async throws {
@Test
func sendReportWithError() async throws {
let mockService = BugReportServiceMock()
mockService.submitBugReportProgressListenerClosure = { _, _ in
.failure(.uploadFailure(TestError.testError))
@@ -125,8 +132,8 @@ class BugReportScreenViewModelTests: XCTestCase {
context.send(viewAction: .submit)
try await deferred.fulfill()
XCTAssert(mockService.submitBugReportProgressListenerCallsCount == 1)
XCTAssertEqual(context.reportText, "This will fail", "The bug report should remain in place so the user can retry.")
XCTAssertFalse(context.viewState.shouldDisableInteraction, "The user should be able to retry.")
#expect(mockService.submitBugReportProgressListenerCallsCount == 1)
#expect(context.reportText == "This will fail", "The bug report should remain in place so the user can retry.")
#expect(!context.viewState.shouldDisableInteraction, "The user should be able to retry.")
}
}