prebid.js 6.3.0 → 6.7.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 -74
- package/integrationExamples/gpt/amp/creative.html +11 -33
- package/karma.conf.maker.js +1 -1
- package/modules/.submodules.json +2 -1
- package/modules/adbookpspBidAdapter.js +27 -10
- package/modules/adhashBidAdapter.js +3 -3
- package/modules/adkernelBidAdapter.js +148 -62
- package/modules/adlooxAdServerVideo.js +2 -2
- package/modules/adlooxAnalyticsAdapter.js +4 -4
- package/modules/admanBidAdapter.js +10 -4
- package/modules/adomikAnalyticsAdapter.js +27 -9
- package/modules/adqueryIdSystem.js +103 -0
- package/modules/adqueryIdSystem.md +35 -0
- package/modules/adyoulikeBidAdapter.js +13 -9
- package/modules/aniviewBidAdapter.js +1 -1
- package/modules/beopBidAdapter.js +1 -1
- package/modules/bidViewability.js +3 -3
- package/modules/bidViewabilityIO.js +3 -3
- package/modules/bliinkBidAdapter.js +3 -2
- package/modules/colossussspBidAdapter.js +12 -8
- package/modules/colossussspBidAdapter.md +15 -1
- package/modules/compassBidAdapter.js +208 -0
- package/modules/compassBidAdapter.md +79 -0
- package/modules/consentManagement.js +7 -1
- package/modules/consumableBidAdapter.md +1 -1
- package/modules/criteoBidAdapter.js +1 -1
- package/modules/criteoIdSystem.js +29 -7
- package/modules/currency.js +2 -2
- 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/engageyaBidAdapter.js +1 -1
- package/modules/feedadBidAdapter.js +2 -2
- package/modules/feedadBidAdapter.md +4 -2
- package/modules/glimpseBidAdapter.js +66 -44
- package/modules/gnetBidAdapter.js +3 -3
- package/modules/gnetBidAdapter.md +4 -4
- package/modules/gptPreAuction.js +55 -7
- package/modules/gridBidAdapter.js +4 -3
- package/modules/gumgumBidAdapter.js +4 -4
- 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/jwplayerRtdProvider.js +71 -6
- package/modules/jwplayerRtdProvider.md +27 -11
- package/modules/kargoBidAdapter.js +2 -2
- 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/nextMillenniumBidAdapter.js +11 -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/pilotxBidAdapter.js +147 -0
- package/modules/pilotxBidAdapter.md +50 -0
- 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 +3 -2
- package/modules/riseBidAdapter.js +1 -1
- package/modules/rtbhouseBidAdapter.js +14 -4
- package/modules/rtdModule/index.js +14 -15
- package/modules/rubiconAnalyticsAdapter.js +3 -2
- package/modules/rubiconBidAdapter.js +21 -11
- package/modules/seedingAllianceBidAdapter.js +3 -3
- package/modules/sharethroughBidAdapter.js +12 -17
- package/modules/showheroes-bsBidAdapter.js +13 -2
- package/modules/synacormediaBidAdapter.js +31 -10
- package/modules/tappxBidAdapter.js +8 -5
- 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/viewability.js +177 -0
- package/modules/viewability.md +87 -0
- package/modules/welectBidAdapter.js +106 -0
- package/modules/yieldmoBidAdapter.js +23 -5
- package/modules/zeta_global_sspAnalyticsAdapter.js +97 -0
- package/modules/zeta_global_sspAnalyticsAdapter.md +24 -0
- package/package.json +1 -1
- package/src/auction.js +2 -2
- package/src/config.js +27 -3
- package/src/hook.js +5 -1
- package/src/prebid.js +20 -4
- package/src/secureCreatives.js +3 -2
- package/src/utils.js +12 -1
- package/test/helpers/prebidGlobal.js +1 -0
- package/test/spec/config_spec.js +279 -0
- package/test/spec/modules/adbookpspBidAdapter_spec.js +17 -3
- package/test/spec/modules/adhashBidAdapter_spec.js +2 -2
- package/test/spec/modules/adlooxAnalyticsAdapter_spec.js +6 -6
- package/test/spec/modules/admanBidAdapter_spec.js +2 -2
- package/test/spec/modules/adomikAnalyticsAdapter_spec.js +9 -1
- package/test/spec/modules/adqueryIdSystem_spec.js +74 -0
- 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 +5 -2
- 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/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/gnetBidAdapter_spec.js +6 -6
- 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/jwplayerRtdProvider_spec.js +195 -2
- package/test/spec/modules/kargoBidAdapter_spec.js +1 -1
- 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/nextMillenniumBidAdapter_spec.js +9 -2
- 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/pilotxBidAdapter_spec.js +244 -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 +67 -5
- package/test/spec/modules/richaudienceBidAdapter_spec.js +40 -0
- package/test/spec/modules/riseBidAdapter_spec.js +1 -1
- package/test/spec/modules/rtbhouseBidAdapter_spec.js +20 -0
- package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +30 -0
- package/test/spec/modules/rubiconBidAdapter_spec.js +48 -9
- package/test/spec/modules/sharethroughBidAdapter_spec.js +91 -6
- package/test/spec/modules/showheroes-bsBidAdapter_spec.js +2 -0
- package/test/spec/modules/synacormediaBidAdapter_spec.js +70 -0
- package/test/spec/modules/tappxBidAdapter_spec.js +0 -19
- package/test/spec/modules/teadsBidAdapter_spec.js +14 -59
- package/test/spec/modules/userId_spec.js +68 -19
- package/test/spec/modules/viewability_spec.js +280 -0
- package/test/spec/modules/welectBidAdapter_spec.js +211 -0
- package/test/spec/modules/zeta_global_sspAnalyticsAdapter_spec.js +427 -0
- package/test/spec/unit/pbjs_api_spec.js +3 -1
- package/test/test_deps.js +3 -0
- package/test/test_index.js +1 -3
package/src/prebid.js
CHANGED
|
@@ -402,10 +402,23 @@ function emitAdRenderSucceeded({ doc, bid, id }) {
|
|
|
402
402
|
events.emit(AD_RENDER_SUCCEEDED, data);
|
|
403
403
|
}
|
|
404
404
|
|
|
405
|
+
/**
|
|
406
|
+
* This function will check for presence of given node in given parent. If not present - will inject it.
|
|
407
|
+
* @param {Node} node node, whose existance is in question
|
|
408
|
+
* @param {Document} doc document element do look in
|
|
409
|
+
* @param {string} tagName tag name to look in
|
|
410
|
+
*/
|
|
411
|
+
function reinjectNodeIfRemoved(node, doc, tagName) {
|
|
412
|
+
const injectionNode = doc.querySelector(tagName);
|
|
413
|
+
if (!node.parentNode || node.parentNode !== injectionNode) {
|
|
414
|
+
insertElement(node, doc, tagName);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
405
418
|
/**
|
|
406
419
|
* This function will render the ad (based on params) in the given iframe document passed through.
|
|
407
420
|
* Note that doc SHOULD NOT be the parent document page as we can't doc.write() asynchronously
|
|
408
|
-
* @param {
|
|
421
|
+
* @param {Document} doc document
|
|
409
422
|
* @param {string} id bid id to locate the ad
|
|
410
423
|
* @alias module:pbjs.renderAd
|
|
411
424
|
*/
|
|
@@ -449,10 +462,11 @@ $$PREBID_GLOBAL$$.renderAd = hook('async', function (doc, id, options) {
|
|
|
449
462
|
const {height, width, ad, mediaType, adUrl, renderer} = bid;
|
|
450
463
|
|
|
451
464
|
const creativeComment = document.createComment(`Creative ${bid.creativeId} served by ${bid.bidder} Prebid.js Header Bidding`);
|
|
465
|
+
insertElement(creativeComment, doc, 'html');
|
|
452
466
|
|
|
453
467
|
if (isRendererRequired(renderer)) {
|
|
454
468
|
executeRenderer(renderer, bid);
|
|
455
|
-
|
|
469
|
+
reinjectNodeIfRemoved(creativeComment, doc, 'html');
|
|
456
470
|
emitAdRenderSucceeded({ doc, bid, id });
|
|
457
471
|
} else if ((doc === document && !inIframe()) || mediaType === 'video') {
|
|
458
472
|
const message = `Error trying to write ad. Ad render call ad id ${id} was prevented from writing to the main document.`;
|
|
@@ -471,7 +485,7 @@ $$PREBID_GLOBAL$$.renderAd = hook('async', function (doc, id, options) {
|
|
|
471
485
|
doc.write(ad);
|
|
472
486
|
doc.close();
|
|
473
487
|
setRenderSize(doc, width, height);
|
|
474
|
-
|
|
488
|
+
reinjectNodeIfRemoved(creativeComment, doc, 'html');
|
|
475
489
|
callBurl(bid);
|
|
476
490
|
emitAdRenderSucceeded({ doc, bid, id });
|
|
477
491
|
} else if (adUrl) {
|
|
@@ -484,7 +498,7 @@ $$PREBID_GLOBAL$$.renderAd = hook('async', function (doc, id, options) {
|
|
|
484
498
|
|
|
485
499
|
insertElement(iframe, doc, 'body');
|
|
486
500
|
setRenderSize(doc, width, height);
|
|
487
|
-
|
|
501
|
+
reinjectNodeIfRemoved(creativeComment, doc, 'html');
|
|
488
502
|
callBurl(bid);
|
|
489
503
|
emitAdRenderSucceeded({ doc, bid, id });
|
|
490
504
|
} else {
|
|
@@ -901,6 +915,8 @@ $$PREBID_GLOBAL$$.markWinningBidAsUsed = function (markBidRequest) {
|
|
|
901
915
|
*/
|
|
902
916
|
$$PREBID_GLOBAL$$.getConfig = config.getConfig;
|
|
903
917
|
$$PREBID_GLOBAL$$.readConfig = config.readConfig;
|
|
918
|
+
$$PREBID_GLOBAL$$.mergeConfig = config.mergeConfig;
|
|
919
|
+
$$PREBID_GLOBAL$$.mergeBidderConfig = config.mergeBidderConfig;
|
|
904
920
|
|
|
905
921
|
/**
|
|
906
922
|
* Set Prebid config options.
|
package/src/secureCreatives.js
CHANGED
|
@@ -127,11 +127,12 @@ function resizeRemoteCreative({ adId, adUnitCode, width, height }) {
|
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
function getDfpElementId(adId) {
|
|
130
|
-
|
|
130
|
+
const slot = find(window.googletag.pubads().getSlots(), slot => {
|
|
131
131
|
return find(slot.getTargetingKeys(), key => {
|
|
132
132
|
return includes(slot.getTargeting(key), adId);
|
|
133
133
|
});
|
|
134
|
-
})
|
|
134
|
+
});
|
|
135
|
+
return slot ? slot.getSlotElementId() : null;
|
|
135
136
|
}
|
|
136
137
|
|
|
137
138
|
function getAstElementId(adUnitCode) {
|
package/src/utils.js
CHANGED
|
@@ -1272,7 +1272,18 @@ export function mergeDeep(target, ...sources) {
|
|
|
1272
1272
|
if (!target[key]) {
|
|
1273
1273
|
Object.assign(target, { [key]: source[key] });
|
|
1274
1274
|
} else if (isArray(target[key])) {
|
|
1275
|
-
|
|
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
|
+
});
|
|
1276
1287
|
}
|
|
1277
1288
|
} else {
|
|
1278
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
|
});
|
|
@@ -504,9 +504,11 @@ describe('adbookpsp bid adapter', () => {
|
|
|
504
504
|
ad: '<div>ad</div>',
|
|
505
505
|
adId: '5',
|
|
506
506
|
adserverTargeting: {
|
|
507
|
+
hb_ad_ord_adbookpsp: '0_0', // the value to the left of the underscore represents the index of the ad id and the number to the right represents the order index
|
|
507
508
|
hb_adid_c_adbookpsp: '5',
|
|
508
509
|
hb_deal_adbookpsp: 'werwetwerw',
|
|
509
510
|
hb_liid_adbookpsp: '2342345',
|
|
511
|
+
hb_ordid_adbookpsp: '567843',
|
|
510
512
|
},
|
|
511
513
|
referrer: 'http://prebid-test-page.io:8080/banner.html',
|
|
512
514
|
lineItemId: '2342345',
|
|
@@ -516,9 +518,11 @@ describe('adbookpsp bid adapter', () => {
|
|
|
516
518
|
adId: '10',
|
|
517
519
|
adUnitCode: 'div-gpt-ad-837465923534-0',
|
|
518
520
|
adserverTargeting: {
|
|
521
|
+
hb_ad_ord_adbookpsp: '0_0',
|
|
519
522
|
hb_adid_c_adbookpsp: '10',
|
|
520
523
|
hb_deal_adbookpsp: 'dsfxcxcvxc',
|
|
521
524
|
hb_liid_adbookpsp: '2121221',
|
|
525
|
+
hb_ordid_adbookpsp: '5678234',
|
|
522
526
|
},
|
|
523
527
|
bidId: 'bid4321',
|
|
524
528
|
bidderRequestId: '999ccceeee11',
|
|
@@ -556,14 +560,18 @@ describe('adbookpsp bid adapter', () => {
|
|
|
556
560
|
|
|
557
561
|
expect(bids).to.have.length(2);
|
|
558
562
|
expect(bids[0].adserverTargeting).to.deep.equal({
|
|
563
|
+
hb_ad_ord_adbookpsp: '0_0',
|
|
564
|
+
hb_adid_c_adbookpsp: '5',
|
|
559
565
|
hb_deal_adbookpsp: 'werwetwerw',
|
|
560
566
|
hb_liid_adbookpsp: '2342345',
|
|
561
|
-
|
|
567
|
+
hb_ordid_adbookpsp: '567843',
|
|
562
568
|
});
|
|
563
569
|
expect(bids[1].adserverTargeting).to.deep.equal({
|
|
570
|
+
hb_ad_ord_adbookpsp: '0_0',
|
|
571
|
+
hb_adid_c_adbookpsp: '10',
|
|
564
572
|
hb_deal_adbookpsp: 'dsfxcxcvxc',
|
|
565
573
|
hb_liid_adbookpsp: '2121221',
|
|
566
|
-
|
|
574
|
+
hb_ordid_adbookpsp: '5678234',
|
|
567
575
|
});
|
|
568
576
|
});
|
|
569
577
|
|
|
@@ -580,9 +588,11 @@ describe('adbookpsp bid adapter', () => {
|
|
|
580
588
|
expect(bids).to.have.length(2);
|
|
581
589
|
for (const bid of bids) {
|
|
582
590
|
expect(bid.adserverTargeting).to.deep.equal({
|
|
591
|
+
hb_ad_ord_adbookpsp: '0_0,1_0',
|
|
592
|
+
hb_adid_c_adbookpsp: '5,10',
|
|
583
593
|
hb_deal_adbookpsp: 'werwetwerw,dsfxcxcvxc',
|
|
584
594
|
hb_liid_adbookpsp: '2342345,2121221',
|
|
585
|
-
|
|
595
|
+
hb_ordid_adbookpsp: '567843,5678234',
|
|
586
596
|
});
|
|
587
597
|
}
|
|
588
598
|
});
|
|
@@ -670,9 +680,11 @@ describe('adbookpsp bid adapter', () => {
|
|
|
670
680
|
);
|
|
671
681
|
|
|
672
682
|
expect(bids[0].adserverTargeting).to.deep.equal({
|
|
683
|
+
hb_ad_ord_adbookpsp: '0_0',
|
|
673
684
|
hb_adid_c_adbookpsp: '10',
|
|
674
685
|
hb_deal_adbookpsp: 'dsfxcxcvxc',
|
|
675
686
|
hb_liid_adbookpsp: '2121221',
|
|
687
|
+
hb_ordid_adbookpsp: '5678234',
|
|
676
688
|
});
|
|
677
689
|
});
|
|
678
690
|
|
|
@@ -1279,6 +1291,7 @@ const exchangeResponse = {
|
|
|
1279
1291
|
nurl: 'http://win.example.url',
|
|
1280
1292
|
ext: {
|
|
1281
1293
|
liid: '2342345',
|
|
1294
|
+
ordid: '567843',
|
|
1282
1295
|
},
|
|
1283
1296
|
cat: ['IAB2-1', 'IAB2-2', 'IAB2-3'],
|
|
1284
1297
|
adomain: ['advertiser.com'],
|
|
@@ -1301,6 +1314,7 @@ const exchangeResponse = {
|
|
|
1301
1314
|
nurl: 'http://win.example.url',
|
|
1302
1315
|
ext: {
|
|
1303
1316
|
liid: '2121221',
|
|
1317
|
+
ordid: '5678234',
|
|
1304
1318
|
},
|
|
1305
1319
|
cat: ['IAB2-3'],
|
|
1306
1320
|
adomain: ['advertiser.com', 'campaign.advertiser.com'],
|
|
@@ -77,7 +77,7 @@ describe('adhashBidAdapter', function () {
|
|
|
77
77
|
);
|
|
78
78
|
expect(result.length).to.equal(1);
|
|
79
79
|
expect(result[0].method).to.equal('POST');
|
|
80
|
-
expect(result[0].url).to.equal('https://bidder.adhash.
|
|
80
|
+
expect(result[0].url).to.equal('https://bidder.adhash.com/rtb?version=1.0&prebid=true&publisher=0xc3b09b27e9c6ef73957901aa729b9e69e5bbfbfb');
|
|
81
81
|
expect(result[0].bidRequest).to.equal(bidRequest);
|
|
82
82
|
expect(result[0].data).to.have.property('timezone');
|
|
83
83
|
expect(result[0].data).to.have.property('location');
|
|
@@ -93,7 +93,7 @@ describe('adhashBidAdapter', function () {
|
|
|
93
93
|
const result = spec.buildRequests([ bidRequest ], { gdprConsent: true });
|
|
94
94
|
expect(result.length).to.equal(1);
|
|
95
95
|
expect(result[0].method).to.equal('POST');
|
|
96
|
-
expect(result[0].url).to.equal('https://bidder.adhash.
|
|
96
|
+
expect(result[0].url).to.equal('https://bidder.adhash.com/rtb?version=1.0&prebid=true&publisher=0xc3b09b27e9c6ef73957901aa729b9e69e5bbfbfb');
|
|
97
97
|
expect(result[0].bidRequest).to.equal(bidRequest);
|
|
98
98
|
expect(result[0].data).to.have.property('timezone');
|
|
99
99
|
expect(result[0].data).to.have.property('location');
|
|
@@ -3,7 +3,7 @@ import analyticsAdapter, { command as analyticsCommand, COMMAND } from 'modules/
|
|
|
3
3
|
import { AUCTION_COMPLETED } from 'src/auction.js';
|
|
4
4
|
import { expect } from 'chai';
|
|
5
5
|
import events from 'src/events.js';
|
|
6
|
-
import
|
|
6
|
+
import CONSTANTS from 'src/constants.json';
|
|
7
7
|
import * as utils from 'src/utils.js';
|
|
8
8
|
import { loadExternalScriptStub } from 'test/mocks/adloaderStub.js';
|
|
9
9
|
|
|
@@ -143,10 +143,10 @@ describe('Adloox Analytics Adapter', function () {
|
|
|
143
143
|
return arg.tagName === 'LINK' && arg.getAttribute('rel') === 'preload' && arg.getAttribute('as') === 'script' && href_uri.href === uri.href;
|
|
144
144
|
};
|
|
145
145
|
|
|
146
|
-
events.emit(EVENTS.AUCTION_END, auctionDetails);
|
|
146
|
+
events.emit(CONSTANTS.EVENTS.AUCTION_END, auctionDetails);
|
|
147
147
|
expect(insertElementStub.calledWith(sinon.match(isLinkPreloadAsScript))).to.true;
|
|
148
148
|
|
|
149
|
-
events.emit(EVENTS.AUCTION_END, auctionDetails);
|
|
149
|
+
events.emit(CONSTANTS.EVENTS.AUCTION_END, auctionDetails);
|
|
150
150
|
expect(insertElementStub.callCount).to.equal(1);
|
|
151
151
|
|
|
152
152
|
done();
|
|
@@ -167,7 +167,7 @@ describe('Adloox Analytics Adapter', function () {
|
|
|
167
167
|
const querySelectorStub = sandbox.stub(document, 'querySelector');
|
|
168
168
|
querySelectorStub.withArgs(`#${bid.adUnitCode}`).returns(slot);
|
|
169
169
|
|
|
170
|
-
events.emit(EVENTS.BID_WON, bid);
|
|
170
|
+
events.emit(CONSTANTS.EVENTS.BID_WON, bid);
|
|
171
171
|
|
|
172
172
|
const [urlInserted, moduleCode] = loadExternalScriptStub.getCall(0).args;
|
|
173
173
|
|
|
@@ -196,7 +196,7 @@ describe('Adloox Analytics Adapter', function () {
|
|
|
196
196
|
const querySelectorStub = sandbox.stub(document, 'querySelector');
|
|
197
197
|
querySelectorStub.withArgs(`#${bid.adUnitCode}`).returns(slot);
|
|
198
198
|
|
|
199
|
-
events.emit(EVENTS.BID_WON, bidIgnore);
|
|
199
|
+
events.emit(CONSTANTS.EVENTS.BID_WON, bidIgnore);
|
|
200
200
|
|
|
201
201
|
expect(parent.querySelector('script')).is.null;
|
|
202
202
|
|
|
@@ -238,7 +238,7 @@ describe('Adloox Analytics Adapter', function () {
|
|
|
238
238
|
|
|
239
239
|
it('should inject tracking event', function (done) {
|
|
240
240
|
const data = {
|
|
241
|
-
eventType: EVENTS.BID_WON,
|
|
241
|
+
eventType: CONSTANTS.EVENTS.BID_WON,
|
|
242
242
|
args: bid
|
|
243
243
|
};
|
|
244
244
|
|
|
@@ -175,13 +175,13 @@ describe('AdmanAdapter', function () {
|
|
|
175
175
|
});
|
|
176
176
|
|
|
177
177
|
describe('getUserSyncs', function () {
|
|
178
|
-
let userSync = spec.getUserSyncs();
|
|
178
|
+
let userSync = spec.getUserSyncs({});
|
|
179
179
|
it('Returns valid URL and type', function () {
|
|
180
180
|
expect(userSync).to.be.an('array').with.lengthOf(1);
|
|
181
181
|
expect(userSync[0].type).to.exist;
|
|
182
182
|
expect(userSync[0].url).to.exist;
|
|
183
183
|
expect(userSync[0].type).to.be.equal('image');
|
|
184
|
-
expect(userSync[0].url).to.be.equal('https://pub.admanmedia.com
|
|
184
|
+
expect(userSync[0].url).to.be.equal('https://pub.admanmedia.com/image?pbjs=1&coppa=0');
|
|
185
185
|
});
|
|
186
186
|
});
|
|
187
187
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import adomikAnalytics from 'modules/adomikAnalyticsAdapter.js';
|
|
2
|
-
import {expect} from 'chai';
|
|
2
|
+
import { expect } from 'chai';
|
|
3
3
|
|
|
4
4
|
let events = require('src/events');
|
|
5
5
|
let adapterManager = require('src/adapterManager').default;
|
|
@@ -45,6 +45,8 @@ describe('Adomik Prebid Analytic', function () {
|
|
|
45
45
|
const initOptions = {
|
|
46
46
|
id: '123456',
|
|
47
47
|
url: 'testurl',
|
|
48
|
+
testId: '12345',
|
|
49
|
+
testValue: '1000'
|
|
48
50
|
};
|
|
49
51
|
|
|
50
52
|
const bid = {
|
|
@@ -71,6 +73,9 @@ describe('Adomik Prebid Analytic', function () {
|
|
|
71
73
|
expect(adomikAnalytics.currentContext).to.deep.equal({
|
|
72
74
|
uid: '123456',
|
|
73
75
|
url: 'testurl',
|
|
76
|
+
sampling: undefined,
|
|
77
|
+
testId: '12345',
|
|
78
|
+
testValue: '1000',
|
|
74
79
|
id: '',
|
|
75
80
|
timeouted: false
|
|
76
81
|
});
|
|
@@ -81,6 +86,9 @@ describe('Adomik Prebid Analytic', function () {
|
|
|
81
86
|
expect(adomikAnalytics.currentContext).to.deep.equal({
|
|
82
87
|
uid: '123456',
|
|
83
88
|
url: 'testurl',
|
|
89
|
+
sampling: undefined,
|
|
90
|
+
testId: '12345',
|
|
91
|
+
testValue: '1000',
|
|
84
92
|
id: 'test-test-test',
|
|
85
93
|
timeouted: false
|
|
86
94
|
});
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { adqueryIdSubmodule, storage } from 'modules/adqueryIdSystem.js';
|
|
2
|
+
import { server } from 'test/mocks/xhr.js';
|
|
3
|
+
import {amxIdSubmodule} from '../../../modules/amxIdSystem';
|
|
4
|
+
import * as utils from '../../../src/utils';
|
|
5
|
+
|
|
6
|
+
const config = {
|
|
7
|
+
storage: {
|
|
8
|
+
type: 'html5',
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
describe('AdqueryIdSystem', function () {
|
|
13
|
+
describe('qid submodule', () => {
|
|
14
|
+
it('should expose a "name" property containing qid', () => {
|
|
15
|
+
expect(adqueryIdSubmodule.name).to.equal('qid');
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('should expose a "gvlid" property containing the GVL ID 902', () => {
|
|
19
|
+
expect(adqueryIdSubmodule.gvlid).to.equal(902);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
describe('getId', function() {
|
|
24
|
+
let getDataFromLocalStorageStub;
|
|
25
|
+
|
|
26
|
+
beforeEach(function() {
|
|
27
|
+
getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
afterEach(function () {
|
|
31
|
+
getDataFromLocalStorageStub.restore();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('gets a adqueryId', function() {
|
|
35
|
+
const config = {
|
|
36
|
+
params: {}
|
|
37
|
+
};
|
|
38
|
+
const callbackSpy = sinon.spy();
|
|
39
|
+
const callback = adqueryIdSubmodule.getId(config).callback;
|
|
40
|
+
callback(callbackSpy);
|
|
41
|
+
const request = server.requests[0];
|
|
42
|
+
expect(request.url).to.eq(`https://bidder.adquery.io/prebid/qid`);
|
|
43
|
+
request.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({ qid: 'qid' }));
|
|
44
|
+
expect(callbackSpy.lastCall.lastArg).to.deep.equal({qid: 'qid'});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('gets a cached adqueryId', function() {
|
|
48
|
+
const config = {
|
|
49
|
+
params: {}
|
|
50
|
+
};
|
|
51
|
+
getDataFromLocalStorageStub.withArgs('qid').returns('qid');
|
|
52
|
+
|
|
53
|
+
const callbackSpy = sinon.spy();
|
|
54
|
+
const callback = adqueryIdSubmodule.getId(config).callback;
|
|
55
|
+
callback(callbackSpy);
|
|
56
|
+
expect(callbackSpy.lastCall.lastArg).to.deep.equal({qid: 'qid'});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('allows configurable id url', function() {
|
|
60
|
+
const config = {
|
|
61
|
+
params: {
|
|
62
|
+
url: 'https://bidder.adquery.io'
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const callbackSpy = sinon.spy();
|
|
66
|
+
const callback = adqueryIdSubmodule.getId(config).callback;
|
|
67
|
+
callback(callbackSpy);
|
|
68
|
+
const request = server.requests[0];
|
|
69
|
+
expect(request.url).to.eq('https://bidder.adquery.io');
|
|
70
|
+
request.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({ qid: 'testqid' }));
|
|
71
|
+
expect(callbackSpy.lastCall.lastArg).to.deep.equal({qid: 'testqid'});
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
});
|