...
1 package ldclient
2
3 import (
4 "testing"
5
6 "github.com/launchdarkly/go-server-sdk/v6/internal/sharedtest/mocks"
7
8 "github.com/launchdarkly/go-sdk-common/v3/ldlog"
9 "github.com/launchdarkly/go-sdk-common/v3/ldlogtest"
10 "github.com/launchdarkly/go-sdk-common/v3/ldvalue"
11 "github.com/launchdarkly/go-server-sdk-evaluation/v2/ldbuilders"
12 "github.com/launchdarkly/go-server-sdk/v6/interfaces"
13 "github.com/launchdarkly/go-server-sdk/v6/internal/datastore"
14 "github.com/launchdarkly/go-server-sdk/v6/internal/sharedtest"
15 "github.com/launchdarkly/go-server-sdk/v6/ldcomponents"
16 "github.com/launchdarkly/go-server-sdk/v6/subsystems"
17 "github.com/launchdarkly/go-server-sdk/v6/subsystems/ldstoreimpl"
18
19 "github.com/stretchr/testify/assert"
20 )
21
22 type clientExternalUpdatesTestParams struct {
23 client *LDClient
24 store subsystems.DataStore
25 mockLog *ldlogtest.MockLog
26 }
27
28 func withClientExternalUpdatesTestParams(callback func(clientExternalUpdatesTestParams)) {
29 p := clientExternalUpdatesTestParams{}
30 p.store = datastore.NewInMemoryDataStore(ldlog.NewDisabledLoggers())
31 p.mockLog = ldlogtest.NewMockLog()
32 config := Config{
33 DataSource: ldcomponents.ExternalUpdatesOnly(),
34 DataStore: mocks.SingleComponentConfigurer[subsystems.DataStore]{Instance: p.store},
35 Logging: ldcomponents.Logging().Loggers(p.mockLog.Loggers),
36 }
37 p.client, _ = MakeCustomClient("sdk_key", config, 0)
38 defer p.client.Close()
39 callback(p)
40 }
41
42 func TestClientExternalUpdatesMode(t *testing.T) {
43 t.Run("is initialized", func(t *testing.T) {
44 withClientExternalUpdatesTestParams(func(p clientExternalUpdatesTestParams) {
45 assert.True(t, p.client.Initialized())
46 assert.Equal(t, interfaces.DataSourceStateValid,
47 p.client.GetDataSourceStatusProvider().GetStatus().State)
48 })
49 })
50
51 t.Run("reports non-offline status", func(t *testing.T) {
52 withClientExternalUpdatesTestParams(func(p clientExternalUpdatesTestParams) {
53 assert.False(t, p.client.IsOffline())
54 })
55 })
56
57 t.Run("logs appropriate message at startup", func(t *testing.T) {
58 withClientExternalUpdatesTestParams(func(p clientExternalUpdatesTestParams) {
59 assert.Contains(
60 t,
61 p.mockLog.GetOutput(ldlog.Info),
62 "LaunchDarkly client will not connect to Launchdarkly for feature flag data",
63 )
64 })
65 })
66
67 t.Run("uses data from store", func(t *testing.T) {
68 flag := ldbuilders.NewFlagBuilder("flagkey").SingleVariation(ldvalue.Bool(true)).Build()
69
70 withClientExternalUpdatesTestParams(func(p clientExternalUpdatesTestParams) {
71 _, _ = p.store.Upsert(ldstoreimpl.Features(), flag.Key, sharedtest.FlagDescriptor(flag))
72 result, err := p.client.BoolVariation(flag.Key, evalTestUser, false)
73 assert.NoError(t, err)
74 assert.True(t, result)
75 })
76 })
77 }
78
View as plain text