prebid.js 6.2.0 → 6.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.circleci/config.yml +1 -1
- package/gulpfile.js +87 -82
- package/integrationExamples/gpt/weboramaRtdProvider_example.html +23 -14
- package/karma.conf.maker.js +1 -1
- package/modules/.submodules.json +2 -1
- package/modules/33acrossBidAdapter.js +189 -102
- package/modules/adagioBidAdapter.js +1 -1
- package/modules/addefendBidAdapter.js +1 -0
- package/modules/adkernelBidAdapter.js +148 -62
- package/modules/adlooxAdServerVideo.js +2 -2
- package/modules/adlooxAnalyticsAdapter.js +4 -4
- package/modules/admanBidAdapter.js +11 -4
- package/modules/admixerBidAdapter.js +1 -1
- package/modules/adnuntiusBidAdapter.js +3 -1
- package/modules/adomikAnalyticsAdapter.js +27 -9
- package/modules/adqueryIdSystem.js +103 -0
- package/modules/adqueryIdSystem.md +35 -0
- package/modules/adxcgBidAdapter.js +311 -359
- package/modules/adxcgBidAdapter.md +22 -21
- package/modules/adyoulikeBidAdapter.js +13 -9
- package/modules/aniviewBidAdapter.js +1 -1
- package/modules/appnexusBidAdapter.js +0 -1
- package/modules/beopBidAdapter.js +6 -4
- package/modules/bidViewability.js +3 -3
- package/modules/bidViewabilityIO.js +3 -3
- package/modules/bliinkBidAdapter.js +3 -2
- package/modules/colossussspBidAdapter.js +7 -0
- package/modules/compassBidAdapter.js +208 -0
- package/modules/compassBidAdapter.md +79 -0
- package/modules/consentManagement.js +7 -1
- package/modules/criteoBidAdapter.js +1 -1
- package/modules/criteoIdSystem.js +29 -7
- package/modules/currency.js +2 -2
- package/modules/cwireBidAdapter.js +3 -0
- package/modules/dailyhuntBidAdapter.js +435 -0
- package/modules/dailyhuntBidAdapter.md +4 -0
- package/modules/docereeBidAdapter.js +10 -1
- package/modules/docereeBidAdapter.md +2 -0
- package/modules/dspxBidAdapter.js +1 -1
- package/modules/engageyaBidAdapter.js +1 -1
- package/modules/feedadBidAdapter.js +2 -2
- package/modules/feedadBidAdapter.md +4 -2
- package/modules/futureads.md +48 -0
- package/modules/glimpseBidAdapter.js +82 -47
- package/modules/gptPreAuction.js +55 -7
- package/modules/gridBidAdapter.js +4 -3
- package/modules/gumgumBidAdapter.js +2 -2
- package/modules/idImportLibrary.js +45 -8
- package/modules/idImportLibrary.md +4 -0
- package/modules/improvedigitalBidAdapter.js +42 -4
- package/modules/instreamTracking.js +4 -4
- package/modules/invibesBidAdapter.js +49 -5
- package/modules/invibesBidAdapter.md +2 -1
- package/modules/ixBidAdapter.js +53 -18
- package/modules/kinessoIdSystem.js +1 -1
- package/modules/limelightDigitalBidAdapter.js +2 -1
- package/modules/livewrappedAnalyticsAdapter.js +3 -1
- package/modules/livewrappedBidAdapter.js +8 -2
- package/modules/loglyliftBidAdapter.js +79 -0
- package/modules/loglyliftBidAdapter.md +55 -0
- package/modules/lotamePanoramaIdSystem.js +80 -8
- package/modules/mediasquareBidAdapter.js +1 -9
- package/modules/nextMillenniumBidAdapter.js +39 -7
- package/modules/oguryBidAdapter.js +9 -2
- package/modules/onetagBidAdapter.js +4 -2
- package/modules/optimeraRtdProvider.js +8 -1
- package/modules/ozoneBidAdapter.js +21 -64
- package/modules/prebidServerBidAdapter/index.js +16 -12
- package/modules/proxistoreBidAdapter.js +0 -2
- package/modules/pubgeniusBidAdapter.js +1 -1
- package/modules/pubmaticAnalyticsAdapter.js +16 -0
- package/modules/pubxaiAnalyticsAdapter.js +17 -0
- package/modules/richaudienceBidAdapter.js +4 -4
- package/modules/riseBidAdapter.js +1 -1
- package/modules/rtbhouseBidAdapter.js +14 -4
- package/modules/rtdModule/index.js +49 -18
- package/modules/rubiconBidAdapter.js +31 -19
- package/modules/sharedIdSystem.js +27 -1
- package/modules/showheroes-bsBidAdapter.js +13 -2
- package/modules/tappxBidAdapter.js +8 -5
- package/modules/targetVideoBidAdapter.js +187 -0
- package/modules/targetVideoBidAdapter.md +34 -0
- package/modules/teadsBidAdapter.js +1 -2
- package/modules/telariaBidAdapter.js +2 -2
- package/modules/trustxBidAdapter.js +8 -16
- package/modules/userId/eids.js +7 -1
- package/modules/userId/userId.md +8 -0
- package/modules/vidoomyBidAdapter.js +16 -10
- package/modules/weboramaRtdProvider.js +288 -73
- package/modules/weboramaRtdProvider.md +27 -10
- package/modules/welectBidAdapter.js +106 -0
- package/modules/yahoosspBidAdapter.js +5 -1
- package/modules/yieldmoBidAdapter.js +23 -5
- package/modules/zetaSspBidAdapter.md +33 -1
- package/modules/zeta_global_sspAnalyticsAdapter.js +97 -0
- package/modules/zeta_global_sspAnalyticsAdapter.md +24 -0
- package/modules/zeta_global_sspBidAdapter.js +22 -1
- package/package.json +1 -1
- package/plugins/pbjsGlobals.js +28 -1
- package/src/auction.js +2 -2
- package/src/config.js +27 -3
- package/src/hook.js +5 -1
- package/src/prebid.js +21 -6
- package/src/targeting.js +22 -1
- package/src/utils.js +46 -8
- package/test/helpers/prebidGlobal.js +1 -0
- package/test/spec/config_spec.js +279 -0
- package/test/spec/modules/33acrossBidAdapter_spec.js +300 -78
- package/test/spec/modules/adlooxAnalyticsAdapter_spec.js +6 -6
- package/test/spec/modules/admanBidAdapter_spec.js +2 -2
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +17 -0
- package/test/spec/modules/adomikAnalyticsAdapter_spec.js +9 -1
- package/test/spec/modules/adqueryIdSystem_spec.js +74 -0
- package/test/spec/modules/adxcgBidAdapter_spec.js +820 -571
- package/test/spec/modules/adyoulikeBidAdapter_spec.js +49 -0
- package/test/spec/modules/beopBidAdapter_spec.js +1 -1
- package/test/spec/modules/bidViewabilityIO_spec.js +2 -2
- package/test/spec/modules/bidViewability_spec.js +4 -4
- package/test/spec/modules/bliinkBidAdapter_spec.js +2 -0
- package/test/spec/modules/colossussspBidAdapter_spec.js +9 -0
- package/test/spec/modules/compassBidAdapter_spec.js +398 -0
- package/test/spec/modules/consentManagement_spec.js +20 -0
- package/test/spec/modules/criteoIdSystem_spec.js +6 -3
- package/test/spec/modules/cwireBidAdapter_spec.js +10 -8
- package/test/spec/modules/dailyhuntBidAdapter_spec.js +404 -0
- package/test/spec/modules/docereeBidAdapter_spec.js +9 -1
- package/test/spec/modules/eids_spec.js +15 -0
- package/test/spec/modules/feedadBidAdapter_spec.js +15 -0
- package/test/spec/modules/glimpseBidAdapter_spec.js +0 -18
- package/test/spec/modules/gptPreAuction_spec.js +177 -2
- package/test/spec/modules/idImportLibrary_spec.js +197 -10
- package/test/spec/modules/improvedigitalBidAdapter_spec.js +45 -1
- package/test/spec/modules/invibesBidAdapter_spec.js +119 -0
- package/test/spec/modules/ixBidAdapter_spec.js +112 -62
- package/test/spec/modules/limelightDigitalBidAdapter_spec.js +75 -17
- package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +22 -0
- package/test/spec/modules/livewrappedBidAdapter_spec.js +31 -0
- package/test/spec/modules/loglyliftBidAdapter_spec.js +172 -0
- package/test/spec/modules/lotamePanoramaIdSystem_spec.js +227 -0
- package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -4
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +26 -1
- package/test/spec/modules/oguryBidAdapter_spec.js +10 -2
- package/test/spec/modules/optimeraRtdProvider_spec.js +14 -1
- package/test/spec/modules/ozoneBidAdapter_spec.js +43 -31
- package/test/spec/modules/prebidServerBidAdapter_spec.js +43 -0
- package/test/spec/modules/pubgeniusBidAdapter_spec.js +3 -3
- package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +13 -1
- package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +11 -0
- package/test/spec/modules/realTimeDataModule_spec.js +147 -48
- package/test/spec/modules/richaudienceBidAdapter_spec.js +42 -2
- package/test/spec/modules/riseBidAdapter_spec.js +1 -1
- package/test/spec/modules/rtbhouseBidAdapter_spec.js +20 -0
- package/test/spec/modules/rubiconBidAdapter_spec.js +65 -9
- package/test/spec/modules/sharedIdSystem_spec.js +52 -6
- package/test/spec/modules/showheroes-bsBidAdapter_spec.js +2 -0
- package/test/spec/modules/tappxBidAdapter_spec.js +0 -19
- package/test/spec/modules/targetVideoBidAdapter_spec.js +96 -0
- package/test/spec/modules/teadsBidAdapter_spec.js +14 -59
- package/test/spec/modules/userId_spec.js +68 -19
- package/test/spec/modules/weboramaRtdProvider_spec.js +408 -214
- package/test/spec/modules/welectBidAdapter_spec.js +211 -0
- package/test/spec/modules/yahoosspBidAdapter_spec.js +28 -1
- package/test/spec/modules/zeta_global_sspAnalyticsAdapter_spec.js +427 -0
- package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +33 -1
- package/test/spec/unit/core/targeting_spec.js +72 -0
- package/test/spec/unit/pbjs_api_spec.js +3 -1
- package/test/spec/utils_spec.js +38 -0
- package/test/test_deps.js +3 -0
- package/test/test_index.js +1 -3
package/src/utils.js
CHANGED
|
@@ -482,16 +482,43 @@ export function insertElement(elm, doc, target, asLastChildChild) {
|
|
|
482
482
|
} catch (e) {}
|
|
483
483
|
}
|
|
484
484
|
|
|
485
|
+
/**
|
|
486
|
+
* Returns a promise that completes when the given element triggers a 'load' or 'error' DOM event, or when
|
|
487
|
+
* `timeout` milliseconds have elapsed.
|
|
488
|
+
*
|
|
489
|
+
* @param {HTMLElement} element
|
|
490
|
+
* @param {Number} [timeout]
|
|
491
|
+
* @returns {Promise}
|
|
492
|
+
*/
|
|
493
|
+
export function waitForElementToLoad(element, timeout) {
|
|
494
|
+
let timer = null;
|
|
495
|
+
return new Promise((resolve) => {
|
|
496
|
+
const onLoad = function() {
|
|
497
|
+
element.removeEventListener('load', onLoad);
|
|
498
|
+
element.removeEventListener('error', onLoad);
|
|
499
|
+
if (timer != null) {
|
|
500
|
+
window.clearTimeout(timer);
|
|
501
|
+
}
|
|
502
|
+
resolve();
|
|
503
|
+
};
|
|
504
|
+
element.addEventListener('load', onLoad);
|
|
505
|
+
element.addEventListener('error', onLoad);
|
|
506
|
+
if (timeout != null) {
|
|
507
|
+
timer = window.setTimeout(onLoad, timeout);
|
|
508
|
+
}
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
|
|
485
512
|
/**
|
|
486
513
|
* Inserts an image pixel with the specified `url` for cookie sync
|
|
487
514
|
* @param {string} url URL string of the image pixel to load
|
|
488
515
|
* @param {function} [done] an optional exit callback, used when this usersync pixel is added during an async process
|
|
516
|
+
* @param {Number} [timeout] an optional timeout in milliseconds for the image to load before calling `done`
|
|
489
517
|
*/
|
|
490
|
-
export function triggerPixel(url, done) {
|
|
518
|
+
export function triggerPixel(url, done, timeout) {
|
|
491
519
|
const img = new Image();
|
|
492
520
|
if (done && internal.isFn(done)) {
|
|
493
|
-
img.
|
|
494
|
-
img.addEventListener('error', done);
|
|
521
|
+
waitForElementToLoad(img, timeout).then(done);
|
|
495
522
|
}
|
|
496
523
|
img.src = url;
|
|
497
524
|
}
|
|
@@ -539,18 +566,18 @@ export function insertHtmlIntoIframe(htmlCode) {
|
|
|
539
566
|
* @param {string} url URL to be requested
|
|
540
567
|
* @param {string} encodeUri boolean if URL should be encoded before inserted. Defaults to true
|
|
541
568
|
* @param {function} [done] an optional exit callback, used when this usersync pixel is added during an async process
|
|
569
|
+
* @param {Number} [timeout] an optional timeout in milliseconds for the iframe to load before calling `done`
|
|
542
570
|
*/
|
|
543
|
-
export function insertUserSyncIframe(url, done) {
|
|
571
|
+
export function insertUserSyncIframe(url, done, timeout) {
|
|
544
572
|
let iframeHtml = internal.createTrackPixelIframeHtml(url, false, 'allow-scripts allow-same-origin');
|
|
545
573
|
let div = document.createElement('div');
|
|
546
574
|
div.innerHTML = iframeHtml;
|
|
547
575
|
let iframe = div.firstChild;
|
|
548
576
|
if (done && internal.isFn(done)) {
|
|
549
|
-
iframe.
|
|
550
|
-
iframe.addEventListener('error', done);
|
|
577
|
+
waitForElementToLoad(iframe, timeout).then(done);
|
|
551
578
|
}
|
|
552
579
|
internal.insertElement(iframe, document, 'html', true);
|
|
553
|
-
}
|
|
580
|
+
}
|
|
554
581
|
|
|
555
582
|
/**
|
|
556
583
|
* Creates a snippet of HTML that retrieves the specified `url`
|
|
@@ -1245,7 +1272,18 @@ export function mergeDeep(target, ...sources) {
|
|
|
1245
1272
|
if (!target[key]) {
|
|
1246
1273
|
Object.assign(target, { [key]: source[key] });
|
|
1247
1274
|
} else if (isArray(target[key])) {
|
|
1248
|
-
|
|
1275
|
+
source[key].forEach(obj => {
|
|
1276
|
+
let addItFlag = 1;
|
|
1277
|
+
for (let i = 0; i < target[key].length; i++) {
|
|
1278
|
+
if (deepEqual(target[key][i], obj)) {
|
|
1279
|
+
addItFlag = 0;
|
|
1280
|
+
break;
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
if (addItFlag) {
|
|
1284
|
+
target[key].push(obj);
|
|
1285
|
+
}
|
|
1286
|
+
});
|
|
1249
1287
|
}
|
|
1250
1288
|
} else {
|
|
1251
1289
|
Object.assign(target, { [key]: source[key] });
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
window.$$PREBID_GLOBAL$$ = (window.$$PREBID_GLOBAL$$ || {});
|
|
2
|
+
window.$$PREBID_GLOBAL$$.installedModules = (window.$$PREBID_GLOBAL$$.installedModules || []);
|
|
2
3
|
window.$$PREBID_GLOBAL$$.cmd = window.$$PREBID_GLOBAL$$.cmd || [];
|
|
3
4
|
window.$$PREBID_GLOBAL$$.que = window.$$PREBID_GLOBAL$$.que || [];
|
package/test/spec/config_spec.js
CHANGED
|
@@ -7,8 +7,10 @@ const utils = require('src/utils');
|
|
|
7
7
|
let getConfig;
|
|
8
8
|
let setConfig;
|
|
9
9
|
let readConfig;
|
|
10
|
+
let mergeConfig;
|
|
10
11
|
let getBidderConfig;
|
|
11
12
|
let setBidderConfig;
|
|
13
|
+
let mergeBidderConfig;
|
|
12
14
|
let setDefaults;
|
|
13
15
|
|
|
14
16
|
describe('config API', function () {
|
|
@@ -19,8 +21,10 @@ describe('config API', function () {
|
|
|
19
21
|
getConfig = config.getConfig;
|
|
20
22
|
setConfig = config.setConfig;
|
|
21
23
|
readConfig = config.readConfig;
|
|
24
|
+
mergeConfig = config.mergeConfig;
|
|
22
25
|
getBidderConfig = config.getBidderConfig;
|
|
23
26
|
setBidderConfig = config.setBidderConfig;
|
|
27
|
+
mergeBidderConfig = config.mergeBidderConfig;
|
|
24
28
|
setDefaults = config.setDefaults;
|
|
25
29
|
logErrorSpy = sinon.spy(utils, 'logError');
|
|
26
30
|
logWarnSpy = sinon.spy(utils, 'logWarn');
|
|
@@ -345,4 +349,279 @@ describe('config API', function () {
|
|
|
345
349
|
const warning = 'Auction Options given an incorrect param: testing';
|
|
346
350
|
assert.ok(logWarnSpy.calledWith(warning), 'expected warning was logged');
|
|
347
351
|
});
|
|
352
|
+
|
|
353
|
+
it('should merge input with existing global config', function () {
|
|
354
|
+
const obj = {
|
|
355
|
+
ortb2: {
|
|
356
|
+
site: {
|
|
357
|
+
name: 'example',
|
|
358
|
+
domain: 'page.example.com',
|
|
359
|
+
cat: ['IAB2'],
|
|
360
|
+
sectioncat: ['IAB2-2'],
|
|
361
|
+
pagecat: ['IAB2-2']
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
setConfig({ ortb2: {
|
|
366
|
+
user: {
|
|
367
|
+
ext: {
|
|
368
|
+
data: {
|
|
369
|
+
registered: true,
|
|
370
|
+
interests: ['cars']
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
mergeConfig(obj);
|
|
377
|
+
const expected = {
|
|
378
|
+
site: {
|
|
379
|
+
name: 'example',
|
|
380
|
+
domain: 'page.example.com',
|
|
381
|
+
cat: ['IAB2'],
|
|
382
|
+
sectioncat: ['IAB2-2'],
|
|
383
|
+
pagecat: ['IAB2-2']
|
|
384
|
+
},
|
|
385
|
+
user: {
|
|
386
|
+
ext: {
|
|
387
|
+
data: {
|
|
388
|
+
registered: true,
|
|
389
|
+
interests: ['cars']
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
expect(getConfig('ortb2')).to.deep.equal(expected);
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
it('input should take precedence over existing config if keys are the same', function() {
|
|
398
|
+
const input = {
|
|
399
|
+
ortb2: {
|
|
400
|
+
user: {
|
|
401
|
+
ext: {
|
|
402
|
+
data: {
|
|
403
|
+
registered: true,
|
|
404
|
+
interests: ['cars']
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
setConfig({ ortb2: {
|
|
411
|
+
user: {
|
|
412
|
+
ext: {
|
|
413
|
+
data: {
|
|
414
|
+
registered: false
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}});
|
|
419
|
+
mergeConfig(input);
|
|
420
|
+
const expected = {
|
|
421
|
+
user: {
|
|
422
|
+
ext: {
|
|
423
|
+
data: {
|
|
424
|
+
registered: true,
|
|
425
|
+
interests: ['cars']
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
expect(getConfig('ortb2')).to.deep.equal(expected);
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
it('should log error for a non-object value passed in', function () {
|
|
434
|
+
mergeConfig('invalid object');
|
|
435
|
+
expect(logErrorSpy.calledOnce).to.equal(true);
|
|
436
|
+
const error = 'mergeConfig input must be an object';
|
|
437
|
+
assert.ok(logErrorSpy.calledWith(error), 'expected error was logged');
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
it('should merge input with existing bidder config', function () {
|
|
441
|
+
const input = {
|
|
442
|
+
bidders: ['rubicon', 'appnexus'],
|
|
443
|
+
config: {
|
|
444
|
+
ortb2: {
|
|
445
|
+
site: {
|
|
446
|
+
name: 'example',
|
|
447
|
+
domain: 'page.example.com',
|
|
448
|
+
cat: ['IAB2'],
|
|
449
|
+
sectioncat: ['IAB2-2'],
|
|
450
|
+
pagecat: ['IAB2-2']
|
|
451
|
+
},
|
|
452
|
+
user: {
|
|
453
|
+
ext: {
|
|
454
|
+
ssp: 'magnite',
|
|
455
|
+
data: {
|
|
456
|
+
registered: false,
|
|
457
|
+
interests: ['sports']
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
};
|
|
464
|
+
setBidderConfig({
|
|
465
|
+
bidders: ['rubicon'],
|
|
466
|
+
config: {
|
|
467
|
+
ortb2: {
|
|
468
|
+
user: {
|
|
469
|
+
ext: {
|
|
470
|
+
data: {
|
|
471
|
+
registered: true,
|
|
472
|
+
interests: ['cars']
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
mergeBidderConfig(input);
|
|
480
|
+
const expected = {
|
|
481
|
+
rubicon: {
|
|
482
|
+
ortb2: {
|
|
483
|
+
site: {
|
|
484
|
+
name: 'example',
|
|
485
|
+
domain: 'page.example.com',
|
|
486
|
+
cat: ['IAB2'],
|
|
487
|
+
sectioncat: ['IAB2-2'],
|
|
488
|
+
pagecat: ['IAB2-2']
|
|
489
|
+
},
|
|
490
|
+
user: {
|
|
491
|
+
ext: {
|
|
492
|
+
ssp: 'magnite',
|
|
493
|
+
data: {
|
|
494
|
+
registered: false,
|
|
495
|
+
interests: ['cars', 'sports']
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
},
|
|
501
|
+
appnexus: {
|
|
502
|
+
ortb2: {
|
|
503
|
+
site: {
|
|
504
|
+
name: 'example',
|
|
505
|
+
domain: 'page.example.com',
|
|
506
|
+
cat: ['IAB2'],
|
|
507
|
+
sectioncat: ['IAB2-2'],
|
|
508
|
+
pagecat: ['IAB2-2']
|
|
509
|
+
},
|
|
510
|
+
user: {
|
|
511
|
+
ext: {
|
|
512
|
+
ssp: 'magnite',
|
|
513
|
+
data: {
|
|
514
|
+
registered: false,
|
|
515
|
+
interests: ['sports']
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
expect(getBidderConfig()).to.deep.equal(expected);
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
it('should log error for a non-object value passed in', function () {
|
|
526
|
+
mergeBidderConfig('invalid object');
|
|
527
|
+
expect(logErrorSpy.calledOnce).to.equal(true);
|
|
528
|
+
const error = 'setBidderConfig bidder options must be an object';
|
|
529
|
+
assert.ok(logErrorSpy.calledWith(error), 'expected error was logged');
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
it('should log error for empty bidders array', function () {
|
|
533
|
+
mergeBidderConfig({
|
|
534
|
+
bidders: [],
|
|
535
|
+
config: {
|
|
536
|
+
ortb2: {
|
|
537
|
+
site: {
|
|
538
|
+
name: 'example',
|
|
539
|
+
domain: 'page.example.com',
|
|
540
|
+
cat: ['IAB2'],
|
|
541
|
+
sectioncat: ['IAB2-2'],
|
|
542
|
+
pagecat: ['IAB2-2']
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
});
|
|
547
|
+
expect(logErrorSpy.calledOnce).to.equal(true);
|
|
548
|
+
const error = 'setBidderConfig bidder options must contain a bidders list with at least 1 bidder';
|
|
549
|
+
assert.ok(logErrorSpy.calledWith(error), 'expected error was logged');
|
|
550
|
+
});
|
|
551
|
+
|
|
552
|
+
it('should log error for nonexistent config object', function () {
|
|
553
|
+
mergeBidderConfig({
|
|
554
|
+
bidders: ['appnexus']
|
|
555
|
+
});
|
|
556
|
+
expect(logErrorSpy.calledOnce).to.equal(true);
|
|
557
|
+
const error = 'setBidderConfig bidder options must contain a config object';
|
|
558
|
+
assert.ok(logErrorSpy.calledWith(error), 'expected error was logged');
|
|
559
|
+
});
|
|
560
|
+
|
|
561
|
+
it('should merge without array duplication', function() {
|
|
562
|
+
const userObj1 = {
|
|
563
|
+
name: 'www.dataprovider1.com',
|
|
564
|
+
ext: { taxonomyname: 'iab_audience_taxonomy' },
|
|
565
|
+
segment: [{
|
|
566
|
+
id: '1776'
|
|
567
|
+
}]
|
|
568
|
+
};
|
|
569
|
+
|
|
570
|
+
const userObj2 = {
|
|
571
|
+
name: 'www.dataprovider2.com',
|
|
572
|
+
ext: { taxonomyname: 'iab_audience_taxonomy' },
|
|
573
|
+
segment: [{
|
|
574
|
+
id: '1914'
|
|
575
|
+
}]
|
|
576
|
+
};
|
|
577
|
+
|
|
578
|
+
const siteObj1 = {
|
|
579
|
+
name: 'www.dataprovider3.com',
|
|
580
|
+
ext: {
|
|
581
|
+
taxonomyname: 'iab_audience_taxonomy'
|
|
582
|
+
},
|
|
583
|
+
segment: [
|
|
584
|
+
{
|
|
585
|
+
id: '1812'
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
id: '1955'
|
|
589
|
+
}
|
|
590
|
+
]
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
setConfig({
|
|
594
|
+
ortb2: {
|
|
595
|
+
user: {
|
|
596
|
+
data: [userObj1, userObj2]
|
|
597
|
+
},
|
|
598
|
+
site: {
|
|
599
|
+
content: {
|
|
600
|
+
data: [siteObj1]
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
});
|
|
605
|
+
|
|
606
|
+
const rtd = {
|
|
607
|
+
ortb2: {
|
|
608
|
+
user: {
|
|
609
|
+
data: [userObj1]
|
|
610
|
+
},
|
|
611
|
+
site: {
|
|
612
|
+
content: {
|
|
613
|
+
data: [siteObj1]
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
};
|
|
618
|
+
mergeConfig(rtd);
|
|
619
|
+
|
|
620
|
+
let ortb2Config = getConfig('ortb2');
|
|
621
|
+
|
|
622
|
+
expect(ortb2Config.user.data).to.deep.include.members([userObj1, userObj2]);
|
|
623
|
+
expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1]);
|
|
624
|
+
expect(ortb2Config.user.data).to.have.lengthOf(2);
|
|
625
|
+
expect(ortb2Config.site.content.data).to.have.lengthOf(1);
|
|
626
|
+
});
|
|
348
627
|
});
|