@@ -24,104 +24,121 @@ import (
24
24
"github.com/optimizely/go-sdk/pkg/decision/reasons"
25
25
26
26
"github.com/stretchr/testify/assert"
27
+ "github.com/stretchr/testify/suite"
27
28
28
29
"github.com/optimizely/go-sdk/pkg/entities"
29
30
)
30
31
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 ,
34
50
}
35
- mockProjectConfig := new (mockProjectConfig )
36
- testFeatureDecisionContext := FeatureDecisionContext {
51
+ s .testFeatureDecisionContext = FeatureDecisionContext {
37
52
Feature : & testFeatRollout3334 ,
38
- ProjectConfig : mockProjectConfig ,
53
+ ProjectConfig : s . mockConfig ,
39
54
}
55
+
40
56
testAudienceMap := map [string ]entities.Audience {
41
57
"5555" : testAudience5555 ,
42
58
}
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
+ }
45
65
66
+ func (s * RolloutServiceTestSuite ) TestGetDecisionHappyPath () {
46
67
// Test experiment passes targeting and bucketing
47
68
testExperimentBucketerDecision := ExperimentDecision {
48
69
Variation : & testExp1112Var2222 ,
70
+ Decision : Decision {Reason : reasons .BucketedIntoVariation },
49
71
}
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 )
54
74
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 )
60
75
testRolloutService := RolloutService {
61
- audienceTreeEvaluator : mockAudienceTreeEvaluator ,
62
- experimentBucketerService : mockExperimentBucketerService ,
76
+ audienceTreeEvaluator : s . mockAudienceTreeEvaluator ,
77
+ experimentBucketerService : s . mockExperimentService ,
63
78
}
64
79
expectedFeatureDecision := FeatureDecision {
65
80
Experiment : testExp1112 ,
66
81
Variation : & testExp1112Var2222 ,
67
82
Source : Rollout ,
83
+ Decision : Decision {Reason : reasons .BucketedIntoRollout },
68
84
}
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
+ }
73
90
91
+ func (s * RolloutServiceTestSuite ) TestGetDecisionFailsBucketing () {
74
92
// Test experiment passes targeting but not bucketing
75
- testExperimentBucketerDecision = ExperimentDecision {
93
+ testExperimentBucketerDecision : = ExperimentDecision {
76
94
Decision : Decision {
77
95
Reason : reasons .NotBucketedIntoVariation ,
78
96
},
79
97
}
80
- testExperimentBucketerDecisionContext = ExperimentDecisionContext {
81
- Experiment : & testExp1112 ,
82
- ProjectConfig : mockProjectConfig ,
83
- }
84
98
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 ,
92
104
}
93
- expectedFeatureDecision = FeatureDecision {
105
+ expectedFeatureDecision : = FeatureDecision {
94
106
Decision : Decision {
95
- Reason : reasons .NotBucketedIntoVariation ,
107
+ Reason : reasons .FailedRolloutBucketing ,
96
108
},
97
109
Experiment : testExp1112 ,
98
110
Source : Rollout ,
99
111
}
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 ,
111
123
}
112
- expectedFeatureDecision = FeatureDecision {
124
+ expectedFeatureDecision : = FeatureDecision {
113
125
Decision : Decision {
114
126
Reason : reasons .FailedRolloutTargeting ,
115
127
},
128
+ Source : Rollout ,
116
129
}
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 () )
121
134
}
122
135
123
136
func TestNewRolloutService (t * testing.T ) {
124
137
rolloutService := NewRolloutService ()
125
138
assert .IsType (t , & evaluator.MixedTreeEvaluator {}, rolloutService .audienceTreeEvaluator )
126
139
assert .IsType (t , & ExperimentBucketerService {}, rolloutService .experimentBucketerService )
127
140
}
141
+
142
+ func TestRolloutServiceTestSuite (t * testing.T ) {
143
+ suite .Run (t , new (RolloutServiceTestSuite ))
144
+ }
0 commit comments