prebid.js 5.18.0 → 5.20.2

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 (114) hide show
  1. package/browsers.json +1 -0
  2. package/integrationExamples/gpt/akamaidap_segments_example.html +132 -0
  3. package/modules/.submodules.json +1 -0
  4. package/modules/adfBidAdapter.js +21 -16
  5. package/modules/adtelligentBidAdapter.js +2 -1
  6. package/modules/adxcgBidAdapter.js +311 -359
  7. package/modules/airgridRtdProvider.js +1 -1
  8. package/modules/akamaiDapRtdProvider.js +474 -0
  9. package/modules/akamaiDapRtdProvider.md +47 -0
  10. package/modules/appnexusBidAdapter.js +9 -3
  11. package/modules/atsAnalyticsAdapter.js +67 -46
  12. package/modules/atsAnalyticsAdapter.md +1 -0
  13. package/modules/betweenBidAdapter.js +20 -3
  14. package/modules/browsiRtdProvider.js +106 -18
  15. package/modules/cleanioRtdProvider.js +192 -0
  16. package/modules/cleanioRtdProvider.md +59 -0
  17. package/modules/codefuelBidAdapter.js +183 -0
  18. package/modules/codefuelBidAdapter.md +111 -0
  19. package/modules/connectIdSystem.js +104 -0
  20. package/modules/connectIdSystem.md +33 -0
  21. package/modules/deepintentBidAdapter.js +106 -9
  22. package/modules/deepintentBidAdapter.md +36 -1
  23. package/modules/deltaprojectsBidAdapter.js +252 -0
  24. package/modules/deltaprojectsBidAdapter.md +32 -0
  25. package/modules/engageyaBidAdapter.js +157 -0
  26. package/modules/gridBidAdapter.js +1 -0
  27. package/modules/gumgumBidAdapter.js +8 -0
  28. package/modules/inskinBidAdapter.js +7 -3
  29. package/modules/ipromBidAdapter.js +79 -0
  30. package/modules/ixBidAdapter.js +8 -1
  31. package/modules/jixieBidAdapter.js +8 -2
  32. package/modules/justpremiumBidAdapter.js +6 -1
  33. package/modules/kinessoIdSystem.js +1 -1
  34. package/modules/limelightDigitalBidAdapter.js +22 -2
  35. package/modules/livewrappedAnalyticsAdapter.js +49 -1
  36. package/modules/multibid/index.js +3 -3
  37. package/modules/nativoBidAdapter.js +5 -1
  38. package/modules/nextMillenniumBidAdapter.js +12 -3
  39. package/modules/oguryBidAdapter.js +14 -1
  40. package/modules/openxBidAdapter.js +34 -22
  41. package/modules/operaadsBidAdapter.js +21 -1
  42. package/modules/otmBidAdapter.js +146 -0
  43. package/modules/otmBidAdapter.md +27 -26
  44. package/modules/outbrainBidAdapter.js +5 -0
  45. package/modules/playwireBidAdapter.md +61 -0
  46. package/modules/publinkIdSystem.js +11 -6
  47. package/modules/rtdModule/index.js +2 -2
  48. package/modules/sonobiBidAdapter.js +7 -0
  49. package/modules/sortableBidAdapter.js +1 -0
  50. package/modules/teadsBidAdapter.js +3 -0
  51. package/modules/tripleliftBidAdapter.js +22 -5
  52. package/modules/trustxBidAdapter.js +8 -6
  53. package/modules/undertoneBidAdapter.js +9 -5
  54. package/modules/undertoneBidAdapter.md +5 -1
  55. package/modules/userId/eids.js +18 -0
  56. package/modules/userId/eids.md +7 -0
  57. package/modules/userId/userId.md +12 -0
  58. package/modules/ventesBidAdapter.js +370 -0
  59. package/modules/ventesBidAdapter.md +94 -0
  60. package/modules/videobyteBidAdapter.js +13 -6
  61. package/modules/videobyteBidAdapter.md +49 -0
  62. package/modules/yahoosspBidAdapter.js +6 -6
  63. package/modules/yieldmoSyntheticInventoryModule.js +46 -0
  64. package/modules/yieldmoSyntheticInventoryModule.md +68 -0
  65. package/package.json +1 -1
  66. package/src/adapterManager.js +5 -0
  67. package/src/adapters/bidderFactory.js +4 -3
  68. package/src/auction.js +11 -11
  69. package/src/constants.json +1 -0
  70. package/src/secureCreatives.js +6 -7
  71. package/src/targeting.js +11 -9
  72. package/test/spec/modules/adfBidAdapter_spec.js +83 -29
  73. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  74. package/test/spec/modules/adxcgBidAdapter_spec.js +827 -571
  75. package/test/spec/modules/akamaiDapRtdProvider_spec.js +246 -0
  76. package/test/spec/modules/appnexusBidAdapter_spec.js +16 -1
  77. package/test/spec/modules/atsAnalyticsAdapter_spec.js +42 -9
  78. package/test/spec/modules/betweenBidAdapter_spec.js +41 -0
  79. package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
  80. package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
  81. package/test/spec/modules/codefuelBidAdapter_spec.js +316 -0
  82. package/test/spec/modules/connectIdSystem_spec.js +189 -0
  83. package/test/spec/modules/deepintentBidAdapter_spec.js +153 -3
  84. package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
  85. package/test/spec/modules/engageyaBidAdapter_spec.js +286 -0
  86. package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
  87. package/test/spec/modules/gumgumBidAdapter_spec.js +5 -1
  88. package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
  89. package/test/spec/modules/ixBidAdapter_spec.js +13 -3
  90. package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
  91. package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
  92. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +155 -1
  93. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +52 -7
  94. package/test/spec/modules/multibid_spec.js +31 -31
  95. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +13 -1
  96. package/test/spec/modules/oguryBidAdapter_spec.js +53 -12
  97. package/test/spec/modules/openxBidAdapter_spec.js +85 -13
  98. package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
  99. package/test/spec/modules/otmBidAdapter_spec.js +67 -0
  100. package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
  101. package/test/spec/modules/publinkIdSystem_spec.js +6 -6
  102. package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
  103. package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
  104. package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
  105. package/test/spec/modules/tripleliftBidAdapter_spec.js +128 -0
  106. package/test/spec/modules/trustxBidAdapter_spec.js +3 -3
  107. package/test/spec/modules/undertoneBidAdapter_spec.js +52 -0
  108. package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
  109. package/test/spec/modules/videobyteBidAdapter_spec.js +2 -2
  110. package/test/spec/modules/yieldmoSyntheticInventoryModule_spec.js +89 -0
  111. package/test/spec/unit/core/adapterManager_spec.js +37 -2
  112. package/test/spec/unit/core/bidderFactory_spec.js +61 -1
  113. package/test/spec/unit/pbjs_api_spec.js +37 -2
  114. package/test/spec/unit/secureCreatives_spec.js +54 -25
@@ -82,7 +82,7 @@ describe('multibid adapter', function () {
82
82
  'sizes': [[300, 250]]
83
83
  }
84
84
  },
85
- 'adUnitCode': 'test-div',
85
+ 'adUnitCode': 'test.div',
86
86
  'transactionId': 'c153f3da-84f0-4be8-95cb-0647c458bc60',
87
87
  'sizes': [[300, 250]],
88
88
  'bidId': '2408ef83b84c9d',
@@ -106,7 +106,7 @@ describe('multibid adapter', function () {
106
106
  'sizes': [[300, 250]]
107
107
  }
108
108
  },
109
- 'adUnitCode': 'test-div',
109
+ 'adUnitCode': 'test.div',
110
110
  'transactionId': 'c153f3da-84f0-4be8-95cb-0647c458bc60',
111
111
  'sizes': [[300, 250]],
112
112
  'bidId': '2408ef83b84c9d',
@@ -197,14 +197,14 @@ describe('multibid adapter', function () {
197
197
  });
198
198
 
199
199
  it('adds original bids and does not modify', function () {
200
- let adUnitCode = 'test-div';
200
+ let adUnitCode = 'test.div';
201
201
  let bids = [{...bidArray[0]}, {...bidArray[1]}];
202
202
 
203
203
  addBidResponseHook(callbackFn, adUnitCode, {...bids[0]});
204
204
 
205
205
  expect(result).to.not.equal(null);
206
206
  expect(result.adUnitCode).to.not.equal(null);
207
- expect(result.adUnitCode).to.equal('test-div');
207
+ expect(result.adUnitCode).to.equal('test.div');
208
208
  expect(result.bid).to.not.equal(null);
209
209
  expect(result.bid).to.deep.equal(bids[0]);
210
210
 
@@ -214,13 +214,13 @@ describe('multibid adapter', function () {
214
214
 
215
215
  expect(result).to.not.equal(null);
216
216
  expect(result.adUnitCode).to.not.equal(null);
217
- expect(result.adUnitCode).to.equal('test-div');
217
+ expect(result.adUnitCode).to.equal('test.div');
218
218
  expect(result.bid).to.not.equal(null);
219
219
  expect(result.bid).to.deep.equal(bids[1]);
220
220
  });
221
221
 
222
222
  it('modifies and adds both bids based on multibid configuration', function () {
223
- let adUnitCode = 'test-div';
223
+ let adUnitCode = 'test.div';
224
224
  let bids = [{...bidArray[0]}, {...bidArray[1]}];
225
225
 
226
226
  config.setConfig({multibid: [{bidder: 'bidderA', maxBids: 2, targetBiddercodePrefix: 'bidA'}]});
@@ -232,7 +232,7 @@ describe('multibid adapter', function () {
232
232
 
233
233
  expect(result).to.not.equal(null);
234
234
  expect(result.adUnitCode).to.not.equal(null);
235
- expect(result.adUnitCode).to.equal('test-div');
235
+ expect(result.adUnitCode).to.equal('test.div');
236
236
  expect(result.bid).to.not.equal(null);
237
237
  expect(result.bid).to.deep.equal(bids[0]);
238
238
 
@@ -250,13 +250,13 @@ describe('multibid adapter', function () {
250
250
 
251
251
  expect(result).to.not.equal(null);
252
252
  expect(result.adUnitCode).to.not.equal(null);
253
- expect(result.adUnitCode).to.equal('test-div');
253
+ expect(result.adUnitCode).to.equal('test.div');
254
254
  expect(result.bid).to.not.equal(null);
255
255
  expect(result.bid).to.deep.equal(bids[1]);
256
256
  });
257
257
 
258
258
  it('only modifies bids defined in the multibid configuration', function () {
259
- let adUnitCode = 'test-div';
259
+ let adUnitCode = 'test.div';
260
260
  let bids = [{...bidArray[0]}, {...bidArray[1]}];
261
261
 
262
262
  bids.push({
@@ -276,7 +276,7 @@ describe('multibid adapter', function () {
276
276
 
277
277
  expect(result).to.not.equal(null);
278
278
  expect(result.adUnitCode).to.not.equal(null);
279
- expect(result.adUnitCode).to.equal('test-div');
279
+ expect(result.adUnitCode).to.equal('test.div');
280
280
  expect(result.bid).to.not.equal(null);
281
281
  expect(result.bid).to.deep.equal(bids[0]);
282
282
 
@@ -292,7 +292,7 @@ describe('multibid adapter', function () {
292
292
 
293
293
  expect(result).to.not.equal(null);
294
294
  expect(result.adUnitCode).to.not.equal(null);
295
- expect(result.adUnitCode).to.equal('test-div');
295
+ expect(result.adUnitCode).to.equal('test.div');
296
296
  expect(result.bid).to.not.equal(null);
297
297
  expect(result.bid).to.deep.equal(bids[1]);
298
298
 
@@ -302,13 +302,13 @@ describe('multibid adapter', function () {
302
302
 
303
303
  expect(result).to.not.equal(null);
304
304
  expect(result.adUnitCode).to.not.equal(null);
305
- expect(result.adUnitCode).to.equal('test-div');
305
+ expect(result.adUnitCode).to.equal('test.div');
306
306
  expect(result.bid).to.not.equal(null);
307
307
  expect(result.bid).to.deep.equal(bids[2]);
308
308
  });
309
309
 
310
310
  it('only modifies and returns bids under limit for a specifc bidder in the multibid configuration', function () {
311
- let adUnitCode = 'test-div';
311
+ let adUnitCode = 'test.div';
312
312
  let bids = [{...bidArray[0]}, {...bidArray[1]}];
313
313
 
314
314
  bids.push({
@@ -328,7 +328,7 @@ describe('multibid adapter', function () {
328
328
 
329
329
  expect(result).to.not.equal(null);
330
330
  expect(result.adUnitCode).to.not.equal(null);
331
- expect(result.adUnitCode).to.equal('test-div');
331
+ expect(result.adUnitCode).to.equal('test.div');
332
332
  expect(result.bid).to.not.equal(null);
333
333
  expect(result.bid).to.deep.equal(bids[0]);
334
334
 
@@ -344,7 +344,7 @@ describe('multibid adapter', function () {
344
344
 
345
345
  expect(result).to.not.equal(null);
346
346
  expect(result.adUnitCode).to.not.equal(null);
347
- expect(result.adUnitCode).to.equal('test-div');
347
+ expect(result.adUnitCode).to.equal('test.div');
348
348
  expect(result.bid).to.not.equal(null);
349
349
  expect(result.bid).to.deep.equal(bids[1]);
350
350
 
@@ -356,7 +356,7 @@ describe('multibid adapter', function () {
356
356
  });
357
357
 
358
358
  it('if no prefix in multibid configuration, modifies and returns bids under limit without preifx property', function () {
359
- let adUnitCode = 'test-div';
359
+ let adUnitCode = 'test.div';
360
360
  let bids = [{...bidArray[0]}, {...bidArray[1]}];
361
361
 
362
362
  bids.push({
@@ -375,7 +375,7 @@ describe('multibid adapter', function () {
375
375
 
376
376
  expect(result).to.not.equal(null);
377
377
  expect(result.adUnitCode).to.not.equal(null);
378
- expect(result.adUnitCode).to.equal('test-div');
378
+ expect(result.adUnitCode).to.equal('test.div');
379
379
  expect(result.bid).to.not.equal(null);
380
380
  expect(result.bid).to.deep.equal(bids[0]);
381
381
 
@@ -389,7 +389,7 @@ describe('multibid adapter', function () {
389
389
 
390
390
  expect(result).to.not.equal(null);
391
391
  expect(result.adUnitCode).to.not.equal(null);
392
- expect(result.adUnitCode).to.equal('test-div');
392
+ expect(result.adUnitCode).to.equal('test.div');
393
393
  expect(result.bid).to.not.equal(null);
394
394
  expect(result.bid).to.deep.equal(bids[1]);
395
395
 
@@ -401,7 +401,7 @@ describe('multibid adapter', function () {
401
401
  });
402
402
 
403
403
  it('does not include extra bids if cpm is less than floor value', function () {
404
- let adUnitCode = 'test-div';
404
+ let adUnitCode = 'test.div';
405
405
  let bids = [{...bidArrayAlt[1]}, {...bidArrayAlt[0]}, {...bidArrayAlt[2]}, {...bidArrayAlt[3]}];
406
406
 
407
407
  bids.map(bid => {
@@ -418,7 +418,7 @@ describe('multibid adapter', function () {
418
418
  floorRuleValue: 65,
419
419
  floorValue: 65,
420
420
  matchedFields: {
421
- gptSlot: 'test-div',
421
+ gptSlot: 'test.div',
422
422
  mediaType: 'banner'
423
423
  }
424
424
  }
@@ -435,7 +435,7 @@ describe('multibid adapter', function () {
435
435
 
436
436
  expect(result).to.not.equal(null);
437
437
  expect(result.adUnitCode).to.not.equal(null);
438
- expect(result.adUnitCode).to.equal('test-div');
438
+ expect(result.adUnitCode).to.equal('test.div');
439
439
  expect(result.bid).to.not.equal(null);
440
440
  expect(result.bid.bidder).to.equal('bidderA');
441
441
  expect(result.bid.targetingBidder).to.equal(undefined);
@@ -452,7 +452,7 @@ describe('multibid adapter', function () {
452
452
 
453
453
  expect(result).to.not.equal(null);
454
454
  expect(result.adUnitCode).to.not.equal(null);
455
- expect(result.adUnitCode).to.equal('test-div');
455
+ expect(result.adUnitCode).to.equal('test.div');
456
456
  expect(result.bid).to.not.equal(null);
457
457
  expect(result.bid.bidder).to.equal('bidderB');
458
458
  expect(result.bid.targetingBidder).to.equal(undefined);
@@ -463,14 +463,14 @@ describe('multibid adapter', function () {
463
463
 
464
464
  expect(result).to.not.equal(null);
465
465
  expect(result.adUnitCode).to.not.equal(null);
466
- expect(result.adUnitCode).to.equal('test-div');
466
+ expect(result.adUnitCode).to.equal('test.div');
467
467
  expect(result.bid).to.not.equal(null);
468
468
  expect(result.bid.bidder).to.equal('bidderC');
469
469
  expect(result.bid.targetingBidder).to.equal(undefined);
470
470
  });
471
471
 
472
472
  it('does include extra bids if cpm is not less than floor value', function () {
473
- let adUnitCode = 'test-div';
473
+ let adUnitCode = 'test.div';
474
474
  let bids = [{...bidArrayAlt[1]}, {...bidArrayAlt[0]}];
475
475
 
476
476
  bids.map(bid => {
@@ -487,7 +487,7 @@ describe('multibid adapter', function () {
487
487
  floorRuleValue: 25,
488
488
  floorValue: 25,
489
489
  matchedFields: {
490
- gptSlot: 'test-div',
490
+ gptSlot: 'test.div',
491
491
  mediaType: 'banner'
492
492
  }
493
493
  }
@@ -504,7 +504,7 @@ describe('multibid adapter', function () {
504
504
 
505
505
  expect(result).to.not.equal(null);
506
506
  expect(result.adUnitCode).to.not.equal(null);
507
- expect(result.adUnitCode).to.equal('test-div');
507
+ expect(result.adUnitCode).to.equal('test.div');
508
508
  expect(result.bid).to.not.equal(null);
509
509
  expect(result.bid.bidder).to.equal('bidderA');
510
510
  expect(result.bid.targetingBidder).to.equal(undefined);
@@ -518,7 +518,7 @@ describe('multibid adapter', function () {
518
518
 
519
519
  expect(result).to.not.equal(null);
520
520
  expect(result.adUnitCode).to.not.equal(null);
521
- expect(result.adUnitCode).to.equal('test-div');
521
+ expect(result.adUnitCode).to.equal('test.div');
522
522
  expect(result.bid).to.not.equal(null);
523
523
  expect(result.bid.bidder).to.equal('bidderA');
524
524
  expect(result.bid.targetingBidder).to.equal('bidA2');
@@ -578,7 +578,7 @@ describe('multibid adapter', function () {
578
578
 
579
579
  it('it sorts and creates dynamic alias on bidsReceived if multibid configuration found with prefix', function () {
580
580
  let modifiedBids = [{...bidArray[1]}, {...bidArray[0]}].map(bid => {
581
- addBidResponseHook(bidResponseCallback, 'test-div', {...bid});
581
+ addBidResponseHook(bidResponseCallback, 'test.div', {...bid});
582
582
 
583
583
  return bidResult;
584
584
  });
@@ -603,7 +603,7 @@ describe('multibid adapter', function () {
603
603
 
604
604
  it('it sorts by cpm treating dynamic alias as unique bid when no bid limit defined', function () {
605
605
  let modifiedBids = [{...bidArrayAlt[0]}, {...bidArrayAlt[2]}, {...bidArrayAlt[3]}, {...bidArrayAlt[1]}].map(bid => {
606
- addBidResponseHook(bidResponseCallback, 'test-div', {...bid});
606
+ addBidResponseHook(bidResponseCallback, 'test.div', {...bid});
607
607
 
608
608
  return bidResult;
609
609
  });
@@ -636,7 +636,7 @@ describe('multibid adapter', function () {
636
636
 
637
637
  it('it should filter out dynamic bid when bid limit is less than unique bid pool', function () {
638
638
  let modifiedBids = [{...bidArrayAlt[0]}, {...bidArrayAlt[2]}, {...bidArrayAlt[3]}, {...bidArrayAlt[1]}].map(bid => {
639
- addBidResponseHook(bidResponseCallback, 'test-div', {...bid});
639
+ addBidResponseHook(bidResponseCallback, 'test.div', {...bid});
640
640
 
641
641
  return bidResult;
642
642
  });
@@ -662,7 +662,7 @@ describe('multibid adapter', function () {
662
662
  config.setConfig({ multibid: [{bidder: 'bidderA', maxBids: 2, targetBiddercodePrefix: 'bidA'}] });
663
663
 
664
664
  let modifiedBids = [{...bidArrayAlt[0]}, {...bidArrayAlt[2]}, {...bidArrayAlt[3]}, {...bidArrayAlt[1]}].map(bid => {
665
- addBidResponseHook(bidResponseCallback, 'test-div', {...bid});
665
+ addBidResponseHook(bidResponseCallback, 'test.div', {...bid});
666
666
 
667
667
  return bidResult;
668
668
  });
@@ -8,10 +8,22 @@ describe('nextMillenniumBidAdapterTests', function() {
8
8
  auctionId: 'b06c5141-fe8f-4cdf-9d7d-54415490a917',
9
9
  bidder: 'nextMillennium',
10
10
  params: { placement_id: '-1' },
11
- sizes: [[300, 250]]
11
+ sizes: [[300, 250]],
12
+ uspConsent: '1---',
13
+ gdprConsent: {
14
+ consentString: 'kjfdniwjnifwenrif3',
15
+ gdprApplies: true
16
+ }
12
17
  }
13
18
  ];
14
19
 
20
+ it('Request params check with GDPR Consent', function () {
21
+ const request = spec.buildRequests(bidRequestData, bidRequestData[0]);
22
+ expect(JSON.parse(request[0].data).user.ext.consent).to.equal('kjfdniwjnifwenrif3');
23
+ expect(JSON.parse(request[0].data).regs.ext.us_privacy).to.equal('1---');
24
+ expect(JSON.parse(request[0].data).regs.ext.gdpr).to.equal(1);
25
+ });
26
+
15
27
  it('validate_generated_params', function() {
16
28
  const request = spec.buildRequests(bidRequestData);
17
29
  expect(request[0].bidId).to.equal('bid1234');
@@ -1,6 +1,6 @@
1
1
  import { expect } from 'chai';
2
2
  import { spec } from 'modules/oguryBidAdapter';
3
- import { deepClone } from 'src/utils.js';
3
+ import * as utils from 'src/utils.js';
4
4
 
5
5
  const BID_URL = 'https://mweb-hb.presage.io/api/header-bidding-request';
6
6
  const TIMEOUT_URL = 'https://ms-ads-monitoring-events.presage.io/bid_timeout'
@@ -68,14 +68,14 @@ describe('OguryBidAdapter', function () {
68
68
 
69
69
  describe('isBidRequestValid', function () {
70
70
  it('should validate correct bid', () => {
71
- let validBid = deepClone(bidRequests[0]);
71
+ let validBid = utils.deepClone(bidRequests[0]);
72
72
 
73
73
  let isValid = spec.isBidRequestValid(validBid);
74
74
  expect(isValid).to.equal(true);
75
75
  });
76
76
 
77
77
  it('should not validate incorrect bid', () => {
78
- let invalidBid = deepClone(bidRequests[0]);
78
+ let invalidBid = utils.deepClone(bidRequests[0]);
79
79
  delete invalidBid.sizes;
80
80
  delete invalidBid.mediaTypes;
81
81
 
@@ -84,7 +84,7 @@ describe('OguryBidAdapter', function () {
84
84
  });
85
85
 
86
86
  it('should not validate bid if adunit is not present', () => {
87
- let invalidBid = deepClone(bidRequests[0]);
87
+ let invalidBid = utils.deepClone(bidRequests[0]);
88
88
  delete invalidBid.params.adUnitId;
89
89
 
90
90
  let isValid = spec.isBidRequestValid(invalidBid);
@@ -92,7 +92,7 @@ describe('OguryBidAdapter', function () {
92
92
  });
93
93
 
94
94
  it('should not validate bid if assetKet is not present', () => {
95
- let invalidBid = deepClone(bidRequests[0]);
95
+ let invalidBid = utils.deepClone(bidRequests[0]);
96
96
  delete invalidBid.params.assetKey;
97
97
 
98
98
  let isValid = spec.isBidRequestValid(invalidBid);
@@ -100,7 +100,7 @@ describe('OguryBidAdapter', function () {
100
100
  });
101
101
 
102
102
  it('should validate bid if getFloor is not present', () => {
103
- let invalidBid = deepClone(bidRequests[1]);
103
+ let invalidBid = utils.deepClone(bidRequests[1]);
104
104
  delete invalidBid.getFloor;
105
105
 
106
106
  let isValid = spec.isBidRequestValid(invalidBid);
@@ -270,7 +270,7 @@ describe('OguryBidAdapter', function () {
270
270
  };
271
271
 
272
272
  it('sends bid request to ENDPOINT via POST', function () {
273
- const validBidRequests = deepClone(bidRequests)
273
+ const validBidRequests = utils.deepClone(bidRequests)
274
274
 
275
275
  const request = spec.buildRequests(validBidRequests, bidderRequest);
276
276
  expect(request.url).to.equal(BID_URL);
@@ -278,7 +278,7 @@ describe('OguryBidAdapter', function () {
278
278
  });
279
279
 
280
280
  it('bid request object should be conform', function () {
281
- const validBidRequests = deepClone(bidRequests)
281
+ const validBidRequests = utils.deepClone(bidRequests)
282
282
 
283
283
  const request = spec.buildRequests(validBidRequests, bidderRequest);
284
284
  expect(request.data).to.deep.equal(expectedRequestObject);
@@ -316,7 +316,7 @@ describe('OguryBidAdapter', function () {
316
316
  ...expectedRequestObject
317
317
  };
318
318
 
319
- const validBidRequests = deepClone(bidRequests);
319
+ const validBidRequests = utils.deepClone(bidRequests);
320
320
  validBidRequests[1] = {
321
321
  ...validBidRequests[1],
322
322
  getFloor: undefined
@@ -331,7 +331,7 @@ describe('OguryBidAdapter', function () {
331
331
  ...expectedRequestObject
332
332
  };
333
333
 
334
- let validBidRequests = deepClone(bidRequests);
334
+ let validBidRequests = utils.deepClone(bidRequests);
335
335
  validBidRequests[1] = {
336
336
  ...validBidRequests[1],
337
337
  getFloor: 'getFloor'
@@ -342,9 +342,9 @@ describe('OguryBidAdapter', function () {
342
342
  });
343
343
 
344
344
  it('should handle bidFloor when currency is not USD', () => {
345
- const expectedRequestWithUnsupportedFloorCurrency = deepClone(expectedRequestObject)
345
+ const expectedRequestWithUnsupportedFloorCurrency = utils.deepClone(expectedRequestObject)
346
346
  expectedRequestWithUnsupportedFloorCurrency.imp[0].bidfloor = 0;
347
- let validBidRequests = deepClone(bidRequests);
347
+ let validBidRequests = utils.deepClone(bidRequests);
348
348
  validBidRequests[0] = {
349
349
  ...validBidRequests[0],
350
350
  getFloor: ({ size, currency, mediaType }) => {
@@ -490,6 +490,47 @@ describe('OguryBidAdapter', function () {
490
490
  expect(requests[0].url).to.equal(nurl);
491
491
  expect(requests[0].method).to.equal('GET')
492
492
  })
493
+
494
+ it('Should trigger getWindowContext method', function() {
495
+ const bidSample = {
496
+ id: 'advertId',
497
+ impid: 'bidId',
498
+ price: 100,
499
+ nurl: 'url',
500
+ adm: `<html><head><title>test creative</title></head><body style="margin: 0;"><div><img style="width: 300px; height: 250px;" src="https://assets.afcdn.com/recipe/20190529/93153_w1024h768c1cx2220cy1728cxt0cyt0cxb4441cyb3456.jpg" alt="cookies" /></div></body></html>`,
501
+ adomain: ['renault.fr'],
502
+ ext: {
503
+ adcontent: 'sample_creative',
504
+ advertid: '1a278c48-b79a-4bbf-b69f-3824803e7d87',
505
+ campaignid: '31724',
506
+ mediatype: 'image',
507
+ userid: 'ab4aabed-5230-49d9-9f1a-f06280d28366',
508
+ usersync: true,
509
+ advertiserid: '1',
510
+ isomidcompliant: false
511
+ },
512
+ w: 180,
513
+ h: 101
514
+ }
515
+ spec.onBidWon(bidSample)
516
+ expect(window.top.OG_PREBID_BID_OBJECT).to.deep.equal(bidSample)
517
+ })
518
+ })
519
+
520
+ describe('getWindowContext', function() {
521
+ it('Should return top window if exist', function() {
522
+ const res = spec.getWindowContext()
523
+ expect(res).to.equal(window.top)
524
+ expect(res).to.not.be.undefined;
525
+ })
526
+
527
+ it('Should return self window if getting top window throw an error', function() {
528
+ const stub = sinon.stub(utils, 'getWindowTop')
529
+ stub.throws()
530
+ const res = spec.getWindowContext()
531
+ expect(res).to.equal(window.self)
532
+ utils.getWindowTop.restore()
533
+ })
493
534
  })
494
535
 
495
536
  describe('onTimeout', function () {
@@ -1085,7 +1085,7 @@ describe('OpenxAdapter', function () {
1085
1085
  intentIqId: '1111-intentiqid',
1086
1086
  lipb: {lipbid: '1111-lipb'},
1087
1087
  lotamePanoramaId: '1111-lotameid',
1088
- merkleId: '1111-merkleid',
1088
+ merkleId: {id: '1111-merkleid'},
1089
1089
  netId: 'fH5A3n2O8_CZZyPoJVD-eabc6ECb7jhxCicsds7qSg',
1090
1090
  parrableId: { eid: 'eidVersion.encryptionKeyReference.encryptedValue' },
1091
1091
  pubcid: '1111-pubcid',
@@ -1139,6 +1139,9 @@ describe('OpenxAdapter', function () {
1139
1139
  let userIdValue;
1140
1140
  // handle cases where userId key refers to an object
1141
1141
  switch (userIdProviderKey) {
1142
+ case 'merkleId':
1143
+ userIdValue = EXAMPLE_DATA_BY_ATTR.merkleId.id;
1144
+ break;
1142
1145
  case 'flocId':
1143
1146
  userIdValue = EXAMPLE_DATA_BY_ATTR.flocId.id;
1144
1147
  break;
@@ -1545,7 +1548,7 @@ describe('OpenxAdapter', function () {
1545
1548
  describe('with segments', function () {
1546
1549
  const TESTS = [
1547
1550
  {
1548
- name: 'should send proprietary segment data from first party config',
1551
+ name: 'should send proprietary segment data from ortb2.user.data',
1549
1552
  config: {
1550
1553
  ortb2: {
1551
1554
  user: {
@@ -1556,10 +1559,51 @@ describe('OpenxAdapter', function () {
1556
1559
  }
1557
1560
  }
1558
1561
  },
1559
- expect: 'dmp1/4:foo|bar,dmp2:baz',
1562
+ expect: {sm: 'dmp1/4:foo|bar,dmp2:baz'},
1560
1563
  },
1561
1564
  {
1562
- name: 'should combine same provider segment data from first party config',
1565
+ name: 'should send proprietary segment data from ortb2.site.content.data',
1566
+ config: {
1567
+ ortb2: {
1568
+ site: {
1569
+ content: {
1570
+ data: [
1571
+ {name: 'dmp1', ext: {segtax: 4}, segment: [{id: 'foo'}, {id: 'bar'}]},
1572
+ {name: 'dmp2', segment: [{id: 'baz'}]},
1573
+ ]
1574
+ }
1575
+ }
1576
+ }
1577
+ },
1578
+ expect: {scsm: 'dmp1/4:foo|bar,dmp2:baz'},
1579
+ },
1580
+ {
1581
+ name: 'should send proprietary segment data from both ortb2.site.content.data and ortb2.user.data',
1582
+ config: {
1583
+ ortb2: {
1584
+ user: {
1585
+ data: [
1586
+ {name: 'dmp1', ext: {segtax: 4}, segment: [{id: 'foo'}, {id: 'bar'}]},
1587
+ {name: 'dmp2', segment: [{id: 'baz'}]},
1588
+ ]
1589
+ },
1590
+ site: {
1591
+ content: {
1592
+ data: [
1593
+ {name: 'dmp3', ext: {segtax: 5}, segment: [{id: 'foo2'}, {id: 'bar2'}]},
1594
+ {name: 'dmp4', segment: [{id: 'baz2'}]},
1595
+ ]
1596
+ }
1597
+ }
1598
+ }
1599
+ },
1600
+ expect: {
1601
+ sm: 'dmp1/4:foo|bar,dmp2:baz',
1602
+ scsm: 'dmp3/5:foo2|bar2,dmp4:baz2'
1603
+ },
1604
+ },
1605
+ {
1606
+ name: 'should combine same provider segment data from ortb2.user.data',
1563
1607
  config: {
1564
1608
  ortb2: {
1565
1609
  user: {
@@ -1570,7 +1614,23 @@ describe('OpenxAdapter', function () {
1570
1614
  }
1571
1615
  }
1572
1616
  },
1573
- expect: 'dmp1/4:foo|bar,dmp1:baz',
1617
+ expect: {sm: 'dmp1/4:foo|bar,dmp1:baz'},
1618
+ },
1619
+ {
1620
+ name: 'should combine same provider segment data from ortb2.site.content.data',
1621
+ config: {
1622
+ ortb2: {
1623
+ site: {
1624
+ content: {
1625
+ data: [
1626
+ {name: 'dmp1', ext: {segtax: 4}, segment: [{id: 'foo'}, {id: 'bar'}]},
1627
+ {name: 'dmp1', ext: {}, segment: [{id: 'baz'}]},
1628
+ ]
1629
+ }
1630
+ }
1631
+ }
1632
+ },
1633
+ expect: {scsm: 'dmp1/4:foo|bar,dmp1:baz'},
1574
1634
  },
1575
1635
  {
1576
1636
  name: 'should not send any segment data if first party config is incomplete',
@@ -1595,6 +1655,14 @@ describe('OpenxAdapter', function () {
1595
1655
  {name: 'dmp1', segment: [{id: 'foo'}, {id: 'bar'}]},
1596
1656
  {name: 'dmp2', segment: [{id: 'baz'}]},
1597
1657
  ]
1658
+ },
1659
+ site: {
1660
+ content: {
1661
+ data: [
1662
+ {name: 'dmp3', ext: {segtax: 5}, segment: [{id: 'foo2'}, {id: 'bar2'}]},
1663
+ {name: 'dmp4', segment: [{id: 'baz2'}]},
1664
+ ]
1665
+ }
1598
1666
  }
1599
1667
  }
1600
1668
  },
@@ -1606,7 +1674,10 @@ describe('OpenxAdapter', function () {
1606
1674
  },
1607
1675
  },
1608
1676
  },
1609
- expect: 'dmp1:foo|bar,dmp2:baz,liveintent:l1|l2',
1677
+ expect: {
1678
+ sm: 'dmp1:foo|bar,dmp2:baz,liveintent:l1|l2',
1679
+ scsm: 'dmp3/5:foo2|bar2,dmp4:baz2'
1680
+ },
1610
1681
  },
1611
1682
  {
1612
1683
  name: 'should send just liveintent segment from request if no first party config',
@@ -1619,7 +1690,7 @@ describe('OpenxAdapter', function () {
1619
1690
  },
1620
1691
  },
1621
1692
  },
1622
- expect: 'liveintent:l1|l2',
1693
+ expect: {sm: 'liveintent:l1|l2'},
1623
1694
  },
1624
1695
  {
1625
1696
  name: 'should send nothing if lipb section does not contain segments',
@@ -1636,13 +1707,11 @@ describe('OpenxAdapter', function () {
1636
1707
  utils._each(TESTS, (t) => {
1637
1708
  context('in ortb2.user.data', function () {
1638
1709
  let bidRequests;
1639
- let configStub;
1640
-
1641
1710
  beforeEach(function () {
1642
1711
  let fpdConfig = t.config
1643
- configStub = sinon
1712
+ sinon
1644
1713
  .stub(config, 'getConfig')
1645
- .withArgs('ortb2.user.data')
1714
+ .withArgs(sinon.match(/^ortb2\.user\.data$|^ortb2\.site\.content\.data$/))
1646
1715
  .callsFake((key) => {
1647
1716
  return utils.deepAccess(fpdConfig, key);
1648
1717
  });
@@ -1658,10 +1727,13 @@ describe('OpenxAdapter', function () {
1658
1727
  const request = spec.buildRequests(bidRequests, mockBidderRequest)
1659
1728
  expect(request.length).to.equal(1);
1660
1729
  if (t.expect) {
1661
- expect(request[0].data.sm).to.exist;
1662
- expect(request[0].data.sm).to.equal(encodeURIComponent(t.expect));
1730
+ for (const key in t.expect) {
1731
+ expect(request[0].data[key]).to.exist;
1732
+ expect(request[0].data[key]).to.equal(t.expect[key]);
1733
+ }
1663
1734
  } else {
1664
1735
  expect(request[0].data.sm).to.not.exist;
1736
+ expect(request[0].data.scsm).to.not.exist;
1665
1737
  }
1666
1738
  });
1667
1739
  });
@@ -369,7 +369,7 @@ describe('Opera Ads Bid Adapter', function () {
369
369
  requestData = JSON.parse(reqs[0].data);
370
370
  }).to.not.throw();
371
371
 
372
- expect(requestData.user.id).to.equal(bidRequests[0].userId.sharedid.id);
372
+ expect(requestData.user.buyeruid).to.equal(bidRequests[0].userId.sharedid.id);
373
373
  });
374
374
 
375
375
  it('pubcid should be used when sharedid is empty', function () {
@@ -406,7 +406,7 @@ describe('Opera Ads Bid Adapter', function () {
406
406
  requestData = JSON.parse(reqs[0].data);
407
407
  }).to.not.throw();
408
408
 
409
- expect(requestData.user.id).to.equal(bidRequests[0].userId.pubcid);
409
+ expect(requestData.user.buyeruid).to.equal(bidRequests[0].userId.pubcid);
410
410
  });
411
411
 
412
412
  it('random uid will be generate when userId is empty', function () {
@@ -433,7 +433,7 @@ describe('Opera Ads Bid Adapter', function () {
433
433
  requestData = JSON.parse(reqs[0].data);
434
434
  }).to.not.throw();
435
435
 
436
- expect(requestData.user.id).to.not.be.empty;
436
+ expect(requestData.user.buyeruid).to.not.be.empty;
437
437
  })
438
438
  });
439
439
 
@@ -679,9 +679,41 @@ describe('Opera Ads Bid Adapter', function () {
679
679
  });
680
680
  });
681
681
 
682
- describe('Test getUserSyncs', function () {
683
- it('getUserSyncs should return empty array', function () {
684
- expect(spec.getUserSyncs()).to.be.an('array').that.is.empty;
682
+ describe('Test getUserSyncs with both iframe and pixel disabled', function () {
683
+ it('getUserSyncs should return an empty array', function () {
684
+ const syncOptions = {};
685
+ expect(spec.getUserSyncs(syncOptions)).to.be.an('array').that.is.empty;
686
+ });
687
+ });
688
+
689
+ describe('Test getUserSyncs with iframe enabled', function () {
690
+ it('getUserSyncs should return array', function () {
691
+ const syncOptions = {
692
+ iframeEnabled: true
693
+ }
694
+ const userSyncPixels = spec.getUserSyncs(syncOptions)
695
+ expect(userSyncPixels).to.have.lengthOf(1);
696
+ expect(userSyncPixels[0].url).to.equal('https://s.adx.opera.com/usersync/page')
697
+ });
698
+ });
699
+
700
+ describe('Test getUserSyncs with pixel enabled', function () {
701
+ it('getUserSyncs should return array', function () {
702
+ const serverResponse = {
703
+ body: {
704
+ 'pixels': [
705
+ 'https://b1.com/usersync',
706
+ 'https://b2.com/usersync'
707
+ ]
708
+ }
709
+ };
710
+ const syncOptions = {
711
+ pixelEnabled: true
712
+ }
713
+ const userSyncPixels = spec.getUserSyncs(syncOptions, [serverResponse])
714
+ expect(userSyncPixels).to.have.lengthOf(2);
715
+ expect(userSyncPixels[0].url).to.equal('https://b1.com/usersync')
716
+ expect(userSyncPixels[1].url).to.equal('https://b2.com/usersync')
685
717
  });
686
718
  });
687
719