diff --git a/AutoCatCore/Services/StorageService/StorageService+Events.swift b/AutoCatCore/Services/StorageService/StorageService+Events.swift index ab9ba4a..6513e35 100644 --- a/AutoCatCore/Services/StorageService/StorageService+Events.swift +++ b/AutoCatCore/Services/StorageService/StorageService+Events.swift @@ -23,4 +23,39 @@ public extension StorageService { return vehicle.dto } + + func remove(event id: String, from number: String) async throws -> VehicleDto { + + guard let vehicle = realm.object(ofType: Vehicle.self, forPrimaryKey: number) else { + throw StorageError.vehicleNotFound + } + + try await realm.asyncWrite { + if let index = vehicle.events.firstIndex(where: { $0.id == id }) { + vehicle.events.remove(at: index) + vehicle.updatedDate = Date().timeIntervalSince1970 + } else { + throw StorageError.eventNotFound + } + } + + return vehicle.dto + } + + func edit(event: VehicleEventDto, for number: String) async throws -> VehicleDto { + + guard let vehicle = realm.object(ofType: Vehicle.self, forPrimaryKey: number) else { + throw StorageError.vehicleNotFound + } + + try await realm.asyncWrite { + if let index = vehicle.events.firstIndex(where: { $0.id == event.id }) { + vehicle.events[index] = VehicleEvent(dto: event) + } else { + throw StorageError.eventNotFound + } + } + + return vehicle.dto + } } diff --git a/AutoCatCore/Services/StorageService/StorageService.swift b/AutoCatCore/Services/StorageService/StorageService.swift index c5d7b67..7d0d508 100644 --- a/AutoCatCore/Services/StorageService/StorageService.swift +++ b/AutoCatCore/Services/StorageService/StorageService.swift @@ -13,11 +13,13 @@ public enum StorageError: LocalizedError { case vehicleNotFound case noteNotFound + case eventNotFound public var errorDescription: String? { switch self { case .vehicleNotFound: "Vehicle not found in realm database" case .noteNotFound: "Vehicle note not found in realm database" + case .eventNotFound: "Event not found in realm database" } } } diff --git a/AutoCatCore/Services/StorageService/StorageServiceProtocol.swift b/AutoCatCore/Services/StorageService/StorageServiceProtocol.swift index 26005c8..0a08ac0 100644 --- a/AutoCatCore/Services/StorageService/StorageServiceProtocol.swift +++ b/AutoCatCore/Services/StorageService/StorageServiceProtocol.swift @@ -17,6 +17,6 @@ public protocol StorageServiceProtocol: Sendable { func updateVehicleIfExists(dto: VehicleDto) async throws func loadVehicle(number: String) async throws -> VehicleDto func add(event: VehicleEventDto, to number: String) async throws -> VehicleDto -// func remove(event id: String) async throws -> VehicleDto -// func edit(event: VehicleEventDto) async throws -> VehicleDto + func remove(event id: String, from number: String) async throws -> VehicleDto + func edit(event: VehicleEventDto, for number: String) async throws -> VehicleDto } diff --git a/AutoCatCoreTests/Storage/StorageServiceTests+Events.swift b/AutoCatCoreTests/Storage/StorageServiceTests+Events.swift new file mode 100644 index 0000000..868c5df --- /dev/null +++ b/AutoCatCoreTests/Storage/StorageServiceTests+Events.swift @@ -0,0 +1,81 @@ +// +// StorageServiceTests+Events.swift +// AutoCatCoreTests +// +// Created by Selim Mustafaev on 13.12.2024. +// Copyright © 2024 Selim Mustafaev. All rights reserved. +// + +import Testing +import AutoCatCore + +extension StorageServiceTests { + + @Test("Add event") + func addEvent() async throws { + + let event = VehicleEventDto(lat: testLat, lon: testLon) + + let vehicle = try await storageService.add(event: event, to: existingVehicleNumber) + + #expect(vehicle.events.count == 1) + #expect(vehicle.events.first?.latitude == testLat) + #expect(vehicle.events.first?.longitude == testLon) + #expect(vehicle.updatedDate != 0) + } + + @Test("Add event to non-existent vehicle") + func addEventToNonExistentVehicle() async throws { + + let event = VehicleEventDto(lat: testLat, lon: testLon) + + await #expect(throws: StorageError.vehicleNotFound) { + _ = try await storageService.add(event: event, to: nonExistingVehicleNumber) + } + } + + @Test("Remove event") + func removeEvent() async throws { + + let event = VehicleEventDto(lat: testLat, lon: testLon) + var vehicle = try await storageService.add(event: event, to: existingVehicleNumber) + let id = try #require(vehicle.events.first { $0.latitude == testLat && $0.longitude == testLon }?.id) + + vehicle = try await storageService.remove(event: id, from: existingVehicleNumber) + + #expect(vehicle.events.isEmpty) + #expect(vehicle.updatedDate != 0) + } + + @Test("Remove event from non-existent vehicle") + func removeEventFromNonExistentVehicle() async throws { + + await #expect(throws: StorageError.vehicleNotFound) { + _ = try await storageService.remove(event: "", from: nonExistingVehicleNumber) + } + } + + @Test("Remove non-existent event") + func removeNonExistentEvent() async throws { + + await #expect(throws: StorageError.eventNotFound) { + _ = try await storageService.remove(event: "", from: existingVehicleNumber) + } + } + + @Test("Edit event") + func editEvent() async throws { + + let event = VehicleEventDto(lat: 0, lon: 0) + var vehicle = try await storageService.add(event: event, to: existingVehicleNumber) + let id = try #require(vehicle.events.first?.id) + + let editedEvent = VehicleEventDto(lat: testLat, lon: testLon) + vehicle = try await storageService.edit(event: editedEvent, for: existingVehicleNumber) + + let resultEcent = try #require(vehicle.events.first { $0.id == id }!) + #expect(resultEcent.latitude == testLat && resultEcent.longitude == testLon) + #expect(vehicle.events.count == 1) + #expect(vehicle.updatedDate != 0) + } +} diff --git a/AutoCatCoreTests/StorageServiceTests.swift b/AutoCatCoreTests/Storage/StorageServiceTests.swift similarity index 95% rename from AutoCatCoreTests/StorageServiceTests.swift rename to AutoCatCoreTests/Storage/StorageServiceTests.swift index 80c1a65..eeb5705 100644 --- a/AutoCatCoreTests/StorageServiceTests.swift +++ b/AutoCatCoreTests/Storage/StorageServiceTests.swift @@ -17,6 +17,8 @@ struct StorageServiceTests { let existingVehicleNumber = "А123АА761" let nonExistingVehicleNumber = "А999АА761" let noteText = "Test note text" + let testLat: Double = 42 + let testLon: Double = 24 let storageService: StorageService @@ -31,9 +33,14 @@ struct StorageServiceTests { } func addTestVehicle(config: Realm.Configuration) throws { + + var vehicle = Vehicle(existingVehicleNumber) + vehicle.addedDate = 0 + vehicle.updatedDate = 0 + let realm = try Realm(configuration: config) try realm.write { - realm.add(Vehicle(existingVehicleNumber)) + realm.add(vehicle) } }