@@ -34,12 +34,102 @@ class GoFeatureFlagProviderTests: XCTestCase {
3434 _ = client. getDoubleDetails ( key: " double-flag " , defaultValue: 1.0 )
3535 _ = client. getStringDetails ( key: " string-flag " , defaultValue: " default " )
3636 _ = client. getObjectDetails ( key: " object-flag " , defaultValue: Value . null)
37+
3738 DispatchQueue . global ( ) . asyncAfter ( deadline: . now( ) + 1.5 ) { expectation. fulfill ( ) }
3839 await fulfillment ( of: [ expectation] , timeout: 3.0 )
3940
4041 XCTAssertEqual ( 1 , mockNetworkService. dataCollectorCallCounter)
4142 XCTAssertEqual ( 6 , mockNetworkService. dataCollectorEventCounter)
4243 }
44+
45+ func testExporterMetadata( ) async {
46+ let mockNetworkService = MockNetworkingService ( mockStatus: 200 )
47+ let provider = GoFeatureFlagProvider (
48+ options: GoFeatureFlagProviderOptions (
49+ endpoint: " https://localhost:1031 " ,
50+ dataFlushInterval: 1 ,
51+ exporterMetadata: [ " version " : ExporterMetadataValue . string ( " 1.0.0 " ) , " testInt " : ExporterMetadataValue . integer ( 123 ) , " testDouble " : ExporterMetadataValue . double ( 123.45 ) ] ,
52+ networkService: mockNetworkService
53+ )
54+ )
55+ let evaluationCtx = MutableContext ( targetingKey: " ede04e44-463d-40d1-8fc0-b1d6855578d0 " )
56+ let api = OpenFeatureAPI ( )
57+ await api. setProviderAndWait ( provider: provider, initialContext: evaluationCtx)
58+ let client = api. getClient ( )
59+
60+ _ = client. getBooleanDetails ( key: " my-flag " , defaultValue: false )
61+ _ = client. getBooleanDetails ( key: " my-flag " , defaultValue: false )
62+ _ = client. getIntegerDetails ( key: " int-flag " , defaultValue: 1 )
63+ _ = client. getDoubleDetails ( key: " double-flag " , defaultValue: 1.0 )
64+ _ = client. getStringDetails ( key: " string-flag " , defaultValue: " default " )
65+ _ = client. getObjectDetails ( key: " object-flag " , defaultValue: Value . null)
66+
67+ let expectation = self . expectation ( description: " Waiting for delay " )
68+
69+ DispatchQueue . global ( ) . asyncAfter ( deadline: . now( ) + 2.0 ) { expectation. fulfill ( ) }
70+ await fulfillment ( of: [ expectation] , timeout: 3.0 )
71+
72+ XCTAssertEqual ( 1 , mockNetworkService. dataCollectorCallCounter)
73+ XCTAssertEqual ( 6 , mockNetworkService. dataCollectorEventCounter)
74+
75+ do {
76+ let httpBodyCollector = mockNetworkService. requests [ mockNetworkService. requests. count - 1 ] . httpBody!
77+ let decodedStruct = try JSONDecoder ( ) . decode ( DataCollectorRequest . self, from: httpBodyCollector)
78+ let want = [
79+ " version " : ExporterMetadataValue . string ( " 1.0.0 " ) ,
80+ " testDouble " : ExporterMetadataValue . double ( 123.45 ) ,
81+ " testInt " : ExporterMetadataValue . integer ( 123 ) ,
82+ " openfeature " : ExporterMetadataValue . bool ( true ) ,
83+ " provider " : ExporterMetadataValue . string ( " swift " )
84+ ] as? [ String : ExporterMetadataValue ]
85+ XCTAssertEqual ( want, decodedStruct. meta)
86+ } catch {
87+ XCTFail ( " Error deserializing: \( error) " )
88+ }
89+ }
90+
91+ func testExporterMetadataNil( ) async {
92+ let mockNetworkService = MockNetworkingService ( mockStatus: 200 )
93+ let provider = GoFeatureFlagProvider (
94+ options: GoFeatureFlagProviderOptions (
95+ endpoint: " https://localhost:1031 " ,
96+ dataFlushInterval: 1 ,
97+ exporterMetadata: nil ,
98+ networkService: mockNetworkService
99+ )
100+ )
101+ let evaluationCtx = MutableContext ( targetingKey: " ede04e44-463d-40d1-8fc0-b1d6855578d0 " )
102+ let api = OpenFeatureAPI ( )
103+ await api. setProviderAndWait ( provider: provider, initialContext: evaluationCtx)
104+ let client = api. getClient ( )
105+
106+ _ = client. getBooleanDetails ( key: " my-flag " , defaultValue: false )
107+ _ = client. getBooleanDetails ( key: " my-flag " , defaultValue: false )
108+ _ = client. getIntegerDetails ( key: " int-flag " , defaultValue: 1 )
109+ _ = client. getDoubleDetails ( key: " double-flag " , defaultValue: 1.0 )
110+ _ = client. getStringDetails ( key: " string-flag " , defaultValue: " default " )
111+ _ = client. getObjectDetails ( key: " object-flag " , defaultValue: Value . null)
112+
113+ let expectation = self . expectation ( description: " Waiting for delay " )
114+
115+ DispatchQueue . global ( ) . asyncAfter ( deadline: . now( ) + 2.0 ) { expectation. fulfill ( ) }
116+ await fulfillment ( of: [ expectation] , timeout: 3.0 )
117+
118+ XCTAssertEqual ( 1 , mockNetworkService. dataCollectorCallCounter)
119+ XCTAssertEqual ( 6 , mockNetworkService. dataCollectorEventCounter)
120+
121+ do {
122+ let httpBodyCollector = mockNetworkService. requests [ mockNetworkService. requests. count - 1 ] . httpBody!
123+ let decodedStruct = try JSONDecoder ( ) . decode ( DataCollectorRequest . self, from: httpBodyCollector)
124+ let want = [
125+ " openfeature " : ExporterMetadataValue . bool ( true ) ,
126+ " provider " : ExporterMetadataValue . string ( " swift " )
127+ ] as? [ String : ExporterMetadataValue ]
128+ XCTAssertEqual ( want, decodedStruct. meta)
129+ } catch {
130+ XCTFail ( " Error deserializing: \( error) " )
131+ }
132+ }
43133
44134 func testProviderMultipleHookCall( ) async {
45135 let mockNetworkService = MockNetworkingService ( mockStatus: 200 )
0 commit comments