@@ -257,6 +257,64 @@ class OptimizelyClientTests_OptimizelyConfig: XCTestCase {
257257 let result = try ? self . optimizely. getOptimizelyConfig ( )
258258 XCTAssertNil ( result)
259259 }
260+
261+ func testOptimizelyConfigWithDuplicateKeys( ) {
262+ let exp0 : [ String : Any ] = [
263+ " id " : " 10001 " ,
264+ " key " : " duplicate_key " ,
265+ " status " : " Running " ,
266+ " layerId " : " 22222 " ,
267+ " variations " : [ ] ,
268+ " trafficAllocation " : [ ] ,
269+ " audienceIds " : [ " 33333 " ] ,
270+ " audienceConditions " : [ ] ,
271+ " forcedVariations " : [ " 12345 " : " 1234567890 " ]
272+ ]
273+
274+ let exp1 : [ String : Any ] = [
275+ " id " : " 10005 " ,
276+ " key " : " duplicate_key " ,
277+ " status " : " Running " ,
278+ " layerId " : " 22222 " ,
279+ " variations " : [ ] ,
280+ " trafficAllocation " : [ ] ,
281+ " audienceIds " : [ " 33333 " ] ,
282+ " audienceConditions " : [ ] ,
283+ " forcedVariations " : [ " 12345 " : " 1234567890 " ]
284+ ]
285+
286+ var projectData : [ String : Any ] = [
287+ " version " : " 4 " ,
288+ " projectId " : " 11111 " ,
289+ " experiments " : [ ] ,
290+ " audiences " : [ ] ,
291+ " groups " : [ ] ,
292+ " attributes " : [ ] ,
293+ " accountId " : " 1234567890 " ,
294+ " events " : [ ] ,
295+ " revision " : " 5 " ,
296+ " anonymizeIP " : true ,
297+ " rollouts " : [ ] ,
298+ " typedAudiences " : [ ] ,
299+ " integrations " : [ ] ,
300+ " featureFlags " : [ ] ,
301+ " botFiltering " : false ,
302+ " sendFlagDecisions " : true
303+ ]
304+
305+ projectData [ " experiments " ] = [ exp0, exp1]
306+ let model : Project = try ! OTUtils . model ( from: projectData)
307+ let projectConfig = ProjectConfig ( )
308+ projectConfig. project = model
309+
310+ let logger = TestLogger ( )
311+ let optiConfigImpl = OptimizelyConfigImp ( projectConfig: projectConfig, logger: logger)
312+ let optimizelyExpMap : [ String : OptimizelyExperiment ] = optiConfigImpl. experimentsMap
313+ XCTAssertEqual ( logger. getMessages ( . warning) , [ " Duplicate experiment keys found in datafile: duplicate_key " ] )
314+
315+ XCTAssertEqual ( optimizelyExpMap. count, 1 )
316+ XCTAssertEqual ( optimizelyExpMap [ " duplicate_key " ] ? . id, " 10005 " )
317+ }
260318
261319}
262320
@@ -365,3 +423,41 @@ extension OptimizelyEvent {
365423 }
366424}
367425
426+ // MARK: - Mock Loggers
427+
428+ fileprivate class TestLogger : OPTLogger {
429+ private static var _logLevel : OptimizelyLogLevel ?
430+ public static var logLevel : OptimizelyLogLevel {
431+ get {
432+ return _logLevel ?? . info
433+ }
434+ set ( newLevel) {
435+ _logLevel = newLevel
436+ }
437+ }
438+
439+ required public init ( ) {
440+ clearMessages ( )
441+ }
442+
443+ func log( level: OptimizelyLogLevel , message: String ) {
444+ logMessages [ level. rawValue] . append ( message)
445+ }
446+
447+ // Utils
448+
449+ var logMessages = [ [ String] ] ( )
450+
451+ var logCount : Int {
452+ return logMessages. reduce ( 0 ) { $0 + $1. count }
453+ }
454+
455+ func getMessages( _ level: OptimizelyLogLevel ) -> [ String ] {
456+ return logMessages [ level. rawValue]
457+ }
458+
459+ func clearMessages( ) {
460+ logMessages = [ [ String] ] ( repeating: [ ] , count: OptimizelyLogLevel . debug. rawValue + 1 )
461+ }
462+
463+ }
0 commit comments