Skip to content

Commit 0f77426

Browse files
author
Mike Davis
authored
Check nil to prevent panic. (#162)
1 parent e9a646e commit 0f77426

File tree

2 files changed

+33
-5
lines changed

2 files changed

+33
-5
lines changed

pkg/client/client.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
9696
}
9797
}()
9898

99-
context, featureDecision, err := o.getFeatureDecision(featureKey, userContext)
99+
decisionContext, featureDecision, err := o.getFeatureDecision(featureKey, userContext)
100100
if err != nil {
101101
logger.Error("received an error while computing feature decision", err)
102102
return result, err
@@ -116,7 +116,7 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
116116

117117
if featureDecision.Source == decision.FeatureTest {
118118
// send impression event for feature tests
119-
impressionEvent := event.CreateImpressionUserEvent(context.ProjectConfig, featureDecision.Experiment, *featureDecision.Variation, userContext)
119+
impressionEvent := event.CreateImpressionUserEvent(decisionContext.ProjectConfig, featureDecision.Experiment, *featureDecision.Variation, userContext)
120120
o.EventProcessor.ProcessEvent(impressionEvent)
121121
}
122122
return result, err
@@ -214,12 +214,12 @@ func (o *OptimizelyClient) GetFeatureVariableString(featureKey, variableKey stri
214214
// GetFeatureVariable returns feature as a string along with it's associated type
215215
func (o *OptimizelyClient) GetFeatureVariable(featureKey, variableKey string, userContext entities.UserContext) (value string, valueType entities.VariableType, err error) {
216216

217-
context, featureDecision, err := o.getFeatureDecision(featureKey, userContext)
217+
decisionContext, featureDecision, err := o.getFeatureDecision(featureKey, userContext)
218218
if err != nil {
219219
return "", "", err
220220
}
221221

222-
variable, err := context.ProjectConfig.GetVariableByKey(featureKey, variableKey)
222+
variable, err := decisionContext.ProjectConfig.GetVariableByKey(featureKey, variableKey)
223223
if err != nil {
224224
return "", "", err
225225
}
@@ -243,11 +243,16 @@ func (o *OptimizelyClient) GetAllFeatureVariables(featureKey string, userContext
243243
return enabled, variableMap, err
244244
}
245245

246-
feature := decisionContext.Feature
247246
if featureDecision.Variation != nil {
248247
enabled = featureDecision.Variation.FeatureEnabled
249248
}
250249

250+
feature := decisionContext.Feature
251+
if feature == nil {
252+
logger.Warning(fmt.Sprintf(`feature "%s" does not exist`, featureKey))
253+
return enabled, variableMap, nil
254+
}
255+
251256
for _, v := range feature.VariableMap {
252257
variableMap[v.Key] = v.DefaultValue
253258

pkg/client/client_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1456,6 +1456,29 @@ func TestGetAllFeatureVariablesWithError(t *testing.T) {
14561456
assert.NoError(t, err)
14571457
}
14581458

1459+
func TestGetAllFeatureVariablesWithoutFeature(t *testing.T) {
1460+
invalidFeatureKey := "non-existent-feature"
1461+
testUserContext := entities.UserContext{ID: "test_user_1"}
1462+
1463+
mockConfig := new(MockProjectConfig)
1464+
mockConfig.On("GetFeatureByKey", invalidFeatureKey).Return(entities.Feature{}, errors.New(""))
1465+
mockConfigManager := new(MockProjectConfigManager)
1466+
mockConfigManager.On("GetConfig").Return(mockConfig, nil)
1467+
mockDecisionService := new(MockDecisionService)
1468+
1469+
client := OptimizelyClient{
1470+
ConfigManager: mockConfigManager,
1471+
DecisionService: mockDecisionService,
1472+
}
1473+
1474+
enabled, variationMap, err := client.GetAllFeatureVariables(invalidFeatureKey, testUserContext)
1475+
1476+
// if we have a decision, but also a non-fatal error, we should return the decision
1477+
assert.False(t, enabled)
1478+
assert.Equal(t, 0, len(variationMap))
1479+
assert.NoError(t, err)
1480+
}
1481+
14591482
// Helper Methods
14601483
func getTestFeatureDecision(experiment entities.Experiment, variation entities.Variation, decisionMade bool) decision.FeatureDecision {
14611484
return decision.FeatureDecision{

0 commit comments

Comments
 (0)