prebid.js 6.1.0 → 6.2.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 (69) hide show
  1. package/README.md +1 -1
  2. package/browsers.json +13 -29
  3. package/karma.conf.maker.js +1 -1
  4. package/modules/admixerBidAdapter.js +2 -1
  5. package/modules/adnuntiusBidAdapter.js +2 -1
  6. package/modules/adplusBidAdapter.js +203 -0
  7. package/modules/adplusBidAdapter.md +39 -0
  8. package/modules/adyoulikeBidAdapter.js +7 -2
  9. package/modules/appnexusBidAdapter.js +19 -2
  10. package/modules/beachfrontBidAdapter.js +14 -17
  11. package/modules/craftBidAdapter.js +5 -3
  12. package/modules/dchain.js +149 -0
  13. package/modules/dchain.md +45 -0
  14. package/modules/emx_digitalBidAdapter.js +9 -1
  15. package/modules/freewheel-sspBidAdapter.js +6 -0
  16. package/modules/goldbachBidAdapter.js +1176 -0
  17. package/modules/goldbachBidAdapter.md +151 -0
  18. package/modules/gumgumBidAdapter.js +5 -1
  19. package/modules/intersectionRtdProvider.js +114 -0
  20. package/modules/invibesBidAdapter.js +15 -9
  21. package/modules/ipromBidAdapter.js +79 -0
  22. package/modules/limelightDigitalBidAdapter.js +2 -1
  23. package/modules/luponmediaBidAdapter.js +570 -0
  24. package/modules/missenaBidAdapter.js +89 -0
  25. package/modules/pubmaticBidAdapter.js +3 -3
  26. package/modules/relaidoBidAdapter.js +86 -65
  27. package/modules/richaudienceBidAdapter.js +1 -1
  28. package/modules/smaatoBidAdapter.js +4 -1
  29. package/modules/smartxBidAdapter.js +17 -1
  30. package/modules/tappxBidAdapter.js +3 -1
  31. package/modules/undertoneBidAdapter.js +8 -1
  32. package/modules/userId/index.js +27 -2
  33. package/modules/ventes.md +71 -0
  34. package/modules/ventesBidAdapter.js +104 -64
  35. package/modules/ventesBidAdapter.md +0 -1
  36. package/modules/visxBidAdapter.js +19 -2
  37. package/modules/visxBidAdapter.md +4 -6
  38. package/modules/yahoosspBidAdapter.md +1 -1
  39. package/modules/yieldoneBidAdapter.js +115 -11
  40. package/package.json +1 -1
  41. package/src/auction.js +3 -2
  42. package/src/targeting.js +2 -2
  43. package/src/utils.js +7 -0
  44. package/test/spec/integration/faker/googletag.js +6 -0
  45. package/test/spec/modules/adnuntiusBidAdapter_spec.js +18 -0
  46. package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
  47. package/test/spec/modules/adyoulikeBidAdapter_spec.js +26 -0
  48. package/test/spec/modules/appnexusBidAdapter_spec.js +49 -1
  49. package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
  50. package/test/spec/modules/dchain_spec.js +329 -0
  51. package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
  52. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
  53. package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
  54. package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
  55. package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
  56. package/test/spec/modules/invibesBidAdapter_spec.js +29 -4
  57. package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
  58. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +10 -7
  59. package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
  60. package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
  61. package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
  62. package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
  63. package/test/spec/modules/smaatoBidAdapter_spec.js +31 -0
  64. package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
  65. package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
  66. package/test/spec/modules/userId_spec.js +51 -0
  67. package/test/spec/modules/visxBidAdapter_spec.js +120 -4
  68. package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
  69. package/test/spec/unit/core/targeting_spec.js +44 -0
@@ -57,23 +57,34 @@ describe('RelaidoAdapter', function () {
57
57
  serverResponse = {
58
58
  body: {
59
59
  status: 'ok',
60
- price: 500,
61
- model: 'vcpm',
62
- currency: 'JPY',
63
- creativeId: 1000,
64
- uuid: relaido_uuid,
65
- vast: '<VAST version="3.0"><Ad><InLine></InLine></Ad></VAST>',
60
+ ads: [{
61
+ placementId: 100000,
62
+ width: 640,
63
+ height: 360,
64
+ bidId: '2ed93003f7bb99',
65
+ price: 500,
66
+ model: 'vcpm',
67
+ currency: 'JPY',
68
+ creativeId: 1000,
69
+ vast: '<VAST version="3.0"><Ad><InLine></InLine></Ad></VAST>',
70
+ syncUrl: 'https://relaido/sync.html',
71
+ adomain: ['relaido.co.jp', 'www.cmertv.co.jp'],
72
+ mediaType: 'video'
73
+ }],
66
74
  playerUrl: 'https://relaido/player.js',
67
- syncUrl: 'https://relaido/sync.html',
68
- adomain: ['relaido.co.jp', 'www.cmertv.co.jp']
75
+ syncUrl: 'https://api-dev.ulizaex.com/tr/v1/prebid/sync.html',
76
+ uuid: relaido_uuid,
69
77
  }
70
78
  };
71
79
  serverRequest = {
72
- method: 'GET',
73
- bidId: bidRequest.bidId,
74
- width: bidRequest.mediaTypes.video.playerSize[0][0],
75
- height: bidRequest.mediaTypes.video.playerSize[0][1],
76
- mediaType: 'video',
80
+ method: 'POST',
81
+ data: {
82
+ bids: [{
83
+ bidId: bidRequest.bidId,
84
+ width: bidRequest.mediaTypes.video.playerSize[0][0],
85
+ height: bidRequest.mediaTypes.video.playerSize[0][1],
86
+ mediaType: 'video'}]
87
+ }
77
88
  };
78
89
  });
79
90
 
@@ -195,28 +206,23 @@ describe('RelaidoAdapter', function () {
195
206
  describe('spec.buildRequests', function () {
196
207
  it('should build bid requests by video', function () {
197
208
  const bidRequests = spec.buildRequests([bidRequest], bidderRequest);
198
- expect(bidRequests).to.have.lengthOf(1);
199
- const request = bidRequests[0];
200
- expect(request.method).to.equal('GET');
201
- expect(request.url).to.equal('https://api.relaido.jp/bid/v1/prebid/100000');
202
- expect(request.bidId).to.equal(bidRequest.bidId);
203
- expect(request.width).to.equal(bidRequest.mediaTypes.video.playerSize[0][0]);
204
- expect(request.height).to.equal(bidRequest.mediaTypes.video.playerSize[0][1]);
205
- expect(request.mediaType).to.equal('video');
206
- expect(request.data.ref).to.equal(bidderRequest.refererInfo.referer);
207
- expect(request.data.timeout_ms).to.equal(bidderRequest.timeout);
208
- expect(request.data.ad_unit_code).to.equal(bidRequest.adUnitCode);
209
- expect(request.data.auction_id).to.equal(bidRequest.auctionId);
210
- expect(request.data.bidder).to.equal(bidRequest.bidder);
211
- expect(request.data.bidder_request_id).to.equal(bidRequest.bidderRequestId);
212
- expect(request.data.bid_requests_count).to.equal(bidRequest.bidRequestsCount);
213
- expect(request.data.bid_id).to.equal(bidRequest.bidId);
214
- expect(request.data.transaction_id).to.equal(bidRequest.transactionId);
215
- expect(request.data.media_type).to.equal('video');
216
- expect(request.data.uuid).to.equal(relaido_uuid);
217
- expect(request.data.width).to.equal(bidRequest.mediaTypes.video.playerSize[0][0]);
218
- expect(request.data.height).to.equal(bidRequest.mediaTypes.video.playerSize[0][1]);
219
- expect(request.data.pv).to.equal('$prebid.version$');
209
+ const data = JSON.parse(bidRequests.data);
210
+ expect(data.bids).to.have.lengthOf(1);
211
+ const request = data.bids[0];
212
+ expect(bidRequests.method).to.equal('POST');
213
+ expect(bidRequests.url).to.equal('https://api.relaido.jp/bid/v1/sprebid');
214
+ expect(data.ref).to.equal(bidderRequest.refererInfo.referer);
215
+ expect(data.timeout_ms).to.equal(bidderRequest.timeout);
216
+ expect(request.ad_unit_code).to.equal(bidRequest.adUnitCode);
217
+ expect(request.auction_id).to.equal(bidRequest.auctionId);
218
+ expect(data.bidder).to.equal(bidRequest.bidder);
219
+ expect(request.bidder_request_id).to.equal(bidRequest.bidderRequestId);
220
+ expect(data.bid_requests_count).to.equal(bidRequest.bidRequestsCount);
221
+ expect(request.bid_id).to.equal(bidRequest.bidId);
222
+ expect(request.transaction_id).to.equal(bidRequest.transactionId);
223
+ expect(request.media_type).to.equal('video');
224
+ expect(data.uuid).to.equal(relaido_uuid);
225
+ expect(data.pv).to.equal('$prebid.version$');
220
226
  });
221
227
 
222
228
  it('should build bid requests by banner', function () {
@@ -236,9 +242,10 @@ describe('RelaidoAdapter', function () {
236
242
  }
237
243
  };
238
244
  const bidRequests = spec.buildRequests([bidRequest], bidderRequest);
239
- expect(bidRequests).to.have.lengthOf(1);
240
- const request = bidRequests[0];
241
- expect(request.mediaType).to.equal('banner');
245
+ const data = JSON.parse(bidRequests.data);
246
+ expect(data.bids).to.have.lengthOf(1);
247
+ const request = data.bids[0];
248
+ expect(request.media_type).to.equal('banner');
242
249
  });
243
250
 
244
251
  it('should take 1x1 size', function () {
@@ -258,17 +265,18 @@ describe('RelaidoAdapter', function () {
258
265
  }
259
266
  };
260
267
  const bidRequests = spec.buildRequests([bidRequest], bidderRequest);
261
- expect(bidRequests).to.have.lengthOf(1);
262
- const request = bidRequests[0];
268
+ const data = JSON.parse(bidRequests.data);
269
+ expect(data.bids).to.have.lengthOf(1);
270
+ const request = data.bids[0];
263
271
 
264
272
  expect(request.width).to.equal(1);
265
273
  });
266
274
 
267
275
  it('The referrer should be the last', function () {
268
276
  const bidRequests = spec.buildRequests([bidRequest], bidderRequest);
269
- expect(bidRequests).to.have.lengthOf(1);
270
- const request = bidRequests[0];
271
- const keys = Object.keys(request.data);
277
+ const data = JSON.parse(bidRequests.data);
278
+ expect(data.bids).to.have.lengthOf(1);
279
+ const keys = Object.keys(data);
272
280
  expect(keys[0]).to.equal('version');
273
281
  expect(keys[keys.length - 1]).to.equal('ref');
274
282
  });
@@ -277,9 +285,9 @@ describe('RelaidoAdapter', function () {
277
285
  bidRequest.userId = {}
278
286
  bidRequest.userId.imuid = 'i.tjHcK_7fTcqnbrS_YA2vaw';
279
287
  const bidRequests = spec.buildRequests([bidRequest], bidderRequest);
280
- expect(bidRequests).to.have.lengthOf(1);
281
- const request = bidRequests[0];
282
- expect(request.data.imuid).to.equal('i.tjHcK_7fTcqnbrS_YA2vaw');
288
+ const data = JSON.parse(bidRequests.data);
289
+ expect(data.bids).to.have.lengthOf(1);
290
+ expect(data.imuid).to.equal('i.tjHcK_7fTcqnbrS_YA2vaw');
283
291
  });
284
292
  });
285
293
 
@@ -288,29 +296,29 @@ describe('RelaidoAdapter', function () {
288
296
  const bidResponses = spec.interpretResponse(serverResponse, serverRequest);
289
297
  expect(bidResponses).to.have.lengthOf(1);
290
298
  const response = bidResponses[0];
291
- expect(response.requestId).to.equal(serverRequest.bidId);
292
- expect(response.width).to.equal(serverRequest.width);
293
- expect(response.height).to.equal(serverRequest.height);
294
- expect(response.cpm).to.equal(serverResponse.body.price);
295
- expect(response.currency).to.equal(serverResponse.body.currency);
296
- expect(response.creativeId).to.equal(serverResponse.body.creativeId);
297
- expect(response.vastXml).to.equal(serverResponse.body.vast);
298
- expect(response.meta.advertiserDomains).to.equal(serverResponse.body.adomain);
299
+ expect(response.requestId).to.equal(serverRequest.data.bids[0].bidId);
300
+ expect(response.width).to.equal(serverRequest.data.bids[0].width);
301
+ expect(response.height).to.equal(serverRequest.data.bids[0].height);
302
+ expect(response.cpm).to.equal(serverResponse.body.ads[0].price);
303
+ expect(response.currency).to.equal(serverResponse.body.ads[0].currency);
304
+ expect(response.creativeId).to.equal(serverResponse.body.ads[0].creativeId);
305
+ expect(response.vastXml).to.equal(serverResponse.body.ads[0].vast);
306
+ expect(response.meta.advertiserDomains).to.equal(serverResponse.body.ads[0].adomain);
299
307
  expect(response.meta.mediaType).to.equal(VIDEO);
300
308
  expect(response.ad).to.be.undefined;
301
309
  });
302
310
 
303
311
  it('should build bid response by banner', function () {
304
- serverRequest.mediaType = 'banner';
312
+ serverResponse.body.ads[0].mediaType = 'banner';
305
313
  const bidResponses = spec.interpretResponse(serverResponse, serverRequest);
306
314
  expect(bidResponses).to.have.lengthOf(1);
307
315
  const response = bidResponses[0];
308
- expect(response.requestId).to.equal(serverRequest.bidId);
309
- expect(response.width).to.equal(serverRequest.width);
310
- expect(response.height).to.equal(serverRequest.height);
311
- expect(response.cpm).to.equal(serverResponse.body.price);
312
- expect(response.currency).to.equal(serverResponse.body.currency);
313
- expect(response.creativeId).to.equal(serverResponse.body.creativeId);
316
+ expect(response.requestId).to.equal(serverRequest.data.bids[0].bidId);
317
+ expect(response.width).to.equal(serverRequest.data.bids[0].width);
318
+ expect(response.height).to.equal(serverRequest.data.bids[0].height);
319
+ expect(response.cpm).to.equal(serverResponse.body.ads[0].price);
320
+ expect(response.currency).to.equal(serverResponse.body.ads[0].currency);
321
+ expect(response.creativeId).to.equal(serverResponse.body.ads[0].creativeId);
314
322
  expect(response.vastXml).to.be.undefined;
315
323
  expect(response.ad).to.include(`<div id="rop-prebid">`);
316
324
  expect(response.ad).to.include(`<script src="https://relaido/player.js"></script>`);
@@ -370,8 +378,8 @@ describe('RelaidoAdapter', function () {
370
378
  it('Should create nurl pixel if bid nurl', function () {
371
379
  let bid = {
372
380
  bidder: bidRequest.bidder,
373
- creativeId: serverResponse.body.creativeId,
374
- cpm: serverResponse.body.price,
381
+ creativeId: serverResponse.body.ads[0].creativeId,
382
+ cpm: serverResponse.body.ads[0].price,
375
383
  params: [bidRequest.params],
376
384
  auctionId: bidRequest.auctionId,
377
385
  requestId: bidRequest.bidId,
@@ -294,6 +294,16 @@ describe('smaatoBidAdapterTest', () => {
294
294
  expect(req.source.ext.schain).to.not.exist;
295
295
  });
296
296
 
297
+ it('sends instl if instl exists', () => {
298
+ const instl = { instl: 1 };
299
+ const bidRequestWithInstl = Object.assign({}, singleBannerBidRequest, {ortb2Imp: instl});
300
+
301
+ const reqs = spec.buildRequests([bidRequestWithInstl], defaultBidderRequest);
302
+
303
+ const req = extractPayloadOfFirstAndOnlyRequest(reqs);
304
+ expect(req.imp[0].instl).to.equal(1);
305
+ });
306
+
297
307
  it('sends tmax', () => {
298
308
  const reqs = spec.buildRequests([singleBannerBidRequest], defaultBidderRequest);
299
309
 
@@ -442,6 +452,16 @@ describe('smaatoBidAdapterTest', () => {
442
452
  expect(req.imp[0].bidfloor).to.be.equal(0.456);
443
453
  });
444
454
 
455
+ it('sends instl if instl exists', () => {
456
+ const instl = { instl: 1 };
457
+ const bidRequestWithInstl = Object.assign({}, singleVideoBidRequest, {ortb2Imp: instl});
458
+
459
+ const reqs = spec.buildRequests([bidRequestWithInstl], defaultBidderRequest);
460
+
461
+ const req = extractPayloadOfFirstAndOnlyRequest(reqs);
462
+ expect(req.imp[0].instl).to.equal(1);
463
+ });
464
+
445
465
  it('splits multi format bid requests', () => {
446
466
  const combinedBannerAndVideoBidRequest = {
447
467
  bidder: 'smaato',
@@ -523,6 +543,17 @@ describe('smaatoBidAdapterTest', () => {
523
543
  expect(req.imp[1].video.sequence).to.be.equal(2);
524
544
  });
525
545
 
546
+ it('sends instl if instl exists', () => {
547
+ const instl = { instl: 1 };
548
+ const bidRequestWithInstl = Object.assign({}, longFormVideoBidRequest, {ortb2Imp: instl});
549
+
550
+ const reqs = spec.buildRequests([bidRequestWithInstl], defaultBidderRequest);
551
+
552
+ const req = extractPayloadOfFirstAndOnlyRequest(reqs);
553
+ expect(req.imp[0].instl).to.equal(1);
554
+ expect(req.imp[1].instl).to.equal(1);
555
+ });
556
+
526
557
  it('sends bidfloor when configured', () => {
527
558
  const longFormVideoBidRequestWithFloor = Object.assign({}, longFormVideoBidRequest);
528
559
  longFormVideoBidRequestWithFloor.getFloor = function(arg) {
@@ -189,6 +189,14 @@ describe('The smartx adapter', function () {
189
189
  domain: '',
190
190
  publisher: {
191
191
  id: '__name__'
192
+ },
193
+ content: {
194
+ ext: {
195
+ prebid: {
196
+ name: 'pbjs',
197
+ version: '$prebid.version$'
198
+ }
199
+ }
192
200
  }
193
201
  });
194
202
  });
@@ -525,6 +533,7 @@ describe('The smartx adapter', function () {
525
533
  bidderRequestObj.bidRequest.bids[0].params.outstream_options.title = 'abc';
526
534
  bidderRequestObj.bidRequest.bids[0].params.outstream_options.skipOffset = 2;
527
535
  bidderRequestObj.bidRequest.bids[0].params.outstream_options.desiredBitrate = 123;
536
+ bidderRequestObj.bidRequest.bids[0].params.outstream_options.visibilityThreshold = 30;
528
537
 
529
538
  responses[0].renderer.render(responses[0]);
530
539
 
@@ -183,6 +183,10 @@ describe('Tappx bid adapter', function () {
183
183
  badBidRequest_v.bids.mediaTypes.video.playerSize = [320, 250];
184
184
  assert.isFalse(spec.isBidRequestValid(badBidRequest_v.bids));
185
185
  });
186
+
187
+ it('should export the TCF vendor ID', function () {
188
+ expect(spec.gvlid).to.equal(628);
189
+ })
186
190
  });
187
191
 
188
192
  /**
@@ -49,6 +49,7 @@ import {flocIdSubmodule} from 'modules/flocIdSystem.js'
49
49
  import {amxIdSubmodule} from '../../../modules/amxIdSystem.js';
50
50
  import {akamaiDAPIdSubmodule} from 'modules/akamaiDAPIdSystem.js'
51
51
  import {kinessoIdSubmodule} from 'modules/kinessoIdSystem.js'
52
+ import * as mockGpt from '../integration/faker/googletag.js';
52
53
 
53
54
  let assert = require('chai').assert;
54
55
  let expect = require('chai').expect;
@@ -114,15 +115,21 @@ describe('User ID', function () {
114
115
 
115
116
  describe('Decorate Ad Units', function () {
116
117
  beforeEach(function () {
118
+ // reset mockGpt so nothing else interferes
119
+ mockGpt.disable();
120
+ mockGpt.enable();
117
121
  coreStorage.setCookie('pubcid', '', EXPIRED_COOKIE_DATE);
118
122
  coreStorage.setCookie('pubcid_alt', 'altpubcid200000', (new Date(Date.now() + 5000).toUTCString()));
119
123
  sinon.spy(coreStorage, 'setCookie');
124
+ sinon.stub(utils, 'logWarn');
120
125
  });
121
126
 
122
127
  afterEach(function () {
128
+ mockGpt.enable();
123
129
  $$PREBID_GLOBAL$$.requestBids.removeAll();
124
130
  config.resetConfig();
125
131
  coreStorage.setCookie.restore();
132
+ utils.logWarn.restore();
126
133
  });
127
134
 
128
135
  after(function () {
@@ -321,6 +328,50 @@ describe('User ID', function () {
321
328
  expect((getGlobal()).getUserIdsAsEids()).to.deep.equal(createEidsArray((getGlobal()).getUserIds()));
322
329
  });
323
330
 
331
+ it('should set googletag ppid correctly', function () {
332
+ let adUnits = [getAdUnitMock()];
333
+ setSubmoduleRegistry([amxIdSubmodule, sharedIdSystemSubmodule, identityLinkSubmodule]);
334
+ init(config);
335
+
336
+ config.setConfig({
337
+ userSync: {
338
+ ppid: 'pubcid.org',
339
+ userIds: [
340
+ { name: 'amxId', value: {'amxId': 'amx-id-value-amx-id-value-amx-id-value'} },
341
+ { name: 'pubCommonId', value: {'pubcid': 'pubCommon-id-value-pubCommon-id-value'} },
342
+ { name: 'identityLink', value: {'idl_env': 'identityLink-id-value-identityLink-id-value'} },
343
+ ]
344
+ }
345
+ });
346
+ // before ppid should not be set
347
+ expect(window.googletag._ppid).to.equal(undefined);
348
+ requestBidsHook(() => {}, {adUnits});
349
+ // ppid should have been set without dashes and stuff
350
+ expect(window.googletag._ppid).to.equal('pubCommonidvaluepubCommonidvalue');
351
+ });
352
+
353
+ it('should log a warning if PPID too big or small', function () {
354
+ let adUnits = [getAdUnitMock()];
355
+ setSubmoduleRegistry([sharedIdSystemSubmodule]);
356
+ init(config);
357
+
358
+ config.setConfig({
359
+ userSync: {
360
+ ppid: 'pubcid.org',
361
+ userIds: [
362
+ { name: 'pubCommonId', value: {'pubcid': 'pubcommonIdValue'} },
363
+ ]
364
+ }
365
+ });
366
+ // before ppid should not be set
367
+ expect(window.googletag._ppid).to.equal(undefined);
368
+ requestBidsHook(() => {}, {adUnits});
369
+ // ppid should NOT have been set
370
+ expect(window.googletag._ppid).to.equal(undefined);
371
+ // a warning should have been emmited
372
+ expect(utils.logWarn.args[0][0]).to.exist.and.to.contain('User ID - Googletag Publisher Provided ID for pubcid.org is not between 32 and 150 characters - pubcommonIdValue');
373
+ });
374
+
324
375
  it('pbjs.refreshUserIds refreshes', function() {
325
376
  let sandbox = sinon.createSandbox();
326
377
 
@@ -3,6 +3,7 @@ import { spec } from 'modules/visxBidAdapter.js';
3
3
  import { config } from 'src/config.js';
4
4
  import { newBidder } from 'src/adapters/bidderFactory.js';
5
5
  import * as utils from 'src/utils.js';
6
+ import { makeSlot } from '../integration/faker/googletag.js';
6
7
 
7
8
  describe('VisxAdapter', function () {
8
9
  const adapter = newBidder(spec);
@@ -145,17 +146,17 @@ describe('VisxAdapter', function () {
145
146
  const expectedFullImps = [{
146
147
  'id': '30b31c1838de1e',
147
148
  'banner': {'format': [{'w': 300, 'h': 250}, {'w': 300, 'h': 600}]},
148
- 'ext': {'bidder': {'uid': 903535}}
149
+ 'ext': {'bidder': {'uid': 903535, 'adslotExists': false}}
149
150
  },
150
151
  {
151
152
  'id': '3150ccb55da321',
152
153
  'banner': {'format': [{'w': 728, 'h': 90}, {'w': 300, 'h': 250}]},
153
- 'ext': {'bidder': {'uid': 903535}}
154
+ 'ext': {'bidder': {'uid': 903535, 'adslotExists': false}}
154
155
  },
155
156
  {
156
157
  'id': '42dbe3a7168a6a',
157
158
  'banner': {'format': [{'w': 300, 'h': 250}, {'w': 300, 'h': 600}]},
158
- 'ext': {'bidder': {'uid': 903536}}
159
+ 'ext': {'bidder': {'uid': 903536, 'adslotExists': false}}
159
160
  },
160
161
  {
161
162
  'id': '39a4e3a7168a6a',
@@ -452,7 +453,122 @@ describe('VisxAdapter', function () {
452
453
  'imp': [{
453
454
  'id': '39aff3a7169a6a',
454
455
  'banner': {'format': [{'w': 300, 'h': 250}, {'w': 300, 'h': 600}]},
455
- 'ext': {'bidder': {'uid': 903538}}
456
+ 'ext': {'bidder': {'uid': 903538, 'adslotExists': false}}
457
+ }],
458
+ 'tmax': 3000,
459
+ 'cur': ['EUR'],
460
+ 'source': {
461
+ 'ext': {
462
+ 'wrapperType': 'Prebid_js',
463
+ 'wrapperVersion': '$prebid.version$'
464
+ }
465
+ },
466
+ 'site': {'page': referrer}
467
+ });
468
+ });
469
+ });
470
+
471
+ describe('buildRequests (check ad slot exists)', function () {
472
+ function parseRequest(url) {
473
+ const res = {};
474
+ (url.split('?')[1] || '').split('&').forEach((it) => {
475
+ const couple = it.split('=');
476
+ res[couple[0]] = decodeURIComponent(couple[1]);
477
+ });
478
+ return res;
479
+ }
480
+ const bidderRequest = {
481
+ timeout: 3000,
482
+ refererInfo: {
483
+ referer: 'https://example.com'
484
+ }
485
+ };
486
+ const referrer = bidderRequest.refererInfo.referer;
487
+ const bidRequests = [
488
+ {
489
+ 'bidder': 'visx',
490
+ 'params': {
491
+ 'uid': 903535
492
+ },
493
+ 'adUnitCode': 'visx-adunit-code-1',
494
+ 'sizes': [[300, 250], [300, 600]],
495
+ 'bidId': '30b31c1838de1e',
496
+ 'bidderRequestId': '22edbae2733bf6',
497
+ 'auctionId': '1d1a030790a475',
498
+ },
499
+ {
500
+ 'bidder': 'visx',
501
+ 'params': {
502
+ 'uid': 903535
503
+ },
504
+ 'adUnitCode': 'visx-adunit-code-2',
505
+ 'sizes': [[300, 250], [300, 600]],
506
+ 'bidId': '30b31c1838de1e',
507
+ 'bidderRequestId': '22edbae2733bf6',
508
+ 'auctionId': '1d1a030790a475',
509
+ }
510
+ ];
511
+ let sandbox;
512
+ let documentStub;
513
+
514
+ before(function() {
515
+ sandbox = sinon.sandbox.create();
516
+ documentStub = sandbox.stub(document, 'getElementById');
517
+ documentStub.withArgs('visx-adunit-code-1').returns({
518
+ id: 'visx-adunit-code-1'
519
+ });
520
+ documentStub.withArgs('visx-adunit-element-2').returns({
521
+ id: 'visx-adunit-element-2'
522
+ });
523
+ });
524
+
525
+ after(function() {
526
+ sandbox.restore();
527
+ });
528
+
529
+ it('should find ad slot by ad unit code as element id', function () {
530
+ const request = spec.buildRequests([bidRequests[0]], bidderRequest);
531
+ const payload = parseRequest(request.url);
532
+ expect(payload).to.be.an('object');
533
+ expect(payload).to.have.property('auids', '903535');
534
+
535
+ const postData = request.data;
536
+ expect(postData).to.be.an('object');
537
+ expect(postData).to.deep.equal({
538
+ 'id': '22edbae2733bf6',
539
+ 'imp': [{
540
+ 'id': '30b31c1838de1e',
541
+ 'banner': {'format': [{'w': 300, 'h': 250}, {'w': 300, 'h': 600}]},
542
+ 'ext': {'bidder': {'uid': 903535, 'adslotExists': true}}
543
+ }],
544
+ 'tmax': 3000,
545
+ 'cur': ['EUR'],
546
+ 'source': {
547
+ 'ext': {
548
+ 'wrapperType': 'Prebid_js',
549
+ 'wrapperVersion': '$prebid.version$'
550
+ }
551
+ },
552
+ 'site': {'page': referrer}
553
+ });
554
+ });
555
+
556
+ it('should find ad slot by ad unit code as adUnitPath', function () {
557
+ makeSlot({code: 'visx-adunit-code-2', divId: 'visx-adunit-element-2'});
558
+
559
+ const request = spec.buildRequests([bidRequests[1]], bidderRequest);
560
+ const payload = parseRequest(request.url);
561
+ expect(payload).to.be.an('object');
562
+ expect(payload).to.have.property('auids', '903535');
563
+
564
+ const postData = request.data;
565
+ expect(postData).to.be.an('object');
566
+ expect(postData).to.deep.equal({
567
+ 'id': '22edbae2733bf6',
568
+ 'imp': [{
569
+ 'id': '30b31c1838de1e',
570
+ 'banner': {'format': [{'w': 300, 'h': 250}, {'w': 300, 'h': 600}]},
571
+ 'ext': {'bidder': {'uid': 903535, 'adslotExists': true}}
456
572
  }],
457
573
  'tmax': 3000,
458
574
  'cur': ['EUR'],