Summary: - Sources: add LocalData.swift, Models, Protocols (+1 more) - Tests: add tests for LocalDataTests.swift - Docs: add docs for Proposal, README - Config: add Package - Other: add .gitignore Stats: - 19 files changed, 814 insertions(+)
102 lines
3.0 KiB
Swift
102 lines
3.0 KiB
Swift
import Foundation
|
|
import XCTest
|
|
@testable import LocalData
|
|
|
|
private struct TestUserDefaultsKey: StorageKey {
|
|
typealias Value = String
|
|
|
|
let name: String
|
|
let domain: StorageDomain
|
|
let security: SecurityPolicy = .none
|
|
let serializer: Serializer<String> = .json
|
|
let owner: String = "LocalDataTests"
|
|
let availability: PlatformAvailability = .all
|
|
let syncPolicy: SyncPolicy = .never
|
|
|
|
init(name: String, suiteName: String) {
|
|
self.name = name
|
|
self.domain = .userDefaults(suite: suiteName)
|
|
}
|
|
}
|
|
|
|
private struct TestFileKey: StorageKey {
|
|
typealias Value = String
|
|
|
|
let name: String
|
|
let domain: StorageDomain
|
|
let security: SecurityPolicy = .none
|
|
let serializer: Serializer<String> = .json
|
|
let owner: String = "LocalDataTests"
|
|
let availability: PlatformAvailability = .all
|
|
let syncPolicy: SyncPolicy = .never
|
|
|
|
init(name: String, directory: URL) {
|
|
self.name = name
|
|
self.domain = .fileSystem(directory: .custom(directory))
|
|
}
|
|
}
|
|
|
|
final class LocalDataTests: XCTestCase {
|
|
private var suiteName: String = ""
|
|
private var tempDirectory: URL = .temporaryDirectory
|
|
|
|
override func setUp() {
|
|
super.setUp()
|
|
suiteName = "LocalDataTests.\(UUID().uuidString)"
|
|
tempDirectory = FileManager.default.temporaryDirectory
|
|
.appending(path: "LocalDataTests")
|
|
.appending(path: UUID().uuidString)
|
|
}
|
|
|
|
override func tearDown() {
|
|
if let defaults = UserDefaults(suiteName: suiteName) {
|
|
defaults.removePersistentDomain(forName: suiteName)
|
|
}
|
|
|
|
try? FileManager.default.removeItem(at: tempDirectory)
|
|
super.tearDown()
|
|
}
|
|
|
|
func testUserDefaultsRoundTrip() async throws {
|
|
let key = TestUserDefaultsKey(name: "test.string", suiteName: suiteName)
|
|
let storedValue = "1.0.0"
|
|
|
|
try await StorageRouter.shared.set(storedValue, for: key)
|
|
let fetched = try await StorageRouter.shared.get(key)
|
|
|
|
XCTAssertEqual(fetched, storedValue)
|
|
|
|
try await StorageRouter.shared.remove(key)
|
|
|
|
do {
|
|
_ = try await StorageRouter.shared.get(key)
|
|
XCTFail("Expected notFound error after removal")
|
|
} catch StorageError.notFound {
|
|
return
|
|
} catch {
|
|
XCTFail("Unexpected error: \(error)")
|
|
}
|
|
}
|
|
|
|
func testFileSystemRoundTrip() async throws {
|
|
let key = TestFileKey(name: "test.json", directory: tempDirectory)
|
|
let storedValue = "payload"
|
|
|
|
try await StorageRouter.shared.set(storedValue, for: key)
|
|
let fetched = try await StorageRouter.shared.get(key)
|
|
|
|
XCTAssertEqual(fetched, storedValue)
|
|
|
|
try await StorageRouter.shared.remove(key)
|
|
|
|
do {
|
|
_ = try await StorageRouter.shared.get(key)
|
|
XCTFail("Expected notFound error after removal")
|
|
} catch StorageError.notFound {
|
|
return
|
|
} catch {
|
|
XCTFail("Unexpected error: \(error)")
|
|
}
|
|
}
|
|
}
|