@@ -257,6 +257,64 @@ class OptimizelyClientTests_OptimizelyConfig: XCTestCase {
257
257
let result = try ? self . optimizely. getOptimizelyConfig ( )
258
258
XCTAssertNil ( result)
259
259
}
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
+ }
260
318
261
319
}
262
320
@@ -365,3 +423,41 @@ extension OptimizelyEvent {
365
423
}
366
424
}
367
425
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