// // 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() viewModel = EventsViewModel(apiService: apiServiceMock, storageService: storageServiceMock, settingsService: settingsServiceMock, 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.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) } @Test("Delete event", arguments: [true, false]) mutating func deleteEvent(isUnrecognized: Bool) async throws { let vehicleWithEvent: VehicleDto = isUnrecognized ? unrecognizedVehicleWithEvent : vehicleWithEvent let vehicle: VehicleDto = isUnrecognized ? .unrecognized : .normal given(apiServiceMock) .remove(event: .value(VehicleEventDto.validId)) .willReturn(.normal) given(storageServiceMock) .updateVehicleIfExists(dto: .value(vehicle)) .willReturn() given(storageServiceMock) .remove(event: .value(VehicleEventDto.validId), from: .value(VehicleDto.validNumber)) .willReturn(.unrecognized) viewModel.vehicle = vehicleWithEvent await viewModel.deleteEvent(VehicleEventDto.valid.viewModel) verify(apiServiceMock) .remove(event: .any) .called(isUnrecognized ? .never : .once) verify(storageServiceMock) .updateVehicleIfExists(dto: .any) .called(isUnrecognized ? .never : .once) verify(storageServiceMock) .remove(event: .any, from: .any) .called(isUnrecognized ? .once : .never) #expect(viewModel.vehicle.events.isEmpty) #expect(viewModel.events.isEmpty) #expect(viewModel.hud == nil) } }