Skip to content

Commit d004cdc

Browse files
Adding test for convert
1 parent 14de297 commit d004cdc

File tree

6 files changed

+366
-50
lines changed

6 files changed

+366
-50
lines changed

dao/dbmodel/feature_flag.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,11 @@ func FromModelFeatureFlag(mff model.FeatureFlag) (FeatureFlag, error) {
5151
return ff, nil
5252
}
5353

54-
func (ff *FeatureFlag) ToModelFeatureFlag(rules []Rule) (model.FeatureFlag, error) {
54+
func (ff *FeatureFlag) ToModelFeatureFlag(rules []Rule) model.FeatureFlag {
5555
var apiRules = make([]model.Rule, 0)
5656
var defaultRule *model.Rule
5757
for _, rule := range rules {
58-
convertedRule, err := rule.ToModelRule()
59-
if err != nil {
60-
return model.FeatureFlag{}, err
61-
}
58+
convertedRule := rule.ToModelRule()
6259
if rule.IsDefault {
6360
defaultRule = &convertedRule
6461
continue
@@ -88,5 +85,5 @@ func (ff *FeatureFlag) ToModelFeatureFlag(rules []Rule) (model.FeatureFlag, erro
8885
LastUpdatedDate: ff.LastUpdatedDate,
8986
Rules: &apiRules,
9087
DefaultRule: defaultRule,
91-
}, nil
88+
}
9289
}

dao/dbmodel/feature_flag_test.go

Lines changed: 136 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
)
1414

1515
func TestFromModelFeatureFlag(t *testing.T) {
16-
flagId, _ := uuid.Parse("123e4567-e89b-12d3-a456-426614174000")
16+
flagID, _ := uuid.Parse("123e4567-e89b-12d3-a456-426614174000")
1717

1818
tests := []struct {
1919
name string
@@ -24,7 +24,7 @@ func TestFromModelFeatureFlag(t *testing.T) {
2424
{
2525
name: "should convert model.FeatureFlag to dbmodel.FeatureFlag",
2626
mff: model.FeatureFlag{
27-
ID: flagId.String(),
27+
ID: flagID.String(),
2828
Name: "my-flag",
2929
Description: testutils.String("my flag description"),
3030
Variations: &map[string]interface{}{
@@ -49,7 +49,7 @@ func TestFromModelFeatureFlag(t *testing.T) {
4949
},
5050
wantErr: assert.NoError,
5151
want: dbmodel.FeatureFlag{
52-
ID: flagId,
52+
ID: flagID,
5353
Name: "my-flag",
5454
Description: testutils.String("my flag description"),
5555
Variations: dbmodel.JSONB(map[string]interface{}{
@@ -70,7 +70,7 @@ func TestFromModelFeatureFlag(t *testing.T) {
7070
}, {
7171
name: "should convert model.FeatureFlag to dbmodel.FeatureFlag without metadata",
7272
mff: model.FeatureFlag{
73-
ID: flagId.String(),
73+
ID: flagID.String(),
7474
Name: "my-flag",
7575
Description: testutils.String("my flag description"),
7676
Variations: &map[string]interface{}{
@@ -92,7 +92,7 @@ func TestFromModelFeatureFlag(t *testing.T) {
9292
},
9393
wantErr: assert.NoError,
9494
want: dbmodel.FeatureFlag{
95-
ID: flagId,
95+
ID: flagID,
9696
Name: "my-flag",
9797
Description: testutils.String("my flag description"),
9898
Variations: dbmodel.JSONB(map[string]interface{}{
@@ -111,7 +111,7 @@ func TestFromModelFeatureFlag(t *testing.T) {
111111
}, {
112112
name: "should convert model.FeatureFlag to dbmodel.FeatureFlag without variation",
113113
mff: model.FeatureFlag{
114-
ID: flagId.String(),
114+
ID: flagID.String(),
115115
Name: "my-flag",
116116
Description: testutils.String("my flag description"),
117117
VariationType: "boolean",
@@ -129,7 +129,7 @@ func TestFromModelFeatureFlag(t *testing.T) {
129129
},
130130
wantErr: assert.NoError,
131131
want: dbmodel.FeatureFlag{
132-
ID: flagId,
132+
ID: flagID,
133133
Name: "my-flag",
134134
Description: testutils.String("my flag description"),
135135
Variations: nil,
@@ -196,3 +196,132 @@ func TestFromModelFeatureFlag(t *testing.T) {
196196
})
197197
}
198198
}
199+
200+
func TestToModelFeatureFlag(t *testing.T) {
201+
flagID, _ := uuid.Parse("123e4567-e89b-12d3-a456-426614174000")
202+
ruleIdDefault, _ := uuid.Parse("123e4567-e89b-12d3-a456-426614174111")
203+
ruleId1, _ := uuid.Parse("123e4567-e89b-12d3-a456-426614174333")
204+
ruleId2, _ := uuid.Parse("123e4567-e89b-12d3-a456-426614174222")
205+
206+
tests := []struct {
207+
name string
208+
dbFF dbmodel.FeatureFlag
209+
dbRule []dbmodel.Rule
210+
want model.FeatureFlag
211+
}{
212+
{
213+
name: "should convert model.FeatureFlag to dbmodel.FeatureFlag",
214+
dbFF: dbmodel.FeatureFlag{
215+
ID: flagID,
216+
Name: "my-flag",
217+
Description: testutils.String("my flag description"),
218+
Variations: dbmodel.JSONB(map[string]interface{}{
219+
"A": "a",
220+
"B": "b",
221+
}),
222+
Type: model.FlagTypeString,
223+
BucketingKey: testutils.String("teamID"),
224+
Metadata: dbmodel.JSONB(map[string]interface{}{
225+
"key": "value",
226+
}),
227+
TrackEvents: testutils.Bool(true),
228+
Disable: testutils.Bool(false),
229+
Version: testutils.String("1.0.0"),
230+
CreatedDate: time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC),
231+
LastUpdatedDate: time.Date(2022, 1, 1, 0, 0, 0, 0, time.UTC),
232+
},
233+
dbRule: []dbmodel.Rule{
234+
{
235+
ID: ruleId1,
236+
Name: "Rule 1",
237+
FeatureFlagID: flagID,
238+
Disable: false,
239+
Percentages: dbmodel.JSONB(map[string]interface{}{"A": float64(50), "B": float64(50)}),
240+
IsDefault: false,
241+
Query: `targetingKey eq "foo"`,
242+
OrderIndex: 6,
243+
},
244+
{
245+
ID: ruleId2,
246+
Name: "rule 2",
247+
FeatureFlagID: flagID,
248+
Query: `targetingKey eq "bar"`,
249+
Disable: true,
250+
OrderIndex: 10,
251+
IsDefault: false,
252+
ProgressiveRolloutInitialVariation: testutils.String("A"),
253+
ProgressiveRolloutEndVariation: testutils.String("B"),
254+
ProgressiveRolloutInitialPercentage: testutils.Float64(0),
255+
ProgressiveRolloutEndPercentage: testutils.Float64(100),
256+
ProgressiveRolloutStartDate: testutils.Time(time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)),
257+
ProgressiveRolloutEndDate: testutils.Time(time.Date(2022, 1, 1, 0, 0, 0, 0, time.UTC)),
258+
},
259+
{
260+
ID: ruleIdDefault,
261+
Name: "defaultRule",
262+
FeatureFlagID: flagID,
263+
Disable: false,
264+
VariationResult: testutils.String("A"),
265+
IsDefault: true,
266+
},
267+
},
268+
want: model.FeatureFlag{
269+
ID: flagID.String(),
270+
Name: "my-flag",
271+
Description: testutils.String("my flag description"),
272+
Variations: &map[string]interface{}{
273+
"A": "a",
274+
"B": "b",
275+
},
276+
VariationType: model.FlagTypeString,
277+
BucketingKey: testutils.String("teamID"),
278+
Metadata: &map[string]interface{}{
279+
"key": "value",
280+
},
281+
TrackEvents: testutils.Bool(true),
282+
Disable: testutils.Bool(false),
283+
Version: testutils.String("1.0.0"),
284+
CreatedDate: time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC),
285+
LastUpdatedDate: time.Date(2022, 1, 1, 0, 0, 0, 0, time.UTC),
286+
DefaultRule: &model.Rule{
287+
ID: ruleIdDefault.String(),
288+
Name: "defaultRule",
289+
VariationResult: testutils.String("A"),
290+
},
291+
Rules: &[]model.Rule{
292+
{
293+
ID: ruleId1.String(),
294+
Name: "Rule 1",
295+
Query: `targetingKey eq "foo"`,
296+
Disable: false,
297+
Percentages: &map[string]float64{"A": 50, "B": 50},
298+
},
299+
{
300+
ID: ruleId2.String(),
301+
Name: "rule 2",
302+
Query: `targetingKey eq "bar"`,
303+
Disable: true,
304+
ProgressiveRollout: &model.ProgressiveRollout{
305+
Initial: &model.ProgressiveRolloutStep{
306+
Variation: testutils.String("A"),
307+
Percentage: testutils.Float64(0),
308+
Date: testutils.Time(time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC)),
309+
},
310+
End: &model.ProgressiveRolloutStep{
311+
Variation: testutils.String("B"),
312+
Percentage: testutils.Float64(100),
313+
Date: testutils.Time(time.Date(2022, 1, 1, 0, 0, 0, 0, time.UTC)),
314+
},
315+
},
316+
},
317+
},
318+
},
319+
},
320+
}
321+
for _, tt := range tests {
322+
t.Run(tt.name, func(t *testing.T) {
323+
got := tt.dbFF.ToModelFeatureFlag(tt.dbRule)
324+
assert.Equalf(t, tt.want, got, "FromModelFeatureFlag")
325+
})
326+
}
327+
}

dao/dbmodel/rule.go

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package dbmodel
22

33
import (
4-
"encoding/json"
54
"time"
65

76
"github.com/go-feature-flag/app-api/model"
@@ -15,7 +14,7 @@ type Rule struct {
1514
Name string `db:"name"`
1615
Query string `db:"query"`
1716
VariationResult *string `db:"variation_result"`
18-
Percentages *string `db:"percentages"` // JSONB is stored as string
17+
Percentages JSONB `db:"percentages"` // JSONB is stored as string
1918
Disable bool `db:"disable"`
2019
ProgressiveRolloutInitialVariation *string `db:"progressive_rollout_initial_variation"`
2120
ProgressiveRolloutEndVariation *string `db:"progressive_rollout_end_variation"`
@@ -38,14 +37,10 @@ func FromModelRule(mr model.Rule, featureFlagID uuid.UUID, isDefault bool, order
3837
id = uuid.New()
3938
}
4039

41-
var percentages *string
42-
if mr.Percentages != nil {
43-
percentagesJSON, err := json.Marshal(mr.Percentages)
44-
if err != nil {
45-
return Rule{}, err
46-
}
47-
percentagesStr := string(percentagesJSON)
48-
percentages = &percentagesStr
40+
if isDefault {
41+
orderIndex = -1
42+
mr.Query = ""
43+
mr.Disable = false
4944
}
5045

5146
dbr := Rule{
@@ -62,8 +57,12 @@ func FromModelRule(mr model.Rule, featureFlagID uuid.UUID, isDefault bool, order
6257
dbr.VariationResult = mr.VariationResult
6358
}
6459

65-
if percentages != nil {
66-
dbr.Percentages = percentages
60+
if mr.Percentages != nil {
61+
percentages := make(map[string]interface{})
62+
for k, v := range *mr.Percentages {
63+
percentages[k] = v
64+
}
65+
dbr.Percentages = JSONB(percentages)
6766
}
6867

6968
if mr.ProgressiveRollout != nil {
@@ -77,7 +76,7 @@ func FromModelRule(mr model.Rule, featureFlagID uuid.UUID, isDefault bool, order
7776
return dbr, nil
7877
}
7978

80-
func (rule *Rule) ToModelRule() (model.Rule, error) {
79+
func (rule *Rule) ToModelRule() model.Rule {
8180
apiRule := model.Rule{
8281
ID: rule.ID.String(),
8382
Name: rule.Name,
@@ -90,12 +89,12 @@ func (rule *Rule) ToModelRule() (model.Rule, error) {
9089
}
9190

9291
if rule.Percentages != nil {
93-
var percentages map[string]float64
94-
err := json.Unmarshal([]byte(*rule.Percentages), &percentages)
95-
if err != nil {
96-
return model.Rule{}, err
92+
for k, v := range rule.Percentages {
93+
if apiRule.Percentages == nil {
94+
apiRule.Percentages = &map[string]float64{}
95+
}
96+
(*apiRule.Percentages)[k] = v.(float64)
9797
}
98-
apiRule.Percentages = &percentages
9998
}
10099

101100
if rule.ProgressiveRolloutInitialVariation != nil || rule.ProgressiveRolloutEndVariation != nil {
@@ -112,5 +111,5 @@ func (rule *Rule) ToModelRule() (model.Rule, error) {
112111
},
113112
}
114113
}
115-
return apiRule, nil
114+
return apiRule
116115
}

0 commit comments

Comments
 (0)