The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
grafana/pkg/services/featuremgmt/static_provider_test.go

96 lines
2.9 KiB

package featuremgmt
import (
"context"
"testing"
"github.com/grafana/grafana/pkg/setting"
"github.com/open-feature/go-sdk/openfeature"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func Test_StaticProvider(t *testing.T) {
ctx := context.Background()
evalCtx := openfeature.NewEvaluationContext("grafana", nil)
stFeat := standardFeatureFlags[0]
stFeatName := stFeat.Name
stFeatValue := stFeat.Expression == "true"
t.Run("empty config loads standard flags", func(t *testing.T) {
setup(t, []byte(``))
// Check for one of the standard flags
feat, err := openfeature.GetApiInstance().GetClient().BooleanValueDetails(ctx, stFeatName, !stFeatValue, evalCtx)
assert.NoError(t, err)
assert.True(t, stFeatValue == feat.Value)
})
t.Run("featureOne does not exist in standard flags but should be loaded", func(t *testing.T) {
conf := []byte(`
[feature_toggles]
featureOne = true
`)
setup(t, conf)
feat, err := openfeature.GetApiInstance().GetClient().BooleanValueDetails(ctx, "featureOne", false, evalCtx)
assert.NoError(t, err)
assert.True(t, feat.Value)
})
t.Run("missing feature should return default evaluation value and an error", func(t *testing.T) {
setup(t, []byte(``))
missingFeature, err := openfeature.GetApiInstance().GetClient().BooleanValueDetails(ctx, "missingFeature", true, evalCtx)
assert.Error(t, err)
assert.True(t, missingFeature.Value)
assert.Equal(t, openfeature.ErrorCode("FLAG_NOT_FOUND"), missingFeature.ErrorCode)
})
}
func setup(t *testing.T, conf []byte) {
t.Helper()
cfg, err := setting.NewCfgFromBytes(conf)
require.NoError(t, err)
err = InitOpenFeatureWithCfg(cfg)
require.NoError(t, err)
}
func Test_CompareStaticProviderWithFeatureManager(t *testing.T) {
conf := []byte(`
[feature_toggles]
ABCD = true
`)
cfg, err := setting.NewCfgFromBytes(conf)
require.NoError(t, err)
// InitOpenFeatureWithCfg needed to initialize OpenFeature with the static provider configuration,
// so that StaticFlagEvaluator can use an open feature client.
// In real scenarios, this would be done during server startup.
err = InitOpenFeatureWithCfg(cfg)
require.NoError(t, err)
// Use StaticFlagEvaluator instead of OpenFeatureService for static evaluation
staticEvaluator, err := CreateStaticEvaluator(cfg)
require.NoError(t, err)
ctx := openfeature.WithTransactionContext(context.Background(), openfeature.NewEvaluationContext("grafana", nil))
allFlags, err := staticEvaluator.EvalAllFlags(ctx)
require.NoError(t, err)
openFeatureEnabledFlags := map[string]bool{}
for _, flag := range allFlags.Flags {
if v, ok := flag.Value.(bool); ok && v {
openFeatureEnabledFlags[flag.Key] = true
}
}
mgr, err := ProvideManagerService(cfg)
require.NoError(t, err)
// compare enabled feature flags match between StaticFlagEvaluator and Feature Manager
enabledFeatureManager := mgr.GetEnabled(ctx)
assert.Equal(t, openFeatureEnabledFlags, enabledFeatureManager)
}