From 345ca06037329a5058363f120dcb3ba3c57ccf70 Mon Sep 17 00:00:00 2001 From: Ricardo Tomasi Date: Fri, 20 Sep 2024 03:33:15 +0200 Subject: [PATCH 1/2] add BucketingKey to DTO converter functions --- cmd/migrationcli/converter/converter.go | 1 + model/dto/convert_v1.go | 1 + 2 files changed, 2 insertions(+) diff --git a/cmd/migrationcli/converter/converter.go b/cmd/migrationcli/converter/converter.go index da4c3d1ed7f..3ee20cdb560 100644 --- a/cmd/migrationcli/converter/converter.go +++ b/cmd/migrationcli/converter/converter.go @@ -94,6 +94,7 @@ func convertToDto(internalFlag flag.InternalFlag) dto.DTO { Disable: internalFlag.Disable, Version: internalFlag.Version, DTOv1: dto.DTOv1{ + BucketingKey: internalFlag.BucketingKey, Variations: internalFlag.Variations, Rules: internalFlag.Rules, DefaultRule: internalFlag.DefaultRule, diff --git a/model/dto/convert_v1.go b/model/dto/convert_v1.go index 3ec90662c44..65823d7afd9 100644 --- a/model/dto/convert_v1.go +++ b/model/dto/convert_v1.go @@ -13,6 +13,7 @@ func ConvertV1DtoToInternalFlag(dto DTO) flag.InternalFlag { } return flag.InternalFlag{ + BucketingKey: dto.BucketingKey, Variations: dto.Variations, Rules: dto.Rules, DefaultRule: dto.DefaultRule, From de45d7d01906f562c1f61e814c614bcb75aa2463 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Fri, 20 Sep 2024 10:13:12 +0200 Subject: [PATCH 2/2] Adding test to validate DTO convertion Signed-off-by: Thomas Poignant --- feature_flag_test.go | 43 +++++++++++++++++++ testdata/flag-config-custom-bucketingkey.yaml | 11 +++++ 2 files changed, 54 insertions(+) create mode 100644 testdata/flag-config-custom-bucketingkey.yaml diff --git a/feature_flag_test.go b/feature_flag_test.go index 23b7fdf95fe..883aebbaabb 100644 --- a/feature_flag_test.go +++ b/feature_flag_test.go @@ -2,6 +2,7 @@ package ffclient_test import ( "errors" + "github.com/thomaspoignant/go-feature-flag/model" "log" "log/slog" "os" @@ -663,3 +664,45 @@ func Test_PersistFlagConfigurationOnDisk(t *testing.T) { assert.NoError(t, err) assert.NotEqual(t, contentP2, contentP3) } + +func Test_UseCustomBucketingKey(t *testing.T) { + gffClient, err := ffclient.New(ffclient.Config{ + PollingInterval: 1 * time.Second, + Retriever: &fileretriever.Retriever{Path: "testdata/flag-config-custom-bucketingkey.yaml"}, + LeveledLogger: slog.Default(), + Offline: false, + }) + assert.NoError(t, err) + + { + got, err := gffClient.StringVariationDetails("my-flag", ffcontext.NewEvaluationContext("random-key"), "default") + assert.NoError(t, err) + want := model.VariationResult[string]{ + Value: "default", + TrackEvents: true, + VariationType: "SdkDefault", + Failed: true, + Reason: flag.ReasonError, + ErrorCode: flag.ErrorCodeTargetingKeyMissing, + ErrorDetails: "invalid bucketing key", + } + assert.Equal(t, want, got) + } + + { + got, err := gffClient.StringVariationDetails( + "my-flag", + ffcontext.NewEvaluationContextBuilder("random-key").AddCustom("teamId", "team-123").Build(), + "default") + assert.NoError(t, err) + want := model.VariationResult[string]{ + Value: "value_A", + TrackEvents: true, + VariationType: "variation_A", + Failed: false, + Reason: flag.ReasonStatic, + Cacheable: true, + } + assert.Equal(t, want, got) + } +} diff --git a/testdata/flag-config-custom-bucketingkey.yaml b/testdata/flag-config-custom-bucketingkey.yaml new file mode 100644 index 00000000000..b6100df9e37 --- /dev/null +++ b/testdata/flag-config-custom-bucketingkey.yaml @@ -0,0 +1,11 @@ +my-flag: + variations: + variation_A: value_A + variation_B: value_B + variation_C: value_C + bucketingKey: teamId + defaultRule: + variation: variation_A + percentage: + variation_A: 33 + variation_B: 67