package ratio_setting import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) const defaultGroupRatioJSON = `{"default":1,"vip":1,"svip":1}` const defaultGroupGroupRatioJSON = `{"vip":{"edit_this":0.9}}` // resetGroupRatios restores the default group ratios after each test. func resetGroupRatios(t *testing.T) { t.Helper() t.Cleanup(func() { _ = UpdateGroupRatioByJSONString(defaultGroupRatioJSON) _ = UpdateGroupGroupRatioByJSONString(defaultGroupGroupRatioJSON) }) } // --- GetGroupRatio --- func TestGetGroupRatio_DefaultGroups(t *testing.T) { resetGroupRatios(t) assert.Equal(t, 1.0, GetGroupRatio("default")) assert.Equal(t, 1.0, GetGroupRatio("vip")) assert.Equal(t, 1.0, GetGroupRatio("svip")) } func TestGetGroupRatio_UnknownGroup(t *testing.T) { resetGroupRatios(t) // 不存在的分组应返回 1(降级默认值) assert.Equal(t, 1.0, GetGroupRatio("nonexistent")) } func TestGetGroupRatio_UpdateAndRead(t *testing.T) { resetGroupRatios(t) err := UpdateGroupRatioByJSONString(`{"default":1,"vip":1,"svip":1,"test-group":0.8,"free":0}`) require.NoError(t, err) assert.Equal(t, 0.8, GetGroupRatio("test-group")) assert.Equal(t, 0.0, GetGroupRatio("free")) // 清除自定义分组后应回退到默认值 1 require.NoError(t, UpdateGroupRatioByJSONString(defaultGroupRatioJSON)) assert.Equal(t, 1.0, GetGroupRatio("test-group")) } func TestGetGroupRatio_OverrideDefault(t *testing.T) { resetGroupRatios(t) require.NoError(t, UpdateGroupRatioByJSONString(`{"default":1,"vip":0.5,"svip":1}`)) assert.Equal(t, 0.5, GetGroupRatio("vip")) } func TestGetGroupRatio_InvalidJSON(t *testing.T) { err := UpdateGroupRatioByJSONString(`not json`) assert.Error(t, err) } func TestCheckGroupRatio_Negative(t *testing.T) { err := CheckGroupRatio(`{"bad":-0.5}`) assert.Error(t, err) } func TestCheckGroupRatio_Valid(t *testing.T) { err := CheckGroupRatio(`{"ok":0.5,"zero":0}`) assert.NoError(t, err) } // --- GetGroupGroupRatio --- func TestGetGroupGroupRatio_NoSpecialRatio(t *testing.T) { resetGroupRatios(t) // default 用户使用 default 分组,没有特殊倍率 ratio, ok := GetGroupGroupRatio("default", "default") assert.False(t, ok) assert.Equal(t, -1.0, ratio) } func TestGetGroupGroupRatio_DefaultSpecialRatio(t *testing.T) { resetGroupRatios(t) // 内置默认: vip 用户使用 edit_this 分组 => 0.9 ratio, ok := GetGroupGroupRatio("vip", "edit_this") assert.True(t, ok) assert.Equal(t, 0.9, ratio) } func TestGetGroupGroupRatio_UpdateAndRead(t *testing.T) { resetGroupRatios(t) err := UpdateGroupGroupRatioByJSONString(`{"premium":{"groupA":0.7,"groupB":1.2}}`) require.NoError(t, err) ratio, ok := GetGroupGroupRatio("premium", "groupA") assert.True(t, ok) assert.Equal(t, 0.7, ratio) ratio, ok = GetGroupGroupRatio("premium", "groupB") assert.True(t, ok) assert.Equal(t, 1.2, ratio) // 不存在的组合 _, ok = GetGroupGroupRatio("premium", "nonexistent") assert.False(t, ok) _, ok = GetGroupGroupRatio("nonexistent", "groupA") assert.False(t, ok) } // --- GetGroupRatioCopy --- func TestGetGroupRatioCopy_ReturnsCurrentState(t *testing.T) { resetGroupRatios(t) require.NoError(t, UpdateGroupRatioByJSONString(`{"default":1,"vip":1,"svip":1,"copy-test":2.5}`)) copy := GetGroupRatioCopy() assert.Equal(t, 2.5, copy["copy-test"]) } // --- ContainsGroupRatio --- func TestContainsGroupRatio(t *testing.T) { resetGroupRatios(t) assert.True(t, ContainsGroupRatio("default")) assert.True(t, ContainsGroupRatio("vip")) assert.False(t, ContainsGroupRatio("nonexistent_group")) }