// // DocuframeTests.swift // GasTankARTests // // Created by Dennis Nemec on 28.08.26. // import Testing import Foundation import SwiftData @testable import GasTankAR // MARK: - Test-Doubles /// Konfigurierbarer Mock des ``DocuframeService`` (Actor → threadsicher & Sendable), /// der Aufrufe zählt und wahlweise einen Fehler wirft. private actor MockDocuframeService: DocuframeService { enum Behavior: Sendable { case success case failure(DocuframeError) } let behavior: Behavior private(set) var uploadCallCount = 0 private(set) var sendEmailCallCount = 0 private(set) var lastPhotoCount = 0 private(set) var lastLeadID: String? init(behavior: Behavior = .success) { self.behavior = behavior } func uploadPhotos(_ photos: [DocuframePhoto], projectLeadID: String) async throws { uploadCallCount += 1 record(photos: photos, leadID: projectLeadID) try applyBehavior() } func sendEmail(_ photos: [DocuframePhoto], projectLeadID: String) async throws { sendEmailCallCount += 1 record(photos: photos, leadID: projectLeadID) try applyBehavior() } private func record(photos: [DocuframePhoto], leadID: String) { lastPhotoCount = photos.count lastLeadID = leadID } private func applyBehavior() throws { if case .failure(let error) = behavior { throw error } } } /// Hält Container und Fotos für die Dauer eines Tests am Leben. @MainActor private struct TestEnvironment { let container: ModelContainer let photos: [ProjectPhoto] } @MainActor private func makeEnvironment(photoCount: Int) throws -> TestEnvironment { let container = try ModelContainer( for: Project.self, configurations: ModelConfiguration(isStoredInMemoryOnly: true) ) let context = container.mainContext let project = Project(leadID: "LEAD-1", customerName: "Test", creationDate: Date(timeIntervalSince1970: 0)) context.insert(project) var photos: [ProjectPhoto] = [] for index in 0..