prebid.js 7.11.0 → 7.12.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 (170) hide show
  1. package/.github/workflows/issue_tracker.yml +1 -1
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/adagioBidAdapter.js +1 -1
  4. package/dist/adbookpspBidAdapter.js +1 -1
  5. package/dist/adgenerationBidAdapter.js +1 -1
  6. package/dist/adkernelBidAdapter.js +1 -1
  7. package/dist/adrelevantisBidAdapter.js +1 -1
  8. package/dist/adriverBidAdapter.js +1 -1
  9. package/dist/adriverIdSystem.js +1 -1
  10. package/dist/adtelligentBidAdapter.js +1 -1
  11. package/dist/adtrgtmeBidAdapter.js +1 -1
  12. package/dist/adxcgBidAdapter.js +1 -1
  13. package/dist/ajaBidAdapter.js +1 -1
  14. package/dist/alkimiBidAdapter.js +1 -1
  15. package/dist/amxBidAdapter.js +1 -1
  16. package/dist/amxIdSystem.js +1 -1
  17. package/dist/appierAnalyticsAdapter.js +1 -1
  18. package/dist/appnexusBidAdapter.js +1 -1
  19. package/dist/asoBidAdapter.js +1 -1
  20. package/dist/axonixBidAdapter.js +1 -1
  21. package/dist/betweenBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  24. package/dist/big-richmediaBidAdapter.js +1 -1
  25. package/dist/bridgewellBidAdapter.js +1 -1
  26. package/dist/brightMountainMediaBidAdapter.js +1 -1
  27. package/dist/concertBidAdapter.js +1 -1
  28. package/dist/connectadBidAdapter.js +1 -1
  29. package/dist/consumableBidAdapter.js +1 -1
  30. package/dist/conversantBidAdapter.js +1 -1
  31. package/dist/craftBidAdapter.js +1 -1
  32. package/dist/criteoBidAdapter.js +1 -1
  33. package/dist/dfpAdServerVideo.js +1 -1
  34. package/dist/dgkeywordRtdProvider.js +1 -1
  35. package/dist/displayioBidAdapter.js +1 -3
  36. package/dist/dspxBidAdapter.js +1 -1
  37. package/dist/eplanningBidAdapter.js +1 -1
  38. package/dist/finativeBidAdapter.js +1 -1
  39. package/dist/glimpseBidAdapter.js +1 -1
  40. package/dist/gmosspBidAdapter.js +1 -1
  41. package/dist/goldbachBidAdapter.js +1 -1
  42. package/dist/gridBidAdapter.js +1 -1
  43. package/dist/gridNMBidAdapter.js +1 -1
  44. package/dist/gumgumBidAdapter.js +1 -1
  45. package/dist/h12mediaBidAdapter.js +1 -1
  46. package/dist/id5IdSystem.js +1 -1
  47. package/dist/improvedigitalBidAdapter.js +1 -1
  48. package/dist/inmarBidAdapter.js +1 -1
  49. package/dist/insticatorBidAdapter.js +1 -1
  50. package/dist/ixBidAdapter.js +1 -1
  51. package/dist/justpremiumBidAdapter.js +1 -1
  52. package/dist/konduitAnalyticsAdapter.js +1 -1
  53. package/dist/kueezBidAdapter.js +1 -1
  54. package/dist/lassoBidAdapter.js +1 -1
  55. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  56. package/dist/logicadBidAdapter.js +1 -1
  57. package/dist/loglyliftBidAdapter.js +1 -1
  58. package/dist/malltvAnalyticsAdapter.js +1 -1
  59. package/dist/marsmediaBidAdapter.js +1 -1
  60. package/dist/mediafuseBidAdapter.js +1 -1
  61. package/dist/mediagoBidAdapter.js +1 -0
  62. package/dist/mediasquareBidAdapter.js +1 -1
  63. package/dist/mgidBidAdapter.js +1 -1
  64. package/dist/minutemediaBidAdapter.js +1 -1
  65. package/dist/nextMillenniumBidAdapter.js +1 -1
  66. package/dist/not-for-prod/prebid.js +120 -121
  67. package/dist/oguryBidAdapter.js +1 -1
  68. package/dist/onetagBidAdapter.js +1 -1
  69. package/dist/ooloAnalyticsAdapter.js +1 -1
  70. package/dist/outbrainBidAdapter.js +1 -1
  71. package/dist/parrableIdSystem.js +1 -1
  72. package/dist/pixfutureBidAdapter.js +1 -1
  73. package/dist/prebid-core.js +1 -1
  74. package/dist/publinkIdSystem.js +1 -1
  75. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  76. package/dist/pubmaticBidAdapter.js +1 -1
  77. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  78. package/dist/pxyzBidAdapter.js +1 -1
  79. package/dist/quantcastBidAdapter.js +1 -1
  80. package/dist/rasBidAdapter.js +1 -1
  81. package/dist/readpeakBidAdapter.js +1 -1
  82. package/dist/relaidoBidAdapter.js +1 -1
  83. package/dist/rhythmoneBidAdapter.js +1 -1
  84. package/dist/riseBidAdapter.js +1 -1
  85. package/dist/rubiconAnalyticsAdapter.js +1 -1
  86. package/dist/rubiconBidAdapter.js +1 -1
  87. package/dist/seedingAllianceBidAdapter.js +1 -1
  88. package/dist/seedtagBidAdapter.js +1 -1
  89. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  90. package/dist/sharethroughBidAdapter.js +1 -1
  91. package/dist/shinezBidAdapter.js +1 -1
  92. package/dist/smaatoBidAdapter.js +1 -1
  93. package/dist/smartadserverBidAdapter.js +1 -1
  94. package/dist/smartxBidAdapter.js +1 -1
  95. package/dist/smilewantedBidAdapter.js +1 -1
  96. package/dist/sonobiBidAdapter.js +1 -1
  97. package/dist/sovrnAnalyticsAdapter.js +1 -1
  98. package/dist/sovrnBidAdapter.js +1 -1
  99. package/dist/sspBCBidAdapter.js +1 -1
  100. package/dist/sublimeBidAdapter.js +1 -1
  101. package/dist/synacormediaBidAdapter.js +1 -1
  102. package/dist/tappxBidAdapter.js +1 -1
  103. package/dist/targetVideoBidAdapter.js +1 -1
  104. package/dist/teadsBidAdapter.js +1 -1
  105. package/dist/trionBidAdapter.js +1 -1
  106. package/dist/tripleliftBidAdapter.js +1 -1
  107. package/dist/ttdBidAdapter.js +1 -1
  108. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  109. package/dist/underdogmediaBidAdapter.js +1 -1
  110. package/dist/undertoneBidAdapter.js +1 -1
  111. package/dist/userId.js +1 -1
  112. package/dist/vidazooBidAdapter.js +1 -1
  113. package/dist/videobyteBidAdapter.js +1 -1
  114. package/dist/visxBidAdapter.js +1 -1
  115. package/dist/vuukleBidAdapter.js +1 -1
  116. package/dist/widespaceBidAdapter.js +1 -1
  117. package/dist/winrBidAdapter.js +1 -1
  118. package/dist/yahoosspBidAdapter.js +1 -1
  119. package/dist/yieldmoBidAdapter.js +1 -1
  120. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  121. package/modules/adkernelBidAdapter.js +28 -12
  122. package/modules/adriverBidAdapter.js +5 -12
  123. package/modules/adriverIdSystem.js +2 -1
  124. package/modules/adtelligentBidAdapter.js +2 -0
  125. package/modules/alkimiBidAdapter.js +2 -1
  126. package/modules/betweenBidAdapter.js +3 -3
  127. package/modules/bidwatchAnalyticsAdapter.js +112 -59
  128. package/modules/consumableBidAdapter.js +2 -2
  129. package/modules/criteoBidAdapter.js +19 -13
  130. package/modules/dgkeywordRtdProvider.js +9 -0
  131. package/modules/displayioBidAdapter.js +92 -97
  132. package/modules/id5IdSystem.js +160 -111
  133. package/modules/id5IdSystem.md +16 -14
  134. package/modules/improvedigitalBidAdapter.js +50 -28
  135. package/modules/ixBidAdapter.js +13 -306
  136. package/modules/mediagoBidAdapter.js +462 -0
  137. package/modules/mediagoBidAdapter.md +34 -0
  138. package/modules/nextMillenniumBidAdapter.js +25 -6
  139. package/modules/pubmaticAnalyticsAdapter.js +1 -1
  140. package/modules/rasBidAdapter.js +8 -0
  141. package/modules/rasBidAdapter.md +14 -13
  142. package/modules/sonobiBidAdapter.js +1 -0
  143. package/modules/tappxBidAdapter.js +9 -0
  144. package/package.json +1 -1
  145. package/src/adloader.js +2 -1
  146. package/src/adserver.js +0 -56
  147. package/src/auction.js +58 -15
  148. package/src/native.js +1 -0
  149. package/src/refererDetection.js +12 -1
  150. package/src/videoCache.js +8 -2
  151. package/test/spec/modules/adkernelBidAdapter_spec.js +11 -2
  152. package/test/spec/modules/adriverBidAdapter_spec.js +6 -13
  153. package/test/spec/modules/adriverIdSystem_spec.js +3 -8
  154. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  155. package/test/spec/modules/alkimiBidAdapter_spec.js +2 -1
  156. package/test/spec/modules/betweenBidAdapter_spec.js +17 -0
  157. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +28 -12
  158. package/test/spec/modules/criteoBidAdapter_spec.js +35 -26
  159. package/test/spec/modules/dgkeywordRtdProvider_spec.js +1 -1
  160. package/test/spec/modules/displayioBidAdapter_spec.js +16 -52
  161. package/test/spec/modules/enrichmentFpdModule_spec.js +2 -1
  162. package/test/spec/modules/fpdModule_spec.js +2 -1
  163. package/test/spec/modules/id5IdSystem_spec.js +529 -172
  164. package/test/spec/modules/improvedigitalBidAdapter_spec.js +9 -13
  165. package/test/spec/modules/ixBidAdapter_spec.js +210 -104
  166. package/test/spec/modules/mediagoBidAdapter_spec.js +97 -0
  167. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +2 -7
  168. package/test/spec/modules/rasBidAdapter_spec.js +2 -0
  169. package/test/spec/native_spec.js +144 -0
  170. package/test/spec/videoCache_spec.js +37 -7
package/src/adserver.js CHANGED
@@ -1,61 +1,5 @@
1
- import { formatQS } from './utils.js';
2
- import { targeting } from './targeting.js';
3
1
  import {hook} from './hook.js';
4
2
 
5
- // Adserver parent class
6
- const AdServer = function(attr) {
7
- this.name = attr.adserver;
8
- this.code = attr.code;
9
- this.getWinningBidByCode = function() {
10
- return targeting.getWinningBids(this.code)[0];
11
- };
12
- };
13
-
14
- // DFP ad server
15
- // TODO: this seems to be unused?
16
- export function dfpAdserver(options, urlComponents) {
17
- var adserver = new AdServer(options);
18
- adserver.urlComponents = urlComponents;
19
-
20
- var dfpReqParams = {
21
- 'env': 'vp',
22
- 'gdfp_req': '1',
23
- 'impl': 's',
24
- 'unviewed_position_start': '1'
25
- };
26
-
27
- var dfpParamsWithVariableValue = ['output', 'iu', 'sz', 'url', 'correlator', 'description_url', 'hl'];
28
-
29
- var getCustomParams = function(targeting) {
30
- return encodeURIComponent(formatQS(targeting));
31
- };
32
-
33
- adserver.appendQueryParams = function() {
34
- var bid = adserver.getWinningBidByCode();
35
- if (bid) {
36
- this.urlComponents.search.description_url = encodeURIComponent(bid.vastUrl);
37
- this.urlComponents.search.cust_params = getCustomParams(bid.adserverTargeting);
38
- this.urlComponents.search.correlator = Date.now();
39
- }
40
- };
41
-
42
- adserver.verifyAdserverTag = function() {
43
- for (var key in dfpReqParams) {
44
- if (!this.urlComponents.search.hasOwnProperty(key) || this.urlComponents.search[key] !== dfpReqParams[key]) {
45
- return false;
46
- }
47
- }
48
- for (var i in dfpParamsWithVariableValue) {
49
- if (!this.urlComponents.search.hasOwnProperty(dfpParamsWithVariableValue[i])) {
50
- return false;
51
- }
52
- }
53
- return true;
54
- };
55
-
56
- return adserver;
57
- };
58
-
59
3
  /**
60
4
  * return the GAM PPID, if available (eid for the userID configured with `userSync.ppidSource`)
61
5
  */
package/src/auction.js CHANGED
@@ -514,28 +514,71 @@ function tryAddVideoBid(auctionInstance, bidResponse, afterBidAdded, {index = au
514
514
  }
515
515
  }
516
516
 
517
- export const callPrebidCache = hook('async', function(auctionInstance, bidResponse, afterBidAdded, videoMediaType) {
518
- store([bidResponse], function (error, cacheIds) {
519
- if (error) {
520
- logWarn(`Failed to save to the video cache: ${error}. Video bid must be discarded.`);
521
-
522
- doCallbacksIfTimedout(auctionInstance, bidResponse);
523
- } else {
524
- if (cacheIds[0].uuid === '') {
525
- logWarn(`Supplied video cache key was already in use by Prebid Cache; caching attempt was rejected. Video bid must be discarded.`);
517
+ const storeInCache = (batch) => {
518
+ store(batch.map(entry => entry.bidResponse), function (error, cacheIds) {
519
+ cacheIds.forEach((cacheId, i) => {
520
+ const { auctionInstance, bidResponse, afterBidAdded } = batch[i];
521
+ if (error) {
522
+ logWarn(`Failed to save to the video cache: ${error}. Video bid must be discarded.`);
526
523
 
527
524
  doCallbacksIfTimedout(auctionInstance, bidResponse);
528
525
  } else {
529
- bidResponse.videoCacheKey = cacheIds[0].uuid;
526
+ if (cacheId.uuid === '') {
527
+ logWarn(`Supplied video cache key was already in use by Prebid Cache; caching attempt was rejected. Video bid must be discarded.`);
530
528
 
531
- if (!bidResponse.vastUrl) {
532
- bidResponse.vastUrl = getCacheUrl(bidResponse.videoCacheKey);
529
+ doCallbacksIfTimedout(auctionInstance, bidResponse);
530
+ } else {
531
+ bidResponse.videoCacheKey = cacheId.uuid;
532
+
533
+ if (!bidResponse.vastUrl) {
534
+ bidResponse.vastUrl = getCacheUrl(bidResponse.videoCacheKey);
535
+ }
536
+ addBidToAuction(auctionInstance, bidResponse);
537
+ afterBidAdded();
533
538
  }
534
- addBidToAuction(auctionInstance, bidResponse);
535
- afterBidAdded();
536
539
  }
537
- }
540
+ });
538
541
  });
542
+ };
543
+
544
+ let batchSize, batchTimeout;
545
+ config.getConfig('cache', (cacheConfig) => {
546
+ batchSize = typeof cacheConfig.cache.batchSize === 'number' && cacheConfig.cache.batchSize > 0
547
+ ? cacheConfig.cache.batchSize
548
+ : 1;
549
+ batchTimeout = typeof cacheConfig.cache.batchTimeout === 'number' && cacheConfig.cache.batchTimeout > 0
550
+ ? cacheConfig.cache.batchTimeout
551
+ : 0;
552
+ });
553
+
554
+ export const batchingCache = (timeout = setTimeout, cache = storeInCache) => {
555
+ let batches = [[]];
556
+ let debouncing = false;
557
+ const noTimeout = cb => cb();
558
+
559
+ return function(auctionInstance, bidResponse, afterBidAdded) {
560
+ const batchFunc = batchTimeout > 0 ? timeout : noTimeout;
561
+ if (batches[batches.length - 1].length >= batchSize) {
562
+ batches.push([]);
563
+ }
564
+
565
+ batches[batches.length - 1].push({auctionInstance, bidResponse, afterBidAdded});
566
+
567
+ if (!debouncing) {
568
+ debouncing = true;
569
+ batchFunc(() => {
570
+ batches.forEach(cache);
571
+ batches = [[]];
572
+ debouncing = false;
573
+ }, batchTimeout);
574
+ }
575
+ }
576
+ };
577
+
578
+ const batchAndStore = batchingCache();
579
+
580
+ export const callPrebidCache = hook('async', function(auctionInstance, bidResponse, afterBidAdded, videoMediaType) {
581
+ batchAndStore(auctionInstance, bidResponse, afterBidAdded);
539
582
  }, 'callPrebidCache');
540
583
 
541
584
  // Postprocess the bids so that all the universal properties exist, no matter which bidder they came from.
package/src/native.js CHANGED
@@ -735,6 +735,7 @@ function toLegacyResponse(ortbResponse, ortbRequest) {
735
735
  const legacyResponse = {};
736
736
  const requestAssets = ortbRequest?.assets || [];
737
737
  legacyResponse.clickUrl = ortbResponse.link.url;
738
+ legacyResponse.privacyLink = ortbResponse.privacy;
738
739
  for (const asset of ortbResponse?.assets || []) {
739
740
  const requestAsset = requestAssets.find(reqAsset => asset.id === reqAsset.id);
740
741
  if (asset.title) {
@@ -11,6 +11,8 @@
11
11
  import { config } from './config.js';
12
12
  import {logWarn} from './utils.js';
13
13
 
14
+ let RI = new WeakMap();
15
+
14
16
  /**
15
17
  * Prepend a URL with the page's protocol (http/https), if necessary.
16
18
  */
@@ -252,10 +254,19 @@ export function detectReferer(win) {
252
254
  };
253
255
  }
254
256
 
255
- return refererInfo;
257
+ return function() {
258
+ if (!RI.has(win)) {
259
+ RI.set(win, Object.freeze(refererInfo()));
260
+ }
261
+ return RI.get(win);
262
+ }
256
263
  }
257
264
 
258
265
  /**
259
266
  * @type {function(): refererInfo}
260
267
  */
261
268
  export const getRefererInfo = detectReferer(window);
269
+
270
+ export function resetRefererInfo() {
271
+ RI = new WeakMap();
272
+ }
package/src/videoCache.js CHANGED
@@ -13,6 +13,12 @@ import { ajax } from './ajax.js';
13
13
  import { config } from './config.js';
14
14
  import {auctionManager} from './auctionManager.js';
15
15
 
16
+ /**
17
+ * Might be useful to be configurable in the future
18
+ * Depending on publisher needs
19
+ */
20
+ const ttlBufferInSeconds = 15;
21
+
16
22
  /**
17
23
  * @typedef {object} CacheableUrlBid
18
24
  * @property {string} vastUrl A URL which loads some valid VAST XML.
@@ -63,11 +69,11 @@ function wrapURI(uri, impUrl) {
63
69
  function toStorageRequest(bid, {index = auctionManager.index} = {}) {
64
70
  const vastValue = bid.vastXml ? bid.vastXml : wrapURI(bid.vastUrl, bid.vastImpUrl);
65
71
  const auction = index.getAuction(bid);
66
-
72
+ const ttlWithBuffer = Number(bid.ttl) + ttlBufferInSeconds;
67
73
  let payload = {
68
74
  type: 'xml',
69
75
  value: vastValue,
70
- ttlseconds: Number(bid.ttl)
76
+ ttlseconds: ttlWithBuffer
71
77
  };
72
78
 
73
79
  if (config.getConfig('cache.vasttrack')) {
@@ -17,6 +17,9 @@ describe('Adkernel adapter', function () {
17
17
  banner: {
18
18
  sizes: [[300, 250], [300, 200]]
19
19
  }
20
+ },
21
+ ortb2Imp: {
22
+ battr: [6, 7, 9]
20
23
  }
21
24
  }, bid2_zone2 = {
22
25
  bidder: 'adkernel',
@@ -95,12 +98,12 @@ describe('Adkernel adapter', function () {
95
98
  params: {
96
99
  zoneId: 1,
97
100
  host: 'rtb.adkernel.com',
98
- video: {api: [1, 2]}
99
101
  },
100
102
  mediaTypes: {
101
103
  video: {
102
104
  context: 'instream',
103
- playerSize: [[640, 480]]
105
+ playerSize: [[640, 480]],
106
+ api: [1, 2]
104
107
  }
105
108
  },
106
109
  adUnitCode: 'ad-unit-1'
@@ -293,6 +296,7 @@ describe('Adkernel adapter', function () {
293
296
 
294
297
  describe('banner request building', function () {
295
298
  let bidRequest, bidRequests, _;
299
+
296
300
  before(function () {
297
301
  [_, bidRequests] = buildRequest([bid1_zone1]);
298
302
  bidRequest = bidRequests[0];
@@ -337,6 +341,11 @@ describe('Adkernel adapter', function () {
337
341
  expect(bidRequest.device).to.have.property('dnt', 1);
338
342
  });
339
343
 
344
+ it('should copy FPD to imp.banner', function() {
345
+ expect(bidRequest.imp[0].banner).to.have.property('battr');
346
+ expect(bidRequest.imp[0].banner.battr).to.be.eql([6, 7, 9]);
347
+ });
348
+
340
349
  it('shouldn\'t contain gdpr nor ccpa information for default request', function () {
341
350
  let [_, bidRequests] = buildRequest([bid1_zone1]);
342
351
  expect(bidRequests[0]).to.not.have.property('regs');
@@ -297,25 +297,18 @@ describe('adriverAdapter', function () {
297
297
  { adrcid: undefined }
298
298
  ]
299
299
  cookieValues.forEach(cookieValue => describe('test cookie exist or not behavior', function () {
300
- let expectedValues = {
301
- adrcid: cookieValue.adrcid,
302
- at: '',
303
- cur: '',
304
- tmax: '',
305
- site: '',
306
- id: '',
307
- user: '',
308
- device: '',
309
- imp: ''
310
- }
300
+ let expectedValues = [
301
+ 'buyerid',
302
+ 'ext'
303
+ ]
311
304
 
312
305
  it('check adrcid if it exists', function () {
313
306
  bidRequests[0].userId.adrcid = cookieValue.adrcid;
314
307
  const payload = JSON.parse(spec.buildRequests(bidRequests).data);
315
308
  if (cookieValue.adrcid) {
316
- expect(Object.keys(payload)).to.have.members(Object.keys(expectedValues));
309
+ expect(Object.keys(payload.user)).to.have.members(expectedValues);
317
310
  } else {
318
- expect(payload.adrcid).to.equal(undefined);
311
+ expect(payload.user.buyerid).to.equal(0);
319
312
  }
320
313
  });
321
314
  }));
@@ -32,7 +32,6 @@ describe('AdriverIdSystem', function () {
32
32
  expect(request.url).to.include('https://ad.adriver.ru/cgi-bin/json.cgi');
33
33
  request.respond(503, null, 'Unavailable');
34
34
  expect(logErrorStub.calledOnce).to.be.true;
35
- expect(callbackSpy.calledOnce).to.be.true;
36
35
  });
37
36
 
38
37
  it('test call user sync url with the right params', function() {
@@ -67,16 +66,12 @@ describe('AdriverIdSystem', function () {
67
66
  let request = server.requests[0];
68
67
  request.respond(200, { 'Content-Type': 'application/json' }, JSON.stringify({ adrcid: response.adrcid }));
69
68
 
70
- let expectedExpiration = new Date();
71
- expectedExpiration.setTime(expectedExpiration.getTime() + 86400 * 1825 * 1000);
69
+ let now = new Date();
70
+ now.setTime(now.getTime() + 86400 * 1825 * 1000);
72
71
  const minimalDate = new Date(0).toString();
73
72
 
74
- function dateStringFor(date, maxDeltaMs = 2000) {
75
- return sinon.match((val) => Math.abs(date.getTime() - new Date(val).getTime()) <= maxDeltaMs)
76
- }
77
-
78
73
  if (response.adrcid) {
79
- expect(setCookieStub.calledWith('adrcid', response.adrcid, dateStringFor(expectedExpiration))).to.be.true;
74
+ expect(setCookieStub.calledWith('adrcid', response.adrcid, now.toUTCString())).to.be.true;
80
75
  expect(setLocalStorageStub.calledWith('adrcid', response.adrcid)).to.be.true;
81
76
  } else {
82
77
  expect(setCookieStub.calledWith('adrcid', '', minimalDate)).to.be.false;
@@ -20,6 +20,7 @@ const aliasEP = {
20
20
  janet: 'https://ghb.bidder.jmgads.com/v2/auction/',
21
21
  pgam: 'https://ghb.pgamssp.com/v2/auction/',
22
22
  ocm: 'https://ghb.cenarius.orangeclickmedia.com/v2/auction/',
23
+ vidcrunchllc: 'https://ghb.platform.vidcrunch.com/v2/auction/',
23
24
  };
24
25
 
25
26
  const DEFAULT_ADATPER_REQ = { bidderCode: 'adtelligent' };
@@ -6,6 +6,7 @@ const REQUEST = {
6
6
  'bidId': '456',
7
7
  'bidder': 'alkimi',
8
8
  'sizes': [[300, 250]],
9
+ 'adUnitCode': 'bannerAdUnitCode',
9
10
  'mediaTypes': {
10
11
  'banner': {
11
12
  'sizes': [[300, 250]]
@@ -138,7 +139,7 @@ describe('alkimiBidAdapter', function () {
138
139
  expect(bidderRequest.data.requestId).to.equal('123')
139
140
  expect(bidderRequest.data.referer).to.equal('http://test.com/path.html')
140
141
  expect(bidderRequest.data.schain).to.deep.contains({ver: '1.0', complete: 1, nodes: [{asi: 'alkimi-onboarding.com', sid: '00001', hp: 1}]})
141
- expect(bidderRequest.data.signRequest.bids).to.deep.contains({ token: 'e64782a4-8e68-4c38-965b-80ccf115d46f', pos: 7, bidFloor: 0.1, width: 300, height: 250, impMediaType: 'Banner' })
142
+ expect(bidderRequest.data.signRequest.bids).to.deep.contains({ token: 'e64782a4-8e68-4c38-965b-80ccf115d46f', pos: 7, bidFloor: 0.1, width: 300, height: 250, impMediaType: 'Banner', adUnitCode: 'bannerAdUnitCode' })
142
143
  expect(bidderRequest.data.signRequest.randomUUID).to.equal(undefined)
143
144
  expect(bidderRequest.data.bidIds).to.deep.contains('456')
144
145
  expect(bidderRequest.data.signature).to.equal(undefined)
@@ -85,6 +85,23 @@ describe('betweenBidAdapterTests', function () {
85
85
 
86
86
  expect(req_data.cur).to.equal('THX');
87
87
  });
88
+ it('validate default cur USD', function() {
89
+ let bidRequestData = [{
90
+ bidId: 'bid1234',
91
+ bidder: 'between',
92
+ params: {
93
+ w: 240,
94
+ h: 400,
95
+ s: 1112
96
+ },
97
+ sizes: [[240, 400]]
98
+ }];
99
+
100
+ let request = spec.buildRequests(bidRequestData);
101
+ let req_data = JSON.parse(request.data)[0].data;
102
+
103
+ expect(req_data.cur).to.equal('USD');
104
+ });
88
105
  it('validate subid param', function() {
89
106
  let bidRequestData = [{
90
107
  bidId: 'bid1234',
@@ -260,15 +260,15 @@ describe('BidWatch Analytics', function () {
260
260
  describe('main test flow', function () {
261
261
  beforeEach(function () {
262
262
  sinon.stub(events, 'getEvents').returns([]);
263
+ sinon.spy(bidwatchAnalytics, 'track');
263
264
  });
264
-
265
265
  afterEach(function () {
266
266
  events.getEvents.restore();
267
+ bidwatchAnalytics.disableAnalytics();
268
+ bidwatchAnalytics.track.restore();
267
269
  });
268
270
 
269
- it('should catch events of interest', function () {
270
- sinon.spy(bidwatchAnalytics, 'track');
271
-
271
+ it('test auctionEnd', function () {
272
272
  adapterManager.registerAnalyticsAdapter({
273
273
  code: 'bidwatch',
274
274
  adapter: bidwatchAnalytics
@@ -280,6 +280,9 @@ describe('BidWatch Analytics', function () {
280
280
  domain: 'test'
281
281
  }
282
282
  });
283
+
284
+ events.emit(constants.EVENTS.BID_REQUESTED, auctionEnd['bidderRequests'][0]);
285
+ events.emit(constants.EVENTS.BID_RESPONSE, auctionEnd['bidsReceived'][0]);
283
286
  events.emit(constants.EVENTS.BID_TIMEOUT, bidTimeout);
284
287
  events.emit(constants.EVENTS.AUCTION_END, auctionEnd);
285
288
  expect(server.requests.length).to.equal(1);
@@ -287,18 +290,31 @@ describe('BidWatch Analytics', function () {
287
290
  expect(message).to.have.property('auctionEnd').exist;
288
291
  expect(message.auctionEnd).to.have.lengthOf(1);
289
292
  expect(message.auctionEnd[0]).to.have.property('bidsReceived').and.to.have.lengthOf(1);
290
- expect(message.auctionEnd[0].bidsReceived[0]).to.have.property('ad');
291
- expect(message.auctionEnd[0].bidsReceived[0].ad).to.equal('emptied');
293
+ expect(message.auctionEnd[0].bidsReceived[0]).not.to.have.property('ad');
292
294
  expect(message.auctionEnd[0]).to.have.property('bidderRequests').and.to.have.lengthOf(1);
293
295
  expect(message.auctionEnd[0].bidderRequests[0]).to.have.property('gdprConsent');
294
- expect(message.auctionEnd[0].bidderRequests[0].gdprConsent).to.have.property('vendorData');
295
- expect(message.auctionEnd[0].bidderRequests[0].gdprConsent.vendorData).to.equal('emptied');
296
+ expect(message.auctionEnd[0].bidderRequests[0].gdprConsent).not.to.have.property('vendorData');
297
+ sinon.assert.callCount(bidwatchAnalytics.track, 4);
298
+ });
299
+
300
+ it('test bidWon', function() {
301
+ adapterManager.registerAnalyticsAdapter({
302
+ code: 'bidwatch',
303
+ adapter: bidwatchAnalytics
304
+ });
305
+
306
+ adapterManager.enableAnalytics({
307
+ provider: 'bidwatch',
308
+ options: {
309
+ domain: 'test'
310
+ }
311
+ });
296
312
  events.emit(constants.EVENTS.BID_WON, bidWon);
297
- expect(server.requests.length).to.equal(2);
298
- message = JSON.parse(server.requests[1].requestBody);
299
- expect(message).to.have.property('ad').and.to.equal('emptied');
313
+ expect(server.requests.length).to.equal(1);
314
+ let message = JSON.parse(server.requests[0].requestBody);
315
+ expect(message).not.to.have.property('ad');
300
316
  expect(message).to.have.property('cpmIncrement').and.to.equal(27.4276);
301
- sinon.assert.callCount(bidwatchAnalytics.track, 3);
317
+ sinon.assert.callCount(bidwatchAnalytics.track, 1);
302
318
  });
303
319
  });
304
320
  });
@@ -13,7 +13,7 @@ import * as utils from 'src/utils.js';
13
13
  import * as refererDetection from 'src/refererDetection.js';
14
14
  import { config } from '../../../src/config.js';
15
15
  import * as storageManager from 'src/storageManager.js';
16
- import {BANNER, NATIVE, VIDEO} from '../../../src/mediaTypes.js';
16
+ import { BANNER, NATIVE, VIDEO } from '../../../src/mediaTypes.js';
17
17
 
18
18
  describe('The Criteo bidding adapter', function () {
19
19
  let utilsMock, sandbox;
@@ -707,7 +707,7 @@ describe('The Criteo bidding adapter', function () {
707
707
  expect(ortbRequest.slots[0].sizes[0]).to.equal('undefinedxundefined');
708
708
  });
709
709
 
710
- it('should properly detect and get sizes of native sizeless banner', function () {
710
+ it('should properly detect and forward native flag', function () {
711
711
  const bidRequests = [
712
712
  {
713
713
  mediaTypes: {
@@ -722,11 +722,10 @@ describe('The Criteo bidding adapter', function () {
722
722
  ];
723
723
  const request = spec.buildRequests(bidRequests, bidderRequest);
724
724
  const ortbRequest = request.data;
725
- expect(ortbRequest.slots[0].sizes).to.have.lengthOf(1);
726
- expect(ortbRequest.slots[0].sizes[0]).to.equal('2x2');
725
+ expect(ortbRequest.slots[0].native).to.equal(true);
727
726
  });
728
727
 
729
- it('should properly detect and get size of native sizeless banner', function () {
728
+ it('should properly detect and forward native flag', function () {
730
729
  const bidRequests = [
731
730
  {
732
731
  mediaTypes: {
@@ -741,8 +740,7 @@ describe('The Criteo bidding adapter', function () {
741
740
  ];
742
741
  const request = spec.buildRequests(bidRequests, bidderRequest);
743
742
  const ortbRequest = request.data;
744
- expect(ortbRequest.slots[0].sizes).to.have.lengthOf(1);
745
- expect(ortbRequest.slots[0].sizes[0]).to.equal('2x2');
743
+ expect(ortbRequest.slots[0].native).to.equal(true);
746
744
  });
747
745
 
748
746
  it('should properly build a networkId request', function () {
@@ -1258,11 +1256,13 @@ describe('The Criteo bidding adapter', function () {
1258
1256
  if (inputParams.mediaType === BANNER && inputParams.size[0] === 300 && inputParams.size[1] === 250) {
1259
1257
  return {
1260
1258
  currency: 'USD',
1261
- floor: 1.0};
1259
+ floor: 1.0
1260
+ };
1262
1261
  } else if (inputParams.mediaType === BANNER && inputParams.size[0] === 728 && inputParams.size[1] === 90) {
1263
1262
  return {
1264
1263
  currency: 'USD',
1265
- floor: 2.0};
1264
+ floor: 2.0
1265
+ };
1266
1266
  } else {
1267
1267
  return {}
1268
1268
  }
@@ -1273,9 +1273,10 @@ describe('The Criteo bidding adapter', function () {
1273
1273
  const request = spec.buildRequests(bidRequests, bidderRequest);
1274
1274
  expect(request.data.slots[0].ext.floors).to.deep.equal({
1275
1275
  'banner': {
1276
- '300x250': {'currency': 'USD', 'floor': 1},
1277
- '728x90': {'currency': 'USD', 'floor': 2}
1278
- }});
1276
+ '300x250': { 'currency': 'USD', 'floor': 1 },
1277
+ '728x90': { 'currency': 'USD', 'floor': 2 }
1278
+ }
1279
+ });
1279
1280
  });
1280
1281
 
1281
1282
  it('should properly build a video request with several player sizes with floors', function () {
@@ -1297,11 +1298,13 @@ describe('The Criteo bidding adapter', function () {
1297
1298
  if (inputParams.mediaType === VIDEO && inputParams.size[0] === 300 && inputParams.size[1] === 250) {
1298
1299
  return {
1299
1300
  currency: 'USD',
1300
- floor: 1.0};
1301
+ floor: 1.0
1302
+ };
1301
1303
  } else if (inputParams.mediaType === VIDEO && inputParams.size[0] === 728 && inputParams.size[1] === 90) {
1302
1304
  return {
1303
1305
  currency: 'USD',
1304
- floor: 2.0};
1306
+ floor: 2.0
1307
+ };
1305
1308
  } else {
1306
1309
  return {}
1307
1310
  }
@@ -1312,9 +1315,10 @@ describe('The Criteo bidding adapter', function () {
1312
1315
  const request = spec.buildRequests(bidRequests, bidderRequest);
1313
1316
  expect(request.data.slots[0].ext.floors).to.deep.equal({
1314
1317
  'video': {
1315
- '300x250': {'currency': 'USD', 'floor': 1},
1316
- '728x90': {'currency': 'USD', 'floor': 2}
1317
- }});
1318
+ '300x250': { 'currency': 'USD', 'floor': 1 },
1319
+ '728x90': { 'currency': 'USD', 'floor': 2 }
1320
+ }
1321
+ });
1318
1322
  });
1319
1323
 
1320
1324
  it('should properly build a multi format request with floors', function () {
@@ -1347,19 +1351,23 @@ describe('The Criteo bidding adapter', function () {
1347
1351
  if (inputParams.mediaType === BANNER && inputParams.size[0] === 300 && inputParams.size[1] === 250) {
1348
1352
  return {
1349
1353
  currency: 'USD',
1350
- floor: 1.0};
1354
+ floor: 1.0
1355
+ };
1351
1356
  } else if (inputParams.mediaType === BANNER && inputParams.size[0] === 728 && inputParams.size[1] === 90) {
1352
1357
  return {
1353
1358
  currency: 'USD',
1354
- floor: 2.0};
1359
+ floor: 2.0
1360
+ };
1355
1361
  } else if (inputParams.mediaType === VIDEO && inputParams.size[0] === 640 && inputParams.size[1] === 480) {
1356
1362
  return {
1357
1363
  currency: 'EUR',
1358
- floor: 3.2};
1364
+ floor: 3.2
1365
+ };
1359
1366
  } else if (inputParams.mediaType === NATIVE && inputParams.size === '*') {
1360
1367
  return {
1361
1368
  currency: 'YEN',
1362
- floor: 4.99};
1369
+ floor: 4.99
1370
+ };
1363
1371
  } else {
1364
1372
  return {}
1365
1373
  }
@@ -1371,15 +1379,16 @@ describe('The Criteo bidding adapter', function () {
1371
1379
  expect(request.data.slots[0].ext.data.someContextAttribute).to.deep.equal('abc');
1372
1380
  expect(request.data.slots[0].ext.floors).to.deep.equal({
1373
1381
  'banner': {
1374
- '300x250': {'currency': 'USD', 'floor': 1},
1375
- '728x90': {'currency': 'USD', 'floor': 2}
1382
+ '300x250': { 'currency': 'USD', 'floor': 1 },
1383
+ '728x90': { 'currency': 'USD', 'floor': 2 }
1376
1384
  },
1377
1385
  'video': {
1378
- '640x480': {'currency': 'EUR', 'floor': 3.2}
1386
+ '640x480': { 'currency': 'EUR', 'floor': 3.2 }
1379
1387
  },
1380
1388
  'native': {
1381
- '*': {'currency': 'YEN', 'floor': 4.99}
1382
- }});
1389
+ '*': { 'currency': 'YEN', 'floor': 4.99 }
1390
+ }
1391
+ });
1383
1392
  });
1384
1393
  });
1385
1394
 
@@ -293,8 +293,8 @@ describe('Digital Garage Keyword Module', function () {
293
293
  moduleConfig,
294
294
  null
295
295
  );
296
+ const request = server.requests[0];
296
297
  setTimeout(() => {
297
- const request = server.requests[0];
298
298
  if (request) {
299
299
  request.respond(
300
300
  200,