import XCTest @testable import iosApp import ComposeApp @MainActor final class TaskViewModelTests: XCTestCase { var sut: TaskViewModel! override func setUp() { super.setUp() sut = TaskViewModel() } override func tearDown() { sut = nil super.tearDown() } // MARK: - Initialization Tests func testInitialState() { // Then XCTAssertFalse(sut.isLoading) XCTAssertNil(sut.errorMessage) XCTAssertTrue(sut.tasks.isEmpty) } // MARK: - Task Operations Tests func testCancelTaskWithValidId() { // Given let taskId: Int32 = 1 var callbackExecuted = false // When sut.cancelTask(id: taskId) { success in callbackExecuted = true } // Then - Callback should eventually be called let expectation = XCTestExpectation(description: "Callback executed") DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { if callbackExecuted || self.sut.errorMessage != nil { expectation.fulfill() } } wait(for: [expectation], timeout: 2.0) } func testUncancelTaskWithValidId() { // Given let taskId: Int32 = 1 var callbackExecuted = false // When sut.uncancelTask(id: taskId) { success in callbackExecuted = true } // Then - Should not crash XCTAssertNotNil(sut) } func testArchiveTaskWithValidId() { // Given let taskId: Int32 = 1 var callbackExecuted = false // When sut.archiveTask(id: taskId) { success in callbackExecuted = true } // Then - Should not crash XCTAssertNotNil(sut) } func testUnarchiveTaskWithValidId() { // Given let taskId: Int32 = 1 var callbackExecuted = false // When sut.unarchiveTask(id: taskId) { success in callbackExecuted = true } // Then - Should not crash XCTAssertNotNil(sut) } func testMarkInProgressWithValidId() { // Given let taskId: Int32 = 1 var callbackExecuted = false // When sut.markInProgress(id: taskId) { success in callbackExecuted = true } // Then - Should not crash XCTAssertNotNil(sut) } // MARK: - State Management Tests func testMultipleOperationsDontCrash() { // When sut.cancelTask(id: 1) { _ in } sut.uncancelTask(id: 2) { _ in } sut.archiveTask(id: 3) { _ in } // Then - Should not crash XCTAssertNotNil(sut) } }