From dc6281ac46de884d118a4c443abbe738e8aa4bb0 Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Wed, 9 Apr 2025 18:33:29 +0300 Subject: [PATCH] Removing ObservableDefaults, back to old dumb UserDefaults wrapper --- AutoCat.xcodeproj/project.pbxproj | 17 --- .../xcshareddata/swiftpm/Package.resolved | 11 +- AutoCat/SceneDelegate.swift | 2 +- .../EventsScreen/EventsViewModel.swift | 4 +- .../SettingsScreen/SettingsScreen.swift | 14 +- .../SettingsScreen/SettingsViewModel.swift | 30 ++++ AutoCatCore/Models/User.swift | 1 + .../Services/ApiService/ApiService.swift | 20 +-- .../LocationService/LocationService.swift | 6 +- .../SettingsService/SettingsService.swift | 133 +++++++++++++++--- .../SettingsServiceProtocol.swift | 5 +- .../StorageService/StorageService+Notes.swift | 2 +- .../VehicleRecordService.swift | 18 ++- AutoCatCoreTests/SettingsServiceTests.swift | 6 +- .../Storage/StorageServiceTests.swift | 2 +- 15 files changed, 195 insertions(+), 76 deletions(-) diff --git a/AutoCat.xcodeproj/project.pbxproj b/AutoCat.xcodeproj/project.pbxproj index 5b1c024..8c8eeb4 100644 --- a/AutoCat.xcodeproj/project.pbxproj +++ b/AutoCat.xcodeproj/project.pbxproj @@ -116,7 +116,6 @@ 7A7AA2C72DA2A45600276D83 /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7A7AA2C62DA2A45600276D83 /* RealmSwift */; }; 7A7AA2CA2DA2C85100276D83 /* RealmSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7A7AA2C92DA2C85100276D83 /* RealmSwift */; }; 7A7AA2CB2DA2C85100276D83 /* RealmSwift in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 7A7AA2C92DA2C85100276D83 /* RealmSwift */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; - 7A7AA2CE2DA3120500276D83 /* ObservableDefaults in Frameworks */ = {isa = PBXBuildFile; productRef = 7A7AA2CD2DA3120500276D83 /* ObservableDefaults */; }; 7A7DADAC2D99738300F52F6C /* AudioRecordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A7DADAB2D99738300F52F6C /* AudioRecordView.swift */; }; 7A809F392D66755B00CF1B3C /* Error+Canceled.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A809F382D66755B00CF1B3C /* Error+Canceled.swift */; }; 7A8A2209248D10EC0073DFD9 /* ResizeImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8A2208248D10EC0073DFD9 /* ResizeImage.swift */; }; @@ -548,7 +547,6 @@ files = ( 7A7AA2C72DA2A45600276D83 /* RealmSwift in Frameworks */, 7AABB1F2267E9CC800D7AB32 /* SwiftDate in Frameworks */, - 7A7AA2CE2DA3120500276D83 /* ObservableDefaults in Frameworks */, 7AF8606E2CB9B86300954D2F /* Mockable in Frameworks */, 7A6C4D9E2C56BCA600982597 /* SwiftLocation in Frameworks */, ); @@ -1314,7 +1312,6 @@ 7A6C4D9D2C56BCA600982597 /* SwiftLocation */, 7AF8606D2CB9B86300954D2F /* Mockable */, 7A7AA2C62DA2A45600276D83 /* RealmSwift */, - 7A7AA2CD2DA3120500276D83 /* ObservableDefaults */, ); productName = AutoCatCore; productReference = 7AF6D1EF2677C03B0086EA64 /* AutoCatCore.framework */; @@ -1363,7 +1360,6 @@ 7A1CF7FD29A41C2F007962DA /* XCRemoteSwiftPackageReference "realm-swift" */, 7A6C4D9C2C56BCA600982597 /* XCRemoteSwiftPackageReference "SwiftLocation" */, 7ACBB91C2CB9B155005A5168 /* XCRemoteSwiftPackageReference "Mockable" */, - 7A7AA2CC2DA3120500276D83 /* XCRemoteSwiftPackageReference "ObservableDefaults" */, ); productRefGroup = 7A1146FE23FDE7E500B424AF /* Products */; projectDirPath = ""; @@ -2118,14 +2114,6 @@ minimumVersion = 6.0.0; }; }; - 7A7AA2CC2DA3120500276D83 /* XCRemoteSwiftPackageReference "ObservableDefaults" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/fatbobman/ObservableDefaults"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.6.2; - }; - }; 7A813DBF2508C4D900CC93B9 /* XCRemoteSwiftPackageReference "ExceptionCatcher" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/sindresorhus/ExceptionCatcher"; @@ -2176,11 +2164,6 @@ package = 7A1CF7FD29A41C2F007962DA /* XCRemoteSwiftPackageReference "realm-swift" */; productName = RealmSwift; }; - 7A7AA2CD2DA3120500276D83 /* ObservableDefaults */ = { - isa = XCSwiftPackageProductDependency; - package = 7A7AA2CC2DA3120500276D83 /* XCRemoteSwiftPackageReference "ObservableDefaults" */; - productName = ObservableDefaults; - }; 7A813DC02508C4D900CC93B9 /* ExceptionCatcher */ = { isa = XCSwiftPackageProductDependency; package = 7A813DBF2508C4D900CC93B9 /* XCRemoteSwiftPackageReference "ExceptionCatcher" */; diff --git a/AutoCat.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/AutoCat.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index ebeff55..027891f 100644 --- a/AutoCat.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/AutoCat.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "3cc3aec63412867029bf57f8fff11744df284387a47994473d82e7aab44a4293", + "originHash" : "6fccb9fdc0d29647d4f0b927aef60f375302d72b5b724992eab52ac0d8ec71c3", "pins" : [ { "identity" : "exceptioncatcher", @@ -19,15 +19,6 @@ "version" : "0.3.1" } }, - { - "identity" : "observabledefaults", - "kind" : "remoteSourceControl", - "location" : "https://github.com/fatbobman/ObservableDefaults", - "state" : { - "revision" : "4740e2c39043b7daff946aa3bbec22e6a68850d3", - "version" : "0.6.2" - } - }, { "identity" : "pkhud", "kind" : "remoteSourceControl", diff --git a/AutoCat/SceneDelegate.swift b/AutoCat/SceneDelegate.swift index 4276d3b..bf62734 100644 --- a/AutoCat/SceneDelegate.swift +++ b/AutoCat/SceneDelegate.swift @@ -38,7 +38,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { let container = ServiceContainer.shared - let settingsService = SettingsService() + let settingsService = await SettingsService() container.register(SettingsServiceProtocol.self, instance: settingsService) diff --git a/AutoCat/Screens/EventsScreen/EventsViewModel.swift b/AutoCat/Screens/EventsScreen/EventsViewModel.swift index 8f680bc..a0c754f 100644 --- a/AutoCat/Screens/EventsScreen/EventsViewModel.swift +++ b/AutoCat/Screens/EventsScreen/EventsViewModel.swift @@ -60,6 +60,8 @@ class EventsViewModel: ACHudContainer { func updateEvents() { + let email = settingsService.user.email + events = vehicle.events.sorted { $0.date > $1.date }.map { event in let date = Date(timeIntervalSince1970: event.date) @@ -71,7 +73,7 @@ class EventsViewModel: ACHudContainer { date: dateString, coordinate: coordinate, address: event.address ?? "Lat: \(event.latitude), Lon: \(event.longitude)", - isMe: event.addedBy == settingsService.user.email + isMe: event.addedBy == email ) } } diff --git a/AutoCat/Screens/SettingsScreen/SettingsScreen.swift b/AutoCat/Screens/SettingsScreen/SettingsScreen.swift index 44a6f95..37e1c43 100644 --- a/AutoCat/Screens/SettingsScreen/SettingsScreen.swift +++ b/AutoCat/Screens/SettingsScreen/SettingsScreen.swift @@ -39,7 +39,7 @@ struct SettingsScreen: View { } Section { - Picker("Server", selection: $viewModel.settingService.backend) { + Picker("Server", selection: $viewModel.backend) { ForEach(Constants.Backend.allCases, id: \.self) { backend in Text(backend.name) } @@ -49,26 +49,26 @@ struct SettingsScreen: View { Section("Plate number recognition") { ToggleRowView(title: "Alternative order", description: "Recognize plate numbers in alternative form. For example 'ЕВА 123 777' instead of 'Е123ВА 777'", - toggle: $viewModel.settingService.recognizeAlternativeOrder) + toggle: $viewModel.recognizeAlternativeOrder) ToggleRowView(title: "Shortened numbers", description: "If enabled, app will try to recognize shortened plate numbers (without region) and add default region", - toggle: $viewModel.settingService.recognizeShortenedNumbers) - if viewModel.settingService.recognizeShortenedNumbers { + toggle: $viewModel.recognizeShortenedNumbers) + if viewModel.recognizeShortenedNumbers { LabeledContent("Default region") { - TextField("", text: $viewModel.settingService.defaultRegion) + TextField("", text: $viewModel.defaultRegion) .frame(width: 50) .multilineTextAlignment(.trailing) } } ToggleRowView(title: "Beep before record", description: "When enabled, you will hear short sound before starting audio recording. This will only work when audio record is started via Siri", - toggle: $viewModel.settingService.recordBeep) + toggle: $viewModel.recordBeep) } Section("Debug") { ToggleRowView(title: "Show debug info", description: nil, - toggle: $viewModel.settingService.showDebugInfo) + toggle: $viewModel.showDebugInfo) } } .navigationTitle("Settings") diff --git a/AutoCat/Screens/SettingsScreen/SettingsViewModel.swift b/AutoCat/Screens/SettingsScreen/SettingsViewModel.swift index 86984c8..cace17b 100644 --- a/AutoCat/Screens/SettingsScreen/SettingsViewModel.swift +++ b/AutoCat/Screens/SettingsScreen/SettingsViewModel.swift @@ -42,6 +42,36 @@ class SettingsViewModel { return jwt.payload.email } + var recognizeAlternativeOrder: Bool { + get { settingService.recognizeAlternativeOrder } + set { settingService.recognizeAlternativeOrder = newValue } + } + + var recognizeShortenedNumbers: Bool { + get { settingService.recognizeShortenedNumbers } + set { settingService.recognizeShortenedNumbers = newValue } + } + + var backend: Constants.Backend { + get { settingService.backend } + set { settingService.backend = newValue } + } + + var recordBeep: Bool { + get { settingService.recordBeep } + set { settingService.recordBeep = newValue } + } + + var showDebugInfo: Bool { + get { settingService.showDebugInfo } + set { settingService.showDebugInfo = newValue } + } + + var defaultRegion: String { + get { settingService.defaultRegion } + set { settingService.defaultRegion = newValue } + } + init(settingsService: SettingsServiceProtocol) { self.settingService = settingsService diff --git a/AutoCatCore/Models/User.swift b/AutoCatCore/Models/User.swift index 3901307..f5f3cc0 100644 --- a/AutoCatCore/Models/User.swift +++ b/AutoCatCore/Models/User.swift @@ -1,5 +1,6 @@ import Foundation +@MainActor public struct User: Codable, Sendable { public let email: String public var token: String diff --git a/AutoCatCore/Services/ApiService/ApiService.swift b/AutoCatCore/Services/ApiService/ApiService.swift index 2e2c076..0dec687 100644 --- a/AutoCatCore/Services/ApiService/ApiService.swift +++ b/AutoCatCore/Services/ApiService/ApiService.swift @@ -20,7 +20,7 @@ public actor ApiService: ApiServiceProtocol { private func createRequest(api: String, method: String, body: B? = nil, params: [String:P]? = nil) async -> URLRequest? where B: Encodable, P: LosslessStringConvertible { - let baseUrl = settingsService.backend.baseUrl + let baseUrl = await settingsService.backend.baseUrl guard var urlComponents = URLComponents(string: baseUrl + api) else { return nil } @@ -32,7 +32,7 @@ public actor ApiService: ApiServiceProtocol { request.httpMethod = method request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") - request.addValue("Bearer " + settingsService.user.token, forHTTPHeaderField: "Authorization") + request.addValue("Bearer " + (await settingsService.user.token), forHTTPHeaderField: "Authorization") if let body = body, method.uppercased() != "GET" { let encoder = JSONEncoder() @@ -109,8 +109,8 @@ public actor ApiService: ApiServiceProtocol { // MARK: - Firebase API public func refreshFbToken() async throws { - guard let token = settingsService.user.firebaseIdToken, - let refreshToken = settingsService.user.firebaseRefreshToken, + guard let token = await settingsService.user.firebaseIdToken, + let refreshToken = await settingsService.user.firebaseRefreshToken, let jwt = JWT(string: token), jwt.expired else { return } @@ -138,11 +138,11 @@ public actor ApiService: ApiServiceProtocol { let model = try JSONDecoder().decode(FbRefreshTokenModel.self, from: data) if let idToken = model.id_token { - await settingsService.user.firebaseIdToken = idToken + await settingsService.setFirebaseIdToken(idToken) } if let refreshToken = model.refresh_token { - await settingsService.user.firebaseRefreshToken = refreshToken + await settingsService.setFirebaseRefreshToken(refreshToken) } } @@ -181,11 +181,11 @@ public actor ApiService: ApiServiceProtocol { let model = try JSONDecoder().decode(FbVerifyTokenModel.self, from: data) if let idToken = model.idToken { - await settingsService.user.firebaseIdToken = idToken + await settingsService.setFirebaseIdToken(idToken) } if let refreshToken = model.refreshToken { - await settingsService.user.firebaseRefreshToken = refreshToken + await settingsService.setFirebaseRefreshToken(refreshToken) } } catch { @@ -237,7 +237,7 @@ public actor ApiService: ApiServiceProtocol { "forceUpdate": AnyEncodable(force) ] - if let token = settingsService.user.firebaseIdToken { + if let token = await settingsService.user.firebaseIdToken { body["googleIdToken"] = AnyEncodable(token) } @@ -324,7 +324,7 @@ public actor ApiService: ApiServiceProtocol { var body = ["number": number] - if let token = settingsService.user.firebaseIdToken { + if let token = await settingsService.user.firebaseIdToken { body["token"] = token } diff --git a/AutoCatCore/Services/LocationService/LocationService.swift b/AutoCatCore/Services/LocationService/LocationService.swift index fdba2c5..ce4a9ee 100644 --- a/AutoCatCore/Services/LocationService/LocationService.swift +++ b/AutoCatCore/Services/LocationService/LocationService.swift @@ -52,7 +52,11 @@ public final class LocationService { throw LocationError.generic } - return VehicleEventDto(lat: coordinate.latitude, lon: coordinate.longitude, addedBy: settingsService.user.email) + return VehicleEventDto( + lat: coordinate.latitude, + lon: coordinate.longitude, + addedBy: await settingsService.user.email + ) } func setLastEvent(_ event: VehicleEventDto) { diff --git a/AutoCatCore/Services/SettingsService/SettingsService.swift b/AutoCatCore/Services/SettingsService/SettingsService.swift index d385ed7..a27cd7c 100644 --- a/AutoCatCore/Services/SettingsService/SettingsService.swift +++ b/AutoCatCore/Services/SettingsService/SettingsService.swift @@ -7,18 +7,37 @@ // import Foundation -import ObservableDefaults -@ObservableDefaults +enum SettingsKey: String { + + case user + case recognizeAlternativeOrder + case recognizeShortenedNumbers + case defaultRegion + case recordBeep + case showDebugInfo + case backendString +} + +@MainActor public final class SettingsService: SettingsServiceProtocol { - @Ignore let jsonEncoder = JSONEncoder() - @Ignore let jsonDecoder = JSONDecoder() + let jsonEncoder = JSONEncoder() + let jsonDecoder = JSONDecoder() + + let suiteName: String? + + var defaults: UserDefaults { + if let suiteName { + return UserDefaults(suiteName: suiteName) ?? .standard + } else { + return .standard + } + } - @ObservableOnly public var user: User { get { - if userData.count > 0 { + if let userData, userData.count > 0 { let result = try? jsonDecoder.decode(User.self, from: userData) return result ?? User() } else { @@ -33,20 +52,102 @@ public final class SettingsService: SettingsServiceProtocol { } } - @DefaultsKey(userDefaultsKey: "user") - public var userData: Data = .init() - - public var recognizeAlternativeOrder: Bool = false - public var recognizeShortenedNumbers: Bool = false - public var defaultRegion: String = "161" - public var recordBeep: Bool = false - public var showDebugInfo: Bool = false + public var userData: Data? { + didSet { + set(value: userData, for: .user) + } + } + + public var recognizeAlternativeOrder: Bool = false { + didSet { + set(value: recognizeAlternativeOrder, for: .recognizeAlternativeOrder) + } + } + + public var recognizeShortenedNumbers: Bool = false { + didSet { + set(value: recognizeShortenedNumbers, for: .recognizeShortenedNumbers) + } + } + + public var defaultRegion: String = "161" { + didSet { + set(value: defaultRegion, for: .defaultRegion) + } + } + + public var recordBeep: Bool = false { + didSet { + set(value: recordBeep, for: .recordBeep) + } + } + + public var showDebugInfo: Bool = false { + didSet { + set(value: showDebugInfo, for: .showDebugInfo) + } + } - @ObservableOnly public var backend: Constants.Backend { get { Constants.Backend(rawValue: backendString) ?? .de } set { backendString = newValue.rawValue } } - public var backendString: String = Constants.Backend.de.rawValue + public var backendString: String = Constants.Backend.de.rawValue { + didSet { + set(value: backendString, for: .backendString) + } + } + + public init(suiteName: String? = nil) async { + + self.suiteName = suiteName + + register(defaultValues: [ + .recognizeAlternativeOrder: false, + .recognizeShortenedNumbers: false, + .defaultRegion: "761", + .recordBeep: false, + .showDebugInfo: false, + .backendString: Constants.Backend.de.rawValue + ]) + + userData = data(for: .user) + recognizeAlternativeOrder = bool(for: .recognizeAlternativeOrder) + recognizeShortenedNumbers = bool(for: .recognizeShortenedNumbers) + defaultRegion = string(for: .defaultRegion) + recordBeep = bool(for: .recordBeep) + showDebugInfo = bool(for: .showDebugInfo) + backendString = string(for: .backendString) + } + + func register(defaultValues: [SettingsKey: Any]) { + defaults.register(defaults: defaultValues.reduce(into: [:], { (partialResult: inout [String: Any], tuple) in + partialResult[tuple.key.rawValue] = tuple.value + })) + } + + func set(value: T, for key: SettingsKey) { + defaults.setValue(value, forKey: key.rawValue) + } + + func bool(for key: SettingsKey) -> Bool { + defaults.bool(forKey: key.rawValue) + } + + func string(for key: SettingsKey, defaultValue: String = "") -> String { + defaults.string(forKey: key.rawValue) ?? defaultValue + } + + func data(for key: SettingsKey) -> Data? { + defaults.data(forKey: key.rawValue) + } + + public func setFirebaseIdToken(_ idToken: String?) { + user.firebaseIdToken = idToken + } + + public func setFirebaseRefreshToken(_ refreshToken: String?) { + user.firebaseRefreshToken = refreshToken + } } diff --git a/AutoCatCore/Services/SettingsService/SettingsServiceProtocol.swift b/AutoCatCore/Services/SettingsService/SettingsServiceProtocol.swift index af2d3de..fe6152a 100644 --- a/AutoCatCore/Services/SettingsService/SettingsServiceProtocol.swift +++ b/AutoCatCore/Services/SettingsService/SettingsServiceProtocol.swift @@ -8,15 +8,18 @@ import Mockable +@MainActor @Mockable public protocol SettingsServiceProtocol: Sendable { var user: User { get set } - var recognizeAlternativeOrder: Bool { get set } var recognizeShortenedNumbers: Bool { get set } var defaultRegion: String { get set } var recordBeep: Bool { get set } var showDebugInfo: Bool { get set } var backend: Constants.Backend { get set } + + func setFirebaseIdToken(_ idToken: String?) + func setFirebaseRefreshToken(_ refreshToken: String?) } diff --git a/AutoCatCore/Services/StorageService/StorageService+Notes.swift b/AutoCatCore/Services/StorageService/StorageService+Notes.swift index 4344beb..f956be1 100644 --- a/AutoCatCore/Services/StorageService/StorageService+Notes.swift +++ b/AutoCatCore/Services/StorageService/StorageService+Notes.swift @@ -16,7 +16,7 @@ extension StorageService { throw StorageError.vehicleNotFound } - let note = VehicleNote(text: text, user: settingsService.user.email) + let note = VehicleNote(text: text, user: await settingsService.user.email) try await realm.asyncWrite { vehicle.notes.append(note) diff --git a/AutoCatCore/Services/VehicleRecordService/VehicleRecordService.swift b/AutoCatCore/Services/VehicleRecordService/VehicleRecordService.swift index 578098e..d7028b3 100644 --- a/AutoCatCore/Services/VehicleRecordService/VehicleRecordService.swift +++ b/AutoCatCore/Services/VehicleRecordService/VehicleRecordService.swift @@ -33,7 +33,7 @@ public actor VehicleRecordService { self.settingsService = settingsService } - func getPlateNumber(from recognizedText: String?) -> String? { + func getPlateNumber(from recognizedText: String?) async -> String? { guard let recognizedText else { return nil } @@ -45,17 +45,21 @@ public actor VehicleRecordService { .replacingOccurrences(of: "НОЛЬ", with: "0") .replacingOccurrences(of: "Э", with: "") + let recognizeAlternativeOrder = await settingsService.recognizeAlternativeOrder + let recognizeShortenedNumbers = await settingsService.recognizeShortenedNumbers + let defaultRegion = await settingsService.defaultRegion + var result = "" if let range = trimmed.range(of: #"\S\d\d\d\S\S\d\d\d?"#, options: .regularExpression) { result = String(trimmed[range]) - } else if let range = trimmed.range(of: #"\S\S\S\d\d\d\d\d\d?"#, options: .regularExpression), settingsService.recognizeAlternativeOrder { + } else if let range = trimmed.range(of: #"\S\S\S\d\d\d\d\d\d?"#, options: .regularExpression), recognizeAlternativeOrder { let n = String(trimmed[range]) result = String(n.prefix(1)) + n.substring(with: 3..<6) + n.substring(with: 1..<3) + n.substring(from: 6) - } else if let range = trimmed.range(of: #"\S\d\d\d\S\S"#, options: .regularExpression), settingsService.recognizeShortenedNumbers { - result = String(trimmed[range]) + settingsService.defaultRegion - } else if let range = trimmed.range(of: #"\S\S\S\d\d\d"#, options: .regularExpression), settingsService.recognizeAlternativeOrder && settingsService.recognizeShortenedNumbers { + } else if let range = trimmed.range(of: #"\S\d\d\d\S\S"#, options: .regularExpression), recognizeShortenedNumbers { + result = String(trimmed[range]) + defaultRegion + } else if let range = trimmed.range(of: #"\S\S\S\d\d\d"#, options: .regularExpression), recognizeAlternativeOrder && recognizeShortenedNumbers { let n = String(trimmed[range]) - result = String(n.prefix(1)) + n.substring(with: 3..<6) + n.substring(with: 1..<3) + settingsService.defaultRegion + result = String(n.prefix(1)) + n.substring(with: 3..<6) + n.substring(with: 1..<3) + defaultRegion } if !result.isEmpty && valid(number: result) { @@ -123,7 +127,7 @@ extension VehicleRecordService: VehicleRecordServiceProtocol { let record = AudioRecordDto( path: url.lastPathComponent, - number: getPlateNumber(from: text), + number: await getPlateNumber(from: text), raw: text ?? "", duration: duration ?? 0, event: location diff --git a/AutoCatCoreTests/SettingsServiceTests.swift b/AutoCatCoreTests/SettingsServiceTests.swift index 1464f3b..b67852b 100644 --- a/AutoCatCoreTests/SettingsServiceTests.swift +++ b/AutoCatCoreTests/SettingsServiceTests.swift @@ -30,11 +30,11 @@ struct SettingsServiceTests { let defaults: UserDefaults var settingsService: SettingsService - init() { + init() async { self.testUser = User(email: testEmail, token: testToken) self.defaults = UserDefaults(suiteName: dbName)! self.defaults.removePersistentDomain(forName: dbName) - self.settingsService = SettingsService(userDefaults: self.defaults) + self.settingsService = await SettingsService(suiteName: dbName) } @Test("Creating default user") @@ -50,7 +50,7 @@ struct SettingsServiceTests { let data = try #require(testUser.data) defaults.setPersistentDomain(["user": data], forName: dbName) - let service = SettingsService(userDefaults: defaults) + let service = await SettingsService(suiteName: dbName) #expect(service.user.email == testEmail) #expect(service.user.token == testToken) diff --git a/AutoCatCoreTests/Storage/StorageServiceTests.swift b/AutoCatCoreTests/Storage/StorageServiceTests.swift index fa0381e..f50c10c 100644 --- a/AutoCatCoreTests/Storage/StorageServiceTests.swift +++ b/AutoCatCoreTests/Storage/StorageServiceTests.swift @@ -34,7 +34,7 @@ struct StorageServiceTests { try addTestVehicle(config: realmConfig) - given(settingsServiceMock) + await given(settingsServiceMock) .user.willReturn(User()) }