Skip to content

Commit

Permalink
tests added.
Browse files Browse the repository at this point in the history
  • Loading branch information
yasirfolio3 committed Mar 26, 2020
1 parent c182a86 commit b047d85
Show file tree
Hide file tree
Showing 2 changed files with 133 additions and 18 deletions.
46 changes: 44 additions & 2 deletions pkg/decision/helpers_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/****************************************************************************
* Copyright 2019, Optimizely, Inc. and contributors *
* Copyright 2019-2020, Optimizely, Inc. and contributors *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); *
* you may not use this file except in compliance with the License. *
Expand Down Expand Up @@ -150,6 +150,48 @@ var testExp1112 = entities.Experiment{
entities.Range{EntityID: "2222", EndOfRange: 10000},
},
}
var testExp1117Var2223 = entities.Variation{ID: "2223", Key: "2223"}
var testAudience5556 = entities.Audience{ID: "5556"}
var testExp1117 = entities.Experiment{
AudienceConditionTree: &entities.TreeNode{
Operator: "and",
Nodes: []*entities.TreeNode{
&entities.TreeNode{Item: "test_audience_5556"},
},
},
ID: "1117",
Key: testExp1111Key,
Variations: map[string]entities.Variation{
"2223": testExp1117Var2223,
},
VariationKeyToIDMap: map[string]string{
"2223": "2223",
},
TrafficAllocation: []entities.Range{
entities.Range{EntityID: "2223", EndOfRange: 10000},
},
}
var testExp1118Var2224 = entities.Variation{ID: "2224", Key: "2224"}
var testAudience5557 = entities.Audience{ID: "5557"}
var testExp1118 = entities.Experiment{
AudienceConditionTree: &entities.TreeNode{
Operator: "and",
Nodes: []*entities.TreeNode{
&entities.TreeNode{Item: "test_audience_5557"},
},
},
ID: "1118",
Key: testExp1111Key,
Variations: map[string]entities.Variation{
"2224": testExp1118Var2224,
},
VariationKeyToIDMap: map[string]string{
"2224": "2224",
},
TrafficAllocation: []entities.Range{
entities.Range{EntityID: "2224", EndOfRange: 10000},
},
}

const testFeatRollout3334Key = "test_feature_rollout_3334_key"

Expand All @@ -158,7 +200,7 @@ var testFeatRollout3334 = entities.Feature{
Key: testFeatRollout3334Key,
Rollout: entities.Rollout{
ID: "4444",
Experiments: []entities.Experiment{testExp1112},
Experiments: []entities.Experiment{testExp1112, testExp1117, testExp1118},
},
}

Expand Down
105 changes: 89 additions & 16 deletions pkg/decision/rollout_service_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/****************************************************************************
* Copyright 2019, Optimizely, Inc. and contributors *
* Copyright 2019-2020, Optimizely, Inc. and contributors *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); *
* you may not use this file except in compliance with the License. *
Expand Down Expand Up @@ -31,20 +31,20 @@ import (

type RolloutServiceTestSuite struct {
suite.Suite
mockConfig *mockProjectConfig
mockAudienceTreeEvaluator *MockAudienceTreeEvaluator
mockExperimentService *MockExperimentDecisionService
testExperimentDecisionContext ExperimentDecisionContext
testFeatureDecisionContext FeatureDecisionContext
testConditionTreeParams *entities.TreeParameters
testUserContext entities.UserContext
mockConfig *mockProjectConfig
mockAudienceTreeEvaluator *MockAudienceTreeEvaluator
mockExperimentService *MockExperimentDecisionService
testExperiment1112DecisionContext ExperimentDecisionContext
testFeatureDecisionContext FeatureDecisionContext
testConditionTreeParams *entities.TreeParameters
testUserContext entities.UserContext
}

func (s *RolloutServiceTestSuite) SetupTest() {
s.mockConfig = new(mockProjectConfig)
s.mockAudienceTreeEvaluator = new(MockAudienceTreeEvaluator)
s.mockExperimentService = new(MockExperimentDecisionService)
s.testExperimentDecisionContext = ExperimentDecisionContext{
s.testExperiment1112DecisionContext = ExperimentDecisionContext{
Experiment: &testExp1112,
ProjectConfig: s.mockConfig,
}
Expand All @@ -55,6 +55,8 @@ func (s *RolloutServiceTestSuite) SetupTest() {

testAudienceMap := map[string]entities.Audience{
"5555": testAudience5555,
"5556": testAudience5556,
"5557": testAudience5557,
}
s.testUserContext = entities.UserContext{
ID: "test_user",
Expand All @@ -70,7 +72,7 @@ func (s *RolloutServiceTestSuite) TestGetDecisionHappyPath() {
Decision: Decision{Reason: reasons.BucketedIntoVariation},
}
s.mockAudienceTreeEvaluator.On("Evaluate", testExp1112.AudienceConditionTree, s.testConditionTreeParams).Return(true, true)
s.mockExperimentService.On("GetDecision", s.testExperimentDecisionContext, s.testUserContext).Return(testExperimentBucketerDecision, nil)
s.mockExperimentService.On("GetDecision", s.testExperiment1112DecisionContext, s.testUserContext).Return(testExperimentBucketerDecision, nil)

testRolloutService := RolloutService{
audienceTreeEvaluator: s.mockAudienceTreeEvaluator,
Expand All @@ -88,26 +90,95 @@ func (s *RolloutServiceTestSuite) TestGetDecisionHappyPath() {
s.mockExperimentService.AssertExpectations(s.T())
}

func (s *RolloutServiceTestSuite) TestGetDecisionFailsBucketing() {
func (s *RolloutServiceTestSuite) TestGetDecisionFallbacksToLastWhenFailsBucketing() {
// Test experiment passes targeting but not bucketing
testExperimentBucketerDecision := ExperimentDecision{
testExperiment1112BucketerDecision := ExperimentDecision{
Decision: Decision{
Reason: reasons.NotBucketedIntoVariation,
},
}

testExperiment1118BucketerDecision := ExperimentDecision{
Variation: &testExp1118Var2224,
Decision: Decision{Reason: reasons.BucketedIntoVariation},
}
experiment1118DecisionContext := ExperimentDecisionContext{
Experiment: &testExp1118,
ProjectConfig: s.mockConfig,
}
s.mockAudienceTreeEvaluator.On("Evaluate", testExp1112.AudienceConditionTree, s.testConditionTreeParams).Return(true, true)
s.mockExperimentService.On("GetDecision", s.testExperimentDecisionContext, s.testUserContext).Return(testExperimentBucketerDecision, nil)
s.mockAudienceTreeEvaluator.On("Evaluate", testExp1118.AudienceConditionTree, s.testConditionTreeParams).Return(true, true)
s.mockExperimentService.On("GetDecision", s.testExperiment1112DecisionContext, s.testUserContext).Return(testExperiment1112BucketerDecision, nil)
s.mockExperimentService.On("GetDecision", experiment1118DecisionContext, s.testUserContext).Return(testExperiment1118BucketerDecision, nil)

testRolloutService := RolloutService{
audienceTreeEvaluator: s.mockAudienceTreeEvaluator,
experimentBucketerService: s.mockExperimentService,
}
expectedFeatureDecision := FeatureDecision{
Experiment: testExp1118,
Variation: &testExp1118Var2224,
Source: Rollout,
Decision: Decision{Reason: reasons.BucketedIntoRollout},
}
decision, _ := testRolloutService.GetDecision(s.testFeatureDecisionContext, s.testUserContext)
s.Equal(expectedFeatureDecision, decision)
s.mockAudienceTreeEvaluator.AssertExpectations(s.T())
s.mockExperimentService.AssertExpectations(s.T())
}

func (s *RolloutServiceTestSuite) TestGetDecisionWhenFallbackBucketingFails() {
// Test experiment passes targeting but not bucketing
testExperiment1112BucketerDecision := ExperimentDecision{
Decision: Decision{
Reason: reasons.FailedRolloutBucketing,
Reason: reasons.NotBucketedIntoVariation,
},
Experiment: testExp1112,
}
testExperiment1118DecisionContext := ExperimentDecisionContext{
Experiment: &testExp1118,
ProjectConfig: s.mockConfig,
}
s.mockAudienceTreeEvaluator.On("Evaluate", testExp1112.AudienceConditionTree, s.testConditionTreeParams).Return(true, true)
s.mockAudienceTreeEvaluator.On("Evaluate", testExp1118.AudienceConditionTree, s.testConditionTreeParams).Return(true, true)
s.mockExperimentService.On("GetDecision", s.testExperiment1112DecisionContext, s.testUserContext).Return(testExperiment1112BucketerDecision, nil)
s.mockExperimentService.On("GetDecision", testExperiment1118DecisionContext, s.testUserContext).Return(testExperiment1112BucketerDecision, nil)

testRolloutService := RolloutService{
audienceTreeEvaluator: s.mockAudienceTreeEvaluator,
experimentBucketerService: s.mockExperimentService,
}
expectedFeatureDecision := FeatureDecision{
Experiment: testExp1118,
Source: Rollout,
Decision: Decision{Reason: reasons.FailedRolloutBucketing},
}
decision, _ := testRolloutService.GetDecision(s.testFeatureDecisionContext, s.testUserContext)
s.Equal(expectedFeatureDecision, decision)
s.mockAudienceTreeEvaluator.AssertExpectations(s.T())
s.mockExperimentService.AssertExpectations(s.T())
}

func (s *RolloutServiceTestSuite) TestEvaluatesNextIfPreviousTargetingFails() {
s.mockAudienceTreeEvaluator.On("Evaluate", testExp1112.AudienceConditionTree, s.testConditionTreeParams).Return(false, true)
s.mockAudienceTreeEvaluator.On("Evaluate", testExp1117.AudienceConditionTree, s.testConditionTreeParams).Return(true, true)
experiment1117DecisionContext := ExperimentDecisionContext{
Experiment: &testExp1117,
ProjectConfig: s.mockConfig,
}
testExperimentBucketerDecision := ExperimentDecision{
Variation: &testExp1117Var2223,
Decision: Decision{Reason: reasons.BucketedIntoVariation},
}
s.mockExperimentService.On("GetDecision", experiment1117DecisionContext, s.testUserContext).Return(testExperimentBucketerDecision, nil)

testRolloutService := RolloutService{
audienceTreeEvaluator: s.mockAudienceTreeEvaluator,
experimentBucketerService: s.mockExperimentService,
}
expectedFeatureDecision := FeatureDecision{
Experiment: testExp1117,
Variation: &testExp1117Var2223,
Source: Rollout,
Decision: Decision{Reason: reasons.BucketedIntoRollout},
}
decision, _ := testRolloutService.GetDecision(s.testFeatureDecisionContext, s.testUserContext)
s.Equal(expectedFeatureDecision, decision)
Expand All @@ -117,6 +188,8 @@ func (s *RolloutServiceTestSuite) TestGetDecisionFailsBucketing() {

func (s *RolloutServiceTestSuite) TestGetDecisionFailsTargeting() {
s.mockAudienceTreeEvaluator.On("Evaluate", testExp1112.AudienceConditionTree, s.testConditionTreeParams).Return(false, true)
s.mockAudienceTreeEvaluator.On("Evaluate", testExp1117.AudienceConditionTree, s.testConditionTreeParams).Return(false, true)
s.mockAudienceTreeEvaluator.On("Evaluate", testExp1118.AudienceConditionTree, s.testConditionTreeParams).Return(false, true)
testRolloutService := RolloutService{
audienceTreeEvaluator: s.mockAudienceTreeEvaluator,
experimentBucketerService: s.mockExperimentService,
Expand Down

0 comments on commit b047d85

Please sign in to comment.