1 package datakinds
2
3 import (
4 "encoding/json"
5 "fmt"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10
11 "github.com/launchdarkly/go-server-sdk-evaluation/v2/ldbuilders"
12 "github.com/launchdarkly/go-server-sdk-evaluation/v2/ldmodel"
13 "github.com/launchdarkly/go-server-sdk/v6/subsystems/ldstoretypes"
14 )
15
16 func TestAllKinds(t *testing.T) {
17 assert.Equal(t, []ldstoretypes.DataKind{Features, Segments}, AllDataKinds())
18 }
19
20 func TestDataKindFeatures(t *testing.T) {
21 kind := Features
22
23 t.Run("name", func(t *testing.T) {
24 assert.Equal(t, "features", kind.GetName())
25 assert.Equal(t, "features", fmt.Sprintf("%s", kind))
26 })
27
28 t.Run("serialize", func(t *testing.T) {
29 flag := ldbuilders.NewFlagBuilder("flagkey").Version(2).Build()
30 bytes := kind.Serialize(ldstoretypes.ItemDescriptor{Version: flag.Version, Item: &flag})
31 assert.Contains(t, string(bytes), `"key":"flagkey"`)
32 assert.Contains(t, string(bytes), `"version":2`)
33 })
34
35 t.Run("deserialize", func(t *testing.T) {
36 json := `{"key":"flagkey","version":2}`
37 item, err := kind.Deserialize([]byte(json))
38 assert.NoError(t, err)
39 assert.Equal(t, 2, item.Version)
40 require.NotNil(t, item.Item)
41 flag := item.Item.(*ldmodel.FeatureFlag)
42 assert.Equal(t, "flagkey", flag.Key)
43 assert.Equal(t, 2, flag.Version)
44 })
45
46 t.Run("serialize deleted item", func(t *testing.T) {
47
48
49
50 bytes := kind.Serialize(ldstoretypes.ItemDescriptor{Version: 2, Item: nil})
51 expected, _ := json.Marshal(ldmodel.FeatureFlag{Key: deletedItemPlaceholderKey, Version: 2, Deleted: true})
52 assert.JSONEq(t, string(expected), string(bytes))
53 })
54
55 t.Run("deserialize deleted item", func(t *testing.T) {
56 json := `{"key":"flagkey","version":2,"deleted":true}`
57 item, err := kind.Deserialize([]byte(json))
58 assert.NoError(t, err)
59 assert.Equal(t, 2, item.Version)
60 require.Nil(t, item.Item)
61 })
62
63 t.Run("will not serialize wrong type", func(t *testing.T) {
64 bytes := kind.Serialize(ldstoretypes.ItemDescriptor{Version: 1, Item: "not a flag"})
65 assert.Nil(t, bytes)
66 })
67
68 t.Run("deserialization error", func(t *testing.T) {
69 json := `{"key":"flagkey"`
70 item, err := kind.Deserialize([]byte(json))
71 assert.Error(t, err)
72 require.Nil(t, item.Item)
73 })
74 }
75
76 func TestDataKindSegments(t *testing.T) {
77 kind := Segments
78
79 t.Run("name", func(t *testing.T) {
80 assert.Equal(t, "segments", kind.GetName())
81 assert.Equal(t, "segments", fmt.Sprintf("%s", kind))
82 })
83
84 t.Run("serialize", func(t *testing.T) {
85 segment := ldbuilders.NewSegmentBuilder("segmentkey").Version(2).Build()
86 bytes := kind.Serialize(ldstoretypes.ItemDescriptor{Version: segment.Version, Item: &segment})
87 assert.Contains(t, string(bytes), `"key":"segmentkey"`)
88 assert.Contains(t, string(bytes), `"version":2`)
89 })
90
91 t.Run("deserialize", func(t *testing.T) {
92 json := `{"key":"segmentkey","version":2}`
93 item, err := kind.Deserialize([]byte(json))
94 assert.NoError(t, err)
95 require.NotNil(t, item.Item)
96 segment := item.Item.(*ldmodel.Segment)
97 assert.Equal(t, "segmentkey", segment.Key)
98 assert.Equal(t, 2, segment.Version)
99 })
100
101 t.Run("serialize deleted item", func(t *testing.T) {
102
103
104
105 bytes := kind.Serialize(ldstoretypes.ItemDescriptor{Version: 2, Item: nil})
106 expected, _ := json.Marshal(ldmodel.Segment{Key: deletedItemPlaceholderKey, Version: 2, Deleted: true})
107 assert.JSONEq(t, string(expected), string(bytes))
108 })
109
110 t.Run("deserialize deleted item", func(t *testing.T) {
111 json := `{"key":"segmentkey","version":2,"deleted":true}`
112 item, err := kind.Deserialize([]byte(json))
113 assert.NoError(t, err)
114 assert.Equal(t, 2, item.Version)
115 require.Nil(t, item.Item)
116 })
117
118 t.Run("will not serialize wrong type", func(t *testing.T) {
119 bytes := kind.Serialize(ldstoretypes.ItemDescriptor{Version: 1, Item: "not a flag"})
120 assert.Nil(t, bytes)
121 })
122
123 t.Run("deserialization error", func(t *testing.T) {
124 json := `{"key":"segmentkey"`
125 item, err := kind.Deserialize([]byte(json))
126 assert.Error(t, err)
127 require.Nil(t, item.Item)
128 })
129 }
130
View as plain text