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.
Files changed (139) hide show
  1. package/.eslintrc.js +8 -1
  2. package/integrationExamples/gpt/amp/creative.html +11 -33
  3. package/integrationExamples/gpt/weboramaRtdProvider_example.html +154 -115
  4. package/integrationExamples/gpt/x-domain/creative.html +63 -29
  5. package/modules/.submodules.json +2 -1
  6. package/modules/adagioBidAdapter.js +0 -8
  7. package/modules/adagioBidAdapter.md +1 -1
  8. package/modules/adbookpspBidAdapter.js +27 -10
  9. package/modules/adhashBidAdapter.js +3 -3
  10. package/modules/adkernelBidAdapter.js +2 -1
  11. package/modules/admanBidAdapter.js +10 -4
  12. package/modules/adomikAnalyticsAdapter.js +23 -11
  13. package/modules/adqueryIdSystem.js +103 -0
  14. package/modules/adqueryIdSystem.md +35 -0
  15. package/modules/appnexusBidAdapter.js +14 -2
  16. package/modules/asealBidAdapter.js +58 -0
  17. package/modules/asealBidAdapter.md +52 -0
  18. package/modules/bliinkBidAdapter.js +2 -1
  19. package/modules/brandmetricsRtdProvider.js +168 -0
  20. package/modules/brandmetricsRtdProvider.md +40 -0
  21. package/modules/colossussspBidAdapter.js +12 -8
  22. package/modules/colossussspBidAdapter.md +15 -1
  23. package/modules/compassBidAdapter.js +10 -3
  24. package/modules/consumableBidAdapter.md +1 -1
  25. package/modules/conversantBidAdapter.js +7 -0
  26. package/modules/criteoBidAdapter.js +10 -1
  27. package/modules/criteoIdSystem.js +29 -7
  28. package/modules/currency.js +26 -1
  29. package/modules/displayioBidAdapter.js +157 -0
  30. package/modules/displayioBidAdapter.md +148 -0
  31. package/modules/e_volutionBidAdapter.js +158 -0
  32. package/modules/glimpseBidAdapter.js +66 -44
  33. package/modules/gnetBidAdapter.js +3 -3
  34. package/modules/gnetBidAdapter.md +4 -4
  35. package/modules/gumgumBidAdapter.js +56 -42
  36. package/modules/idImportLibrary.js +45 -8
  37. package/modules/idImportLibrary.md +4 -0
  38. package/modules/improvedigitalBidAdapter.js +29 -2
  39. package/modules/interactiveOffersBidAdapter.js +9 -6
  40. package/modules/jwplayerRtdProvider.js +71 -6
  41. package/modules/jwplayerRtdProvider.md +27 -11
  42. package/modules/kargoBidAdapter.js +2 -2
  43. package/modules/lunamediahbBidAdapter.js +32 -4
  44. package/modules/nextMillenniumBidAdapter.js +3 -1
  45. package/modules/oguryBidAdapter.js +14 -14
  46. package/modules/onetagBidAdapter.js +4 -2
  47. package/modules/pilotxBidAdapter.js +147 -0
  48. package/modules/pilotxBidAdapter.md +50 -0
  49. package/modules/priceFloors.js +2 -1
  50. package/modules/proxistoreBidAdapter.js +0 -2
  51. package/modules/pubmaticAnalyticsAdapter.js +16 -0
  52. package/modules/richaudienceBidAdapter.js +10 -4
  53. package/modules/riseBidAdapter.js +18 -7
  54. package/modules/rtbhouseBidAdapter.js +14 -4
  55. package/modules/rtdModule/index.js +14 -15
  56. package/modules/rubiconAnalyticsAdapter.js +8 -2
  57. package/modules/seedingAllianceBidAdapter.js +3 -3
  58. package/modules/sharethroughBidAdapter.js +12 -17
  59. package/modules/showheroes-bsBidAdapter.js +13 -2
  60. package/modules/sortableAnalyticsAdapter.js +5 -4
  61. package/modules/sovrnBidAdapter.js +93 -18
  62. package/modules/sovrnBidAdapter.md +80 -2
  63. package/modules/synacormediaBidAdapter.js +31 -10
  64. package/modules/tappxBidAdapter.js +8 -5
  65. package/modules/teadsBidAdapter.js +1 -2
  66. package/modules/undertoneBidAdapter.js +17 -1
  67. package/modules/userId/eids.js +7 -1
  68. package/modules/userId/userId.md +8 -0
  69. package/modules/viewability.js +177 -0
  70. package/modules/viewability.md +87 -0
  71. package/modules/weboramaRtdProvider.js +264 -34
  72. package/modules/weboramaRtdProvider.md +110 -40
  73. package/modules/welectBidAdapter.js +106 -0
  74. package/modules/yahoosspBidAdapter.js +2 -0
  75. package/package.json +2 -1
  76. package/src/adRendering.js +38 -0
  77. package/src/adloader.js +2 -1
  78. package/src/auction.js +103 -73
  79. package/src/bidderSettings.js +69 -0
  80. package/src/hook.js +5 -1
  81. package/src/prebid.js +19 -21
  82. package/src/secureCreatives.js +131 -47
  83. package/src/targeting.js +3 -2
  84. package/src/utils.js +13 -10
  85. package/test/helpers/syncPromise.js +71 -0
  86. package/test/spec/auctionmanager_spec.js +179 -15
  87. package/test/spec/modules/adagioBidAdapter_spec.js +0 -10
  88. package/test/spec/modules/adbookpspBidAdapter_spec.js +17 -3
  89. package/test/spec/modules/adhashBidAdapter_spec.js +2 -2
  90. package/test/spec/modules/admanBidAdapter_spec.js +2 -2
  91. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
  92. package/test/spec/modules/adqueryIdSystem_spec.js +74 -0
  93. package/test/spec/modules/appnexusBidAdapter_spec.js +27 -0
  94. package/test/spec/modules/asealBidAdapter_spec.js +144 -0
  95. package/test/spec/modules/bliinkBidAdapter_spec.js +2 -0
  96. package/test/spec/modules/brandmetricsRtdProvider_spec.js +191 -0
  97. package/test/spec/modules/colossussspBidAdapter_spec.js +5 -2
  98. package/test/spec/modules/compassBidAdapter_spec.js +1 -0
  99. package/test/spec/modules/conversantBidAdapter_spec.js +54 -2
  100. package/test/spec/modules/criteoBidAdapter_spec.js +21 -0
  101. package/test/spec/modules/criteoIdSystem_spec.js +6 -3
  102. package/test/spec/modules/currency_spec.js +21 -6
  103. package/test/spec/modules/displayioBidAdapter_spec.js +239 -0
  104. package/test/spec/modules/e_volutionBidAdapter_spec.js +242 -0
  105. package/test/spec/modules/eids_spec.js +15 -0
  106. package/test/spec/modules/glimpseBidAdapter_spec.js +0 -18
  107. package/test/spec/modules/gnetBidAdapter_spec.js +6 -6
  108. package/test/spec/modules/gumgumBidAdapter_spec.js +46 -0
  109. package/test/spec/modules/idImportLibrary_spec.js +197 -10
  110. package/test/spec/modules/improvedigitalBidAdapter_spec.js +61 -0
  111. package/test/spec/modules/jwplayerRtdProvider_spec.js +195 -2
  112. package/test/spec/modules/kargoBidAdapter_spec.js +1 -1
  113. package/test/spec/modules/loglyliftBidAdapter_spec.js +1 -1
  114. package/test/spec/modules/lunamediahbBidAdapter_spec.js +27 -1
  115. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +1 -1
  116. package/test/spec/modules/oguryBidAdapter_spec.js +69 -3
  117. package/test/spec/modules/pilotxBidAdapter_spec.js +244 -0
  118. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +13 -1
  119. package/test/spec/modules/realTimeDataModule_spec.js +67 -5
  120. package/test/spec/modules/richaudienceBidAdapter_spec.js +40 -0
  121. package/test/spec/modules/riseBidAdapter_spec.js +31 -5
  122. package/test/spec/modules/rtbhouseBidAdapter_spec.js +20 -0
  123. package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +61 -1
  124. package/test/spec/modules/sharethroughBidAdapter_spec.js +91 -6
  125. package/test/spec/modules/showheroes-bsBidAdapter_spec.js +2 -0
  126. package/test/spec/modules/sortableAnalyticsAdapter_spec.js +2 -3
  127. package/test/spec/modules/sovrnBidAdapter_spec.js +413 -333
  128. package/test/spec/modules/synacormediaBidAdapter_spec.js +70 -0
  129. package/test/spec/modules/tappxBidAdapter_spec.js +0 -19
  130. package/test/spec/modules/teadsBidAdapter_spec.js +14 -59
  131. package/test/spec/modules/undertoneBidAdapter_spec.js +55 -2
  132. package/test/spec/modules/userId_spec.js +68 -19
  133. package/test/spec/modules/viewability_spec.js +280 -0
  134. package/test/spec/modules/weboramaRtdProvider_spec.js +536 -20
  135. package/test/spec/modules/welectBidAdapter_spec.js +211 -0
  136. package/test/spec/modules/yahoosspBidAdapter_spec.js +10 -0
  137. package/test/spec/unit/core/bidderSettings_spec.js +123 -0
  138. package/test/spec/unit/pbjs_api_spec.js +21 -8
  139. 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
- hb_adid_c_adbookpsp: '5',
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
- hb_adid_c_adbookpsp: '10',
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
- hb_adid_c_adbookpsp: '5,10',
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.org/rtb?version=1.0&prebid=true');
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.org/rtb?version=1.0&prebid=true');
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/?c=o&m=sync');
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
+ });
@@ -477,6 +477,8 @@ const testsBuildRequests = [
477
477
  refererInfo: getConfigBuildRequest('banner').refererInfo
478
478
  },
479
479
  data: {
480
+ gdpr: false,
481
+ gdpr_consent: '',
480
482
  height: 250,
481
483
  width: 300,
482
484
  keywords: '',
@@ -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');