github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/model/feature/flag_test.go (about)

     1  package feature
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/cozy/cozy-stack/model/instance"
     9  	"github.com/gofrs/uuid/v5"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func uuidv7() string {
    15  	return uuid.Must(uuid.NewV7()).String()
    16  }
    17  
    18  func TestFeatureFlagRatio(t *testing.T) {
    19  	inst := instance.Instance{
    20  		DocID:       uuidv7(),
    21  		ContextName: "testing",
    22  	}
    23  	var data []interface{}
    24  	err := json.Unmarshal([]byte(`[
    25  	{"ratio": 0.1, "value": 1},
    26  	{"ratio": 0.2, "value": 2},
    27  	{"ratio": 0.4, "value": 4}
    28  ]`), &data)
    29  	assert.NoError(t, err)
    30  
    31  	results := make(map[interface{}]int)
    32  	for i := 0; i < 10000; i++ {
    33  		key := fmt.Sprintf("%d-feature", i)
    34  		value := applyRatio(&inst, key, data)
    35  		results[value]++
    36  	}
    37  	assert.InDelta(t, 1000, results[float64(1)], 100)
    38  	assert.InDelta(t, 2000, results[float64(2)], 100)
    39  	assert.InDelta(t, 4000, results[float64(4)], 100)
    40  	assert.InDelta(t, 3000, results[nil], 100)
    41  }
    42  
    43  func TestFeatureFlagList(t *testing.T) {
    44  	var flags Flags
    45  	err := json.Unmarshal(
    46  		[]byte(`{
    47  		  "flag1": { "list": ["other", "val"] },
    48  		  "flag2": { "list": ["other"] },
    49  		  "flag3": { "list": [] },
    50  		  "flag4": ["val"],
    51  		  "flag5": "val"
    52  		}`),
    53  		&flags,
    54  	)
    55  	require.NoError(t, err)
    56  
    57  	// GetList
    58  	list, err := flags.GetList("flag1")
    59  	require.NoError(t, err)
    60  	assert.EqualValues(t, []interface{}{"other", "val"}, list)
    61  	_, err = flags.GetList("flag4")
    62  	assert.Error(t, err)
    63  	_, err = flags.GetList("flag5")
    64  	assert.Error(t, err)
    65  
    66  	// HasListItem
    67  	hasVal, err := flags.HasListItem("flag1", "val")
    68  	require.NoError(t, err)
    69  	assert.True(t, hasVal)
    70  	hasVal, _ = flags.HasListItem("flag2", "val")
    71  	assert.False(t, hasVal)
    72  	hasVal, _ = flags.HasListItem("flag3", "val")
    73  	assert.False(t, hasVal)
    74  	_, err = flags.HasListItem("flag4", "val")
    75  	assert.Error(t, err)
    76  	_, err = flags.HasListItem("flag5", "val")
    77  	assert.Error(t, err)
    78  }