...

Source file src/github.com/launchdarkly/go-server-sdk/v6/internal/datakinds/data_kinds_impl_test.go

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

     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  		// It's important that the SDK provides a placeholder JSON object for deleted items, because most
    48  		// of our existing database integrations aren't able to store the version number separately from
    49  		// the JSON data.
    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  		// It's important that the SDK provides a placeholder JSON object for deleted items, because most
   103  		// of our existing database integrations aren't able to store the version number separately from
   104  		// the JSON data.
   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