167 lines
5.2 KiB
Swift
167 lines
5.2 KiB
Swift
//
|
||
// ReportTests.swift
|
||
// AutoCatTests
|
||
//
|
||
// Created by Selim Mustafaev on 02.12.2024.
|
||
// Copyright © 2024 Selim Mustafaev. All rights reserved.
|
||
//
|
||
|
||
import Testing
|
||
import Mockable
|
||
import AutoCatCore
|
||
@testable import AutoCat
|
||
|
||
@MainActor
|
||
class ReportTests {
|
||
|
||
let existingVehicleNumber = "А123АА761"
|
||
let nonExistingVehicleNumber = "А999АА761"
|
||
let testColor = "testColor"
|
||
|
||
var storageServiceMock: MockStorageServiceProtocol
|
||
var settingsServiceMock: MockSettingsServiceProtocol
|
||
var apiServiceMock: MockApiServiceProtocol
|
||
|
||
var viewModel: ReportViewModel
|
||
|
||
init() {
|
||
storageServiceMock = MockStorageServiceProtocol()
|
||
settingsServiceMock = MockSettingsServiceProtocol()
|
||
apiServiceMock = MockApiServiceProtocol()
|
||
|
||
viewModel = ReportViewModel(
|
||
apiService: apiServiceMock,
|
||
storageService: storageServiceMock,
|
||
settingsService: settingsServiceMock,
|
||
vehicle: VehicleDto(),
|
||
isPersistent: true
|
||
)
|
||
}
|
||
|
||
func makeViewModel(vehicle: VehicleDto, isPersistent: Bool) -> ReportViewModel {
|
||
ReportViewModel(
|
||
apiService: apiServiceMock,
|
||
storageService: storageServiceMock,
|
||
settingsService: settingsServiceMock,
|
||
vehicle: vehicle,
|
||
isPersistent: isPersistent
|
||
)
|
||
}
|
||
|
||
@Test("Load vehicle detail")
|
||
func loadVehicleDetail() async throws {
|
||
|
||
let incompleteVehicleModel = VehicleDto(number: existingVehicleNumber)
|
||
let fullVehicleModel = VehicleDto(number: existingVehicleNumber, color: testColor)
|
||
|
||
viewModel.vehicle = incompleteVehicleModel
|
||
|
||
#expect(viewModel.vehicle.color == nil)
|
||
|
||
given(storageServiceMock)
|
||
.loadVehicle(number: .value(existingVehicleNumber))
|
||
.willReturn(fullVehicleModel)
|
||
|
||
await viewModel.onAppear()
|
||
|
||
verify(storageServiceMock)
|
||
.loadVehicle(number: .value(existingVehicleNumber))
|
||
.called(.once)
|
||
|
||
#expect(viewModel.vehicle.color == testColor)
|
||
#expect(viewModel.hud == nil)
|
||
}
|
||
|
||
@Test("Load vehicle error")
|
||
func loadVehicleError() async throws {
|
||
|
||
given(storageServiceMock)
|
||
.loadVehicle(number: .any)
|
||
.willThrow(StorageError.vehicleNotFound)
|
||
|
||
await viewModel.onAppear()
|
||
|
||
verify(storageServiceMock)
|
||
.loadVehicle(number: .any)
|
||
.called(.once)
|
||
|
||
#expect(viewModel.hud == .error(StorageError.vehicleNotFound))
|
||
}
|
||
|
||
@Test("Show debug info", arguments: [true, false])
|
||
func showDebugInfo(value: Bool) async throws {
|
||
|
||
given(settingsServiceMock)
|
||
.showDebugInfo.willReturn(value)
|
||
|
||
#expect(viewModel.showDebugInfo == value)
|
||
}
|
||
|
||
@Test("Check GB bot report", arguments: [true, false])
|
||
func checkGbBotReport(isPersistent: Bool) async throws {
|
||
|
||
let vehicle = VehicleDto(number: existingVehicleNumber)
|
||
let updatedVehicle = VehicleDto(number: existingVehicleNumber, color: testColor)
|
||
|
||
viewModel = makeViewModel(vehicle: vehicle, isPersistent: isPersistent)
|
||
|
||
given(apiServiceMock)
|
||
.checkVehicleGb(by: .value(existingVehicleNumber))
|
||
.willReturn(updatedVehicle)
|
||
|
||
given(storageServiceMock)
|
||
.updateVehicleIfExists(dto: .value(updatedVehicle))
|
||
.willReturn()
|
||
|
||
given(storageServiceMock)
|
||
.loadVehicle(number: .value(existingVehicleNumber))
|
||
.willReturn(vehicle)
|
||
|
||
await viewModel.onAppear()
|
||
await viewModel.checkGB()
|
||
|
||
verify(apiServiceMock)
|
||
.checkVehicleGb(by: .value(existingVehicleNumber))
|
||
.called(.once)
|
||
|
||
verify(storageServiceMock)
|
||
.updateVehicleIfExists(dto: .value(updatedVehicle))
|
||
.called(.once)
|
||
|
||
verify(storageServiceMock)
|
||
.loadVehicle(number: .value(existingVehicleNumber))
|
||
.called(isPersistent ? .once : .never)
|
||
|
||
#expect(viewModel.vehicle.color == testColor)
|
||
#expect(viewModel.hud == nil)
|
||
}
|
||
|
||
@Test("Check GB error", arguments: [true, false])
|
||
func checkGbError(isPersistent: Bool) async throws {
|
||
|
||
let vehicle = VehicleDto(number: existingVehicleNumber)
|
||
viewModel = makeViewModel(vehicle: vehicle, isPersistent: isPersistent)
|
||
|
||
given(apiServiceMock)
|
||
.checkVehicleGb(by: .value(existingVehicleNumber))
|
||
.willThrow(TestError.generic)
|
||
|
||
given(storageServiceMock)
|
||
.loadVehicle(number: .value(existingVehicleNumber))
|
||
.willReturn(vehicle)
|
||
|
||
await viewModel.onAppear()
|
||
await viewModel.checkGB()
|
||
|
||
verify(apiServiceMock)
|
||
.checkVehicleGb(by: .value(existingVehicleNumber))
|
||
.called(.once)
|
||
|
||
verify(storageServiceMock)
|
||
.loadVehicle(number: .value(existingVehicleNumber))
|
||
.called(isPersistent ? .once : .never)
|
||
|
||
#expect(viewModel.hud == .error(TestError.generic))
|
||
}
|
||
}
|