...
1 package sharedtest
2
3 import (
4 "sort"
5
6 "github.com/launchdarkly/go-server-sdk-evaluation/v2/ldmodel"
7 "github.com/launchdarkly/go-server-sdk/v6/internal/datakinds"
8 "github.com/launchdarkly/go-server-sdk/v6/subsystems/ldstoretypes"
9 "github.com/launchdarkly/go-server-sdk/v6/testhelpers/ldservices"
10 )
11
12
13 func FlagDescriptor(f ldmodel.FeatureFlag) ldstoretypes.ItemDescriptor {
14 return ldstoretypes.ItemDescriptor{Version: f.Version, Item: &f}
15 }
16
17
18 func SegmentDescriptor(s ldmodel.Segment) ldstoretypes.ItemDescriptor {
19 return ldstoretypes.ItemDescriptor{Version: s.Version, Item: &s}
20 }
21
22
23 type DataSetBuilder struct {
24 flags []ldstoretypes.KeyedItemDescriptor
25 segments []ldstoretypes.KeyedItemDescriptor
26 }
27
28
29 func NewDataSetBuilder() *DataSetBuilder {
30 return &DataSetBuilder{}
31 }
32
33
34 func (d *DataSetBuilder) Build() []ldstoretypes.Collection {
35 return []ldstoretypes.Collection{
36 ldstoretypes.Collection{Kind: datakinds.Features, Items: d.flags},
37 ldstoretypes.Collection{Kind: datakinds.Segments, Items: d.segments},
38 }
39 }
40
41
42 func (d *DataSetBuilder) Flags(flags ...ldmodel.FeatureFlag) *DataSetBuilder {
43 for _, f := range flags {
44 d.flags = append(d.flags, ldstoretypes.KeyedItemDescriptor{Key: f.Key, Item: FlagDescriptor(f)})
45 }
46 return d
47 }
48
49
50 func (d *DataSetBuilder) Segments(segments ...ldmodel.Segment) *DataSetBuilder {
51 for _, s := range segments {
52 d.segments = append(d.segments, ldstoretypes.KeyedItemDescriptor{Key: s.Key, Item: SegmentDescriptor(s)})
53 }
54 return d
55 }
56
57
58 func (d *DataSetBuilder) ToServerSDKData() *ldservices.ServerSDKData {
59 ret := ldservices.NewServerSDKData()
60 for _, f := range d.flags {
61 ret.Flags(f.Item.Item.(*ldmodel.FeatureFlag))
62 }
63 for _, s := range d.segments {
64 ret.Segments(s.Item.Item.(*ldmodel.Segment))
65 }
66 return ret
67 }
68
69
70 func DataSetToMap(
71 allData []ldstoretypes.Collection,
72 ) map[ldstoretypes.DataKind]map[string]ldstoretypes.ItemDescriptor {
73 ret := make(map[ldstoretypes.DataKind]map[string]ldstoretypes.ItemDescriptor, len(allData))
74 for _, coll := range allData {
75 itemsMap := make(map[string]ldstoretypes.ItemDescriptor, len(coll.Items))
76 for _, item := range coll.Items {
77 itemsMap[item.Key] = item.Item
78 }
79 ret[coll.Kind] = itemsMap
80 }
81 return ret
82 }
83
84
85 func NormalizeDataSet(in []ldstoretypes.Collection) []ldstoretypes.Collection {
86 out := append([]ldstoretypes.Collection(nil), in...)
87 sort.Slice(out, func(a, b int) bool { return out[a].Kind.GetName() < out[b].Kind.GetName() })
88 for i := range out {
89 newItems := append([]ldstoretypes.KeyedItemDescriptor(nil), out[i].Items...)
90 sort.Slice(newItems, func(a, b int) bool { return newItems[a].Key < newItems[b].Key })
91 out[i].Items = newItems
92 }
93 return out
94 }
95
View as plain text