Skip to content
Snippets Groups Projects
Commit 1a6e4ad5 authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Add Stored.userDefaults implementation

parent be76a5ce
No related branches found
No related tags found
2 merge requests!138Notifications,!102Release 1.0.0
import Foundation
import XCTestDynamicOverlay import XCTestDynamicOverlay
public struct Stored<Value> { public struct Stored<Value> {
...@@ -31,6 +32,26 @@ private final class Memory<Value> { ...@@ -31,6 +32,26 @@ private final class Memory<Value> {
var value: Value var value: Value
} }
extension Stored {
public static func userDefaults<T>(
key: String,
userDefaults: UserDefaults = .standard
) -> Stored<T?> where T: Codable {
let encoder = JSONEncoder()
let decoder = JSONDecoder()
return Stored<T?>(
get: {
guard let data = userDefaults.data(forKey: key) else { return nil }
return try? decoder.decode(T.self, from: data)
},
set: { newValue in
let data = try? encoder.encode(newValue)
userDefaults.set(data, forKey: key)
}
)
}
}
extension Stored { extension Stored {
public struct MissingValueError: Error, Equatable { public struct MissingValueError: Error, Equatable {
public init(typeDescription: String) { public init(typeDescription: String) {
......
import CustomDump
import XCTest import XCTest
@testable import XXMessengerClient @testable import XXMessengerClient
final class StoredTests: XCTestCase { final class StoredTests: XCTestCase {
func testInMemory() throws { func testInMemory() {
let stored: Stored<String?> = .inMemory() let stored: Stored<String?> = .inMemory()
XCTAssertNil(stored()) XCTAssertNil(stored())
...@@ -15,4 +16,35 @@ final class StoredTests: XCTestCase { ...@@ -15,4 +16,35 @@ final class StoredTests: XCTestCase {
XCTAssertNil(stored()) XCTAssertNil(stored())
} }
func testUserDefaults() {
struct Value: Equatable, Codable {
var id = UUID()
}
let key = "key"
let userDefaults = UserDefaults(suiteName: "XXMessengerClient_StoredTests")!
userDefaults.removeObject(forKey: key)
let stored: Stored<Value?> = .userDefaults(
key: key,
userDefaults: userDefaults
)
XCTAssertNoDifference(stored.get(), nil)
let value = Value()
stored.set(value)
XCTAssertNoDifference(
userDefaults.data(forKey: key).map { data in
try? JSONDecoder().decode(Value.self, from: data)
},
value
)
XCTAssertNoDifference(stored.get(), value)
userDefaults.set(nil, forKey: key)
XCTAssertNoDifference(stored.get(), nil)
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment