prebid.js 6.5.0 → 6.9.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/.eslintrc.js +8 -1
- package/integrationExamples/gpt/amp/creative.html +11 -33
- package/integrationExamples/gpt/weboramaRtdProvider_example.html +154 -115
- package/integrationExamples/gpt/x-domain/creative.html +63 -29
- package/modules/.submodules.json +2 -1
- package/modules/adagioBidAdapter.js +0 -8
- package/modules/adagioBidAdapter.md +1 -1
- package/modules/adbookpspBidAdapter.js +27 -10
- package/modules/adhashBidAdapter.js +3 -3
- package/modules/adkernelBidAdapter.js +2 -1
- package/modules/admanBidAdapter.js +10 -4
- package/modules/adomikAnalyticsAdapter.js +23 -11
- package/modules/adqueryIdSystem.js +103 -0
- package/modules/adqueryIdSystem.md +35 -0
- package/modules/appnexusBidAdapter.js +14 -2
- package/modules/asealBidAdapter.js +58 -0
- package/modules/asealBidAdapter.md +52 -0
- package/modules/bliinkBidAdapter.js +2 -1
- package/modules/brandmetricsRtdProvider.js +168 -0
- package/modules/brandmetricsRtdProvider.md +40 -0
- package/modules/colossussspBidAdapter.js +12 -8
- package/modules/colossussspBidAdapter.md +15 -1
- package/modules/compassBidAdapter.js +10 -3
- package/modules/consumableBidAdapter.md +1 -1
- package/modules/conversantBidAdapter.js +7 -0
- package/modules/criteoBidAdapter.js +10 -1
- package/modules/criteoIdSystem.js +29 -7
- package/modules/currency.js +26 -1
- package/modules/displayioBidAdapter.js +157 -0
- package/modules/displayioBidAdapter.md +148 -0
- package/modules/e_volutionBidAdapter.js +158 -0
- package/modules/glimpseBidAdapter.js +66 -44
- package/modules/gnetBidAdapter.js +3 -3
- package/modules/gnetBidAdapter.md +4 -4
- package/modules/gumgumBidAdapter.js +56 -42
- package/modules/idImportLibrary.js +45 -8
- package/modules/idImportLibrary.md +4 -0
- package/modules/improvedigitalBidAdapter.js +29 -2
- package/modules/interactiveOffersBidAdapter.js +9 -6
- package/modules/jwplayerRtdProvider.js +71 -6
- package/modules/jwplayerRtdProvider.md +27 -11
- package/modules/kargoBidAdapter.js +2 -2
- package/modules/lunamediahbBidAdapter.js +32 -4
- package/modules/nextMillenniumBidAdapter.js +3 -1
- package/modules/oguryBidAdapter.js +14 -14
- package/modules/onetagBidAdapter.js +4 -2
- package/modules/pilotxBidAdapter.js +147 -0
- package/modules/pilotxBidAdapter.md +50 -0
- package/modules/priceFloors.js +2 -1
- package/modules/proxistoreBidAdapter.js +0 -2
- package/modules/pubmaticAnalyticsAdapter.js +16 -0
- package/modules/richaudienceBidAdapter.js +10 -4
- package/modules/riseBidAdapter.js +18 -7
- package/modules/rtbhouseBidAdapter.js +14 -4
- package/modules/rtdModule/index.js +14 -15
- package/modules/rubiconAnalyticsAdapter.js +8 -2
- package/modules/seedingAllianceBidAdapter.js +3 -3
- package/modules/sharethroughBidAdapter.js +12 -17
- package/modules/showheroes-bsBidAdapter.js +13 -2
- package/modules/sortableAnalyticsAdapter.js +5 -4
- package/modules/sovrnBidAdapter.js +93 -18
- package/modules/sovrnBidAdapter.md +80 -2
- package/modules/synacormediaBidAdapter.js +31 -10
- package/modules/tappxBidAdapter.js +8 -5
- package/modules/teadsBidAdapter.js +1 -2
- package/modules/undertoneBidAdapter.js +17 -1
- 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/weboramaRtdProvider.js +264 -34
- package/modules/weboramaRtdProvider.md +110 -40
- package/modules/welectBidAdapter.js +106 -0
- package/modules/yahoosspBidAdapter.js +2 -0
- package/package.json +2 -1
- package/src/adRendering.js +38 -0
- package/src/adloader.js +2 -1
- package/src/auction.js +103 -73
- package/src/bidderSettings.js +69 -0
- package/src/hook.js +5 -1
- package/src/prebid.js +19 -21
- package/src/secureCreatives.js +131 -47
- package/src/targeting.js +3 -2
- package/src/utils.js +13 -10
- package/test/helpers/syncPromise.js +71 -0
- package/test/spec/auctionmanager_spec.js +179 -15
- package/test/spec/modules/adagioBidAdapter_spec.js +0 -10
- package/test/spec/modules/adbookpspBidAdapter_spec.js +17 -3
- package/test/spec/modules/adhashBidAdapter_spec.js +2 -2
- package/test/spec/modules/admanBidAdapter_spec.js +2 -2
- package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
- package/test/spec/modules/adqueryIdSystem_spec.js +74 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +27 -0
- package/test/spec/modules/asealBidAdapter_spec.js +144 -0
- package/test/spec/modules/bliinkBidAdapter_spec.js +2 -0
- package/test/spec/modules/brandmetricsRtdProvider_spec.js +191 -0
- package/test/spec/modules/colossussspBidAdapter_spec.js +5 -2
- package/test/spec/modules/compassBidAdapter_spec.js +1 -0
- package/test/spec/modules/conversantBidAdapter_spec.js +54 -2
- package/test/spec/modules/criteoBidAdapter_spec.js +21 -0
- package/test/spec/modules/criteoIdSystem_spec.js +6 -3
- package/test/spec/modules/currency_spec.js +21 -6
- package/test/spec/modules/displayioBidAdapter_spec.js +239 -0
- package/test/spec/modules/e_volutionBidAdapter_spec.js +242 -0
- package/test/spec/modules/eids_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/gumgumBidAdapter_spec.js +46 -0
- package/test/spec/modules/idImportLibrary_spec.js +197 -10
- package/test/spec/modules/improvedigitalBidAdapter_spec.js +61 -0
- package/test/spec/modules/jwplayerRtdProvider_spec.js +195 -2
- package/test/spec/modules/kargoBidAdapter_spec.js +1 -1
- package/test/spec/modules/loglyliftBidAdapter_spec.js +1 -1
- package/test/spec/modules/lunamediahbBidAdapter_spec.js +27 -1
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +1 -1
- package/test/spec/modules/oguryBidAdapter_spec.js +69 -3
- package/test/spec/modules/pilotxBidAdapter_spec.js +244 -0
- package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +13 -1
- 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 +31 -5
- package/test/spec/modules/rtbhouseBidAdapter_spec.js +20 -0
- package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +61 -1
- package/test/spec/modules/sharethroughBidAdapter_spec.js +91 -6
- package/test/spec/modules/showheroes-bsBidAdapter_spec.js +2 -0
- package/test/spec/modules/sortableAnalyticsAdapter_spec.js +2 -3
- package/test/spec/modules/sovrnBidAdapter_spec.js +413 -333
- 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/undertoneBidAdapter_spec.js +55 -2
- package/test/spec/modules/userId_spec.js +68 -19
- package/test/spec/modules/viewability_spec.js +280 -0
- package/test/spec/modules/weboramaRtdProvider_spec.js +536 -20
- package/test/spec/modules/welectBidAdapter_spec.js +211 -0
- package/test/spec/modules/yahoosspBidAdapter_spec.js +10 -0
- package/test/spec/unit/core/bidderSettings_spec.js +123 -0
- package/test/spec/unit/pbjs_api_spec.js +21 -8
- package/test/spec/unit/secureCreatives_spec.js +143 -24
|
@@ -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');
|
|
@@ -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;
|
|
@@ -73,6 +73,7 @@ describe('Adomik Prebid Analytic', function () {
|
|
|
73
73
|
expect(adomikAnalytics.currentContext).to.deep.equal({
|
|
74
74
|
uid: '123456',
|
|
75
75
|
url: 'testurl',
|
|
76
|
+
sampling: undefined,
|
|
76
77
|
testId: '12345',
|
|
77
78
|
testValue: '1000',
|
|
78
79
|
id: '',
|
|
@@ -85,6 +86,7 @@ describe('Adomik Prebid Analytic', function () {
|
|
|
85
86
|
expect(adomikAnalytics.currentContext).to.deep.equal({
|
|
86
87
|
uid: '123456',
|
|
87
88
|
url: 'testurl',
|
|
89
|
+
sampling: undefined,
|
|
88
90
|
testId: '12345',
|
|
89
91
|
testValue: '1000',
|
|
90
92
|
id: 'test-test-test',
|
|
@@ -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
|
+
});
|
|
@@ -556,6 +556,33 @@ describe('AppNexusAdapter', function () {
|
|
|
556
556
|
config.getConfig.restore();
|
|
557
557
|
});
|
|
558
558
|
|
|
559
|
+
it('adds auction level keywords to request when set', function() {
|
|
560
|
+
let bidRequest = Object.assign({}, bidRequests[0]);
|
|
561
|
+
sinon
|
|
562
|
+
.stub(config, 'getConfig')
|
|
563
|
+
.withArgs('appnexusAuctionKeywords')
|
|
564
|
+
.returns({
|
|
565
|
+
gender: 'm',
|
|
566
|
+
music: ['rock', 'pop'],
|
|
567
|
+
test: ''
|
|
568
|
+
});
|
|
569
|
+
|
|
570
|
+
const request = spec.buildRequests([bidRequest]);
|
|
571
|
+
const payload = JSON.parse(request.data);
|
|
572
|
+
|
|
573
|
+
expect(payload.keywords).to.deep.equal([{
|
|
574
|
+
'key': 'gender',
|
|
575
|
+
'value': ['m']
|
|
576
|
+
}, {
|
|
577
|
+
'key': 'music',
|
|
578
|
+
'value': ['rock', 'pop']
|
|
579
|
+
}, {
|
|
580
|
+
'key': 'test'
|
|
581
|
+
}]);
|
|
582
|
+
|
|
583
|
+
config.getConfig.restore();
|
|
584
|
+
});
|
|
585
|
+
|
|
559
586
|
it('should attach native params to the request', function () {
|
|
560
587
|
let bidRequest = Object.assign({},
|
|
561
588
|
bidRequests[0],
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { spec, BIDDER_CODE, API_ENDPOINT, HEADER_AOTTER_VERSION } from 'modules/asealBidAdapter.js';
|
|
3
|
+
import { newBidder } from 'src/adapters/bidderFactory.js';
|
|
4
|
+
import { config } from 'src/config.js';
|
|
5
|
+
|
|
6
|
+
const TEST_CLIENT_ID = 'TEST_CLIENT_ID'
|
|
7
|
+
|
|
8
|
+
describe('asealBidAdapter', () => {
|
|
9
|
+
const adapter = newBidder(spec);
|
|
10
|
+
|
|
11
|
+
describe('inherited functions', () => {
|
|
12
|
+
it('exists and is a function', () => {
|
|
13
|
+
expect(adapter.callBids).to.exist.and.to.be.a('function')
|
|
14
|
+
})
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
describe('isBidRequestValid', () => {
|
|
18
|
+
const bid = {
|
|
19
|
+
bidder: 'aseal',
|
|
20
|
+
params: {
|
|
21
|
+
placeUid: '123'
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
it('should return true when required params found', () => {
|
|
26
|
+
expect(spec.isBidRequestValid(bid)).to.equal(true)
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should return false when required param placeUid is not passed', () => {
|
|
30
|
+
bid.params = {
|
|
31
|
+
placeUid: ''
|
|
32
|
+
}
|
|
33
|
+
expect(spec.isBidRequestValid(bid)).to.equal(false)
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should return false when required param placeUid is wrong type', () => {
|
|
37
|
+
bid.params = {
|
|
38
|
+
placeUid: null
|
|
39
|
+
}
|
|
40
|
+
expect(spec.isBidRequestValid(bid)).to.equal(false)
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should return false when required params are not passed', () => {
|
|
44
|
+
let bid = Object.assign({}, bid);
|
|
45
|
+
delete bid.params;
|
|
46
|
+
bid.params = {};
|
|
47
|
+
expect(spec.isBidRequestValid(bid)).to.equal(false)
|
|
48
|
+
})
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
describe('buildRequests', () => {
|
|
52
|
+
afterEach(() => {
|
|
53
|
+
config.resetConfig();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should return an empty array when there are no bid requests', () => {
|
|
57
|
+
const bidRequests = []
|
|
58
|
+
const request = spec.buildRequests(bidRequests)
|
|
59
|
+
|
|
60
|
+
expect(request).to.be.an('array').that.is.empty
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('should send `x-aotter-clientid` header as empty string when user not set config `clientId`', () => {
|
|
64
|
+
const bidRequests = [{
|
|
65
|
+
bidder: BIDDER_CODE,
|
|
66
|
+
params: {
|
|
67
|
+
placeUid: '123'
|
|
68
|
+
}
|
|
69
|
+
}]
|
|
70
|
+
|
|
71
|
+
const bidderRequest = {}
|
|
72
|
+
const request = spec.buildRequests(bidRequests, bidderRequest)[0];
|
|
73
|
+
|
|
74
|
+
expect(request.options.customHeaders['x-aotter-clientid']).equal('')
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
it('should send bid requests to ENDPOINT via POST', () => {
|
|
78
|
+
const bidRequests = [{
|
|
79
|
+
bidder: BIDDER_CODE,
|
|
80
|
+
params: {
|
|
81
|
+
placeUid: '123'
|
|
82
|
+
}
|
|
83
|
+
}]
|
|
84
|
+
|
|
85
|
+
const bidderRequest = {
|
|
86
|
+
refererInfo: {
|
|
87
|
+
referer: 'https://aseal.in/',
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
config.setConfig({
|
|
92
|
+
aseal: {
|
|
93
|
+
clientId: TEST_CLIENT_ID
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
const request = spec.buildRequests(bidRequests, bidderRequest)[0];
|
|
97
|
+
|
|
98
|
+
expect(request.url).to.equal(API_ENDPOINT);
|
|
99
|
+
expect(request.method).to.equal('POST')
|
|
100
|
+
expect(request.options).deep.equal({
|
|
101
|
+
contentType: 'application/json',
|
|
102
|
+
withCredentials: true,
|
|
103
|
+
customHeaders: {
|
|
104
|
+
'x-aotter-clientid': TEST_CLIENT_ID,
|
|
105
|
+
'x-aotter-version': HEADER_AOTTER_VERSION,
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
expect(request.data).deep.equal({
|
|
109
|
+
bids: bidRequests,
|
|
110
|
+
refererInfo: bidderRequest.refererInfo,
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
describe('interpretResponse', () => {
|
|
116
|
+
it('should return an empty array when there are no bids', () => {
|
|
117
|
+
const serverResponse = {}
|
|
118
|
+
const response = spec.interpretResponse(serverResponse);
|
|
119
|
+
|
|
120
|
+
expect(response).is.an('array').that.is.empty;
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('should get correct bid response', () => {
|
|
124
|
+
const serverResponse = {
|
|
125
|
+
body: [{
|
|
126
|
+
requestId: '2ef08f145b7a4f',
|
|
127
|
+
cpm: 3,
|
|
128
|
+
width: 300,
|
|
129
|
+
height: 250,
|
|
130
|
+
creativeId: '123abc',
|
|
131
|
+
dealId: '123abc',
|
|
132
|
+
currency: 'USD',
|
|
133
|
+
netRevenue: false,
|
|
134
|
+
mediaType: 'banner',
|
|
135
|
+
ttl: 300,
|
|
136
|
+
ad: '<!-- adtag -->'
|
|
137
|
+
}]
|
|
138
|
+
}
|
|
139
|
+
const response = spec.interpretResponse(serverResponse);
|
|
140
|
+
|
|
141
|
+
expect(response).deep.equal(serverResponse.body);
|
|
142
|
+
});
|
|
143
|
+
})
|
|
144
|
+
});
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import * as brandmetricsRTD from '../../../modules/brandmetricsRtdProvider.js';
|
|
2
|
+
import {config} from 'src/config.js';
|
|
3
|
+
|
|
4
|
+
const VALID_CONFIG = {
|
|
5
|
+
name: 'brandmetrics',
|
|
6
|
+
waitForIt: true,
|
|
7
|
+
params: {
|
|
8
|
+
scriptId: '00000000-0000-0000-0000-000000000000',
|
|
9
|
+
bidders: ['ozone']
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const NO_BIDDERS_CONFIG = {
|
|
14
|
+
name: 'brandmetrics',
|
|
15
|
+
waitForIt: true,
|
|
16
|
+
params: {
|
|
17
|
+
scriptId: '00000000-0000-0000-0000-000000000000'
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const NO_SCRIPTID_CONFIG = {
|
|
22
|
+
name: 'brandmetrics',
|
|
23
|
+
waitForIt: true
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const USER_CONSENT = {
|
|
27
|
+
gdpr: {
|
|
28
|
+
vendorData: {
|
|
29
|
+
vendor: {
|
|
30
|
+
consents: {
|
|
31
|
+
422: true
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
purpose: {
|
|
35
|
+
consents: {
|
|
36
|
+
1: true,
|
|
37
|
+
7: true
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
gdprApplies: true
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const NO_TCF_CONSENT = {
|
|
46
|
+
gdpr: {
|
|
47
|
+
vendorData: {
|
|
48
|
+
vendor: {
|
|
49
|
+
consents: {
|
|
50
|
+
422: false
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
purpose: {
|
|
54
|
+
consents: {
|
|
55
|
+
1: false,
|
|
56
|
+
7: false
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
gdprApplies: true
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const NO_USP_CONSENT = {
|
|
65
|
+
usp: '1NYY'
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
function mockSurveyLoaded(surveyConf) {
|
|
69
|
+
const commands = window._brandmetrics || [];
|
|
70
|
+
commands.forEach(command => {
|
|
71
|
+
if (command.cmd === '_addeventlistener') {
|
|
72
|
+
const conf = command.val;
|
|
73
|
+
if (conf.event === 'surveyloaded') {
|
|
74
|
+
conf.handler(surveyConf);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function scriptTagExists(url) {
|
|
81
|
+
const tags = document.getElementsByTagName('script');
|
|
82
|
+
for (let i = 0; i < tags.length; i++) {
|
|
83
|
+
if (tags[i].src === url) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
describe('BrandmetricsRTD module', () => {
|
|
91
|
+
beforeEach(function () {
|
|
92
|
+
const scriptTags = document.getElementsByTagName('script');
|
|
93
|
+
for (let i = 0; i < scriptTags.length; i++) {
|
|
94
|
+
if (scriptTags[i].src.indexOf('brandmetrics') !== -1) {
|
|
95
|
+
scriptTags[i].remove();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('should init and return true', () => {
|
|
101
|
+
expect(brandmetricsRTD.brandmetricsSubmodule.init(VALID_CONFIG, USER_CONSENT)).to.equal(true);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('should init and return true even if bidders is not included', () => {
|
|
105
|
+
expect(brandmetricsRTD.brandmetricsSubmodule.init(NO_BIDDERS_CONFIG, USER_CONSENT)).to.equal(true);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('should init even if script- id is not configured', () => {
|
|
109
|
+
expect(brandmetricsRTD.brandmetricsSubmodule.init(NO_SCRIPTID_CONFIG, USER_CONSENT)).to.equal(true);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('should not init when there is no TCF- consent', () => {
|
|
113
|
+
expect(brandmetricsRTD.brandmetricsSubmodule.init(VALID_CONFIG, NO_TCF_CONSENT)).to.equal(false);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('should not init when there is no usp- consent', () => {
|
|
117
|
+
expect(brandmetricsRTD.brandmetricsSubmodule.init(VALID_CONFIG, NO_USP_CONSENT)).to.equal(false);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
describe('getBidRequestData', () => {
|
|
122
|
+
beforeEach(function () {
|
|
123
|
+
config.resetConfig()
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
it('should set targeting keys for specified bidders', () => {
|
|
127
|
+
brandmetricsRTD.brandmetricsSubmodule.getBidRequestData({}, () => {
|
|
128
|
+
const bidderConfig = config.getBidderConfig()
|
|
129
|
+
const expected = VALID_CONFIG.params.bidders
|
|
130
|
+
|
|
131
|
+
expected.forEach(exp => {
|
|
132
|
+
expect(bidderConfig[exp].ortb2.user.ext.data.mockTargetKey).to.equal('mockMeasurementId')
|
|
133
|
+
})
|
|
134
|
+
}, VALID_CONFIG);
|
|
135
|
+
|
|
136
|
+
mockSurveyLoaded({
|
|
137
|
+
available: true,
|
|
138
|
+
conf: {
|
|
139
|
+
displayOption: {
|
|
140
|
+
type: 'pbjs',
|
|
141
|
+
targetKey: 'mockTargetKey'
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
survey: {
|
|
145
|
+
measurementId: 'mockMeasurementId'
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('should only set targeting keys when the brandmetrics survey- type is "pbjs"', () => {
|
|
151
|
+
mockSurveyLoaded({
|
|
152
|
+
available: true,
|
|
153
|
+
conf: {
|
|
154
|
+
displayOption: {
|
|
155
|
+
type: 'dfp',
|
|
156
|
+
targetKey: 'mockTargetKey'
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
survey: {
|
|
160
|
+
measurementId: 'mockMeasurementId'
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
brandmetricsRTD.brandmetricsSubmodule.getBidRequestData({}, () => {}, VALID_CONFIG);
|
|
165
|
+
const bidderConfig = config.getBidderConfig()
|
|
166
|
+
expect(Object.keys(bidderConfig).length).to.equal(0)
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('should use a default targeting key name if the brandmetrics- configuration does not include one', () => {
|
|
170
|
+
mockSurveyLoaded({
|
|
171
|
+
available: true,
|
|
172
|
+
conf: {
|
|
173
|
+
displayOption: {
|
|
174
|
+
type: 'pbjs',
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
survey: {
|
|
178
|
+
measurementId: 'mockMeasurementId'
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
brandmetricsRTD.brandmetricsSubmodule.getBidRequestData({}, () => {}, VALID_CONFIG);
|
|
183
|
+
|
|
184
|
+
const bidderConfig = config.getBidderConfig()
|
|
185
|
+
const expected = VALID_CONFIG.params.bidders
|
|
186
|
+
|
|
187
|
+
expected.forEach(exp => {
|
|
188
|
+
expect(bidderConfig[exp].ortb2.user.ext.data.brandmetrics_survey).to.equal('mockMeasurementId')
|
|
189
|
+
})
|
|
190
|
+
});
|
|
191
|
+
});
|
|
@@ -7,7 +7,8 @@ describe('ColossussspAdapter', function () {
|
|
|
7
7
|
bidder: 'colossusssp',
|
|
8
8
|
bidderRequestId: '145e1d6a7837c9',
|
|
9
9
|
params: {
|
|
10
|
-
placement_id: 0
|
|
10
|
+
placement_id: 0,
|
|
11
|
+
group_id: 0
|
|
11
12
|
},
|
|
12
13
|
placementCode: 'placementid_0',
|
|
13
14
|
auctionId: '74f78609-a92d-4cf1-869f-1b244bbfb5d2',
|
|
@@ -60,6 +61,7 @@ describe('ColossussspAdapter', function () {
|
|
|
60
61
|
});
|
|
61
62
|
it('Should return false when placement_id is not a number', function () {
|
|
62
63
|
bid.params.placement_id = 'aaa';
|
|
64
|
+
delete bid.params.group_id;
|
|
63
65
|
expect(spec.isBidRequestValid(bid)).to.be.false;
|
|
64
66
|
});
|
|
65
67
|
});
|
|
@@ -95,9 +97,10 @@ describe('ColossussspAdapter', function () {
|
|
|
95
97
|
let placements = data['placements'];
|
|
96
98
|
for (let i = 0; i < placements.length; i++) {
|
|
97
99
|
let placement = placements[i];
|
|
98
|
-
expect(placement).to.have.all.keys('placementId', 'eids', 'bidId', 'traffic', 'sizes', 'schain', 'floor', 'gpid');
|
|
100
|
+
expect(placement).to.have.all.keys('placementId', 'groupId', 'eids', 'bidId', 'traffic', 'sizes', 'schain', 'floor', 'gpid');
|
|
99
101
|
expect(placement.schain).to.be.an('object')
|
|
100
102
|
expect(placement.placementId).to.be.a('number');
|
|
103
|
+
expect(placement.groupId).to.be.a('number');
|
|
101
104
|
expect(placement.bidId).to.be.a('string');
|
|
102
105
|
expect(placement.traffic).to.be.a('string');
|
|
103
106
|
expect(placement.sizes).to.be.an('array');
|
|
@@ -143,6 +143,7 @@ describe('CompassBidAdapter', function () {
|
|
|
143
143
|
expect(placement.bidId).to.be.a('string');
|
|
144
144
|
expect(placement.schain).to.be.an('object');
|
|
145
145
|
expect(placement.bidfloor).to.exist.and.to.equal(0);
|
|
146
|
+
expect(placement.type).to.exist.and.to.equal('publisher');
|
|
146
147
|
|
|
147
148
|
if (placement.adFormat === BANNER) {
|
|
148
149
|
expect(placement.sizes).to.be.an('array');
|