...

Source file src/github.com/launchdarkly/go-server-sdk/v6/internal/sharedtest/data_helpers.go

Documentation: github.com/launchdarkly/go-server-sdk/v6/internal/sharedtest

     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  // FlagDescriptor is a shortcut for creating a StoreItemDescriptor from a flag.
    13  func FlagDescriptor(f ldmodel.FeatureFlag) ldstoretypes.ItemDescriptor {
    14  	return ldstoretypes.ItemDescriptor{Version: f.Version, Item: &f}
    15  }
    16  
    17  // SegmentDescriptor is a shortcut for creating a StoreItemDescriptor from a segment.
    18  func SegmentDescriptor(s ldmodel.Segment) ldstoretypes.ItemDescriptor {
    19  	return ldstoretypes.ItemDescriptor{Version: s.Version, Item: &s}
    20  }
    21  
    22  // DataSetBuilder is a helper for creating collections of flags and segments.
    23  type DataSetBuilder struct {
    24  	flags    []ldstoretypes.KeyedItemDescriptor
    25  	segments []ldstoretypes.KeyedItemDescriptor
    26  }
    27  
    28  // NewDataSetBuilder creates a DataSetBuilder.
    29  func NewDataSetBuilder() *DataSetBuilder {
    30  	return &DataSetBuilder{}
    31  }
    32  
    33  // Build returns the built data sest.
    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  // Flags adds flags to the data set.
    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  // Segments adds segments to the data set.
    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  // ToServerSDKData converts the data set to the format used by the ldservices helpers.
    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  // DataSetToMap converts the data format for Init into a map of maps.
    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  // NormalizeDataSet sorts the data set by kind and key for test determinacy.
    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