@@ -3,16 +3,28 @@ package com.configcat
33import com.configcat.override.OverrideBehavior
44import com.configcat.override.OverrideDataSource
55import dev.openfeature.sdk.ImmutableContext
6+ import dev.openfeature.sdk.OpenFeatureAPI
67import dev.openfeature.sdk.Reason
78import dev.openfeature.sdk.Value
9+ import dev.openfeature.sdk.events.OpenFeatureProviderEvents
810import dev.openfeature.sdk.exceptions.ErrorCode
11+ import io.ktor.client.engine.mock.MockEngine
12+ import io.ktor.client.engine.mock.MockEngine.Companion.invoke
13+ import io.ktor.client.engine.mock.respond
14+ import io.ktor.http.HttpStatusCode
15+ import kotlinx.coroutines.cancelAndJoin
16+ import kotlinx.coroutines.launch
17+ import kotlinx.coroutines.test.runTest
918import java.time.Instant
1019import java.util.Date
20+ import kotlin.compareTo
1121import kotlin.test.Test
1222import kotlin.test.assertContains
1323import kotlin.test.assertEquals
1424import kotlin.test.assertFalse
1525import kotlin.test.assertTrue
26+ import kotlin.time.Duration.Companion.seconds
27+ import kotlin.time.TimeSource
1628
1729class ProviderTests {
1830 @Test
@@ -164,4 +176,128 @@ class ProviderTests {
164176
165177 provider.shutdown()
166178 }
179+
180+ @Test
181+ fun testInitialize () =
182+ runTest {
183+ val mockEngine =
184+ MockEngine {
185+ respond(
186+ content = readResource(" test_json_complex.json" ),
187+ status = HttpStatusCode .OK ,
188+ )
189+ }
190+
191+ val provider =
192+ ConfigCatProvider (randomSdkKey()) {
193+ httpEngine = mockEngine
194+ }
195+
196+ provider.initialize(null )
197+
198+ var ready = false
199+ val collectJob =
200+ launch {
201+ provider.observe().collect {
202+ if (it == OpenFeatureProviderEvents .ProviderReady ) {
203+ ready = true
204+ }
205+ }
206+ }
207+
208+ awaitUntil {
209+ ready
210+ }
211+
212+ val boolVal = provider.getBooleanEvaluation(" enabledFeature" , false , null )
213+ assertTrue(boolVal.value)
214+ assertEquals(" v-enabled" , boolVal.variant)
215+ assertEquals(Reason .DEFAULT .name, boolVal.reason)
216+
217+ provider.shutdown()
218+ collectJob.cancelAndJoin()
219+ }
220+
221+ @Test
222+ fun testReadyOnConfigChange () =
223+ runTest {
224+ val mockEngine =
225+ MockEngine .create {
226+ this .addHandler {
227+ respond(
228+ content = " " ,
229+ status = HttpStatusCode .BadRequest ,
230+ )
231+ }
232+ this .addHandler {
233+ respond(
234+ content = readResource(" test_json_complex.json" ),
235+ status = HttpStatusCode .OK ,
236+ )
237+ }
238+ }
239+
240+ val provider =
241+ ConfigCatProvider (randomSdkKey()) {
242+ httpEngine = mockEngine
243+ pollingMode = autoPoll { pollingInterval = 1 .seconds }
244+ }
245+
246+ val ts = TimeSource .Monotonic
247+ val start = ts.markNow()
248+ provider.initialize(null )
249+
250+ var ready = false
251+ val collectJob =
252+ launch {
253+ provider.observe().collect {
254+ if (it == OpenFeatureProviderEvents .ProviderReady ) {
255+ ready = true
256+ }
257+ }
258+ }
259+
260+ awaitUntil {
261+ ready
262+ }
263+
264+ val elapsed = ts.markNow() - start
265+ assertTrue { elapsed >= 1 .seconds }
266+
267+ val boolVal = provider.getBooleanEvaluation(" enabledFeature" , false , null )
268+ assertTrue(boolVal.value)
269+ assertEquals(" v-enabled" , boolVal.variant)
270+ assertEquals(Reason .DEFAULT .name, boolVal.reason)
271+
272+ provider.shutdown()
273+ collectJob.cancelAndJoin()
274+ }
275+
276+ @Test
277+ fun testOpenFeatureAPI () =
278+ runTest {
279+ val mockEngine =
280+ MockEngine {
281+ respond(
282+ content = readResource(" test_json_complex.json" ),
283+ status = HttpStatusCode .OK ,
284+ )
285+ }
286+
287+ val provider =
288+ ConfigCatProvider (randomSdkKey()) {
289+ httpEngine = mockEngine
290+ pollingMode = autoPoll { pollingInterval = 1 .seconds }
291+ }
292+
293+ OpenFeatureAPI .setProviderAndWait(provider)
294+ val client = OpenFeatureAPI .getClient()
295+
296+ val boolVal = client.getBooleanDetails(" enabledFeature" , false )
297+ assertTrue(boolVal.value)
298+ assertEquals(" v-enabled" , boolVal.variant)
299+ assertEquals(Reason .DEFAULT .name, boolVal.reason)
300+
301+ OpenFeatureAPI .shutdown()
302+ }
167303}
0 commit comments