prebid.js 6.4.0 → 6.8.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 (147) hide show
  1. package/integrationExamples/gpt/amp/creative.html +11 -33
  2. package/integrationExamples/gpt/x-domain/creative.html +53 -26
  3. package/modules/.submodules.json +2 -1
  4. package/modules/adagioBidAdapter.js +0 -8
  5. package/modules/adagioBidAdapter.md +1 -1
  6. package/modules/adbookpspBidAdapter.js +27 -10
  7. package/modules/adhashBidAdapter.js +3 -3
  8. package/modules/adkernelBidAdapter.js +2 -1
  9. package/modules/admanBidAdapter.js +10 -4
  10. package/modules/adomikAnalyticsAdapter.js +23 -11
  11. package/modules/adqueryIdSystem.js +103 -0
  12. package/modules/adqueryIdSystem.md +35 -0
  13. package/modules/adyoulikeBidAdapter.js +13 -9
  14. package/modules/appnexusBidAdapter.js +11 -0
  15. package/modules/bliinkBidAdapter.js +3 -2
  16. package/modules/brandmetricsRtdProvider.js +168 -0
  17. package/modules/brandmetricsRtdProvider.md +40 -0
  18. package/modules/colossussspBidAdapter.js +12 -8
  19. package/modules/colossussspBidAdapter.md +15 -1
  20. package/modules/compassBidAdapter.js +10 -3
  21. package/modules/consentManagement.js +7 -1
  22. package/modules/consumableBidAdapter.md +1 -1
  23. package/modules/criteoBidAdapter.js +10 -1
  24. package/modules/criteoIdSystem.js +29 -7
  25. package/modules/currency.js +26 -1
  26. package/modules/displayioBidAdapter.js +157 -0
  27. package/modules/displayioBidAdapter.md +148 -0
  28. package/modules/docereeBidAdapter.js +10 -1
  29. package/modules/docereeBidAdapter.md +2 -0
  30. package/modules/e_volutionBidAdapter.js +158 -0
  31. package/modules/glimpseBidAdapter.js +66 -44
  32. package/modules/gnetBidAdapter.js +3 -3
  33. package/modules/gnetBidAdapter.md +4 -4
  34. package/modules/gptPreAuction.js +55 -7
  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 +24 -2
  39. package/modules/interactiveOffersBidAdapter.js +9 -6
  40. package/modules/ixBidAdapter.js +29 -12
  41. package/modules/jwplayerRtdProvider.js +71 -6
  42. package/modules/jwplayerRtdProvider.md +27 -11
  43. package/modules/kargoBidAdapter.js +2 -2
  44. package/modules/limelightDigitalBidAdapter.js +2 -1
  45. package/modules/livewrappedAnalyticsAdapter.js +3 -1
  46. package/modules/loglyliftBidAdapter.js +79 -0
  47. package/modules/loglyliftBidAdapter.md +55 -0
  48. package/modules/nextMillenniumBidAdapter.js +3 -1
  49. package/modules/oguryBidAdapter.js +9 -2
  50. package/modules/onetagBidAdapter.js +4 -2
  51. package/modules/optimeraRtdProvider.js +8 -1
  52. package/modules/ozoneBidAdapter.js +21 -64
  53. package/modules/pilotxBidAdapter.js +147 -0
  54. package/modules/pilotxBidAdapter.md +50 -0
  55. package/modules/proxistoreBidAdapter.js +0 -2
  56. package/modules/pubmaticAnalyticsAdapter.js +16 -0
  57. package/modules/richaudienceBidAdapter.js +3 -2
  58. package/modules/riseBidAdapter.js +1 -1
  59. package/modules/rtbhouseBidAdapter.js +14 -4
  60. package/modules/rtdModule/index.js +14 -15
  61. package/modules/rubiconAnalyticsAdapter.js +3 -2
  62. package/modules/seedingAllianceBidAdapter.js +3 -3
  63. package/modules/sharethroughBidAdapter.js +12 -17
  64. package/modules/showheroes-bsBidAdapter.js +13 -2
  65. package/modules/sovrnBidAdapter.js +93 -18
  66. package/modules/sovrnBidAdapter.md +80 -2
  67. package/modules/synacormediaBidAdapter.js +31 -10
  68. package/modules/tappxBidAdapter.js +8 -5
  69. package/modules/teadsBidAdapter.js +1 -2
  70. package/modules/undertoneBidAdapter.js +17 -1
  71. package/modules/userId/eids.js +7 -1
  72. package/modules/userId/userId.md +8 -0
  73. package/modules/viewability.js +177 -0
  74. package/modules/viewability.md +87 -0
  75. package/modules/welectBidAdapter.js +106 -0
  76. package/modules/yahoosspBidAdapter.js +2 -0
  77. package/modules/yieldmoBidAdapter.js +23 -5
  78. package/modules/zeta_global_sspAnalyticsAdapter.js +97 -0
  79. package/modules/zeta_global_sspAnalyticsAdapter.md +24 -0
  80. package/package.json +1 -1
  81. package/src/adRendering.js +38 -0
  82. package/src/auction.js +44 -9
  83. package/src/config.js +27 -3
  84. package/src/hook.js +5 -1
  85. package/src/prebid.js +21 -21
  86. package/src/secureCreatives.js +114 -44
  87. package/src/utils.js +25 -4
  88. package/test/helpers/syncPromise.js +71 -0
  89. package/test/spec/auctionmanager_spec.js +148 -16
  90. package/test/spec/config_spec.js +279 -0
  91. package/test/spec/modules/adagioBidAdapter_spec.js +0 -10
  92. package/test/spec/modules/adbookpspBidAdapter_spec.js +17 -3
  93. package/test/spec/modules/adhashBidAdapter_spec.js +2 -2
  94. package/test/spec/modules/admanBidAdapter_spec.js +2 -2
  95. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
  96. package/test/spec/modules/adqueryIdSystem_spec.js +74 -0
  97. package/test/spec/modules/adyoulikeBidAdapter_spec.js +49 -0
  98. package/test/spec/modules/appnexusBidAdapter_spec.js +27 -0
  99. package/test/spec/modules/bliinkBidAdapter_spec.js +2 -0
  100. package/test/spec/modules/brandmetricsRtdProvider_spec.js +191 -0
  101. package/test/spec/modules/colossussspBidAdapter_spec.js +5 -2
  102. package/test/spec/modules/compassBidAdapter_spec.js +1 -0
  103. package/test/spec/modules/consentManagement_spec.js +20 -0
  104. package/test/spec/modules/criteoBidAdapter_spec.js +21 -0
  105. package/test/spec/modules/criteoIdSystem_spec.js +6 -3
  106. package/test/spec/modules/currency_spec.js +21 -6
  107. package/test/spec/modules/displayioBidAdapter_spec.js +239 -0
  108. package/test/spec/modules/docereeBidAdapter_spec.js +9 -1
  109. package/test/spec/modules/e_volutionBidAdapter_spec.js +242 -0
  110. package/test/spec/modules/eids_spec.js +15 -0
  111. package/test/spec/modules/glimpseBidAdapter_spec.js +0 -18
  112. package/test/spec/modules/gnetBidAdapter_spec.js +6 -6
  113. package/test/spec/modules/gptPreAuction_spec.js +177 -2
  114. package/test/spec/modules/gumgumBidAdapter_spec.js +46 -0
  115. package/test/spec/modules/idImportLibrary_spec.js +197 -10
  116. package/test/spec/modules/improvedigitalBidAdapter_spec.js +42 -0
  117. package/test/spec/modules/ixBidAdapter_spec.js +104 -62
  118. package/test/spec/modules/jwplayerRtdProvider_spec.js +195 -2
  119. package/test/spec/modules/kargoBidAdapter_spec.js +1 -1
  120. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +75 -17
  121. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +22 -0
  122. package/test/spec/modules/loglyliftBidAdapter_spec.js +172 -0
  123. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +1 -1
  124. package/test/spec/modules/oguryBidAdapter_spec.js +10 -2
  125. package/test/spec/modules/optimeraRtdProvider_spec.js +14 -1
  126. package/test/spec/modules/ozoneBidAdapter_spec.js +43 -31
  127. package/test/spec/modules/pilotxBidAdapter_spec.js +244 -0
  128. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +13 -1
  129. package/test/spec/modules/realTimeDataModule_spec.js +67 -5
  130. package/test/spec/modules/richaudienceBidAdapter_spec.js +40 -0
  131. package/test/spec/modules/riseBidAdapter_spec.js +1 -1
  132. package/test/spec/modules/rtbhouseBidAdapter_spec.js +20 -0
  133. package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +30 -0
  134. package/test/spec/modules/sharethroughBidAdapter_spec.js +91 -6
  135. package/test/spec/modules/showheroes-bsBidAdapter_spec.js +2 -0
  136. package/test/spec/modules/sovrnBidAdapter_spec.js +413 -333
  137. package/test/spec/modules/synacormediaBidAdapter_spec.js +70 -0
  138. package/test/spec/modules/tappxBidAdapter_spec.js +0 -19
  139. package/test/spec/modules/teadsBidAdapter_spec.js +14 -59
  140. package/test/spec/modules/undertoneBidAdapter_spec.js +55 -2
  141. package/test/spec/modules/userId_spec.js +68 -19
  142. package/test/spec/modules/viewability_spec.js +280 -0
  143. package/test/spec/modules/welectBidAdapter_spec.js +211 -0
  144. package/test/spec/modules/yahoosspBidAdapter_spec.js +10 -0
  145. package/test/spec/modules/zeta_global_sspAnalyticsAdapter_spec.js +427 -0
  146. package/test/spec/unit/pbjs_api_spec.js +20 -2
  147. package/test/spec/unit/secureCreatives_spec.js +85 -0
@@ -69,8 +69,6 @@ var validBidRequestsMulti = [
69
69
  transactionId: '2e63c0ed-b10c-4008-aed5-84582cecfe87'
70
70
  }
71
71
  ];
72
- // use 'pubcid', 'tdid', 'id5id', 'parrableId', 'idl_env', 'criteoId'
73
- // see http://prebid.org/dev-docs/modules/userId.html
74
72
  var validBidRequestsWithUserIdData = [
75
73
  {
76
74
  adUnitCode: 'div-gpt-ad-1460505748561-0',
@@ -291,7 +289,6 @@ var validBidRequests1OutstreamVideo2020 = [
291
289
  }
292
290
  ];
293
291
 
294
- // WHEN sent as bidderRequest to buildRequests you should send the child: .bidderRequest
295
292
  var validBidderRequest1OutstreamVideo2020 = {
296
293
  bidderRequest: {
297
294
  auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99',
@@ -394,7 +391,6 @@ var validBidderRequest1OutstreamVideo2020 = {
394
391
  timeout: 3000
395
392
  }
396
393
  };
397
- // WHEN sent as bidderRequest to buildRequests you should send the child: .bidderRequest
398
394
  var validBidderRequest = {
399
395
  bidderRequest: {
400
396
  auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99',
@@ -419,11 +415,6 @@ var validBidderRequest = {
419
415
  }
420
416
  };
421
417
 
422
- // bidder request with GDPR - change the values for testing:
423
- // gdprConsent.gdprApplies (true/false)
424
- // gdprConsent.vendorData.purposeConsents (make empty, make null, remove it)
425
- // gdprConsent.vendorData.vendorConsents (remove 524, remove all, make the element null, remove it)
426
- // WHEN sent as bidderRequest to buildRequests you should send the child: .bidderRequest
427
418
  var bidderRequestWithFullGdpr = {
428
419
  bidderRequest: {
429
420
  auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99',
@@ -512,7 +503,6 @@ var gdpr1 = {
512
503
  'gdprApplies': true
513
504
  };
514
505
 
515
- // simulating the Mirror
516
506
  var bidderRequestWithPartialGdpr = {
517
507
  bidderRequest: {
518
508
  auctionId: '27dcb421-95c6-4024-a624-3c03816c5f99',
@@ -558,7 +548,6 @@ var bidderRequestWithPartialGdpr = {
558
548
  }
559
549
  };
560
550
 
561
- // make sure the impid matches the request bidId
562
551
  var validResponse = {
563
552
  'body': {
564
553
  'id': 'd6198807-7a53-4141-b2db-d2cb754d68ba',
@@ -1113,7 +1102,6 @@ var multiRequest1 = [
1113
1102
  }
1114
1103
  ];
1115
1104
 
1116
- // WHEN sent as bidderRequest to buildRequests you should send the child: .bidderRequest
1117
1105
  var multiBidderRequest1 = {
1118
1106
  bidderRequest: {
1119
1107
  'bidderCode': 'ozone',
@@ -1507,7 +1495,6 @@ var multiResponse1 = {
1507
1495
 
1508
1496
  describe('ozone Adapter', function () {
1509
1497
  describe('isBidRequestValid', function () {
1510
- // A test ad unit that will consistently return test creatives
1511
1498
  let validBidReq = {
1512
1499
  bidder: BIDDER_CODE,
1513
1500
  params: {
@@ -1941,7 +1928,6 @@ describe('ozone Adapter', function () {
1941
1928
  const request = spec.buildRequests(validBidRequestsNoSizes, validBidderRequest.bidderRequest);
1942
1929
  expect(request).to.be.a('array');
1943
1930
  expect(request[0]).to.have.all.keys(['bidderRequest', 'data', 'method', 'url']);
1944
- // need to reset the singleRequest config flag:
1945
1931
  config.setConfig({'ozone': {'singleRequest': true}});
1946
1932
  });
1947
1933
 
@@ -1965,7 +1951,6 @@ describe('ozone Adapter', function () {
1965
1951
  expect(payload.user.ext.consent).to.equal(consentString);
1966
1952
  });
1967
1953
 
1968
- // mirror
1969
1954
  it('should add gdpr consent information to the request when vendorData is missing vendorConsents (Mirror)', function () {
1970
1955
  let consentString = 'BOcocyaOcocyaAfEYDENCD-AAAAjx7_______9______9uz_Ov_v_f__33e8__9v_l_7_-___u_-33d4-_1vf99yfm1-7ftr3tp_87ues2_Xur__59__3z3_NphLgA==';
1971
1956
  let bidderRequest = validBidderRequest.bidderRequest;
@@ -2018,7 +2003,6 @@ describe('ozone Adapter', function () {
2018
2003
  };
2019
2004
 
2020
2005
  let bidRequests = validBidRequests;
2021
- // values from http://prebid.org/dev-docs/modules/userId.html#pubcommon-id
2022
2006
  bidRequests[0]['userId'] = {
2023
2007
  'digitrustid': {data: {id: 'DTID', keyv: 4, privacy: {optout: false}, producer: 'ABC', version: 2}},
2024
2008
  'id5id': { uid: '1111', ext: { linkType: 2, abTestingControlGroup: false } },
@@ -2038,13 +2022,11 @@ describe('ozone Adapter', function () {
2038
2022
 
2039
2023
  it('should pick up the value of pubcid when built using the pubCommonId module (not userId)', function () {
2040
2024
  let bidRequests = validBidRequests;
2041
- // values from http://prebid.org/dev-docs/modules/userId.html#pubcommon-id
2042
2025
  bidRequests[0]['userId'] = {
2043
2026
  'digitrustid': {data: {id: 'DTID', keyv: 4, privacy: {optout: false}, producer: 'ABC', version: 2}},
2044
2027
  'id5id': { uid: '1111', ext: { linkType: 2, abTestingControlGroup: false } },
2045
2028
  'idl_env': '3333',
2046
2029
  'parrableid': 'eidVersion.encryptionKeyReference.encryptedValue',
2047
- // 'pubcid': '5555', // remove pubcid from here to emulate the OLD module & cause the failover code to kick in
2048
2030
  'tdid': '6666',
2049
2031
  'sharedid': {'id': '01EAJWWNEPN3CYMM5N8M5VXY22', 'third': '01EAJWWNEPN3CYMM5N8M5VXY22'}
2050
2032
  };
@@ -2170,7 +2152,6 @@ describe('ozone Adapter', function () {
2170
2152
  });
2171
2153
  it('should use oztestmode GET value if set', function() {
2172
2154
  var specMock = utils.deepClone(spec);
2173
- // mock the getGetParametersAsObject function to simulate GET parameters for oztestmode:
2174
2155
  specMock.getGetParametersAsObject = function() {
2175
2156
  return {'oztestmode': 'mytestvalue_123'};
2176
2157
  };
@@ -2181,7 +2162,6 @@ describe('ozone Adapter', function () {
2181
2162
  });
2182
2163
  it('should pass through GET params if present: ozf, ozpf, ozrp, ozip', function() {
2183
2164
  var specMock = utils.deepClone(spec);
2184
- // mock the getGetParametersAsObject function to simulate GET parameters :
2185
2165
  specMock.getGetParametersAsObject = function() {
2186
2166
  return {ozf: '1', ozpf: '0', ozrp: '2', ozip: '123'};
2187
2167
  };
@@ -2194,7 +2174,6 @@ describe('ozone Adapter', function () {
2194
2174
  });
2195
2175
  it('should pass through GET params if present: ozf, ozpf, ozrp, ozip with alternative values', function() {
2196
2176
  var specMock = utils.deepClone(spec);
2197
- // mock the getGetParametersAsObject function to simulate GET parameters :
2198
2177
  specMock.getGetParametersAsObject = function() {
2199
2178
  return {ozf: 'false', ozpf: 'true', ozrp: 'xyz', ozip: 'hello'};
2200
2179
  };
@@ -2207,7 +2186,6 @@ describe('ozone Adapter', function () {
2207
2186
  });
2208
2187
  it('should use oztestmode GET value if set, even if there is no customdata in config', function() {
2209
2188
  var specMock = utils.deepClone(spec);
2210
- // mock the getGetParametersAsObject function to simulate GET parameters for oztestmode:
2211
2189
  specMock.getGetParametersAsObject = function() {
2212
2190
  return {'oztestmode': 'mytestvalue_123'};
2213
2191
  };
@@ -2217,7 +2195,6 @@ describe('ozone Adapter', function () {
2217
2195
  expect(data.imp[0].ext.ozone.customData[0].targeting.oztestmode).to.equal('mytestvalue_123');
2218
2196
  });
2219
2197
  it('should use GET values auction=dev & cookiesync=dev if set', function() {
2220
- // mock the getGetParametersAsObject function to simulate GET parameters for oztestmode:
2221
2198
  var specMock = utils.deepClone(spec);
2222
2199
  specMock.getGetParametersAsObject = function() {
2223
2200
  return {};
@@ -2228,8 +2205,6 @@ describe('ozone Adapter', function () {
2228
2205
  let cookieUrl = specMock.getCookieSyncUrl();
2229
2206
  expect(cookieUrl).to.equal('https://elb.the-ozone-project.com/static/load-cookie.html');
2230
2207
 
2231
- // now mock the response from getGetParametersAsObject & do the request again
2232
-
2233
2208
  specMock = utils.deepClone(spec);
2234
2209
  specMock.getGetParametersAsObject = function() {
2235
2210
  return {'auction': 'dev', 'cookiesync': 'dev'};
@@ -2241,7 +2216,6 @@ describe('ozone Adapter', function () {
2241
2216
  expect(cookieUrl).to.equal('https://test.ozpr.net/static/load-cookie.html');
2242
2217
  });
2243
2218
  it('should use a valid ozstoredrequest GET value if set to override the placementId values, and set oz_rw if we find it', function() {
2244
- // mock the getGetParametersAsObject function to simulate GET parameters for ozstoredrequest:
2245
2219
  var specMock = utils.deepClone(spec);
2246
2220
  specMock.getGetParametersAsObject = function() {
2247
2221
  return {'ozstoredrequest': '1122334455'}; // 10 digits are valid
@@ -2252,7 +2226,6 @@ describe('ozone Adapter', function () {
2252
2226
  expect(data.imp[0].ext.prebid.storedrequest.id).to.equal('1122334455');
2253
2227
  });
2254
2228
  it('should NOT use an invalid ozstoredrequest GET value if set to override the placementId values, and set oz_rw to 0', function() {
2255
- // mock the getGetParametersAsObject function to simulate GET parameters for ozstoredrequest:
2256
2229
  var specMock = utils.deepClone(spec);
2257
2230
  specMock.getGetParametersAsObject = function() {
2258
2231
  return {'ozstoredrequest': 'BADVAL'}; // 10 digits are valid
@@ -2424,6 +2397,26 @@ describe('ozone Adapter', function () {
2424
2397
  expect(utils.deepAccess(payload, 'imp.0.floor.banner.floor')).to.equal(0.8);
2425
2398
  config.resetConfig();
2426
2399
  });
2400
+
2401
+ it('handles schain object in each bidrequest (will be the same in each br)', function () {
2402
+ let br = JSON.parse(JSON.stringify(validBidRequests));
2403
+ let schainConfigObject = {
2404
+ 'ver': '1.0',
2405
+ 'complete': 1,
2406
+ 'nodes': [
2407
+ {
2408
+ 'asi': 'bidderA.com',
2409
+ 'sid': '00001',
2410
+ 'hp': 1
2411
+ }
2412
+ ]
2413
+ };
2414
+ br[0]['schain'] = schainConfigObject;
2415
+ const request = spec.buildRequests(br, validBidderRequest.bidderRequest);
2416
+ const data = JSON.parse(request.data);
2417
+ expect(data.source.ext).to.haveOwnProperty('schain');
2418
+ expect(data.source.ext.schain).to.deep.equal(schainConfigObject); // .deep.equal() : Target object deeply (but not strictly) equals `{a: 1}`
2419
+ });
2427
2420
  });
2428
2421
 
2429
2422
  describe('interpretResponse', function () {
@@ -2624,7 +2617,6 @@ describe('ozone Adapter', function () {
2624
2617
  expect(result[1]['impid']).to.equal('3025f169863b7f8');
2625
2618
  expect(result[1]['id']).to.equal('18552976939844999');
2626
2619
  expect(result[1]['adserverTargeting']['oz_ozappnexus_adId']).to.equal('3025f169863b7f8-0-oz-2');
2627
- // change the bid values so a different second bid for an impid by the same bidder gets dropped
2628
2620
  validres = JSON.parse(JSON.stringify(multiResponse1));
2629
2621
  validres.body.seatbid[0].bid[1].price = 1.1;
2630
2622
  validres.body.seatbid[0].bid[1].cpm = 1.1;
@@ -2647,7 +2639,6 @@ describe('ozone Adapter', function () {
2647
2639
  expect(result).to.be.empty;
2648
2640
  });
2649
2641
  it('should append the various values if they exist', function() {
2650
- // get the cookie bag populated
2651
2642
  spec.buildRequests(validBidRequests, validBidderRequest.bidderRequest);
2652
2643
  const result = spec.getUserSyncs({iframeEnabled: true}, 'good server response', gdpr1);
2653
2644
  expect(result).to.be.an('array');
@@ -2657,14 +2648,12 @@ describe('ozone Adapter', function () {
2657
2648
  expect(result[0].url).to.include('gdpr_consent=BOh7mtYOh7mtYAcABBENCU-AAAAncgPIXJiiAoao0PxBFkgCAC8ACIAAQAQQAAIAAAIAAAhBGAAAQAQAEQgAAAAAAABAAAAAAAAAAAAAAACAAAAAAAACgAAAAABAAAAQAAAAAAA');
2658
2649
  });
2659
2650
  it('should append ccpa (usp data)', function() {
2660
- // get the cookie bag populated
2661
2651
  spec.buildRequests(validBidRequests, validBidderRequest.bidderRequest);
2662
2652
  const result = spec.getUserSyncs({iframeEnabled: true}, 'good server response', gdpr1, '1YYN');
2663
2653
  expect(result).to.be.an('array');
2664
2654
  expect(result[0].url).to.include('usp_consent=1YYN');
2665
2655
  });
2666
2656
  it('should use "" if no usp is sent to cookieSync', function() {
2667
- // get the cookie bag populated
2668
2657
  spec.buildRequests(validBidRequests, validBidderRequest.bidderRequest);
2669
2658
  const result = spec.getUserSyncs({iframeEnabled: true}, 'good server response', gdpr1);
2670
2659
  expect(result).to.be.an('array');
@@ -2887,4 +2876,27 @@ describe('ozone Adapter', function () {
2887
2876
  expect(response[1].bid.length).to.equal(2);
2888
2877
  });
2889
2878
  });
2879
+ /**
2880
+ * spec.getWhitelabelConfigItem test - get a config value for a whitelabelled bidder,
2881
+ * from a standard ozone.oz_xxxx_yyy string
2882
+ */
2883
+ describe('getWhitelabelConfigItem', function() {
2884
+ it('should fetch the whitelabelled equivalent config value correctly', function () {
2885
+ var specMock = utils.deepClone(spec);
2886
+ config.setConfig({'ozone': {'oz_omp_floor': 'ozone-floor-value'}});
2887
+ config.setConfig({'markbidder': {'mb_omp_floor': 'markbidder-floor-value'}});
2888
+ specMock.propertyBag.whitelabel = {bidder: 'ozone', keyPrefix: 'oz'};
2889
+ let testKey = 'ozone.oz_omp_floor';
2890
+ let ozone_value = specMock.getWhitelabelConfigItem(testKey);
2891
+ expect(ozone_value).to.equal('ozone-floor-value');
2892
+ specMock.propertyBag.whitelabel = {bidder: 'markbidder', keyPrefix: 'mb'};
2893
+ let markbidder_config = specMock.getWhitelabelConfigItem(testKey);
2894
+ expect(markbidder_config).to.equal('markbidder-floor-value');
2895
+ config.setConfig({'markbidder': {'singleRequest': 'markbidder-singlerequest-value'}});
2896
+ let testKey2 = 'ozone.singleRequest';
2897
+ let markbidder_config2 = specMock.getWhitelabelConfigItem(testKey2);
2898
+ expect(markbidder_config2).to.equal('markbidder-singlerequest-value');
2899
+ config.resetConfig();
2900
+ });
2901
+ });
2890
2902
  });
@@ -0,0 +1,244 @@
1
+ // import or require modules necessary for the test, e.g.:
2
+ import { expect } from 'chai'; // may prefer 'assert' in place of 'expect'
3
+ import { spec } from '../../../modules/pilotxBidAdapter.js';
4
+
5
+ describe('pilotxAdapter', function () {
6
+ describe('isBidRequestValid', function () {
7
+ let banner;
8
+ beforeEach(function () {
9
+ banner = {
10
+ bidder: 'pilotx',
11
+ adUnitCode: 'adunit-test',
12
+ mediaTypes: { banner: {} },
13
+ sizes: [[300, 250], [468, 60]],
14
+ bidId: '2de8c82e30665a',
15
+ params: {
16
+ placementId: '1'
17
+ }
18
+ };
19
+ });
20
+
21
+ it('should return false if sizes is empty', function () {
22
+ banner.sizes = []
23
+ expect(spec.isBidRequestValid(banner)).to.equal(false);
24
+ });
25
+ it('should return true if all is valid/ is not empty', function () {
26
+ expect(spec.isBidRequestValid(banner)).to.equal(true);
27
+ });
28
+ it('should return false if there is no placement id found', function () {
29
+ banner.params = {}
30
+ expect(spec.isBidRequestValid(banner)).to.equal(false);
31
+ });
32
+ it('should return false if sizes is empty', function () {
33
+ banner.sizes = []
34
+ expect(spec.isBidRequestValid(banner)).to.equal(false);
35
+ });
36
+ it('should return false for no size and empty params', function() {
37
+ const emptySizes = {
38
+ bidder: 'pilotx',
39
+ adUnitCode: 'adunit-test',
40
+ mediaTypes: { banner: {} },
41
+ bidId: '2de8c82e30665a',
42
+ params: {
43
+ placementId: '1',
44
+ sizes: []
45
+ }
46
+ };
47
+ expect(spec.isBidRequestValid(emptySizes)).to.equal(false);
48
+ })
49
+ it('should return true for no size and valid size params', function() {
50
+ const emptySizes = {
51
+ bidder: 'pilotx',
52
+ adUnitCode: 'adunit-test',
53
+ mediaTypes: { banner: {} },
54
+ bidId: '2de8c82e30665a',
55
+ params: {
56
+ placementId: '1',
57
+ sizes: [[300, 250], [468, 60]]
58
+ }
59
+ };
60
+ expect(spec.isBidRequestValid(emptySizes)).to.equal(true);
61
+ })
62
+ it('should return false for no size items', function() {
63
+ const emptySizes = {
64
+ bidder: 'pilotx',
65
+ adUnitCode: 'adunit-test',
66
+ mediaTypes: { banner: {} },
67
+ bidId: '2de8c82e30665a',
68
+ params: {
69
+ placementId: '1'
70
+ }
71
+ };
72
+ expect(spec.isBidRequestValid(emptySizes)).to.equal(false);
73
+ })
74
+ });
75
+
76
+ describe('buildRequests', function () {
77
+ const mockRequest = { refererInfo: {} };
78
+ const mockRequestGDPR = {
79
+ refererInfo: {},
80
+ gdprConsent: {
81
+ consentString: 'BOJ/P2HOJ/P2HABABMAAAAAZ+A==',
82
+ gdprApplies: true
83
+ }
84
+
85
+ }
86
+ const mockVideo1 = [{
87
+ adUnitCode: 'video1',
88
+ auctionId: '01618029-7ae9-4e98-a73a-1ed0c817f414',
89
+ bidId: '2a59588c0114fa',
90
+ bidRequestsCount: 1,
91
+ bidder: 'pilotx',
92
+ bidderRequestId: '1f6b4ba2039726',
93
+ bidderRequestsCount: 1,
94
+ bidderWinsCount: 0,
95
+ crumbs: { pubcid: 'de5240ef-ff80-4b55-8837-26a11cfbf64c' },
96
+ mediaTypes: {
97
+ video: {
98
+ context: 'instream',
99
+ mimes: ['video/mp4'],
100
+ playbackmethod: [2],
101
+ playerSize: [[640, 480]],
102
+ protocols: [1, 2, 3, 4, 5, 6, 7, 8],
103
+ skip: 1
104
+ }
105
+ },
106
+ ortb2Imp: {
107
+ ext: {
108
+ data: {
109
+ pbadslot: 'video1'
110
+ }
111
+ }
112
+ },
113
+ params: { placementId: '379' },
114
+ sizes: [[640, 480]],
115
+ src: 'client',
116
+ transactionId: 'fec9f2ff-da13-4921-8437-8d679c2be7fe',
117
+ }];
118
+ const mockVideo2 = [{
119
+ adUnitCode: 'video1',
120
+ auctionId: '01618029-7ae9-4e98-a73a-1ed0c817f414',
121
+ bidId: '2a59588c0114fa',
122
+ bidRequestsCount: 1,
123
+ bidder: 'pilotx',
124
+ bidderRequestId: '1f6b4ba2039726',
125
+ bidderRequestsCount: 1,
126
+ bidderWinsCount: 0,
127
+ crumbs: { pubcid: 'de5240ef-ff80-4b55-8837-26a11cfbf64c' },
128
+ mediaTypes: {
129
+ video: {
130
+ context: 'instream',
131
+ mimes: ['video/mp4'],
132
+ playbackmethod: [2],
133
+ playerSize: [[640, 480]],
134
+ protocols: [1, 2, 3, 4, 5, 6, 7, 8],
135
+ skip: 1
136
+ }
137
+ },
138
+ ortb2Imp: {
139
+ ext: {
140
+ data: {
141
+ pbadslot: 'video1'
142
+ }
143
+ }
144
+ },
145
+ params: { placementId: '379' },
146
+ sizes: [640, 480],
147
+ src: 'client',
148
+ transactionId: 'fec9f2ff-da13-4921-8437-8d679c2be7fe',
149
+ }];
150
+ it('should return correct response', function () {
151
+ const builtRequest = spec.buildRequests(mockVideo1, mockRequest)
152
+ let builtRequestData = builtRequest.data
153
+ let data = JSON.parse(builtRequestData)
154
+ expect(data['379'].bidId).to.equal(mockVideo1[0].bidId)
155
+ });
156
+ it('should return correct response for only array of size', function () {
157
+ const builtRequest = spec.buildRequests(mockVideo2, mockRequest)
158
+ let builtRequestData = builtRequest.data
159
+ let data = JSON.parse(builtRequestData)
160
+ expect(data['379'].sizes[0][0]).to.equal(mockVideo2[0].sizes[0])
161
+ expect(data['379'].sizes[0][1]).to.equal(mockVideo2[0].sizes[1])
162
+ });
163
+ it('should be valid and pass gdpr items correctly', function () {
164
+ const builtRequest = spec.buildRequests(mockVideo2, mockRequestGDPR)
165
+ let builtRequestData = builtRequest.data
166
+ let data = JSON.parse(builtRequestData)
167
+ expect(data['379'].gdprConsentString).to.equal(mockRequestGDPR.gdprConsent.consentString)
168
+ expect(data['379'].gdprConsentRequired).to.equal(mockRequestGDPR.gdprConsent.gdprApplies)
169
+ });
170
+ });
171
+ describe('interpretResponse', function () {
172
+ const bidRequest = {}
173
+ const serverResponse = {
174
+ cpm: 2.5,
175
+ creativeId: 'V9060',
176
+ currency: 'US',
177
+ height: 480,
178
+ mediaType: 'video',
179
+ netRevenue: false,
180
+ requestId: '273b39c74069cb',
181
+ ttl: 3000,
182
+ vastUrl: 'http://testadserver.com/ads?&k=60cd901ad8ab70c9cedf373cb17b93b8&pid=379&tid=91342717',
183
+ width: 640
184
+ }
185
+ const serverResponseVideo = {
186
+ body: serverResponse
187
+ }
188
+ const serverResponse2 = {
189
+ cpm: 2.5,
190
+ creativeId: 'V9060',
191
+ currency: 'US',
192
+ height: 480,
193
+ mediaType: 'banner',
194
+ netRevenue: false,
195
+ requestId: '273b39c74069cb',
196
+ ttl: 3000,
197
+ vastUrl: 'http://testadserver.com/ads?&k=60cd901ad8ab70c9cedf373cb17b93b8&pid=379&tid=91342717',
198
+ width: 640
199
+ }
200
+ const serverResponseBanner = {
201
+ body: serverResponse2
202
+ }
203
+ it('should be valid from bidRequest for video', function () {
204
+ const bidResponses = spec.interpretResponse(serverResponseVideo, bidRequest)
205
+ expect(bidResponses[0].requestId).to.equal(serverResponse.requestId)
206
+ expect(bidResponses[0].cpm).to.equal(serverResponse.cpm)
207
+ expect(bidResponses[0].width).to.equal(serverResponse.width)
208
+ expect(bidResponses[0].height).to.equal(serverResponse.height)
209
+ expect(bidResponses[0].creativeId).to.equal(serverResponse.creativeId)
210
+ expect(bidResponses[0].currency).to.equal(serverResponse.currency)
211
+ expect(bidResponses[0].netRevenue).to.equal(serverResponse.netRevenue)
212
+ expect(bidResponses[0].ttl).to.equal(serverResponse.ttl)
213
+ expect(bidResponses[0].vastUrl).to.equal(serverResponse.vastUrl)
214
+ expect(bidResponses[0].mediaType).to.equal(serverResponse.mediaType)
215
+ expect(bidResponses[0].meta.mediaType).to.equal(serverResponse.mediaType)
216
+ });
217
+ it('should be valid from bidRequest for banner', function () {
218
+ const bidResponses = spec.interpretResponse(serverResponseBanner, bidRequest)
219
+ expect(bidResponses[0].requestId).to.equal(serverResponse2.requestId)
220
+ expect(bidResponses[0].cpm).to.equal(serverResponse2.cpm)
221
+ expect(bidResponses[0].width).to.equal(serverResponse2.width)
222
+ expect(bidResponses[0].height).to.equal(serverResponse2.height)
223
+ expect(bidResponses[0].creativeId).to.equal(serverResponse2.creativeId)
224
+ expect(bidResponses[0].currency).to.equal(serverResponse2.currency)
225
+ expect(bidResponses[0].netRevenue).to.equal(serverResponse2.netRevenue)
226
+ expect(bidResponses[0].ttl).to.equal(serverResponse2.ttl)
227
+ expect(bidResponses[0].ad).to.equal(serverResponse2.ad)
228
+ expect(bidResponses[0].mediaType).to.equal(serverResponse2.mediaType)
229
+ expect(bidResponses[0].meta.mediaType).to.equal(serverResponse2.mediaType)
230
+ });
231
+ });
232
+ describe('setPlacementID', function () {
233
+ const multiplePlacementIds = ['380', '381']
234
+ it('should be valid with an array of placement ids passed', function () {
235
+ const placementID = spec.setPlacementID(multiplePlacementIds)
236
+ expect(placementID).to.equal('380#381')
237
+ });
238
+ it('should be valid with single placement ID passed', function () {
239
+ const placementID = spec.setPlacementID('381')
240
+ expect(placementID).to.equal('381')
241
+ });
242
+ });
243
+ // Add other `describe` or `it` blocks as necessary
244
+ });
@@ -95,6 +95,9 @@ const BID2 = Object.assign({}, BID, {
95
95
  'hb_pb': '1.500',
96
96
  'hb_size': '728x90',
97
97
  'hb_source': 'server'
98
+ },
99
+ meta: {
100
+ advertiserDomains: ['example.com']
98
101
  }
99
102
  });
100
103
 
@@ -382,6 +385,7 @@ describe('pubmatic analytics adapter', function () {
382
385
  expect(data.s[1].ps[0].di).to.equal('the-deal-id');
383
386
  expect(data.s[1].ps[0].dc).to.equal('PMP');
384
387
  expect(data.s[1].ps[0].mi).to.equal('matched-impression');
388
+ expect(data.s[1].ps[0].adv).to.equal('example.com');
385
389
  expect(data.s[1].ps[0].l1).to.equal(3214);
386
390
  expect(data.s[1].ps[0].l2).to.equal(0);
387
391
  expect(data.s[1].ps[0].ss).to.equal(1);
@@ -651,6 +655,7 @@ describe('pubmatic analytics adapter', function () {
651
655
  expect(data.s[1].ps[0].di).to.equal('the-deal-id');
652
656
  expect(data.s[1].ps[0].dc).to.equal('PMP');
653
657
  expect(data.s[1].ps[0].mi).to.equal('matched-impression');
658
+ expect(data.s[1].ps[0].adv).to.equal('example.com');
654
659
  expect(data.s[1].ps[0].l1).to.equal(3214);
655
660
  expect(data.s[1].ps[0].l2).to.equal(0);
656
661
  expect(data.s[1].ps[0].ss).to.equal(1);
@@ -708,6 +713,7 @@ describe('pubmatic analytics adapter', function () {
708
713
  expect(data.s[1].ps[0].di).to.equal('the-deal-id');
709
714
  expect(data.s[1].ps[0].dc).to.equal('PMP');
710
715
  expect(data.s[1].ps[0].mi).to.equal('matched-impression');
716
+ expect(data.s[1].ps[0].adv).to.equal('example.com');
711
717
  expect(data.s[1].ps[0].l1).to.equal(3214);
712
718
  expect(data.s[1].ps[0].l2).to.equal(0);
713
719
  expect(data.s[1].ps[0].ss).to.equal(1);
@@ -754,6 +760,7 @@ describe('pubmatic analytics adapter', function () {
754
760
  expect(data.s[1].ps[0].di).to.equal('the-deal-id');
755
761
  expect(data.s[1].ps[0].dc).to.equal('PMP');
756
762
  expect(data.s[1].ps[0].mi).to.equal('matched-impression');
763
+ expect(data.s[1].ps[0].adv).to.equal('example.com');
757
764
  expect(data.s[1].ps[0].l1).to.equal(3214);
758
765
  expect(data.s[1].ps[0].l2).to.equal(0);
759
766
  expect(data.s[1].ps[0].ss).to.equal(1);
@@ -771,9 +778,10 @@ describe('pubmatic analytics adapter', function () {
771
778
  expect(data.kgpv).to.equal('*');
772
779
  });
773
780
 
774
- it('Logger: regexPattern in bid.bidResponse', function() {
781
+ it('Logger: regexPattern in bid.bidResponse and url in adomain', function() {
775
782
  const BID2_COPY = utils.deepClone(BID2);
776
783
  BID2_COPY.regexPattern = '*';
784
+ BID2_COPY.meta.advertiserDomains = ['https://www.example.com/abc/223']
777
785
  events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
778
786
  events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
779
787
  events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
@@ -808,6 +816,7 @@ describe('pubmatic analytics adapter', function () {
808
816
  expect(data.s[1].ps[0].di).to.equal('the-deal-id');
809
817
  expect(data.s[1].ps[0].dc).to.equal('PMP');
810
818
  expect(data.s[1].ps[0].mi).to.equal('matched-impression');
819
+ expect(data.s[1].ps[0].adv).to.equal('example.com');
811
820
  expect(data.s[1].ps[0].l1).to.equal(3214);
812
821
  expect(data.s[1].ps[0].l2).to.equal(0);
813
822
  expect(data.s[1].ps[0].ss).to.equal(1);
@@ -859,6 +868,7 @@ describe('pubmatic analytics adapter', function () {
859
868
  expect(data.s[1].ps[0].di).to.equal('the-deal-id');
860
869
  expect(data.s[1].ps[0].dc).to.equal('PMP');
861
870
  expect(data.s[1].ps[0].mi).to.equal('matched-impression');
871
+ expect(data.s[1].ps[0].adv).to.equal('example.com');
862
872
  expect(data.s[1].ps[0].l1).to.equal(3214);
863
873
  expect(data.s[1].ps[0].l2).to.equal(0);
864
874
  expect(data.s[1].ps[0].ss).to.equal(1);
@@ -912,6 +922,7 @@ describe('pubmatic analytics adapter', function () {
912
922
  expect(data.s[1].ps[0].di).to.equal('the-deal-id');
913
923
  expect(data.s[1].ps[0].dc).to.equal('PMP');
914
924
  expect(data.s[1].ps[0].mi).to.equal('matched-impression');
925
+ expect(data.s[1].ps[0].adv).to.equal('example.com');
915
926
  expect(data.s[1].ps[0].l1).to.equal(3214);
916
927
  expect(data.s[1].ps[0].l2).to.equal(0);
917
928
  expect(data.s[1].ps[0].ss).to.equal(1);
@@ -1011,6 +1022,7 @@ describe('pubmatic analytics adapter', function () {
1011
1022
  expect(data.s[1].ps[0].di).to.equal('the-deal-id');
1012
1023
  expect(data.s[1].ps[0].dc).to.equal('PMP');
1013
1024
  expect(data.s[1].ps[0].mi).to.equal('matched-impression');
1025
+ expect(data.s[1].ps[0].adv).to.equal('example.com');
1014
1026
  expect(data.s[1].ps[0].l1).to.equal(3214);
1015
1027
  expect(data.s[1].ps[0].l2).to.equal(0);
1016
1028
  expect(data.s[1].ps[0].ss).to.equal(1);
@@ -3,6 +3,7 @@ import {config} from 'src/config.js';
3
3
  import * as sinon from 'sinon';
4
4
  import {default as CONSTANTS} from '../../../src/constants.json';
5
5
  import {default as events} from '../../../src/events.js';
6
+ import 'src/prebid.js';
6
7
 
7
8
  const getBidRequestDataSpy = sinon.spy();
8
9
 
@@ -140,7 +141,56 @@ describe('Real time module', function () {
140
141
  const adUnits = rtdModule.getAdUnitTargeting(auction);
141
142
  assert.deepEqual(expectedAdUnits, adUnits)
142
143
  done();
143
- })
144
+ });
145
+
146
+ describe('setBidRequestData', () => {
147
+ let withWait, withoutWait;
148
+
149
+ function runSetBidRequestData() {
150
+ return new Promise((resolve) => {
151
+ rtdModule.setBidRequestsData(resolve, {bidRequest: {}});
152
+ });
153
+ }
154
+
155
+ beforeEach(() => {
156
+ withWait = {
157
+ submod: validSMWait,
158
+ cbTime: 0,
159
+ cbRan: false
160
+ };
161
+ withoutWait = {
162
+ submod: validSM,
163
+ cbTime: 0,
164
+ cbRan: false
165
+ };
166
+
167
+ [withWait, withoutWait].forEach((c) => {
168
+ c.submod.getBidRequestData = sinon.stub().callsFake((_, cb) => {
169
+ setTimeout(() => {
170
+ c.cbRan = true;
171
+ cb();
172
+ }, c.cbTime);
173
+ });
174
+ });
175
+ });
176
+
177
+ it('should allow non-priority submodules to run synchronously', () => {
178
+ withWait.cbTime = withoutWait.cbTime = 0;
179
+ return runSetBidRequestData().then(() => {
180
+ expect(withWait.cbRan).to.be.true;
181
+ expect(withoutWait.cbRan).to.be.true;
182
+ })
183
+ });
184
+
185
+ it('should not wait for non-priority submodules if priority ones complete first', () => {
186
+ withWait.cbTime = 10;
187
+ withoutWait.cbTime = 100;
188
+ return runSetBidRequestData().then(() => {
189
+ expect(withWait.cbRan).to.be.true;
190
+ expect(withoutWait.cbRan).to.be.false;
191
+ });
192
+ });
193
+ });
144
194
  });
145
195
 
146
196
  it('deep merge object', function () {
@@ -195,7 +245,7 @@ describe('Real time module', function () {
195
245
  'name': 'tp1',
196
246
  },
197
247
  {
198
- 'name': 'tp2'
248
+ 'name': 'tp2',
199
249
  }
200
250
  ]
201
251
  }
@@ -206,7 +256,7 @@ describe('Real time module', function () {
206
256
  function eventHandlingProvider(name) {
207
257
  const provider = {
208
258
  name: name,
209
- init: () => true
259
+ init: () => true,
210
260
  }
211
261
  Object.values(EVENTS).forEach((ev) => provider[ev] = sinon.spy());
212
262
  return provider;
@@ -222,7 +272,19 @@ describe('Real time module', function () {
222
272
  afterEach(() => {
223
273
  _detachers.forEach((d) => d())
224
274
  config.resetConfig();
225
- })
275
+ });
276
+
277
+ it('should set targeting for auctionEnd', () => {
278
+ providers.forEach(p => p.getTargetingData = sinon.spy());
279
+ const auction = {
280
+ adUnitCodes: ['a1'],
281
+ adUnits: [{code: 'a1'}]
282
+ };
283
+ mockEmitEvent(CONSTANTS.EVENTS.AUCTION_END, auction);
284
+ providers.forEach(p => {
285
+ expect(p.getTargetingData.calledWith(auction.adUnitCodes)).to.be.true;
286
+ });
287
+ });
226
288
 
227
289
  Object.entries(EVENTS).forEach(([event, hook]) => {
228
290
  it(`'${event}' should be propagated to providers through '${hook}'`, () => {
@@ -242,5 +304,5 @@ describe('Real time module', function () {
242
304
  expect(providers[1][hook].called).to.be.true;
243
305
  });
244
306
  });
245
- })
307
+ });
246
308
  });