1
1
/****************************************************************************
2
- * Copyright 2019, Optimizely, Inc. and contributors *
3
- * *
4
- * Licensed under the Apache License, Version 2.0 (the "License"); *
5
- * you may not use this file except in compliance with the License. *
6
- * You may obtain a copy of the License at *
7
- * *
8
- * http://www.apache.org/licenses/LICENSE-2.0 *
9
- * *
10
- * Unless required by applicable law or agreed to in writing, software *
11
- * distributed under the License is distributed on an "AS IS" BASIS, *
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13
- * See the License for the specific language governing permissions and *
14
- * limitations under the License. *
15
- ***************************************************************************/
2
+ * Copyright 2019-2020 , Optimizely, Inc. and contributors *
3
+ * *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); *
5
+ * you may not use this file except in compliance with the License. *
6
+ * You may obtain a copy of the License at *
7
+ * *
8
+ * http://www.apache.org/licenses/LICENSE-2.0 *
9
+ * *
10
+ * Unless required by applicable law or agreed to in writing, software *
11
+ * distributed under the License is distributed on an "AS IS" BASIS, *
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13
+ * See the License for the specific language governing permissions and *
14
+ * limitations under the License. *
15
+ ***************************************************************************/
16
16
17
17
import XCTest
18
18
@@ -24,6 +24,24 @@ class OptimizelyClientTests_Variables: XCTestCase {
24
24
25
25
let kUserId = " 12345 "
26
26
let kExperimentId = " 11111 "
27
+ var kRolloutId = " rollout11 "
28
+ var kRolloutExperimentId = " rolloutExp11 "
29
+ var kRolloutExperimentId2 = " rolloutExp12 "
30
+ var kRolloutExperimentId3 = " rolloutExp13 "
31
+
32
+ let kRolloutVariableValueA = 40
33
+ let kRolloutVariableValueB = 50
34
+ let kRolloutVariableValueC = 60
35
+
36
+ var kRolloutAudienceIdAge1 = " 30 "
37
+ var kRolloutAudienceIdAge2 = " 40 "
38
+ var kAttributesRolloutAge1Match : [ String : Any ] = [ " age " : 20 ]
39
+ var kAttributesRolloutAge2Match : [ String : Any ] = [ " age " : 30 ]
40
+ var kAttributesRolloutNotMatch : [ String : Any ] = [ " age " : 40 ]
41
+
42
+ var kRolloutVariationKeyA = " rolloutA "
43
+ var kRolloutVariationKeyB = " rolloutB "
44
+ var kRolloutVariationKeyC = " rolloutC "
27
45
28
46
var sampleExperimentData : [ String : Any ] { return
29
47
[
@@ -67,8 +85,100 @@ class OptimizelyClientTests_Variables: XCTestCase {
67
85
]
68
86
}
69
87
88
+ var sampleRolloutData : [ String : Any ] { return
89
+ [
90
+ " id " : kRolloutId,
91
+ " experiments " : sampleRolloutExperimentData
92
+ ]
93
+ }
94
+
95
+ var sampleRolloutExperimentData : [ [ String : Any ] ] { return
96
+ [
97
+ [
98
+ " status " : " Running " ,
99
+ " id " : kRolloutExperimentId,
100
+ " key " : " rolloutExp " ,
101
+ " layerId " : " 10420273888 " ,
102
+ " trafficAllocation " : [
103
+ [
104
+ " entityId " : " 10389700000 " ,
105
+ " endOfRange " : 10000
106
+ ]
107
+ ] ,
108
+ " audienceIds " : [ kRolloutAudienceIdAge1] ,
109
+ " variations " : [
110
+ [
111
+ " variables " : [ [ " id " : kVariableId, " value " : String ( kRolloutVariableValueA) ] ] ,
112
+ " id " : " 10389700000 " ,
113
+ " key " : kRolloutVariationKeyA,
114
+ " featureEnabled " : true
115
+ ]
116
+ ] ,
117
+ " forcedVariations " : [ : ]
118
+ ] ,
119
+ [
120
+ " status " : " Running " ,
121
+ " id " : kRolloutExperimentId2,
122
+ " key " : " rolloutExp1 " ,
123
+ " layerId " : " 10420273889 " ,
124
+ " trafficAllocation " : [
125
+ [
126
+ " entityId " : " 10389700000 " ,
127
+ " endOfRange " : 10000
128
+ ]
129
+ ] ,
130
+ " audienceIds " : [ kRolloutAudienceIdAge2] ,
131
+ " variations " : [
132
+ [
133
+ " variables " : [ [ " id " : kVariableId, " value " : String ( kRolloutVariableValueB) ] ] ,
134
+ " id " : " 10389700000 " ,
135
+ " key " : kRolloutVariationKeyB,
136
+ " featureEnabled " : true
137
+ ]
138
+ ] ,
139
+ " forcedVariations " : [ : ]
140
+ ] ,
141
+ [
142
+ " status " : " Running " ,
143
+ " id " : kRolloutExperimentId3,
144
+ " key " : " rolloutExp2 " ,
145
+ " layerId " : " 10420273890 " ,
146
+ " trafficAllocation " : [
147
+ [
148
+ " entityId " : " 10389700000 " ,
149
+ " endOfRange " : 10000
150
+ ]
151
+ ] ,
152
+ " audienceIds " : [ ] ,
153
+ " variations " : [
154
+ [
155
+ " variables " : [ [ " id " : kVariableId, " value " : String ( kRolloutVariableValueC) ] ] ,
156
+ " id " : " 10389700000 " ,
157
+ " key " : kRolloutVariationKeyC,
158
+ " featureEnabled " : true
159
+ ]
160
+ ] ,
161
+ " forcedVariations " : [ : ]
162
+ ]
163
+ ]
164
+ }
165
+
166
+ var sampleRolloutTypedAudiencesData : [ [ String : Any ] ] { return
167
+ [
168
+ [
169
+ " id " : kRolloutAudienceIdAge1,
170
+ " conditions " : [ " type " : " custom_attribute " , " name " : " age " , " match " : " lt " , " value " : 30 ] ,
171
+ " name " : " age "
172
+ ] ,
173
+ [
174
+ " id " : kRolloutAudienceIdAge2,
175
+ " conditions " : [ " type " : " custom_attribute " , " name " : " age " , " match " : " lt " , " value " : 40 ] ,
176
+ " name " : " age "
177
+ ]
178
+ ]
179
+ }
180
+
70
181
var optimizely : OptimizelyClient !
71
- var experiment : Experiment !
72
182
var featureFlag : FeatureFlag !
73
183
74
184
override func setUp( ) {
@@ -77,10 +187,10 @@ class OptimizelyClientTests_Variables: XCTestCase {
77
187
optimizely = OTUtils . createOptimizely ( datafileName: " empty_datafile " ,
78
188
clearUserProfileService: true ) !
79
189
80
- let featureFlag : FeatureFlag = try ! OTUtils . model ( from: sampleFeatureFlagData)
190
+ featureFlag = try ! OTUtils . model ( from: sampleFeatureFlagData)
81
191
optimizely. config!. project. featureFlags = [ featureFlag]
82
192
}
83
-
193
+
84
194
func testFeatureVariableWhenFeatureEnabled( ) {
85
195
var experiment : Experiment = try ! OTUtils . model ( from: sampleExperimentData)
86
196
experiment. variations [ 0 ] . featureEnabled = true
@@ -100,7 +210,7 @@ class OptimizelyClientTests_Variables: XCTestCase {
100
210
101
211
XCTAssertEqual ( value, kVariableDefaultValue)
102
212
}
103
-
213
+
104
214
func testFeatureVariableWhenFeatureEnabledNil( ) {
105
215
var experiment : Experiment = try ! OTUtils . model ( from: sampleExperimentData)
106
216
experiment. variations [ 0 ] . featureEnabled = nil
@@ -110,5 +220,62 @@ class OptimizelyClientTests_Variables: XCTestCase {
110
220
111
221
XCTAssertEqual ( value, kVariableDefaultValue)
112
222
}
223
+ }
224
+
225
+ // MARK: - Test getFeatureVariableForFeatureRollout()
113
226
227
+ extension OptimizelyClientTests_Variables {
228
+
229
+ func testFeatureVariableWhenBucketedToRollout( ) {
230
+ optimizely. config!. project. rollouts = [ try ! OTUtils . model ( from: sampleRolloutData) ]
231
+ optimizely. config!. project. typedAudiences = try ! OTUtils . model ( from: sampleRolloutTypedAudiencesData)
232
+ featureFlag. rolloutId = kRolloutId
233
+ optimizely. config!. project. featureFlags = [ featureFlag]
234
+
235
+ let value = try ! optimizely. getFeatureVariableInteger ( featureKey: " house " , variableKey: " window " , userId: kUserId, attributes: kAttributesRolloutAge1Match)
236
+ XCTAssert ( value == kRolloutVariableValueA)
237
+ }
238
+
239
+ func testFeatureVariableWhenBucketedToRolloutUsingSecondRule( ) {
240
+ optimizely. config!. project. rollouts = [ try ! OTUtils . model ( from: sampleRolloutData) ]
241
+ optimizely. config!. project. typedAudiences = try ! OTUtils . model ( from: sampleRolloutTypedAudiencesData)
242
+ featureFlag. rolloutId = kRolloutId
243
+ optimizely. config!. project. featureFlags = [ featureFlag]
244
+
245
+ let value = try ! optimizely. getFeatureVariableInteger ( featureKey: " house " , variableKey: " window " , userId: kUserId, attributes: kAttributesRolloutAge2Match)
246
+ XCTAssert ( value == kRolloutVariableValueB)
247
+ }
248
+
249
+ func testFeatureVariableWhenBucketedToRolloutUsingFallbackRule( ) {
250
+ optimizely. config!. project. rollouts = [ try ! OTUtils . model ( from: sampleRolloutData) ]
251
+ optimizely. config!. project. typedAudiences = try ! OTUtils . model ( from: sampleRolloutTypedAudiencesData)
252
+ featureFlag. rolloutId = kRolloutId
253
+ optimizely. config!. project. featureFlags = [ featureFlag]
254
+ optimizely. config!. project. rollouts [ 0 ] . experiments [ 0 ] . trafficAllocation [ 0 ] . endOfRange = 0
255
+
256
+ let value = try ! optimizely. getFeatureVariableInteger ( featureKey: " house " , variableKey: " window " , userId: kUserId, attributes: kAttributesRolloutAge1Match)
257
+ XCTAssert ( value == kRolloutVariableValueC)
258
+ }
259
+
260
+ func testFeatureVariableReturnsDefaultValueWhenFeatureDisabled( ) {
261
+ optimizely. config!. project. rollouts = [ try ! OTUtils . model ( from: sampleRolloutData) ]
262
+ optimizely. config!. project. typedAudiences = try ! OTUtils . model ( from: sampleRolloutTypedAudiencesData)
263
+ featureFlag. rolloutId = kRolloutId
264
+ optimizely. config!. project. featureFlags = [ featureFlag]
265
+ optimizely. config!. project. rollouts [ 0 ] . experiments [ 0 ] . variations [ 0 ] . featureEnabled = false
266
+
267
+ let value = try ! optimizely. getFeatureVariableInteger ( featureKey: " house " , variableKey: " window " , userId: kUserId, attributes: kAttributesRolloutAge1Match)
268
+ XCTAssert ( value == kVariableDefaultValue)
269
+ }
270
+
271
+ func testFeatureVariableReturnsDefaultValueWhenRolloutBucketingReturnsNil( ) {
272
+ optimizely. config!. project. rollouts = [ try ! OTUtils . model ( from: sampleRolloutData) ]
273
+ optimizely. config!. project. typedAudiences = try ! OTUtils . model ( from: sampleRolloutTypedAudiencesData)
274
+ featureFlag. rolloutId = kRolloutId
275
+ optimizely. config!. project. featureFlags = [ featureFlag]
276
+ optimizely. config!. project. rollouts [ 0 ] . experiments = [ ]
277
+
278
+ let value = try ! optimizely. getFeatureVariableInteger ( featureKey: " house " , variableKey: " window " , userId: kUserId, attributes: kAttributesRolloutAge1Match)
279
+ XCTAssert ( value == kVariableDefaultValue)
280
+ }
114
281
}
0 commit comments