// // EventsTests.swift // AutoCatTests // // Created by Selim Mustafaev on 18.12.2024. // Copyright © 2024 Selim Mustafaev. All rights reserved. // import Testing import Mockable import AutoCatCore @testable import AutoCat @MainActor struct EventsTests { var settingsServiceMock: MockSettingsServiceProtocol var storageServiceMock: MockStorageServiceProtocol var apiServiceMock: MockApiServiceProtocol var viewModel: EventsViewModel lazy var vehicleWithEvent: VehicleDto = .normal.addEvent(.valid) lazy var unrecognizedVehicleWithEvent: VehicleDto = .unrecognized.addEvent(.valid) init() { settingsServiceMock = MockSettingsServiceProtocol() storageServiceMock = MockStorageServiceProtocol() apiServiceMock = MockApiServiceProtocol() ServiceContainer.shared.register(SettingsServiceProtocol.self, instance: settingsServiceMock) ServiceContainer.shared.register(StorageServiceProtocol.self, instance: storageServiceMock) ServiceContainer.shared.register(ApiServiceProtocol.self, instance: apiServiceMock) viewModel = EventsViewModel(vehicle: VehicleDto()) given(settingsServiceMock) .user.willReturn(User()) } @Test("Add event", arguments: [true, false]) mutating func addEvent(isUnrecognized: Bool) async throws { let updatedVehicle: VehicleDto = isUnrecognized ? unrecognizedVehicleWithEvent : vehicleWithEvent given(apiServiceMock) .add(event: .value(.valid), to: .value(VehicleDto.validNumber)) .willReturn(vehicleWithEvent) given(storageServiceMock) .updateVehicleIfExists(dto: .value(updatedVehicle)) .willReturn() given(storageServiceMock) .add(event: .value(.valid), to: .value(VehicleDto.validNumber)) .willReturn(unrecognizedVehicleWithEvent) viewModel = EventsViewModel(vehicle: isUnrecognized ? .unrecognized : .normal) await viewModel.addEvent(.valid) verify(apiServiceMock) .add(event: .any, to: .any) .called(isUnrecognized ? .never : .once) verify(storageServiceMock) .updateVehicleIfExists(dto: .any) .called(isUnrecognized ? .never : .once) verify(storageServiceMock) .add(event: .any, to: .any) .called(isUnrecognized ? .once : .never) #expect(viewModel.vehicle.events.count == 1) #expect(viewModel.vehicle.events.first?.id == VehicleEventDto.validId) #expect(viewModel.events.count == 1) #expect(viewModel.events.first?.id == VehicleEventDto.validId) #expect(viewModel.hud == nil) } }