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 }