Skip to content

Commit 3c5021c

Browse files
feat: Add ProviderNotReady event
Signed-off-by: Fabrizio Demaria <[email protected]>
1 parent 5661080 commit 3c5021c

9 files changed

+56
-63
lines changed

Diff for: Sources/OpenFeature/EventHandler.swift

+5-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@ import Combine
44
public class EventHandler: EventSender, EventPublisher {
55
private let eventState: CurrentValueSubject<ProviderEvent, Never>
66

7+
convenience init() {
8+
self.init(.notReady)
9+
}
10+
711
public init(_ state: ProviderEvent) {
8-
eventState = CurrentValueSubject<ProviderEvent, Never>(ProviderEvent.stale)
12+
eventState = CurrentValueSubject<ProviderEvent, Never>(state)
913
}
1014

1115
public func observe() -> AnyPublisher<ProviderEvent, Never> {

Diff for: Sources/OpenFeature/Provider/NoOpProvider.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Combine
44
/// A ``FeatureProvider`` that simply returns the default values passed to it.
55
class NoOpProvider: FeatureProvider {
66
public static let passedInDefault = "Passed in default"
7-
private let eventHandler = EventHandler(.ready)
7+
private let eventHandler = EventHandler()
88

99
public enum Mode {
1010
case normal

Diff for: Sources/OpenFeature/Provider/ProviderEvents.swift

+1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ public enum ProviderEvent: String, CaseIterable {
99
case error = "PROVIDER_ERROR"
1010
case configurationChanged = "PROVIDER_CONFIGURATION_CHANGED"
1111
case stale = "PROVIDER_STALE"
12+
case notReady = "PROVIDER_NOT_READY"
1213
}

Diff for: Tests/OpenFeatureTests/DeveloperExperienceTests.swift

+11-15
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,14 @@ final class DeveloperExperienceTests: XCTestCase {
2020
}
2121

2222
func testObserveGlobalEvents() {
23+
let notReadyExpectation = XCTestExpectation(description: "NotReady")
2324
let readyExpectation = XCTestExpectation(description: "Ready")
24-
let errorExpectation = XCTestExpectation(description: "Error")
25-
let staleExpectation = XCTestExpectation(description: "Stale")
2625
var eventState = OpenFeatureAPI.shared.observe().sink { event in
2726
switch event {
28-
case ProviderEvent.ready:
27+
case .notReady:
28+
notReadyExpectation.fulfill()
29+
case .ready:
2930
readyExpectation.fulfill()
30-
case ProviderEvent.error:
31-
errorExpectation.fulfill()
32-
case ProviderEvent.stale:
33-
staleExpectation.fulfill()
3431
default:
3532
XCTFail("Unexpected event")
3633
}
@@ -50,34 +47,33 @@ final class DeveloperExperienceTests: XCTestCase {
5047
}
5148

5249
func testSetProviderAndWait() async {
50+
let notReadyExpectation = XCTestExpectation(description: "NotReady")
5351
let readyExpectation = XCTestExpectation(description: "Ready")
5452
let errorExpectation = XCTestExpectation(description: "Error")
55-
let staleExpectation = XCTestExpectation(description: "Stale")
5653
withExtendedLifetime(
5754
OpenFeatureAPI.shared.observe().sink { event in
5855
switch event {
59-
case ProviderEvent.ready:
56+
case .notReady:
57+
notReadyExpectation.fulfill()
58+
case .ready:
6059
readyExpectation.fulfill()
61-
case ProviderEvent.error:
60+
case .error:
6261
errorExpectation.fulfill()
63-
case ProviderEvent.stale:
64-
staleExpectation.fulfill()
6562
default:
6663
XCTFail("Unexpected event")
6764
}
6865
})
6966
{
7067
let initCompleteExpectation = XCTestExpectation()
7168

72-
let eventHandler = EventHandler(.stale)
69+
let eventHandler = EventHandler()
7370
let provider = InjectableEventHandlerProvider(eventHandler: eventHandler)
7471
Task {
7572
await OpenFeatureAPI.shared.setProviderAndWait(provider: provider)
7673
wait(for: [readyExpectation], timeout: 1)
7774
initCompleteExpectation.fulfill()
7875
}
79-
80-
wait(for: [staleExpectation], timeout: 1)
76+
wait(for: [notReadyExpectation], timeout: 1)
8177
eventHandler.send(.ready)
8278
wait(for: [initCompleteExpectation], timeout: 1)
8379

Diff for: Tests/OpenFeatureTests/FlagEvaluationTests.swift

+21-21
Original file line numberDiff line numberDiff line change
@@ -53,23 +53,26 @@ final class FlagEvaluationTests: XCTestCase {
5353

5454
func testSimpleFlagEvaluation() {
5555
let provider = DoSomethingProvider()
56+
let notReadyExpectation = XCTestExpectation(description: "NotReady")
5657
let readyExpectation = XCTestExpectation(description: "Ready")
5758
let errorExpectation = XCTestExpectation(description: "Error")
5859
let staleExpectation = XCTestExpectation(description: "Stale")
5960
let eventState = provider.observe().sink { event in
6061
switch event {
61-
case ProviderEvent.ready:
62+
case .notReady:
63+
notReadyExpectation.fulfill()
64+
case .ready:
6265
readyExpectation.fulfill()
63-
case ProviderEvent.error:
66+
case .error:
6467
errorExpectation.fulfill()
65-
case ProviderEvent.stale:
68+
case .stale:
6669
staleExpectation.fulfill()
6770
default:
6871
XCTFail("Unexpected event")
6972
}
7073
}
7174

72-
wait(for: [staleExpectation], timeout: 5)
75+
wait(for: [notReadyExpectation], timeout: 5)
7376
OpenFeatureAPI.shared.setProvider(provider: provider)
7477
wait(for: [readyExpectation], timeout: 5)
7578
let client = OpenFeatureAPI.shared.getClient()
@@ -109,17 +112,14 @@ final class FlagEvaluationTests: XCTestCase {
109112

110113
func testDetailedFlagEvaluation() async {
111114
let provider = DoSomethingProvider()
115+
let notReadyExpectation = XCTestExpectation(description: "NotReady")
112116
let readyExpectation = XCTestExpectation(description: "Ready")
113-
let errorExpectation = XCTestExpectation(description: "Error")
114-
let staleExpectation = XCTestExpectation(description: "Stale")
115117
let eventState = provider.observe().sink { event in
116118
switch event {
117-
case ProviderEvent.ready:
119+
case .notReady:
120+
notReadyExpectation.fulfill()
121+
case .ready:
118122
readyExpectation.fulfill()
119-
case ProviderEvent.error:
120-
errorExpectation.fulfill()
121-
case ProviderEvent.stale:
122-
staleExpectation.fulfill()
123123
default:
124124
XCTFail("Unexpected event")
125125
}
@@ -170,17 +170,14 @@ final class FlagEvaluationTests: XCTestCase {
170170

171171
func testHooksAreFired() async {
172172
let provider = NoOpProvider()
173+
let notReadyExpectation = XCTestExpectation(description: "NotReady")
173174
let readyExpectation = XCTestExpectation(description: "Ready")
174-
let errorExpectation = XCTestExpectation(description: "Error")
175-
let staleExpectation = XCTestExpectation(description: "Stale")
176175
let eventState = provider.observe().sink { event in
177176
switch event {
178-
case ProviderEvent.ready:
177+
case .notReady:
178+
notReadyExpectation.fulfill()
179+
case .ready:
179180
readyExpectation.fulfill()
180-
case ProviderEvent.error:
181-
errorExpectation.fulfill()
182-
case ProviderEvent.stale:
183-
staleExpectation.fulfill()
184181
default:
185182
XCTFail("Unexpected event")
186183
}
@@ -207,16 +204,19 @@ final class FlagEvaluationTests: XCTestCase {
207204

208205
func testBrokenProvider() {
209206
let provider = AlwaysBrokenProvider()
207+
let notReadyExpectation = XCTestExpectation(description: "NotReady")
210208
let readyExpectation = XCTestExpectation(description: "Ready")
211209
let errorExpectation = XCTestExpectation(description: "Error")
212210
let staleExpectation = XCTestExpectation(description: "Stale")
213211
let eventState = provider.observe().sink { event in
214212
switch event {
215-
case ProviderEvent.ready:
213+
case .notReady:
214+
notReadyExpectation.fulfill()
215+
case .ready:
216216
readyExpectation.fulfill()
217-
case ProviderEvent.error:
217+
case .error:
218218
errorExpectation.fulfill()
219-
case ProviderEvent.stale:
219+
case .stale:
220220
staleExpectation.fulfill()
221221
default:
222222
XCTFail("Unexpected event")

Diff for: Tests/OpenFeatureTests/Helpers/AlwaysBrokenProvider.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import Combine
66
class AlwaysBrokenProvider: FeatureProvider {
77
var metadata: ProviderMetadata = AlwaysBrokenMetadata()
88
var hooks: [any Hook] = []
9-
private let eventHandler = EventHandler(.stale)
9+
private let eventHandler = EventHandler()
1010

1111
func onContextSet(oldContext: OpenFeature.EvaluationContext?, newContext: OpenFeature.EvaluationContext) {
1212
eventHandler.send(.error)

Diff for: Tests/OpenFeatureTests/Helpers/DoSomethingProvider.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Combine
44

55
class DoSomethingProvider: FeatureProvider {
66
public static let name = "Something"
7-
private let eventHandler = EventHandler(.ready)
7+
private let eventHandler = EventHandler(.notReady)
88
private var holdit: AnyCancellable?
99

1010
func onContextSet(oldContext: OpenFeature.EvaluationContext?, newContext: OpenFeature.EvaluationContext) {

Diff for: Tests/OpenFeatureTests/Helpers/InjectableEventHandlerProvider.swift

+2-4
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,11 @@ class InjectableEventHandlerProvider: FeatureProvider {
1111
}
1212

1313
func onContextSet(oldContext: OpenFeature.EvaluationContext?, newContext: OpenFeature.EvaluationContext) {
14-
// Emit stale, then let the parent test control events via eventHandler
15-
eventHandler.send(.stale)
14+
// Let the parent test control events via eventHandler
1615
}
1716

1817
func initialize(initialContext: OpenFeature.EvaluationContext?) {
19-
// Emit stale, then let the parent test control events via eventHandler
20-
eventHandler.send(.stale)
18+
// Let the parent test control events via eventHandler
2119
}
2220

2321
var hooks: [any OpenFeature.Hook] = []

Diff for: Tests/OpenFeatureTests/HookSpecTests.swift

+13-19
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,14 @@ import XCTest
66
final class HookSpecTests: XCTestCase {
77
func testNoErrorHookCalled() {
88
let provider = NoOpProvider()
9+
let notReadyExpectation = XCTestExpectation(description: "NotReady")
910
let readyExpectation = XCTestExpectation(description: "Ready")
10-
let errorExpectation = XCTestExpectation(description: "Error")
11-
let staleExpectation = XCTestExpectation(description: "Stale")
1211
let eventState = provider.observe().sink { event in
1312
switch event {
14-
case ProviderEvent.ready:
13+
case .notReady:
14+
notReadyExpectation.fulfill()
15+
case .ready:
1516
readyExpectation.fulfill()
16-
case ProviderEvent.error:
17-
errorExpectation.fulfill()
18-
case ProviderEvent.stale:
19-
staleExpectation.fulfill()
2017
default:
2118
XCTFail("Unexpected event")
2219
}
@@ -42,17 +39,17 @@ final class HookSpecTests: XCTestCase {
4239

4340
func testErrorHookButNoAfterCalled() {
4441
let provider = AlwaysBrokenProvider()
42+
let notReadyExpectation = XCTestExpectation(description: "NotReady")
4543
let readyExpectation = XCTestExpectation(description: "Ready")
4644
let errorExpectation = XCTestExpectation(description: "Error")
47-
let staleExpectation = XCTestExpectation(description: "Stale")
4845
let eventState = provider.observe().sink { event in
4946
switch event {
50-
case ProviderEvent.ready:
47+
case .notReady:
48+
notReadyExpectation.fulfill()
49+
case .ready:
5150
readyExpectation.fulfill()
52-
case ProviderEvent.error:
51+
case .error:
5352
errorExpectation.fulfill()
54-
case ProviderEvent.stale:
55-
staleExpectation.fulfill()
5653
default:
5754
XCTFail("Unexpected event")
5855
}
@@ -84,17 +81,14 @@ final class HookSpecTests: XCTestCase {
8481
let providerMock = NoOpProviderMock(hooks: [
8582
BooleanHookMock(prefix: "provider", addEval: addEval)
8683
])
84+
let notReadyExpectation = XCTestExpectation(description: "NotReady")
8785
let readyExpectation = XCTestExpectation(description: "Ready")
88-
let errorExpectation = XCTestExpectation(description: "Error")
89-
let staleExpectation = XCTestExpectation(description: "Stale")
9086
let eventState = providerMock.observe().sink { event in
9187
switch event {
92-
case ProviderEvent.ready:
88+
case .notReady:
89+
notReadyExpectation.fulfill()
90+
case .ready:
9391
readyExpectation.fulfill()
94-
case ProviderEvent.error:
95-
errorExpectation.fulfill()
96-
case ProviderEvent.stale:
97-
staleExpectation.fulfill()
9892
default:
9993
XCTFail("Unexpected event")
10094
}

0 commit comments

Comments
 (0)