AutoCat/AutoCatTests/EventsTests.swift
2024-12-24 22:19:55 +03:00

126 lines
4.4 KiB
Swift

//
// 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())
}
func makeViewModel(vehicle: VehicleDto) -> EventsViewModel {
EventsViewModel(apiService: apiServiceMock,
storageService: storageServiceMock,
settingsService: settingsServiceMock,
vehicle: vehicle)
}
@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 = makeViewModel(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 = makeViewModel(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)
}
}