// // KeychainStorageMock.swift // KeychainStorageTests // // Created by Javier Cicchelli on 11/12/2022. // Copyright © 2022 Röck+Cöde. All rights reserved. // import Foundation import KeychainStorage class KeychainStorageMock { // MARK: Properties private var storage: [String: Data] private let concurrentQueue = DispatchQueue( label: "com.rockncode.app.assignment.my-files.library.keychain-storage.test.queue.keychain-storage", attributes: .concurrent ) // MARK: Initialisers init(storage: [String: Data] = [:]) { self.storage = storage } } // MARK: - Keychainable extension KeychainStorageMock: Keychainable { func getData( _ key: String, ignoringAttributeSynchronizable: Bool ) throws -> Data? { var data: Data? try concurrentQueue.sync { guard let dataValue = storage[key] else { throw KeychainStorageMockError.keyIsNotDefined } data = dataValue } return data } func set( _ value: Data, key: String, ignoringAttributeSynchronizable: Bool ) throws { concurrentQueue.async(flags: .barrier) { self.storage[key] = value } } func remove( _ key: String, ignoringAttributeSynchronizable: Bool ) throws { guard storage.keys.contains(key) else { throw KeychainStorageMockError.keyIsNotDefined } concurrentQueue.async(flags: .barrier) { self.storage.removeValue(forKey: key) } } } // MARK: - KeychainStorageSpyError enum KeychainStorageMockError: Error { case keyIsNotDefined }