import Foundation @testable import NASBackup final class MockNASService: NASTransferProtocol { var shouldFail: Bool = false var uploadDelay: TimeInterval = 0 var fakeItems: [NASItem] = [] var fileExistsAnswer: Bool = false private(set) var connectCalled = false private(set) var uploadCallCount = 0 private(set) var lastUploadedPath: String? var isConnected: Bool = false func connect(to host: String, port: Int, username: String, password: String) async throws { connectCalled = true if shouldFail { throw MockError.connectionFailed } isConnected = true } func disconnect() { isConnected = false } func listDirectory(at path: String) async throws -> [NASItem] { if shouldFail { throw MockError.connectionFailed } return fakeItems } func createDirectory(at path: String) async throws { if shouldFail { throw MockError.connectionFailed } } func fileExists(at remotePath: String) async throws -> Bool { fileExistsAnswer } func upload(localURL: URL, remotePath: String, progress: @escaping (Int64, Int64) -> Void) async throws { if uploadDelay > 0 { try await Task.sleep(nanoseconds: UInt64(uploadDelay * 1_000_000_000)) } if shouldFail { throw MockError.uploadFailed } progress(100, 100) uploadCallCount += 1 lastUploadedPath = remotePath } } enum MockError: Error { case connectionFailed case uploadFailed }