@@ -24,104 +24,121 @@ import (
2424 "github.com/optimizely/go-sdk/pkg/decision/reasons"
2525
2626 "github.com/stretchr/testify/assert"
27+ "github.com/stretchr/testify/suite"
2728
2829 "github.com/optimizely/go-sdk/pkg/entities"
2930)
3031
31- func TestRolloutServiceGetDecision (t * testing.T ) {
32- testUserContext := entities.UserContext {
33- ID : "test_user" ,
32+ type RolloutServiceTestSuite struct {
33+ suite.Suite
34+ mockConfig * mockProjectConfig
35+ mockAudienceTreeEvaluator * MockAudienceTreeEvaluator
36+ mockExperimentService * MockExperimentDecisionService
37+ testExperimentDecisionContext ExperimentDecisionContext
38+ testFeatureDecisionContext FeatureDecisionContext
39+ testConditionTreeParams * entities.TreeParameters
40+ testUserContext entities.UserContext
41+ }
42+
43+ func (s * RolloutServiceTestSuite ) SetupTest () {
44+ s .mockConfig = new (mockProjectConfig )
45+ s .mockAudienceTreeEvaluator = new (MockAudienceTreeEvaluator )
46+ s .mockExperimentService = new (MockExperimentDecisionService )
47+ s .testExperimentDecisionContext = ExperimentDecisionContext {
48+ Experiment : & testExp1112 ,
49+ ProjectConfig : s .mockConfig ,
3450 }
35- mockProjectConfig := new (mockProjectConfig )
36- testFeatureDecisionContext := FeatureDecisionContext {
51+ s .testFeatureDecisionContext = FeatureDecisionContext {
3752 Feature : & testFeatRollout3334 ,
38- ProjectConfig : mockProjectConfig ,
53+ ProjectConfig : s . mockConfig ,
3954 }
55+
4056 testAudienceMap := map [string ]entities.Audience {
4157 "5555" : testAudience5555 ,
4258 }
43- mockProjectConfig .On ("GetAudienceMap" ).Return (testAudienceMap )
44- testCondTreeParams := entities .NewTreeParameters (& testUserContext , testAudienceMap )
59+ s .testUserContext = entities.UserContext {
60+ ID : "test_user" ,
61+ }
62+ s .testConditionTreeParams = entities .NewTreeParameters (& s .testUserContext , testAudienceMap )
63+ s .mockConfig .On ("GetAudienceMap" ).Return (testAudienceMap )
64+ }
4565
66+ func (s * RolloutServiceTestSuite ) TestGetDecisionHappyPath () {
4667 // Test experiment passes targeting and bucketing
4768 testExperimentBucketerDecision := ExperimentDecision {
4869 Variation : & testExp1112Var2222 ,
70+ Decision : Decision {Reason : reasons .BucketedIntoVariation },
4971 }
50- testExperimentBucketerDecisionContext := ExperimentDecisionContext {
51- Experiment : & testExp1112 ,
52- ProjectConfig : mockProjectConfig ,
53- }
72+ s .mockAudienceTreeEvaluator .On ("Evaluate" , testExp1112 .AudienceConditionTree , s .testConditionTreeParams ).Return (true )
73+ s .mockExperimentService .On ("GetDecision" , s .testExperimentDecisionContext , s .testUserContext ).Return (testExperimentBucketerDecision , nil )
5474
55- testAudienceConditionTree := testExp1112 .AudienceConditionTree
56- mockAudienceTreeEvaluator := new (MockAudienceTreeEvaluator )
57- mockAudienceTreeEvaluator .On ("Evaluate" , testAudienceConditionTree , testCondTreeParams ).Return (true )
58- mockExperimentBucketerService := new (MockExperimentDecisionService )
59- mockExperimentBucketerService .On ("GetDecision" , testExperimentBucketerDecisionContext , testUserContext ).Return (testExperimentBucketerDecision , nil )
6075 testRolloutService := RolloutService {
61- audienceTreeEvaluator : mockAudienceTreeEvaluator ,
62- experimentBucketerService : mockExperimentBucketerService ,
76+ audienceTreeEvaluator : s . mockAudienceTreeEvaluator ,
77+ experimentBucketerService : s . mockExperimentService ,
6378 }
6479 expectedFeatureDecision := FeatureDecision {
6580 Experiment : testExp1112 ,
6681 Variation : & testExp1112Var2222 ,
6782 Source : Rollout ,
83+ Decision : Decision {Reason : reasons .BucketedIntoRollout },
6884 }
69- decision , _ := testRolloutService .GetDecision (testFeatureDecisionContext , testUserContext )
70- assert .Equal (t , expectedFeatureDecision , decision )
71- mockAudienceTreeEvaluator .AssertExpectations (t )
72- mockExperimentBucketerService .AssertExpectations (t )
85+ decision , _ := testRolloutService .GetDecision (s .testFeatureDecisionContext , s .testUserContext )
86+ s .Equal (expectedFeatureDecision , decision )
87+ s .mockAudienceTreeEvaluator .AssertExpectations (s .T ())
88+ s .mockExperimentService .AssertExpectations (s .T ())
89+ }
7390
91+ func (s * RolloutServiceTestSuite ) TestGetDecisionFailsBucketing () {
7492 // Test experiment passes targeting but not bucketing
75- testExperimentBucketerDecision = ExperimentDecision {
93+ testExperimentBucketerDecision : = ExperimentDecision {
7694 Decision : Decision {
7795 Reason : reasons .NotBucketedIntoVariation ,
7896 },
7997 }
80- testExperimentBucketerDecisionContext = ExperimentDecisionContext {
81- Experiment : & testExp1112 ,
82- ProjectConfig : mockProjectConfig ,
83- }
8498
85- mockAudienceTreeEvaluator = new (MockAudienceTreeEvaluator )
86- mockAudienceTreeEvaluator .On ("Evaluate" , testAudienceConditionTree , testCondTreeParams ).Return (true )
87- mockExperimentBucketerService = new (MockExperimentDecisionService )
88- mockExperimentBucketerService .On ("GetDecision" , testExperimentBucketerDecisionContext , testUserContext ).Return (testExperimentBucketerDecision , nil )
89- testRolloutService = RolloutService {
90- audienceTreeEvaluator : mockAudienceTreeEvaluator ,
91- experimentBucketerService : mockExperimentBucketerService ,
99+ s .mockAudienceTreeEvaluator .On ("Evaluate" , testExp1112 .AudienceConditionTree , s .testConditionTreeParams ).Return (true )
100+ s .mockExperimentService .On ("GetDecision" , s .testExperimentDecisionContext , s .testUserContext ).Return (testExperimentBucketerDecision , nil )
101+ testRolloutService := RolloutService {
102+ audienceTreeEvaluator : s .mockAudienceTreeEvaluator ,
103+ experimentBucketerService : s .mockExperimentService ,
92104 }
93- expectedFeatureDecision = FeatureDecision {
105+ expectedFeatureDecision : = FeatureDecision {
94106 Decision : Decision {
95- Reason : reasons .NotBucketedIntoVariation ,
107+ Reason : reasons .FailedRolloutBucketing ,
96108 },
97109 Experiment : testExp1112 ,
98110 Source : Rollout ,
99111 }
100- decision , _ = testRolloutService .GetDecision (testFeatureDecisionContext , testUserContext )
101- assert .Equal (t , expectedFeatureDecision , decision )
102- mockAudienceTreeEvaluator .AssertExpectations (t )
103- mockExperimentBucketerService . AssertExpectations (t )
104-
105- // Test experiment fails targeting
106- mockAudienceTreeEvaluator = new ( MockAudienceTreeEvaluator )
107- mockAudienceTreeEvaluator .On ("Evaluate" , testAudienceConditionTree , testCondTreeParams ).Return (false )
108- testRolloutService = RolloutService {
109- audienceTreeEvaluator : mockAudienceTreeEvaluator ,
110- experimentBucketerService : mockExperimentBucketerService ,
112+ decision , _ : = testRolloutService .GetDecision (s . testFeatureDecisionContext , s . testUserContext )
113+ s .Equal (expectedFeatureDecision , decision )
114+ s . mockAudienceTreeEvaluator .AssertExpectations (s . T () )
115+ s . mockExperimentService . AssertExpectations (s . T () )
116+ }
117+
118+ func ( s * RolloutServiceTestSuite ) TestGetDecisionFailsTargeting () {
119+ s . mockAudienceTreeEvaluator .On ("Evaluate" , testExp1112 . AudienceConditionTree , s . testConditionTreeParams ).Return (false )
120+ testRolloutService : = RolloutService {
121+ audienceTreeEvaluator : s . mockAudienceTreeEvaluator ,
122+ experimentBucketerService : s . mockExperimentService ,
111123 }
112- expectedFeatureDecision = FeatureDecision {
124+ expectedFeatureDecision : = FeatureDecision {
113125 Decision : Decision {
114126 Reason : reasons .FailedRolloutTargeting ,
115127 },
128+ Source : Rollout ,
116129 }
117- decision , _ = testRolloutService .GetDecision (testFeatureDecisionContext , testUserContext )
118- assert . Nil ( t , decision . Variation )
119- mockAudienceTreeEvaluator .AssertExpectations (t )
120- mockExperimentBucketerService . AssertNotCalled ( t , "GetDecision" )
130+ decision , _ : = testRolloutService .GetDecision (s . testFeatureDecisionContext , s . testUserContext )
131+ s . Equal ( expectedFeatureDecision , decision )
132+ s . mockAudienceTreeEvaluator .AssertExpectations (s . T () )
133+ s . mockExperimentService . AssertExpectations ( s . T () )
121134}
122135
123136func TestNewRolloutService (t * testing.T ) {
124137 rolloutService := NewRolloutService ()
125138 assert .IsType (t , & evaluator.MixedTreeEvaluator {}, rolloutService .audienceTreeEvaluator )
126139 assert .IsType (t , & ExperimentBucketerService {}, rolloutService .experimentBucketerService )
127140}
141+
142+ func TestRolloutServiceTestSuite (t * testing.T ) {
143+ suite .Run (t , new (RolloutServiceTestSuite ))
144+ }
0 commit comments