From f3a09e35003d05cf381fed5102d8bdfca528c7d4 Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Sun, 9 Feb 2025 18:38:35 +0300 Subject: [PATCH] Fix tabbar --- AutoCat/Controllers/MainTabController.swift | 14 ++++- .../HistoryScreen/HistoryCoordinator.swift | 5 +- .../Screens/HistoryScreen/HistoryScreen.swift | 3 + .../HistoryScreen/HistoryViewModel.swift | 16 +++-- .../VehicleServiceProtocol.swift | 3 + AutoCatTests/HistoryTests.swift | 58 +++++++++++++++++++ 6 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 AutoCatTests/HistoryTests.swift diff --git a/AutoCat/Controllers/MainTabController.swift b/AutoCat/Controllers/MainTabController.swift index cad977e..3ddee42 100644 --- a/AutoCat/Controllers/MainTabController.swift +++ b/AutoCat/Controllers/MainTabController.swift @@ -24,20 +24,28 @@ class MainTabController: UITabBarController, UITabBarControllerDelegate { traitOverrides.horizontalSizeClass = .compact } - setupHistoryTab() + addHistoryTab() + addDummyTab() Task { await addSettings() } } - func setupHistoryTab() { + func addHistoryTab() { let coordinator = HistoryCoordinator() let (controller, viewModel) = coordinator.start() controller.tabBarItem = UITabBarItem(title: NSLocalizedString("History", comment: ""), image: UIImage(systemName: "clock.arrow.circlepath"), tag: 0) - viewControllers?[0] = controller + viewControllers?.insert(controller, at: 0) historyViewModel = viewModel } + func addDummyTab() { + + let controller = DummyNewController() + controller.tabBarItem = UITabBarItem(title: "", image: UIImage(systemName: "plus"), tag: 0) + viewControllers?.insert(controller, at: 2) + } + func addSettings() async { let coordinator = SettingsCoordinator(tabController: self) diff --git a/AutoCat/Screens/HistoryScreen/HistoryCoordinator.swift b/AutoCat/Screens/HistoryScreen/HistoryCoordinator.swift index 6b001e4..12db1dd 100644 --- a/AutoCat/Screens/HistoryScreen/HistoryCoordinator.swift +++ b/AutoCat/Screens/HistoryScreen/HistoryCoordinator.swift @@ -21,10 +21,11 @@ final class HistoryCoordinator { let viewModel = HistoryViewModel( apiService: resolver.resolve(ApiServiceProtocol.self), storageService: resolver.resolve(StorageServiceProtocol.self), - vehicleService: resolver.resolve(VehicleServiceProtocol.self), - coordinator: self + vehicleService: resolver.resolve(VehicleServiceProtocol.self) ) + viewModel.coordinator = self + let view = HistoryScreen(viewModel: viewModel) let controller = UIHostingController(rootView: view) diff --git a/AutoCat/Screens/HistoryScreen/HistoryScreen.swift b/AutoCat/Screens/HistoryScreen/HistoryScreen.swift index 65af8f3..8e6fdb1 100644 --- a/AutoCat/Screens/HistoryScreen/HistoryScreen.swift +++ b/AutoCat/Screens/HistoryScreen/HistoryScreen.swift @@ -34,6 +34,9 @@ struct HistoryScreen: View { } } } + .onAppear { + Task { await viewModel.onAppear() } + } .hud($viewModel.hud) .listStyle(.plain) .navigationTitle(String.localizedStringWithFormat(NSLocalizedString("vehicles found", comment: ""), diff --git a/AutoCat/Screens/HistoryScreen/HistoryViewModel.swift b/AutoCat/Screens/HistoryScreen/HistoryViewModel.swift index 04a1690..b6f7de3 100644 --- a/AutoCat/Screens/HistoryScreen/HistoryViewModel.swift +++ b/AutoCat/Screens/HistoryScreen/HistoryViewModel.swift @@ -16,7 +16,7 @@ final class HistoryViewModel: ACHudContainer { let apiService: ApiServiceProtocol let storageService: StorageServiceProtocol let vehicleService: VehicleServiceProtocol - let coordinator: HistoryCoordinator? + var coordinator: HistoryCoordinator? var hud: ACHud? @@ -46,16 +46,20 @@ final class HistoryViewModel: ACHudContainer { init(apiService: ApiServiceProtocol, storageService: StorageServiceProtocol, - vehicleService: VehicleServiceProtocol, - coordinator: HistoryCoordinator) { + vehicleService: VehicleServiceProtocol) { self.apiService = apiService self.storageService = storageService self.vehicleService = vehicleService - self.coordinator = coordinator + } + + func onAppear() async { - Task { await loadVehicles() } - Task { dbFileURL = await storageService.dbFileURL } + async let loadTask: () = loadVehicles() + async let dbUrlTask = storageService.dbFileURL + + await loadTask + dbFileURL = await dbUrlTask } func loadVehicles() async { diff --git a/AutoCatCore/Services/VehicleService/VehicleServiceProtocol.swift b/AutoCatCore/Services/VehicleService/VehicleServiceProtocol.swift index a48ea50..ef14d65 100644 --- a/AutoCatCore/Services/VehicleService/VehicleServiceProtocol.swift +++ b/AutoCatCore/Services/VehicleService/VehicleServiceProtocol.swift @@ -6,6 +6,9 @@ // Copyright © 2025 Selim Mustafaev. All rights reserved. // +import Mockable + +@Mockable public protocol VehicleServiceProtocol: Sendable { func check(number: String) async throws -> VehicleWithErrors diff --git a/AutoCatTests/HistoryTests.swift b/AutoCatTests/HistoryTests.swift new file mode 100644 index 0000000..fdf00ce --- /dev/null +++ b/AutoCatTests/HistoryTests.swift @@ -0,0 +1,58 @@ +// +// HistoryTests.swift +// AutoCatTests +// +// Created by Selim Mustafaev on 09.02.2025. +// Copyright © 2025 Selim Mustafaev. All rights reserved. +// + +import Testing +import Mockable +import AutoCatCore +@testable import AutoCat +import Foundation + +@MainActor +struct HistoryTests { + + var storageServiceMock: MockStorageServiceProtocol + var apiServiceMock: MockApiServiceProtocol + var vehicleServiceMock: MockVehicleServiceProtocol + + var viewModel: HistoryViewModel + + init() async { + + storageServiceMock = MockStorageServiceProtocol() + apiServiceMock = MockApiServiceProtocol() + vehicleServiceMock = MockVehicleServiceProtocol() + + viewModel = HistoryViewModel( + apiService: apiServiceMock, + storageService: storageServiceMock, + vehicleService: vehicleServiceMock + ) + } + + @Test func test() async throws { + + let dbURL = URL(fileURLWithPath: "testDbUrl") + + given(storageServiceMock) + .loadVehicles() + .willReturn([.normal]) + + given(storageServiceMock) + .dbFileURL + .willReturn(dbURL) + + await viewModel.onAppear() + + #expect(viewModel.vehicles == [.normal]) + #expect(viewModel.vehiclesFiltered == [.normal]) + #expect(viewModel.vehicleSections.count == 1) + #expect(viewModel.dbFileURL == dbURL) + } + + +}