Skip to content

Commit 3f274dd

Browse files
chore: adding test for all types
Signed-off-by: Thomas Poignant <[email protected]>
1 parent f9fa6bb commit 3f274dd

File tree

3 files changed

+239
-7
lines changed

3 files changed

+239
-7
lines changed

Diff for: Sources/go-feature-flag-provider/go_feature_flag_provider.swift

-4
Original file line numberDiff line numberDiff line change
@@ -233,12 +233,9 @@ final class GoFeatureFlagProvider: FeatureProvider {
233233
self.apiRetryAfter = getRetryAfterDate(from: response.allHeaderFields)
234234
throw error
235235
default:
236-
// TODO: convert error in OpenFeatureError?
237236
throw error
238237
}
239238
} catch {
240-
print(error)
241-
// TODO: convert error in OpenFeatureError?
242239
throw error
243240
}
244241
}
@@ -283,7 +280,6 @@ final class GoFeatureFlagProvider: FeatureProvider {
283280
weakSelf.eventHandler.send(.error)
284281
}
285282
} catch {
286-
// TODO: manage error
287283
weakSelf.eventHandler.send(.error)
288284
}
289285
}

Diff for: Tests/go-feature-flag-providerTests/ofrep_api_mock.swift

+66
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,72 @@ class MockNetworkingService: NetworkingService {
8787
"additionalProp2": true,
8888
"additionalProp3": true
8989
}
90+
},
91+
{
92+
"value": true,
93+
"key": "bool-flag",
94+
"reason": "TARGETING_MATCH",
95+
"variant": "variantA",
96+
"metadata": {
97+
"additionalProp1": true,
98+
"additionalProp2": true,
99+
"additionalProp3": true
100+
}
101+
},
102+
{
103+
"value": 1234,
104+
"key": "int-flag",
105+
"reason": "TARGETING_MATCH",
106+
"variant": "variantA",
107+
"metadata": {
108+
"additionalProp1": true,
109+
"additionalProp2": true,
110+
"additionalProp3": true
111+
}
112+
},
113+
{
114+
"value": 12.34,
115+
"key": "double-flag",
116+
"reason": "TARGETING_MATCH",
117+
"variant": "variantA",
118+
"metadata": {
119+
"additionalProp1": true,
120+
"additionalProp2": true,
121+
"additionalProp3": true
122+
}
123+
},
124+
{
125+
"value": "1234value",
126+
"key": "string-flag",
127+
"reason": "TARGETING_MATCH",
128+
"variant": "variantA",
129+
"metadata": {
130+
"additionalProp1": true,
131+
"additionalProp2": true,
132+
"additionalProp3": true
133+
}
134+
},
135+
{
136+
"value": {"testValue":{"toto":1234}},
137+
"key": "object-flag",
138+
"reason": "TARGETING_MATCH",
139+
"variant": "variantA",
140+
"metadata": {
141+
"additionalProp1": true,
142+
"additionalProp2": true,
143+
"additionalProp3": true
144+
}
145+
},
146+
{
147+
"value": [1234, 5678],
148+
"key": "array-flag",
149+
"reason": "TARGETING_MATCH",
150+
"variant": "variantA",
151+
"metadata": {
152+
"additionalProp1": true,
153+
"additionalProp2": true,
154+
"additionalProp3": true
155+
}
90156
}
91157
]
92158
}

Diff for: Tests/go-feature-flag-providerTests/provider_tests.swift

+173-3
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,177 @@ class ProviderTests: XCTestCase {
469469
XCTAssertEqual(details2.variant, "variantB")
470470
}
471471

472-
/*
473-
should test all types
474-
*/
472+
func testShouldReturnAValidEvaluationForBool() async {
473+
let mockService = MockNetworkingService( mockStatus: 200)
474+
let options = GoFeatureFlagProviderOptions(
475+
endpoint: "http://localhost:1031/",
476+
networkService: mockService
477+
)
478+
let provider = GoFeatureFlagProvider(options: options)
479+
480+
let api = OpenFeatureAPI()
481+
await api.setProviderAndWait(provider: provider, initialContext: defaultEvaluationContext)
482+
let expectation = XCTestExpectation(description: "waiting 1st event")
483+
_ = api.observe().sink{ event in
484+
if(event != ProviderEvent.ready){
485+
XCTFail("If OFREP API returns a 200 we should receive a ready event, received: \(event)")
486+
}
487+
expectation.fulfill()
488+
}
489+
await fulfillment(of: [expectation], timeout: 3)
490+
491+
let client = api.getClient()
492+
let details = client.getBooleanDetails(key: "bool-flag", defaultValue: false)
493+
XCTAssertEqual(details.errorCode, nil)
494+
XCTAssertEqual(details.errorMessage, nil)
495+
XCTAssertEqual(details.value, true)
496+
XCTAssertEqual(details.flagKey, "bool-flag")
497+
XCTAssertEqual(details.reason, "TARGETING_MATCH")
498+
XCTAssertEqual(details.variant, "variantA")
499+
}
500+
501+
func testShouldReturnAValidEvaluationForInt() async {
502+
let mockService = MockNetworkingService( mockStatus: 200)
503+
let options = GoFeatureFlagProviderOptions(
504+
endpoint: "http://localhost:1031/",
505+
networkService: mockService
506+
)
507+
let provider = GoFeatureFlagProvider(options: options)
508+
509+
let api = OpenFeatureAPI()
510+
await api.setProviderAndWait(provider: provider, initialContext: defaultEvaluationContext)
511+
let expectation = XCTestExpectation(description: "waiting 1st event")
512+
_ = api.observe().sink{ event in
513+
if(event != ProviderEvent.ready){
514+
XCTFail("If OFREP API returns a 200 we should receive a ready event, received: \(event)")
515+
}
516+
expectation.fulfill()
517+
}
518+
await fulfillment(of: [expectation], timeout: 3)
519+
520+
let client = api.getClient()
521+
let details = client.getIntegerDetails(key: "int-flag", defaultValue: 1)
522+
XCTAssertEqual(details.errorCode, nil)
523+
XCTAssertEqual(details.errorMessage, nil)
524+
XCTAssertEqual(details.value, 1234)
525+
XCTAssertEqual(details.flagKey, "int-flag")
526+
XCTAssertEqual(details.reason, "TARGETING_MATCH")
527+
XCTAssertEqual(details.variant, "variantA")
528+
}
529+
530+
func testShouldReturnAValidEvaluationForDouble() async {
531+
let mockService = MockNetworkingService( mockStatus: 200)
532+
let options = GoFeatureFlagProviderOptions(
533+
endpoint: "http://localhost:1031/",
534+
networkService: mockService
535+
)
536+
let provider = GoFeatureFlagProvider(options: options)
537+
538+
let api = OpenFeatureAPI()
539+
await api.setProviderAndWait(provider: provider, initialContext: defaultEvaluationContext)
540+
let expectation = XCTestExpectation(description: "waiting 1st event")
541+
_ = api.observe().sink{ event in
542+
if(event != ProviderEvent.ready){
543+
XCTFail("If OFREP API returns a 200 we should receive a ready event, received: \(event)")
544+
}
545+
expectation.fulfill()
546+
}
547+
await fulfillment(of: [expectation], timeout: 3)
548+
549+
let client = api.getClient()
550+
let details = client.getDoubleDetails(key: "double-flag", defaultValue: 1.1)
551+
XCTAssertEqual(details.errorCode, nil)
552+
XCTAssertEqual(details.errorMessage, nil)
553+
XCTAssertEqual(details.value, 12.34)
554+
XCTAssertEqual(details.flagKey, "double-flag")
555+
XCTAssertEqual(details.reason, "TARGETING_MATCH")
556+
XCTAssertEqual(details.variant, "variantA")
557+
}
558+
559+
func testShouldReturnAValidEvaluationForString() async {
560+
let mockService = MockNetworkingService( mockStatus: 200)
561+
let options = GoFeatureFlagProviderOptions(
562+
endpoint: "http://localhost:1031/",
563+
networkService: mockService
564+
)
565+
let provider = GoFeatureFlagProvider(options: options)
566+
567+
let api = OpenFeatureAPI()
568+
await api.setProviderAndWait(provider: provider, initialContext: defaultEvaluationContext)
569+
let expectation = XCTestExpectation(description: "waiting 1st event")
570+
_ = api.observe().sink{ event in
571+
if(event != ProviderEvent.ready){
572+
XCTFail("If OFREP API returns a 200 we should receive a ready event, received: \(event)")
573+
}
574+
expectation.fulfill()
575+
}
576+
await fulfillment(of: [expectation], timeout: 3)
577+
578+
let client = api.getClient()
579+
let details = client.getStringDetails(key: "string-flag", defaultValue: "1")
580+
XCTAssertEqual(details.errorCode, nil)
581+
XCTAssertEqual(details.errorMessage, nil)
582+
XCTAssertEqual(details.value, "1234value")
583+
XCTAssertEqual(details.flagKey, "string-flag")
584+
XCTAssertEqual(details.reason, "TARGETING_MATCH")
585+
XCTAssertEqual(details.variant, "variantA")
586+
}
587+
588+
func testShouldReturnAValidEvaluationForArray() async {
589+
let mockService = MockNetworkingService( mockStatus: 200)
590+
let options = GoFeatureFlagProviderOptions(
591+
endpoint: "http://localhost:1031/",
592+
networkService: mockService
593+
)
594+
let provider = GoFeatureFlagProvider(options: options)
595+
596+
let api = OpenFeatureAPI()
597+
await api.setProviderAndWait(provider: provider, initialContext: defaultEvaluationContext)
598+
let expectation = XCTestExpectation(description: "waiting 1st event")
599+
_ = api.observe().sink{ event in
600+
if(event != ProviderEvent.ready){
601+
XCTFail("If OFREP API returns a 200 we should receive a ready event, received: \(event)")
602+
}
603+
expectation.fulfill()
604+
}
605+
await fulfillment(of: [expectation], timeout: 3)
606+
607+
let client = api.getClient()
608+
let details = client.getObjectDetails(key: "array-flag", defaultValue: Value.list([Value.string("1")]))
609+
XCTAssertEqual(details.errorCode, nil)
610+
XCTAssertEqual(details.errorMessage, nil)
611+
XCTAssertEqual(details.value, Value.list([Value.integer(1234),Value.integer(5678)]))
612+
XCTAssertEqual(details.flagKey, "array-flag")
613+
XCTAssertEqual(details.reason, "TARGETING_MATCH")
614+
XCTAssertEqual(details.variant, "variantA")
615+
}
616+
617+
func testShouldReturnAValidEvaluationForObject() async {
618+
let mockService = MockNetworkingService( mockStatus: 200)
619+
let options = GoFeatureFlagProviderOptions(
620+
endpoint: "http://localhost:1031/",
621+
networkService: mockService
622+
)
623+
let provider = GoFeatureFlagProvider(options: options)
624+
625+
let api = OpenFeatureAPI()
626+
await api.setProviderAndWait(provider: provider, initialContext: defaultEvaluationContext)
627+
let expectation = XCTestExpectation(description: "waiting 1st event")
628+
_ = api.observe().sink{ event in
629+
if(event != ProviderEvent.ready){
630+
XCTFail("If OFREP API returns a 200 we should receive a ready event, received: \(event)")
631+
}
632+
expectation.fulfill()
633+
}
634+
await fulfillment(of: [expectation], timeout: 3)
635+
636+
let client = api.getClient()
637+
let details = client.getObjectDetails(key: "object-flag", defaultValue: Value.list([Value.string("1")]))
638+
XCTAssertEqual(details.errorCode, nil)
639+
XCTAssertEqual(details.errorMessage, nil)
640+
XCTAssertEqual(details.value, Value.structure(["testValue": Value.structure(["toto":Value.integer(1234)])]))
641+
XCTAssertEqual(details.flagKey, "object-flag")
642+
XCTAssertEqual(details.reason, "TARGETING_MATCH")
643+
XCTAssertEqual(details.variant, "variantA")
644+
}
475645
}

0 commit comments

Comments
 (0)