Skip to content

Commit 8ecf2ce

Browse files
committed
Added fallback treatment and calculator
1 parent 847b770 commit 8ecf2ce

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed

dtos/fallbacktreatment.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package dtos
2+
3+
const (
4+
labelPrefix = "fallback - "
5+
)
6+
7+
type FallbackTreatment struct {
8+
Treatment string
9+
Config string
10+
Label *string
11+
}
12+
13+
type FallbackTreatmentConfig struct {
14+
GlobalFallbackTreatment *FallbackTreatment
15+
byFlagFallbackTreatment map[string]FallbackTreatment
16+
}
17+
18+
type FallbackTreatmentCalculator interface {
19+
Resolve(flagName string, label string) FallbackTreatment
20+
}
21+
22+
type FallbackTreatmentCalculatorImp struct {
23+
fallbackTreatmentConfig *FallbackTreatmentConfig
24+
}
25+
26+
func NewFallbackTreatmentCalculatorImp(fallbackTreatmentConfig *FallbackTreatmentConfig) FallbackTreatmentCalculatorImp {
27+
return FallbackTreatmentCalculatorImp{
28+
fallbackTreatmentConfig: fallbackTreatmentConfig,
29+
}
30+
}
31+
32+
func (f *FallbackTreatmentCalculatorImp) Resolve(flagName string, label *string) FallbackTreatment {
33+
if f.fallbackTreatmentConfig != nil {
34+
if byFlag := f.fallbackTreatmentConfig.byFlagFallbackTreatment; byFlag != nil {
35+
if val, ok := byFlag[flagName]; ok {
36+
return FallbackTreatment{
37+
Treatment: val.Treatment,
38+
Config: val.Config,
39+
Label: f.resolveLabel(label),
40+
}
41+
}
42+
}
43+
if f.fallbackTreatmentConfig.GlobalFallbackTreatment != nil {
44+
return FallbackTreatment{
45+
Treatment: f.fallbackTreatmentConfig.GlobalFallbackTreatment.Treatment,
46+
Config: f.fallbackTreatmentConfig.GlobalFallbackTreatment.Config,
47+
Label: f.resolveLabel(label),
48+
}
49+
}
50+
}
51+
return FallbackTreatment{
52+
Treatment: "control",
53+
Label: label,
54+
}
55+
}
56+
57+
func (f *FallbackTreatmentCalculatorImp) resolveLabel(label *string) *string {
58+
if label == nil {
59+
return nil
60+
}
61+
result := labelPrefix + *label
62+
return &result
63+
}

dtos/fallbacktreatment_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package dtos
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestFallbackTreatmentCalculatorResolve(t *testing.T) {
10+
// Initial setup with both global and flag-specific treatments
11+
config := &FallbackTreatmentConfig{
12+
GlobalFallbackTreatment: &FallbackTreatment{
13+
Treatment: "global_treatment",
14+
Config: "global_config",
15+
},
16+
byFlagFallbackTreatment: map[string]FallbackTreatment{
17+
"flag1": {
18+
Treatment: "flag1_treatment",
19+
Config: "flag1_config",
20+
},
21+
},
22+
}
23+
calc := NewFallbackTreatmentCalculatorImp(config)
24+
25+
// Test flag-specific treatment with label
26+
label := "some_label"
27+
result := calc.Resolve("flag1", &label)
28+
assert.Equal(t, "flag1_treatment", result.Treatment)
29+
assert.Equal(t, "flag1_config", result.Config)
30+
assert.Equal(t, "fallback - some_label", *result.Label)
31+
32+
// Test fallback to global treatment when flag not found
33+
result = calc.Resolve("flag2", &label)
34+
assert.Equal(t, "global_treatment", result.Treatment)
35+
assert.Equal(t, "global_config", result.Config)
36+
assert.Equal(t, "fallback - some_label", *result.Label)
37+
38+
// Test nil label handling
39+
result = calc.Resolve("flag1", nil)
40+
assert.Equal(t, "flag1_treatment", result.Treatment)
41+
assert.Equal(t, "flag1_config", result.Config)
42+
assert.Nil(t, result.Label)
43+
44+
// Test default control when no config
45+
calcNoConfig := NewFallbackTreatmentCalculatorImp(nil)
46+
result = calcNoConfig.Resolve("flag1", &label)
47+
assert.Equal(t, "control", result.Treatment)
48+
assert.Equal(t, "", result.Config)
49+
assert.Equal(t, "some_label", *result.Label)
50+
51+
// Test global treatment when no flag-specific treatments exist
52+
configGlobalOnly := &FallbackTreatmentConfig{
53+
GlobalFallbackTreatment: &FallbackTreatment{
54+
Treatment: "global_treatment",
55+
Config: "global_config",
56+
},
57+
}
58+
calcGlobalOnly := NewFallbackTreatmentCalculatorImp(configGlobalOnly)
59+
result = calcGlobalOnly.Resolve("any_flag", &label)
60+
assert.Equal(t, "global_treatment", result.Treatment)
61+
assert.Equal(t, "global_config", result.Config)
62+
assert.Equal(t, "fallback - some_label", *result.Label)
63+
}

0 commit comments

Comments
 (0)