diff --git a/Examples/xx-messenger/Sources/BackupFeature/BackupFeature.swift b/Examples/xx-messenger/Sources/BackupFeature/BackupFeature.swift index e1ce8fb201188ac101249d070dc96a75e4ca481a..f672b312a1867790a10ffb54f84cd683084a1b22 100644 --- a/Examples/xx-messenger/Sources/BackupFeature/BackupFeature.swift +++ b/Examples/xx-messenger/Sources/BackupFeature/BackupFeature.swift @@ -103,6 +103,7 @@ public let backupReducer = Reducer<BackupState, BackupAction, BackupEnvironment> case .task: state.isRunning = env.messenger.isBackupRunning() return Effect.run { subscriber in + subscriber.send(.backupUpdated(env.backupStorage.stored())) let cancellable = env.backupStorage.observe { backup in subscriber.send(.backupUpdated(backup)) } diff --git a/Examples/xx-messenger/Tests/BackupFeatureTests/BackupFeatureTests.swift b/Examples/xx-messenger/Tests/BackupFeatureTests/BackupFeatureTests.swift index ebb1510bc0c4f8a602db808931fe2c66ee5d3589..21afbd5409a40c956cce46cc40726996f741cb70 100644 --- a/Examples/xx-messenger/Tests/BackupFeatureTests/BackupFeatureTests.swift +++ b/Examples/xx-messenger/Tests/BackupFeatureTests/BackupFeatureTests.swift @@ -9,6 +9,10 @@ final class BackupFeatureTests: XCTestCase { func testTask() { var isBackupRunning: [Bool] = [false] var observers: [UUID: BackupStorage.Observer] = [:] + let storedBackup = BackupStorage.Backup( + date: .init(timeIntervalSince1970: 1), + data: "stored".data(using: .utf8)! + ) let store = TestStore( initialState: BackupState(), @@ -20,6 +24,9 @@ final class BackupFeatureTests: XCTestCase { store.environment.messenger.isBackupRunning.run = { isBackupRunning.removeFirst() } + store.environment.backupStorage.stored = { + storedBackup + } store.environment.backupStorage.observe = { let id = UUID() observers[id] = $0 @@ -30,14 +37,18 @@ final class BackupFeatureTests: XCTestCase { XCTAssertNoDifference(observers.count, 1) - let backup = BackupStorage.Backup( - date: .init(timeIntervalSince1970: 1), - data: "backup".data(using: .utf8)! + store.receive(.backupUpdated(storedBackup)) { + $0.backup = storedBackup + } + + let observedBackup = BackupStorage.Backup( + date: .init(timeIntervalSince1970: 2), + data: "observed".data(using: .utf8)! ) - observers.values.forEach { $0(backup) } + observers.values.forEach { $0(observedBackup) } - store.receive(.backupUpdated(backup)) { - $0.backup = backup + store.receive(.backupUpdated(observedBackup)) { + $0.backup = observedBackup } observers.values.forEach { $0(nil) } diff --git a/Sources/XXMessengerClient/Utils/BackupStorage.swift b/Sources/XXMessengerClient/Utils/BackupStorage.swift index e85e2e869b6610440b9531f70fd1a7d3fd42bd45..2f9112be7718f31fe4528e8a9bbe4c75c5d7db7a 100644 --- a/Sources/XXMessengerClient/Utils/BackupStorage.swift +++ b/Sources/XXMessengerClient/Utils/BackupStorage.swift @@ -18,6 +18,7 @@ public struct BackupStorage { public typealias Observer = (Backup?) -> Void + public var stored: () -> Backup? public var store: (Data) throws -> Void public var observe: (@escaping Observer) -> Cancellable public var remove: () throws -> Void @@ -43,6 +44,9 @@ extension BackupStorage { backup = Backup(date: fileDate, data: fileData) } return BackupStorage( + stored: { + backup + }, store: { data in let newBackup = Backup( date: now(), @@ -55,7 +59,6 @@ extension BackupStorage { observe: { observer in let id = UUID() observers[id] = observer - defer { observers[id]?(backup) } return Cancellable { observers[id] = nil } @@ -71,6 +74,7 @@ extension BackupStorage { extension BackupStorage { public static let unimplemented = BackupStorage( + stored: XCTUnimplemented("\(Self.self).stored"), store: XCTUnimplemented("\(Self.self).store"), observe: XCTUnimplemented("\(Self.self).observe", placeholder: Cancellable {}), remove: XCTUnimplemented("\(Self.self).remove") diff --git a/Tests/XXMessengerClientTests/Utils/BackupStorageTests.swift b/Tests/XXMessengerClientTests/Utils/BackupStorageTests.swift index d373ce6e3a88f1644e94ea735a5805dd039631e7..10da4a7c0eb62ae7647b3a52b506f6fcdf8fc57c 100644 --- a/Tests/XXMessengerClientTests/Utils/BackupStorageTests.swift +++ b/Tests/XXMessengerClientTests/Utils/BackupStorageTests.swift @@ -32,6 +32,10 @@ final class BackupStorageTests: XCTestCase { path: path ) + XCTAssertNoDifference( + storage.stored(), + BackupStorage.Backup(date: fileDate, data: fileData) + ) XCTAssertNoDifference(actions, [ .didLoadFile(path), .didGetModifiedTime(path), @@ -42,43 +46,46 @@ final class BackupStorageTests: XCTestCase { actions.append(.didObserve("A", backup)) } - XCTAssertNoDifference(actions, [ - .didObserve("A", .init(date: fileDate, data: fileData)) - ]) + XCTAssertNoDifference(actions, []) + XCTAssertNoDifference( + storage.stored(), + BackupStorage.Backup(date: fileDate, data: fileData) + ) actions = [] now = .init(1) let data1 = "data-1".data(using: .utf8)! try storage.store(data1) + XCTAssertNoDifference( + storage.stored(), + BackupStorage.Backup(date: .init(1), data: data1) + ) XCTAssertNoDifference(actions, [ .didObserve("A", .init(date: .init(1), data: data1)), .didSaveFile(path, data1), ]) actions = [] - now = .init(2) let observerB = storage.observe { backup in actions.append(.didObserve("B", backup)) } - XCTAssertNoDifference(actions, [ - .didObserve("B", .init(date: .init(1), data: data1)) - ]) + XCTAssertNoDifference(actions, []) actions = [] - now = .init(3) + now = .init(2) observerA.cancel() let data2 = "data-2".data(using: .utf8)! try storage.store(data2) XCTAssertNoDifference(actions, [ - .didObserve("B", .init(date: .init(3), data: data2)), + .didObserve("B", .init(date: .init(2), data: data2)), .didSaveFile(path, data2), ]) actions = [] - now = .init(4) + now = .init(3) try storage.remove() XCTAssertNoDifference(actions, [ @@ -87,7 +94,7 @@ final class BackupStorageTests: XCTestCase { ]) actions = [] - now = .init(5) + now = .init(4) observerB.cancel() let data3 = "data-3".data(using: .utf8)! try storage.store(data3)