79 lines
1.7 KiB
Swift
79 lines
1.7 KiB
Swift
//
|
|
// 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
|
|
}
|