Skip to content

Commit 1f993c9

Browse files
committed
Added unit tests to ensure biases are applied to the correct test variation
1 parent ed906df commit 1f993c9

File tree

3 files changed

+110
-3
lines changed

3 files changed

+110
-3
lines changed

Example/Tests/TestVariationTests.swift

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,104 @@ class TestVariationTests: XCTestCase {
7575
XCTAssert(!feature.isEnabled(), "Pass")
7676
}
7777

78+
func testWhenTestVariationsAreEnabledAndDisabledThenTypeIsFeatureFlagAB() {
79+
let featureConfiguration =
80+
"""
81+
[{
82+
"name": "Example Feature A/B Test",
83+
"enabled": false,
84+
"test-variations": ["Enabled", "Disabled"]
85+
}]
86+
"""
87+
let decoder = JSONDecoder()
88+
guard let featuresData = featureConfiguration.data(using: .utf8),
89+
let features = try? decoder.decode([Feature].self, from: featuresData),
90+
let feature = features.first else {
91+
XCTAssert(false, "Fail")
92+
return
93+
}
94+
XCTAssertEqual(feature.type, .featureTest(.featureFlagAB))
95+
}
96+
97+
func testWhenTestVariationsAreEnabled_DisabledAndBiasesAre80_20ThenEnabledBiasIs80() {
98+
let featureConfiguration =
99+
"""
100+
[{
101+
"name": "Example Feature A/B Test",
102+
"enabled": true,
103+
"test-biases": [80, 20],
104+
"test-variations": ["Enabled", "Disabled"]
105+
}]
106+
"""
107+
let decoder = JSONDecoder()
108+
guard let featuresData = featureConfiguration.data(using: .utf8),
109+
let features = try? decoder.decode([Feature].self, from: featuresData),
110+
let feature = features.first else {
111+
XCTAssert(false, "Fail")
112+
return
113+
}
114+
XCTAssertEqual(feature.testVariations.count, 2)
115+
XCTAssertEqual(feature.testBias(.enabled)?.rawValue, 80)
116+
XCTAssertEqual(feature.testBias(.disabled)?.rawValue, 20)
117+
}
118+
119+
func testWhenTestVariationsAreDisabledAndEnabledThenTypeIsFeatureFlagAB() {
120+
let featureConfiguration =
121+
"""
122+
[{
123+
"name": "Example Feature A/B Test",
124+
"enabled": false,
125+
"test-variations": ["Disabled", "Enabled"]
126+
}]
127+
"""
128+
let decoder = JSONDecoder()
129+
guard let featuresData = featureConfiguration.data(using: .utf8),
130+
let features = try? decoder.decode([Feature].self, from: featuresData),
131+
let feature = features.first else {
132+
XCTAssert(false, "Fail")
133+
return
134+
}
135+
XCTAssertEqual(feature.type, .featureTest(.featureFlagAB))
136+
}
137+
138+
func testWhenTestVariationsAreDisabled_EnabledAndBiasesAre80_20ThenEnabledBiasIs20() {
139+
let featureConfiguration =
140+
"""
141+
[{
142+
"name": "Example Feature A/B Test",
143+
"enabled": true,
144+
"test-biases": [80, 20],
145+
"test-variations": ["Disabled", "Enabled"]
146+
}]
147+
"""
148+
let decoder = JSONDecoder()
149+
guard let featuresData = featureConfiguration.data(using: .utf8),
150+
let features = try? decoder.decode([Feature].self, from: featuresData),
151+
let feature = features.first else {
152+
XCTAssert(false, "Fail")
153+
return
154+
}
155+
XCTAssertEqual(feature.testVariations.count, 2)
156+
XCTAssertEqual(feature.testBias(.enabled)?.rawValue, 20)
157+
XCTAssertEqual(feature.testBias(.disabled)?.rawValue, 80)
158+
}
159+
160+
func testWhenTestVariationsAreAAndBThenTypeIsFeatureTestAB() {
161+
let featureConfiguration =
162+
"""
163+
[{
164+
"name": "Example Feature A/B Test",
165+
"enabled": false,
166+
"test-variations": ["A", "B"]
167+
}]
168+
"""
169+
let decoder = JSONDecoder()
170+
guard let featuresData = featureConfiguration.data(using: .utf8),
171+
let features = try? decoder.decode([Feature].self, from: featuresData),
172+
let feature = features.first else {
173+
XCTAssert(false, "Fail")
174+
return
175+
}
176+
XCTAssertEqual(feature.type, .featureTest(.ab))
177+
}
78178
}

FeatureFlags/Classes/Model/Feature.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,9 @@ public struct Feature {
176176
}
177177

178178
func testBias(_ testVariation: Test.Variation) -> Percentage? {
179-
guard enabled else { return Percentage.min }
179+
guard enabled else {
180+
return Percentage.min
181+
}
180182
guard let testBiasForVariation = zip(testVariations, testBiases).first(where: { pair in
181183
let currentTestVariation = pair.0
182184
return currentTestVariation == testVariation

FeatureFlags/Classes/Model/FeatureType.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,13 @@ public enum FeatureType {
1414
case unlockFlag
1515

1616
public static var all: [FeatureType] {
17-
return [.featureFlag, .featureTest(.ab), .featureTest(.featureFlagAB),
18-
.featureTest(.mvt), .unlockFlag]
17+
return [
18+
.featureFlag,
19+
.featureTest(.ab),
20+
.featureTest(.featureFlagAB),
21+
.featureTest(.mvt),
22+
.unlockFlag
23+
]
1924
}
2025
}
2126

0 commit comments

Comments
 (0)