import XCTest @testable import iosApp import ComposeApp @MainActor final class ContractorViewModelTests: XCTestCase { var sut: ContractorViewModel! override func setUp() { super.setUp() sut = ContractorViewModel() } override func tearDown() { sut = nil super.tearDown() } // MARK: - Initialization Tests func testInitialState() { // Then XCTAssertFalse(sut.isLoading) XCTAssertNil(sut.errorMessage) XCTAssertTrue(sut.contractors.isEmpty) } // MARK: - Contractor Loading Tests func testLoadContractorsWithoutFilters() { // When sut.loadContractors() // Then - Should start loading or complete XCTAssertTrue(sut.isLoading || sut.errorMessage != nil || !sut.contractors.isEmpty || (!sut.isLoading && sut.contractors.isEmpty)) } func testLoadContractorsWithSpecialtyFilter() { // When sut.loadContractors(specialty: "Plumbing") // Then - Should not crash XCTAssertNotNil(sut) } func testLoadContractorsWithFavoriteFilter() { // When sut.loadContractors(isFavorite: true) // Then - Should not crash XCTAssertNotNil(sut) } func testLoadContractorsWithSearchQuery() { // When sut.loadContractors(search: "John") // Then - Should not crash XCTAssertNotNil(sut) } // MARK: - Toggle Favorite Tests func testToggleFavoriteWithValidId() { // Given let expectation = XCTestExpectation(description: "Toggle favorite callback") var resultSuccess: Bool? // When sut.toggleFavorite(id: 1) { success in resultSuccess = success expectation.fulfill() } // Then wait(for: [expectation], timeout: 5.0) XCTAssertNotNil(resultSuccess) } // MARK: - State Management Tests func testMultipleLoadCallsDontCrash() { // When sut.loadContractors() sut.loadContractors(specialty: "Electrical") sut.loadContractors(isFavorite: true) // Then - Should not crash XCTAssertNotNil(sut) } }