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