Skip to content

Commit d77173d

Browse files
wip: add cmab property to experiment (#599)
1 parent f0c90a9 commit d77173d

File tree

7 files changed

+164
-3
lines changed

7 files changed

+164
-3
lines changed

OptimizelySwiftSDK.xcodeproj/project.pbxproj

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2074,6 +2074,24 @@
20742074
98AC985F2DBA6721001405DD /* OptimizelyUserContextTests_Decide_With_Holdouts_Reasons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98AC985D2DBA6721001405DD /* OptimizelyUserContextTests_Decide_With_Holdouts_Reasons.swift */; };
20752075
98D5AE842DBB91C0000D5844 /* OptimizelyUserContextTests_Decide_Holdouts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98D5AE832DBB91C0000D5844 /* OptimizelyUserContextTests_Decide_Holdouts.swift */; };
20762076
98D5AE852DBB91C0000D5844 /* OptimizelyUserContextTests_Decide_Holdouts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98D5AE832DBB91C0000D5844 /* OptimizelyUserContextTests_Decide_Holdouts.swift */; };
2077+
98F28A1D2E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2078+
98F28A1E2E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2079+
98F28A1F2E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2080+
98F28A202E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2081+
98F28A212E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2082+
98F28A222E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2083+
98F28A232E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2084+
98F28A242E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2085+
98F28A252E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2086+
98F28A262E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2087+
98F28A272E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2088+
98F28A282E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2089+
98F28A292E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2090+
98F28A2A2E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2091+
98F28A2B2E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2092+
98F28A2C2E01940500A86546 /* Cmab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A1C2E01940500A86546 /* Cmab.swift */; };
2093+
98F28A2E2E01968000A86546 /* CmabTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A2D2E01968000A86546 /* CmabTests.swift */; };
2094+
98F28A3E2E01AC0700A86546 /* CmabTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F28A2D2E01968000A86546 /* CmabTests.swift */; };
20772095
BD1C3E8524E4399C0084B4DA /* SemanticVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B97DD93249D327F003DE606 /* SemanticVersion.swift */; };
20782096
BD64853C2491474500F30986 /* Optimizely.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E75167A22C520D400B2B157 /* Optimizely.h */; settings = {ATTRIBUTES = (Public, ); }; };
20792097
BD64853E2491474500F30986 /* Audience.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E75169822C520D400B2B157 /* Audience.swift */; };
@@ -2525,6 +2543,8 @@
25252543
98AC98482DB8FC29001405DD /* DecisionServiceTests_Holdouts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecisionServiceTests_Holdouts.swift; sourceTree = "<group>"; };
25262544
98AC985D2DBA6721001405DD /* OptimizelyUserContextTests_Decide_With_Holdouts_Reasons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyUserContextTests_Decide_With_Holdouts_Reasons.swift; sourceTree = "<group>"; };
25272545
98D5AE832DBB91C0000D5844 /* OptimizelyUserContextTests_Decide_Holdouts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyUserContextTests_Decide_Holdouts.swift; sourceTree = "<group>"; };
2546+
98F28A1C2E01940500A86546 /* Cmab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cmab.swift; sourceTree = "<group>"; };
2547+
98F28A2D2E01968000A86546 /* CmabTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmabTests.swift; sourceTree = "<group>"; };
25282548
BD6485812491474500F30986 /* Optimizely.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Optimizely.framework; sourceTree = BUILT_PRODUCTS_DIR; };
25292549
C78CAF572445AD8D009FE876 /* OptimizelyJSON.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyJSON.swift; sourceTree = "<group>"; };
25302550
C78CAF652446DB91009FE876 /* OptimizelyClientTests_OptimizelyJSON.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyClientTests_OptimizelyJSON.swift; sourceTree = "<group>"; };
@@ -2907,6 +2927,7 @@
29072927
6E75169222C520D400B2B157 /* Project.swift */,
29082928
98AC97E12DAE4579001405DD /* HoldoutConfig.swift */,
29092929
6E75169322C520D400B2B157 /* Experiment.swift */,
2930+
98F28A1C2E01940500A86546 /* Cmab.swift */,
29102931
980CC9072D833F2800E07D24 /* ExperimentCore.swift */,
29112932
980CC8F62D833F0D00E07D24 /* Holdout.swift */,
29122933
6E75169422C520D400B2B157 /* FeatureFlag.swift */,
@@ -3109,6 +3130,7 @@
31093130
982C071E2D8C82AE0068B1FF /* HoldoutTests.swift */,
31103131
6E7519AC22C5211100B2B157 /* ExperimentTests.swift */,
31113132
6E7519AD22C5211100B2B157 /* EventTests.swift */,
3133+
98F28A2D2E01968000A86546 /* CmabTests.swift */,
31123134
6E7519AE22C5211100B2B157 /* ConditionHolderTests.swift */,
31133135
6E7519AF22C5211100B2B157 /* TrafficAllocationTests.swift */,
31143136
6E7519B022C5211100B2B157 /* ProjectTests.swift */,
@@ -4319,6 +4341,7 @@
43194341
6E14CD892423F9A100010234 /* ConditionLeaf.swift in Sources */,
43204342
6E14CD9F2423F9C300010234 /* ArrayEventForDispatch+Extension.swift in Sources */,
43214343
6E14CD9C2423F9C300010234 /* OPTDecisionService.swift in Sources */,
4344+
98F28A202E01940500A86546 /* Cmab.swift in Sources */,
43224345
6E14CD8A2423F9A100010234 /* ConditionHolder.swift in Sources */,
43234346
6E14CD9E2423F9C300010234 /* OPTBucketer.swift in Sources */,
43244347
6E14CD742423F97200010234 /* OptimizelyConfig.swift in Sources */,
@@ -4397,6 +4420,7 @@
43974420
984FE5112CC8AA88004F6F41 /* UserProfileTracker.swift in Sources */,
43984421
845945C2287758A000D13E11 /* OdpConfig.swift in Sources */,
43994422
6E424D1426324B620081004A /* OPTNotificationCenter.swift in Sources */,
4423+
98F28A212E01940500A86546 /* Cmab.swift in Sources */,
44004424
6E424D5026324C4D0081004A /* OptimizelyDecideOption.swift in Sources */,
44014425
6E424D5126324C4D0081004A /* OptimizelyDecision.swift in Sources */,
44024426
6E424D1526324B620081004A /* DataStoreQueueStack.swift in Sources */,
@@ -4496,6 +4520,7 @@
44964520
6E75179722C520D400B2B157 /* DataStoreQueueStackImpl+Extension.swift in Sources */,
44974521
6E7518DD22C520D400B2B157 /* ConditionLeaf.swift in Sources */,
44984522
6E75187D22C520D400B2B157 /* TrafficAllocation.swift in Sources */,
4523+
98F28A252E01940500A86546 /* Cmab.swift in Sources */,
44994524
C78CAFA524486E0A009FE876 /* OptimizelyJSON+ObjC.swift in Sources */,
45004525
6E75185922C520D400B2B157 /* FeatureVariable.swift in Sources */,
45014526
6E4544AB270E67C800F2CEBC /* NetworkReachability.swift in Sources */,
@@ -4637,6 +4662,7 @@
46374662
6E7517DC22C520D400B2B157 /* DefaultNotificationCenter.swift in Sources */,
46384663
6E75178622C520D400B2B157 /* ArrayEventForDispatch+Extension.swift in Sources */,
46394664
6E75171A22C520D400B2B157 /* OptimizelyClient+ObjC.swift in Sources */,
4665+
98F28A2C2E01940500A86546 /* Cmab.swift in Sources */,
46404666
6ECB60D2234D5D9C00016D41 /* OptimizelyConfig+ObjC.swift in Sources */,
46414667
6E75192C22C520D500B2B157 /* DataStoreQueueStack.swift in Sources */,
46424668
6E7517AA22C520D400B2B157 /* Array+Extension.swift in Sources */,
@@ -4676,6 +4702,7 @@
46764702
6E75174622C520D400B2B157 /* HandlerRegistryService.swift in Sources */,
46774703
6E75181422C520D400B2B157 /* DataStoreQueueStackImpl.swift in Sources */,
46784704
6E593FB625BB9C5500EC72BC /* OptimizelyClientTests_Decide.swift in Sources */,
4705+
98F28A292E01940500A86546 /* Cmab.swift in Sources */,
46794706
6E7516C222C520D400B2B157 /* DefaultEventDispatcher.swift in Sources */,
46804707
980CC8FC2D833F0D00E07D24 /* Holdout.swift in Sources */,
46814708
848617F22863E21200B7F41B /* OdpEventApiManager.swift in Sources */,
@@ -4810,6 +4837,7 @@
48104837
6E75176122C520D400B2B157 /* AtomicProperty.swift in Sources */,
48114838
6E75180B22C520D400B2B157 /* DataStoreFile.swift in Sources */,
48124839
6E6522E9278E4F3800954EA1 /* OdpManager.swift in Sources */,
4840+
98F28A272E01940500A86546 /* Cmab.swift in Sources */,
48134841
6EF8DE2324BD1BB2008B9488 /* OptimizelyDecideOption.swift in Sources */,
48144842
6E7517C322C520D400B2B157 /* DefaultDatafileHandler.swift in Sources */,
48154843
6E75190722C520D500B2B157 /* Attribute.swift in Sources */,
@@ -4944,6 +4972,7 @@
49444972
6E75180122C520D400B2B157 /* DataStoreUserDefaults.swift in Sources */,
49454973
98AC98472DB7B762001405DD /* BucketTests_HoldoutToVariation.swift in Sources */,
49464974
6E75175722C520D400B2B157 /* LogMessage.swift in Sources */,
4975+
98F28A242E01940500A86546 /* Cmab.swift in Sources */,
49474976
6E7516EB22C520D400B2B157 /* OPTEventDispatcher.swift in Sources */,
49484977
6E75188522C520D400B2B157 /* TrafficAllocation.swift in Sources */,
49494978
6E75176F22C520D400B2B157 /* Utils.swift in Sources */,
@@ -5082,6 +5111,7 @@
50825111
6E86CEAE24FDC84A005DAFED /* OptimizelyUserContext+ObjC.swift in Sources */,
50835112
6E9B119922C5488300C22D81 /* UserAttributeTests_Evaluate.swift in Sources */,
50845113
6E9B11A422C5488300C22D81 /* ProjectTests.swift in Sources */,
5114+
98F28A3E2E01AC0700A86546 /* CmabTests.swift in Sources */,
50855115
6E9B119622C5488300C22D81 /* AudienceTests.swift in Sources */,
50865116
6E7518B622C520D400B2B157 /* Group.swift in Sources */,
50875117
6E7516D422C520D400B2B157 /* OPTLogger.swift in Sources */,
@@ -5104,6 +5134,7 @@
51045134
8464087E28130D3200CCF97D /* Integration.swift in Sources */,
51055135
6E9B119722C5488300C22D81 /* ConditionLeafTests.swift in Sources */,
51065136
6E75184A22C520D400B2B157 /* Event.swift in Sources */,
5137+
98F28A262E01940500A86546 /* Cmab.swift in Sources */,
51075138
6E75191622C520D500B2B157 /* BackgroundingCallbacks.swift in Sources */,
51085139
848617D62863DC2700B7F41B /* OdpSegmentManager.swift in Sources */,
51095140
6E9B11A522C5488300C22D81 /* ConditionHolderTests_Evaluate.swift in Sources */,
@@ -5227,6 +5258,7 @@
52275258
6E7517EF22C520D400B2B157 /* DataStoreMemory.swift in Sources */,
52285259
6E75194B22C520D500B2B157 /* OPTDatafileHandler.swift in Sources */,
52295260
6E75195722C520D500B2B157 /* OPTBucketer.swift in Sources */,
5261+
98F28A2A2E01940500A86546 /* Cmab.swift in Sources */,
52305262
6E75181322C520D400B2B157 /* DataStoreQueueStackImpl.swift in Sources */,
52315263
6EC6DD6924AE94820017D296 /* OptimizelyUserContextTests.swift in Sources */,
52325264
6E75171522C520D400B2B157 /* OptimizelyClient+ObjC.swift in Sources */,
@@ -5363,6 +5395,7 @@
53635395
6E75182122C520D400B2B157 /* BatchEventBuilder.swift in Sources */,
53645396
6E86CEA924FDC847005DAFED /* OptimizelyUserContext+ObjC.swift in Sources */,
53655397
6E9B118322C5488100C22D81 /* UserAttributeTests_Evaluate.swift in Sources */,
5398+
98F28A1D2E01940500A86546 /* Cmab.swift in Sources */,
53665399
6E9B118E22C5488100C22D81 /* ProjectTests.swift in Sources */,
53675400
6E9B118022C5488100C22D81 /* AudienceTests.swift in Sources */,
53685401
6E7518B122C520D400B2B157 /* Group.swift in Sources */,
@@ -5372,6 +5405,7 @@
53725405
84640881281320F000CCF97D /* IntegrationTests.swift in Sources */,
53735406
6E9B118222C5488100C22D81 /* AudienceTests_Evaluate.swift in Sources */,
53745407
6E75191D22C520D500B2B157 /* OPTNotificationCenter.swift in Sources */,
5408+
98F28A2E2E01968000A86546 /* CmabTests.swift in Sources */,
53755409
6E75176B22C520D400B2B157 /* Utils.swift in Sources */,
53765410
6E7516DB22C520D400B2B157 /* OPTUserProfileService.swift in Sources */,
53775411
6E34A61C2319EBB800BAE302 /* Notifications.swift in Sources */,
@@ -5469,6 +5503,7 @@
54695503
6EC6DD3924ABF6990017D296 /* OptimizelyClient+Decide.swift in Sources */,
54705504
6E75179C22C520D400B2B157 /* DataStoreQueueStackImpl+Extension.swift in Sources */,
54715505
6E7516D022C520D400B2B157 /* OPTLogger.swift in Sources */,
5506+
98F28A2B2E01940500A86546 /* Cmab.swift in Sources */,
54725507
6E7518B222C520D400B2B157 /* Group.swift in Sources */,
54735508
6EF8DE3924BF7D69008B9488 /* DecisionReasons.swift in Sources */,
54745509
6E424BE6263228E90081004A /* AtomicArray.swift in Sources */,
@@ -5575,6 +5610,7 @@
55755610
6EC6DD3E24ABF6990017D296 /* OptimizelyClient+Decide.swift in Sources */,
55765611
6E7517A122C520D400B2B157 /* DataStoreQueueStackImpl+Extension.swift in Sources */,
55775612
6E7516D522C520D400B2B157 /* OPTLogger.swift in Sources */,
5613+
98F28A1E2E01940500A86546 /* Cmab.swift in Sources */,
55785614
6E7518B722C520D400B2B157 /* Group.swift in Sources */,
55795615
6EF8DE3E24BF7D69008B9488 /* DecisionReasons.swift in Sources */,
55805616
6E424BEB263228E90081004A /* AtomicArray.swift in Sources */,
@@ -5709,6 +5745,7 @@
57095745
6E7518D022C520D400B2B157 /* AttributeValue.swift in Sources */,
57105746
6E75181C22C520D400B2B157 /* BatchEventBuilder.swift in Sources */,
57115747
6E7518DC22C520D400B2B157 /* ConditionLeaf.swift in Sources */,
5748+
98F28A1F2E01940500A86546 /* Cmab.swift in Sources */,
57125749
C78CAFA424486E0A009FE876 /* OptimizelyJSON+ObjC.swift in Sources */,
57135750
6E7517F822C520D400B2B157 /* DataStoreUserDefaults.swift in Sources */,
57145751
6E4544AA270E67C800F2CEBC /* NetworkReachability.swift in Sources */,
@@ -5850,6 +5887,7 @@
58505887
6E7517D622C520D400B2B157 /* DefaultNotificationCenter.swift in Sources */,
58515888
6E75178022C520D400B2B157 /* ArrayEventForDispatch+Extension.swift in Sources */,
58525889
6E75171422C520D400B2B157 /* OptimizelyClient+ObjC.swift in Sources */,
5890+
98F28A232E01940500A86546 /* Cmab.swift in Sources */,
58535891
6ECB60CC234D5D9C00016D41 /* OptimizelyConfig+ObjC.swift in Sources */,
58545892
6E75192622C520D500B2B157 /* DataStoreQueueStack.swift in Sources */,
58555893
6E7517A422C520D400B2B157 /* Array+Extension.swift in Sources */,
@@ -5925,6 +5963,7 @@
59255963
75C71A2925E454460084187E /* ProjectConfig.swift in Sources */,
59265964
75C71A2A25E454460084187E /* FeatureVariable.swift in Sources */,
59275965
75C71A2B25E454460084187E /* Rollout.swift in Sources */,
5966+
98F28A282E01940500A86546 /* Cmab.swift in Sources */,
59285967
984FE51B2CC8AA88004F6F41 /* UserProfileTracker.swift in Sources */,
59295968
6E424BFF263228FD0081004A /* AtomicDictionary.swift in Sources */,
59305969
75C71A2C25E454460084187E /* Variation.swift in Sources */,
@@ -6011,6 +6050,7 @@
60116050
BD6485582491474500F30986 /* AttributeValue.swift in Sources */,
60126051
BD6485592491474500F30986 /* BatchEventBuilder.swift in Sources */,
60136052
BD64855A2491474500F30986 /* ConditionLeaf.swift in Sources */,
6053+
98F28A222E01940500A86546 /* Cmab.swift in Sources */,
60146054
BD64855B2491474500F30986 /* OptimizelyJSON+ObjC.swift in Sources */,
60156055
BD64855C2491474500F30986 /* DataStoreUserDefaults.swift in Sources */,
60166056
6E4544AC270E67C800F2CEBC /* NetworkReachability.swift in Sources */,

Sources/Data Model/Cmab.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//
2+
// Copyright 2022, 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+
17+
import Foundation
18+
19+
struct Cmab: Codable, Equatable {
20+
var trafficAllocation: Int
21+
var attributeIds: [String]
22+
}

Sources/Data Model/Experiment.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,10 @@ struct Experiment: Codable, ExperimentCore {
3535
var audienceConditions: ConditionHolder?
3636
// datafile spec defines this as [String: Any]. Supposed to be [ExperimentKey: VariationKey]
3737
var forcedVariations: [String: String]
38+
var cmab: Cmab?
3839

3940
enum CodingKeys: String, CodingKey {
40-
case id, key, status, layerId, variations, trafficAllocation, audienceIds, audienceConditions, forcedVariations
41+
case id, key, status, layerId, variations, trafficAllocation, audienceIds, audienceConditions, forcedVariations, cmab
4142
}
4243

4344
// MARK: - OptimizelyConfig
@@ -57,7 +58,8 @@ extension Experiment: Equatable {
5758
lhs.trafficAllocation == rhs.trafficAllocation &&
5859
lhs.audienceIds == rhs.audienceIds &&
5960
lhs.audienceConditions == rhs.audienceConditions &&
60-
lhs.forcedVariations == rhs.forcedVariations
61+
lhs.forcedVariations == rhs.forcedVariations &&
62+
lhs.cmab == rhs.cmab
6163
}
6264
}
6365

Sources/Data Model/ProjectConfig.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class ProjectConfig {
3434
var experimentFeatureMap = [String: [String]]()
3535
var eventKeyMap = [String: Event]()
3636
var attributeKeyMap = [String: Attribute]()
37+
var attributeIdMap = [String: Attribute]()
3738
var featureFlagKeyMap = [String: FeatureFlag]()
3839
var featureFlagKeys = [String]()
3940
var rolloutIdMap = [String: Rollout]()
@@ -113,6 +114,12 @@ class ProjectConfig {
113114
return map
114115
}()
115116

117+
self.attributeIdMap = {
118+
var map = [String: Attribute]()
119+
project.attributes.forEach { map[$0.id] = $0 }
120+
return map
121+
}()
122+
116123
self.featureFlagKeyMap = {
117124
var map = [String: FeatureFlag]()
118125
project.featureFlags.forEach { map[$0.key] = $0 }
@@ -306,6 +313,13 @@ extension ProjectConfig {
306313
return attributeKeyMap[key]
307314
}
308315

316+
/**
317+
* Get an attribute for a given id.
318+
*/
319+
func getAttribute(id: String) -> Attribute? {
320+
return attributeIdMap[id]
321+
}
322+
309323
/**
310324
* Get an attribute Id for a given key.
311325
**/
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//
2+
// Copyright 2022, 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+
17+
import XCTest
18+
19+
class CmabTests: XCTestCase {
20+
static var sampleData: [String: Any] = ["trafficAllocation": 10000, "attributeIds": ["id_1", "id_2"]]
21+
22+
func testDecodeSuccessValidJson() {
23+
let data = Self.sampleData
24+
let cmab: Cmab = try! OTUtils.model(from: data)
25+
XCTAssertEqual(cmab.attributeIds, ["id_1", "id_2"])
26+
XCTAssertEqual(cmab.trafficAllocation, 10000)
27+
}
28+
29+
func testDecodeSuccessEmptyIds() {
30+
var data = Self.sampleData
31+
data["attributeIds"] = []
32+
let cmab: Cmab = try! OTUtils.model(from: data)
33+
XCTAssertEqual(cmab.attributeIds, [])
34+
XCTAssertEqual(cmab.trafficAllocation, 10000)
35+
}
36+
37+
func testDecodFailedWithoutTrafficAllocation() {
38+
let data = ["attributeIds": ["id_1", "id_2"]]
39+
let cmab: Cmab? = try? OTUtils.model(from: data)
40+
XCTAssertNil(cmab)
41+
}
42+
43+
func testDecodFailedWithoutAttributeIds() {
44+
let data = ["trafficAllocation": 10000]
45+
let cmab: Cmab? = try? OTUtils.model(from: data)
46+
XCTAssertNil(cmab)
47+
}
48+
}

0 commit comments

Comments
 (0)