Skip to content

Commit e884383

Browse files
committed
Isolate cloud mock storage per test
1 parent 72b0eb4 commit e884383

4 files changed

Lines changed: 26 additions & 6 deletions

File tree

Sources/ObservableDefaults/NSUbiquitousKeyValueStore/MockUbiquitousKeyValueStore.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ import Foundation
2525
userDefaults = UserDefaults(suiteName: Self.suiteName)!
2626
}
2727

28+
init(suiteName: String) {
29+
userDefaults = UserDefaults(suiteName: suiteName)!
30+
}
31+
2832
// MARK: - Object methods
2933

3034
func object(forKey aKey: String) -> Any? {

Sources/ObservableDefaults/NSUbiquitousKeyValueStore/NSUbiquitousKeyValueStoreWrapper.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,22 @@ public struct NSUbiquitousKeyValueStoreWrapper: Sendable {
2727
/// A TaskLocal variable to determine if the current environment is a test environment.
2828
@TaskLocal
2929
static var isTestEnvironment: Bool = false
30+
31+
/// A TaskLocal suite override used to isolate mock cloud storage per test.
32+
@TaskLocal
33+
static var testSuiteName: String?
3034
#endif
3135

3236
/// A private property to store the cloud store.
3337
private var store: ObservableDefaultsCloudStoreProtocol {
3438
#if DEBUG
35-
return Self.isTestEnvironment ? MockUbiquitousKeyValueStore
36-
.default : NSUbiquitousKeyValueStore.default
39+
if Self.isTestEnvironment {
40+
if let testSuiteName = Self.testSuiteName {
41+
return MockUbiquitousKeyValueStore(suiteName: testSuiteName)
42+
}
43+
return MockUbiquitousKeyValueStore.default
44+
}
45+
return NSUbiquitousKeyValueStore.default
3746
#else
3847
return NSUbiquitousKeyValueStore.default
3948
#endif

Tests/ObservableDefaultsTests/Utils/TestTrait.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,13 @@ import Testing
1818
testCase: Test.Case?,
1919
performing function: @Sendable () async throws -> Void) async throws
2020
{
21+
let suiteName = "ObservableDefaults.TestMode.\(UUID().uuidString)"
2122
try await NSUbiquitousKeyValueStoreWrapper.$isTestEnvironment
2223
.withValue(value) {
23-
try await function()
24+
try await NSUbiquitousKeyValueStoreWrapper.$testSuiteName
25+
.withValue(suiteName) {
26+
try await function()
27+
}
2428
}
2529
}
2630
}

Tests/ObservableDefaultsTests/Utils/UserDefaults.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,16 @@ extension UserDefaults {
2424
}
2525

2626
extension UserDefaults {
27+
private static var currentMockSuiteName: String {
28+
NSUbiquitousKeyValueStoreWrapper.testSuiteName ?? MockUbiquitousKeyValueStore.suiteName
29+
}
30+
2731
static var mock: UserDefaults {
28-
UserDefaults(suiteName: MockUbiquitousKeyValueStore.suiteName)!
32+
UserDefaults(suiteName: currentMockSuiteName)!
2933
}
3034

3135
static func clearMock() {
32-
mock.removePersistentDomain(forName: MockUbiquitousKeyValueStore.suiteName)
36+
mock.removePersistentDomain(forName: currentMockSuiteName)
3337
mock.synchronize()
3438
}
3539
}
36-

0 commit comments

Comments
 (0)