prebid.js 7.45.0 → 7.47.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 (204) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.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/admaticBidAdapter.js +1 -1
  7. package/dist/adnuntiusBidAdapter.js +1 -1
  8. package/dist/adrelevantisBidAdapter.js +1 -1
  9. package/dist/adtrgtmeBidAdapter.js +1 -1
  10. package/dist/adxcgBidAdapter.js +1 -1
  11. package/dist/adyoulikeBidAdapter.js +1 -1
  12. package/dist/ajaBidAdapter.js +1 -1
  13. package/dist/amxBidAdapter.js +1 -1
  14. package/dist/amxIdSystem.js +1 -1
  15. package/dist/appierAnalyticsAdapter.js +1 -1
  16. package/dist/appnexusBidAdapter.js +1 -1
  17. package/dist/asoBidAdapter.js +1 -1
  18. package/dist/axonixBidAdapter.js +1 -1
  19. package/dist/bidglassBidAdapter.js +1 -1
  20. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  21. package/dist/big-richmediaBidAdapter.js +1 -1
  22. package/dist/bridgewellBidAdapter.js +1 -1
  23. package/dist/brightMountainMediaBidAdapter.js +1 -1
  24. package/dist/carodaBidAdapter.js +1 -1
  25. package/dist/chtnwBidAdapter.js +1 -1
  26. package/dist/concertBidAdapter.js +1 -1
  27. package/dist/connectadBidAdapter.js +1 -1
  28. package/dist/consumableBidAdapter.js +1 -1
  29. package/dist/conversantAnalyticsAdapter.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/criteoIdSystem.js +1 -1
  34. package/dist/cwireBidAdapter.js +1 -1
  35. package/dist/debugging-standalone.js +1 -1
  36. package/dist/dependencies.json +3 -0
  37. package/dist/dspxBidAdapter.js +1 -1
  38. package/dist/emtvBidAdapter.js +1 -0
  39. package/dist/eplanningBidAdapter.js +1 -1
  40. package/dist/eskimiBidAdapter.js +1 -0
  41. package/dist/feedadBidAdapter.js +1 -1
  42. package/dist/finativeBidAdapter.js +1 -1
  43. package/dist/freewheel-sspBidAdapter.js +1 -1
  44. package/dist/glimpseBidAdapter.js +1 -1
  45. package/dist/gmosspBidAdapter.js +1 -1
  46. package/dist/goldbachBidAdapter.js +1 -1
  47. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  48. package/dist/gridBidAdapter.js +1 -1
  49. package/dist/gumgumBidAdapter.js +1 -1
  50. package/dist/h12mediaBidAdapter.js +1 -1
  51. package/dist/id5IdSystem.js +1 -1
  52. package/dist/improvedigitalBidAdapter.js +1 -1
  53. package/dist/inmarBidAdapter.js +1 -1
  54. package/dist/insticatorBidAdapter.js +1 -1
  55. package/dist/ixBidAdapter.js +1 -1
  56. package/dist/justpremiumBidAdapter.js +1 -1
  57. package/dist/kargoBidAdapter.js +1 -1
  58. package/dist/konduitAnalyticsAdapter.js +1 -1
  59. package/dist/kueezBidAdapter.js +1 -1
  60. package/dist/kueezRtbBidAdapter.js +1 -1
  61. package/dist/kulturemediaBidAdapter.js +1 -1
  62. package/dist/lassoBidAdapter.js +1 -1
  63. package/dist/lifestreetBidAdapter.js +1 -1
  64. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  65. package/dist/logicadBidAdapter.js +1 -1
  66. package/dist/loglyliftBidAdapter.js +1 -1
  67. package/dist/magniteAnalyticsAdapter.js +1 -1
  68. package/dist/malltvAnalyticsAdapter.js +1 -1
  69. package/dist/marsmediaBidAdapter.js +1 -1
  70. package/dist/mediafuseBidAdapter.js +1 -1
  71. package/dist/mediasquareBidAdapter.js +1 -1
  72. package/dist/mgidBidAdapter.js +1 -1
  73. package/dist/minutemediaBidAdapter.js +1 -1
  74. package/dist/minutemediaplusBidAdapter.js +1 -1
  75. package/dist/missenaBidAdapter.js +1 -1
  76. package/dist/nativoBidAdapter.js +1 -1
  77. package/dist/neuwoRtdProvider.js +1 -1
  78. package/dist/nextMillenniumBidAdapter.js +1 -1
  79. package/dist/nexx360BidAdapter.js +1 -1
  80. package/dist/not-for-prod/prebid.js +137 -135
  81. package/dist/oguryBidAdapter.js +1 -1
  82. package/dist/onetagBidAdapter.js +1 -1
  83. package/dist/ooloAnalyticsAdapter.js +1 -1
  84. package/dist/optidigitalBidAdapter.js +1 -1
  85. package/dist/ortbConverter.js +1 -1
  86. package/dist/outbrainBidAdapter.js +1 -1
  87. package/dist/pairIdSystem.js +1 -0
  88. package/dist/parrableIdSystem.js +1 -1
  89. package/dist/pixfutureBidAdapter.js +1 -1
  90. package/dist/prebid-core.js +1 -1
  91. package/dist/publinkIdSystem.js +1 -1
  92. package/dist/pubmaticBidAdapter.js +1 -1
  93. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  94. package/dist/pxyzBidAdapter.js +1 -1
  95. package/dist/quantcastBidAdapter.js +1 -1
  96. package/dist/readpeakBidAdapter.js +1 -1
  97. package/dist/relaidoBidAdapter.js +1 -1
  98. package/dist/rhythmoneBidAdapter.js +1 -1
  99. package/dist/riseBidAdapter.js +1 -1
  100. package/dist/rtbhouseBidAdapter.js +1 -1
  101. package/dist/rubiconAnalyticsAdapter.js +1 -1
  102. package/dist/rubiconBidAdapter.js +1 -1
  103. package/dist/seedingAllianceBidAdapter.js +1 -1
  104. package/dist/seedtagBidAdapter.js +1 -1
  105. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  106. package/dist/sharethroughBidAdapter.js +1 -1
  107. package/dist/shinezBidAdapter.js +1 -1
  108. package/dist/smaatoBidAdapter.js +1 -1
  109. package/dist/smartadserverBidAdapter.js +1 -1
  110. package/dist/smartxBidAdapter.js +1 -1
  111. package/dist/smilewantedBidAdapter.js +1 -1
  112. package/dist/sonobiBidAdapter.js +1 -1
  113. package/dist/sovrnAnalyticsAdapter.js +1 -1
  114. package/dist/sovrnBidAdapter.js +1 -1
  115. package/dist/sspBCBidAdapter.js +1 -1
  116. package/dist/stvBidAdapter.js +1 -1
  117. package/dist/sublimeBidAdapter.js +1 -1
  118. package/dist/synacormediaBidAdapter.js +1 -1
  119. package/dist/targetVideoBidAdapter.js +1 -1
  120. package/dist/teadsBidAdapter.js +1 -1
  121. package/dist/trionBidAdapter.js +1 -1
  122. package/dist/tripleliftBidAdapter.js +1 -1
  123. package/dist/ttdBidAdapter.js +1 -1
  124. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  125. package/dist/uid2IdSystem.js +1 -1
  126. package/dist/underdogmediaBidAdapter.js +1 -1
  127. package/dist/undertoneBidAdapter.js +1 -1
  128. package/dist/userId.js +1 -1
  129. package/dist/vidazooBidAdapter.js +1 -1
  130. package/dist/videobyteBidAdapter.js +1 -1
  131. package/dist/vidoomyBidAdapter.js +1 -1
  132. package/dist/visxBidAdapter.js +1 -1
  133. package/dist/vuukleBidAdapter.js +1 -1
  134. package/dist/widespaceBidAdapter.js +1 -1
  135. package/dist/winrBidAdapter.js +1 -1
  136. package/dist/yahoosspBidAdapter.js +1 -1
  137. package/dist/yieldmoBidAdapter.js +1 -1
  138. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  139. package/integrationExamples/gpt/fledge_example.html +103 -0
  140. package/integrationExamples/gpt/prebidServer_fledge_example.html +111 -0
  141. package/libraries/ortbConverter/processors/video.js +1 -0
  142. package/modules/admaticBidAdapter.js +7 -2
  143. package/modules/adnuntiusBidAdapter.js +3 -1
  144. package/modules/appnexusBidAdapter.js +108 -102
  145. package/modules/bidwatchAnalyticsAdapter.js +2 -0
  146. package/modules/conversantBidAdapter.js +3 -0
  147. package/modules/criteoBidAdapter.js +5 -1
  148. package/modules/criteoIdSystem.js +27 -14
  149. package/modules/emtvBidAdapter.js +211 -0
  150. package/modules/emtvBidAdapter.md +79 -0
  151. package/modules/eskimiBidAdapter.js +72 -0
  152. package/modules/eskimiBidAdapter.md +34 -0
  153. package/modules/gridBidAdapter.js +42 -19
  154. package/modules/ixBidAdapter.js +30 -0
  155. package/modules/kargoBidAdapter.js +473 -246
  156. package/modules/kueezRtbBidAdapter.js +16 -4
  157. package/modules/mediasquareBidAdapter.js +2 -1
  158. package/modules/minutemediaplusBidAdapter.js +16 -4
  159. package/modules/missenaBidAdapter.js +1 -1
  160. package/modules/nativoBidAdapter.js +110 -21
  161. package/modules/neuwoRtdProvider.js +0 -2
  162. package/modules/nextMillenniumBidAdapter.js +2 -0
  163. package/modules/pairIdSystem.js +79 -0
  164. package/modules/pubmaticBidAdapter.js +12 -9
  165. package/modules/rtbhouseBidAdapter.js +3 -3
  166. package/modules/userId/eids.js +6 -0
  167. package/modules/vidoomyBidAdapter.js +30 -9
  168. package/modules/vidoomyBidAdapter.md +12 -2
  169. package/modules/yieldmoBidAdapter.js +15 -5
  170. package/package.json +1 -1
  171. package/src/config.js +78 -127
  172. package/test/spec/modules/1plusXRtdProvider_spec.js +8 -7
  173. package/test/spec/modules/adagioBidAdapter_spec.js +0 -25
  174. package/test/spec/modules/admaticBidAdapter_spec.js +1 -1
  175. package/test/spec/modules/adnuntiusBidAdapter_spec.js +2 -1
  176. package/test/spec/modules/appnexusBidAdapter_spec.js +464 -448
  177. package/test/spec/modules/axonixBidAdapter_spec.js +0 -27
  178. package/test/spec/modules/big-richmediaBidAdapter_spec.js +68 -64
  179. package/test/spec/modules/conversantBidAdapter_spec.js +1 -0
  180. package/test/spec/modules/criteoBidAdapter_spec.js +33 -1
  181. package/test/spec/modules/criteoIdSystem_spec.js +99 -9
  182. package/test/spec/modules/emtvBidAdapter_spec.js +400 -0
  183. package/test/spec/modules/eskimiBidAdapter_spec.js +155 -0
  184. package/test/spec/modules/gridBidAdapter_spec.js +8 -0
  185. package/test/spec/modules/ixBidAdapter_spec.js +57 -0
  186. package/test/spec/modules/kargoBidAdapter_spec.js +297 -140
  187. package/test/spec/modules/kueezRtbBidAdapter_spec.js +22 -2
  188. package/test/spec/modules/minutemediaplusBidAdapter_spec.js +22 -2
  189. package/test/spec/modules/nativoBidAdapter_spec.js +101 -0
  190. package/test/spec/modules/neuwoRtdProvider_spec.js +0 -1
  191. package/test/spec/modules/ooloAnalyticsAdapter_spec.js +1 -1
  192. package/test/spec/modules/pairIdSystem_spec.js +68 -0
  193. package/test/spec/modules/pubCommonId_spec.js +0 -17
  194. package/test/spec/modules/pubmaticBidAdapter_spec.js +868 -867
  195. package/test/spec/modules/realvuAnalyticsAdapter_spec.js +0 -5
  196. package/test/spec/modules/rtbhouseBidAdapter_spec.js +2 -2
  197. package/test/spec/modules/vidoomyBidAdapter_spec.js +72 -0
  198. package/test/spec/modules/yieldmoBidAdapter_spec.js +19 -1
  199. package/test/spec/unit/pbjs_api_spec.js +19 -3
  200. package/test/test_index.js +13 -3
  201. package/dist/gridNMBidAdapter.js +0 -1
  202. package/modules/gridNMBidAdapter.js +0 -422
  203. package/modules/gridNMBidAdapter.md +0 -39
  204. package/test/spec/modules/gridNMBidAdapter_spec.js +0 -636
@@ -286,26 +286,6 @@ describe('AxonixBidAdapter', function () {
286
286
  });
287
287
  });
288
288
 
289
- describe.skip('buildRequests: can handle native ad requests', function () {
290
- it('creates ServerRequests pointing to the correct region and endpoint if it changes', function () {
291
- // loop:
292
- // set supply id
293
- // set region/endpoint in ssp config
294
- // call buildRequests, validate request (url, method, supply id)
295
- expect.fail('Not implemented');
296
- });
297
-
298
- it('creates ServerRequests pointing to default endpoint if missing', function () {
299
- // no endpoint in config means default value openrtb.axonix.com
300
- expect.fail('Not implemented');
301
- });
302
-
303
- it('creates ServerRequests pointing to default region if missing', function () {
304
- // no region in config means default value us-east-1
305
- expect.fail('Not implemented');
306
- });
307
- });
308
-
309
289
  describe('interpretResponse', function () {
310
290
  it('considers corner cases', function() {
311
291
  expect(spec.interpretResponse(null)).to.be.an('array').that.is.empty;
@@ -331,13 +311,6 @@ describe('AxonixBidAdapter', function () {
331
311
  expect(response).to.be.an('array').that.is.not.empty;
332
312
  expect(response[0]).to.equal(VIDEO_RESPONSE.body[0]);
333
313
  });
334
-
335
- it.skip('parses 1 native responses', function () {
336
- // passing 1 valid native in a response generates an array with 1 correct prebid response
337
- // examine mediaType:native, native element
338
- // check nativeBidIsValid from {@link file://./../../../src/native.js}
339
- expect.fail('Not implemented');
340
- });
341
314
  });
342
315
 
343
316
  describe('onBidWon', function () {
@@ -92,40 +92,42 @@ describe('bigRichMediaAdapterTests', function () {
92
92
  expect(payload.tags[0].sizes).to.have.lengthOf(3);
93
93
  });
94
94
 
95
- it('should build video bid request', function() {
96
- const bidRequest = deepClone(bidRequests[0]);
97
- bidRequest.params = {
98
- placementId: '1234235',
99
- video: {
100
- skippable: true,
101
- playback_method: ['auto_play_sound_off', 'auto_play_sound_unknown'],
102
- context: 'outstream',
103
- format: 'sticky-top'
104
- }
105
- };
106
- bidRequest.mediaTypes = {
107
- video: {
108
- playerSize: [640, 480],
109
- context: 'outstream',
110
- mimes: ['video/mp4'],
111
- skip: 0,
112
- minduration: 5,
113
- api: [1, 5, 6],
114
- playbackmethod: [2, 4]
115
- }
116
- };
95
+ if (FEATURES.VIDEO) {
96
+ it('should build video bid request', function() {
97
+ const bidRequest = deepClone(bidRequests[0]);
98
+ bidRequest.params = {
99
+ placementId: '1234235',
100
+ video: {
101
+ skippable: true,
102
+ playback_method: ['auto_play_sound_off', 'auto_play_sound_unknown'],
103
+ context: 'outstream',
104
+ format: 'sticky-top'
105
+ }
106
+ };
107
+ bidRequest.mediaTypes = {
108
+ video: {
109
+ playerSize: [640, 480],
110
+ context: 'outstream',
111
+ mimes: ['video/mp4'],
112
+ skip: 0,
113
+ minduration: 5,
114
+ api: [1, 5, 6],
115
+ playbackmethod: [2, 4]
116
+ }
117
+ };
117
118
 
118
- const request = spec.buildRequests([bidRequest]);
119
- const payload = JSON.parse(request.data);
119
+ const request = spec.buildRequests([bidRequest]);
120
+ const payload = JSON.parse(request.data);
120
121
 
121
- expect(payload.tags[0].video).to.deep.equal({
122
- minduration: 5,
123
- playback_method: 2,
124
- skippable: true,
125
- context: 4
122
+ expect(payload.tags[0].video).to.deep.equal({
123
+ minduration: 5,
124
+ playback_method: 2,
125
+ skippable: true,
126
+ context: 4
127
+ });
128
+ expect(payload.tags[0].video_frameworks).to.deep.equal([1, 4])
126
129
  });
127
- expect(payload.tags[0].video_frameworks).to.deep.equal([1, 4])
128
- });
130
+ }
129
131
  });
130
132
 
131
133
  describe('interpretResponse', function () {
@@ -227,42 +229,44 @@ describe('bigRichMediaAdapterTests', function () {
227
229
  expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
228
230
  });
229
231
 
230
- it('handles outstream video responses', function () {
231
- const response = {
232
- 'tags': [{
233
- 'uuid': '84ab500420319d',
234
- 'ads': [{
235
- 'ad_type': 'video',
236
- 'cpm': 0.500000,
237
- 'notify_url': 'imptracker.com',
238
- 'rtb': {
239
- 'video': {
240
- 'content': '<!-- VAST Creative -->'
241
- }
242
- },
243
- 'javascriptTrackers': '<script type=\'text/javascript\' async=\'true\' src=\'https://cdn.adnxs.com/v/s/152/trk.js#v;vk=appnexus.com-omid;tv=native1-18h;dom_id=%native_dom_id%;st=0;d=1x1;vc=iab;vid_ccr=1;tag_id=13232354;cb=https%3A%2F%2Fams1-ib.adnxs.com%2Fvevent%3Freferrer%3Dhttps253A%252F%252Ftestpages-pmahe.tp.adnxs.net%252F01_basic_single%26e%3DwqT_3QLNB6DNAwAAAwDWAAUBCLfl_-MFEMStk8u3lPTjRxih88aF0fq_2QsqNgkAAAECCCRAEQEHEAAAJEAZEQkAIREJACkRCQAxEQmoMOLRpwY47UhA7UhIAlCDy74uWJzxW2AAaM26dXjzjwWAAQGKAQNVU0SSAQEG8FCYAQGgAQGoAQGwAQC4AQHAAQTIAQLQAQDYAQDgAQDwAQCKAjt1ZignYScsIDI1Mjk4ODUsIDE1NTE4ODkwNzkpO3VmKCdyJywgOTc0OTQ0MDM2HgDwjZIC8QEha0RXaXBnajgtTHdLRUlQTHZpNFlBQ0NjOFZzd0FEZ0FRQVJJN1VoUTR0R25CbGdBWU1rR2FBQndMSGlrTDRBQlVvZ0JwQy1RQVFHWUFRR2dBUUdvQVFPd0FRQzVBZk90YXFRQUFDUkF3UUh6cldxa0FBQWtRTWtCbWo4dDA1ZU84VF9aQVFBQUEBAyRQQV80QUVBOVFFAQ4sQW1BSUFvQUlBdFFJBRAAdg0IeHdBSUF5QUlBNEFJQTZBSUEtQUlBZ0FNQm1BTUJxQVAFzIh1Z01KUVUxVE1UbzBNekl3NEFPVENBLi6aAmEhUXcxdGNRagUoEfQkblBGYklBUW9BRAl8AEEBqAREbzJEABRRSk1JU1EBGwRBQQGsAFURDAxBQUFXHQzwWNgCAOACrZhI6gIzaHR0cDovL3Rlc3RwYWdlcy1wbWFoZS50cC5hZG54cy5uZXQvMDFfYmFzaWNfc2luZ2xl8gITCg9DVVNUT01fTU9ERUxfSUQSAPICGgoWMhYAPExFQUZfTkFNRRIA8gIeCho2HQAIQVNUAT7wnElGSUVEEgCAAwCIAwGQAwCYAxegAwGqAwDAA-CoAcgDANgD8ao-4AMA6AMA-AMBgAQAkgQNL3V0L3YzL3ByZWJpZJgEAKIECjEwLjIuMTIuMzioBIqpB7IEDggAEAEYACAAKAAwADgCuAQAwAQAyAQA0gQOOTMyNSNBTVMxOjQzMjDaBAIIAeAEAfAEg8u-LogFAZgFAKAF______8BAxgBwAUAyQUABQEU8D_SBQkJBQt8AAAA2AUB4AUB8AWZ9CH6BQQIABAAkAYBmAYAuAYAwQYBITAAAPA_yAYA2gYWChAAOgEAGBAAGADgBgw.%26s%3D971dce9d49b6bee447c8a58774fb30b40fe98171;ts=1551889079;cet=0;cecb=\'></script>'
232
+ if (FEATURES.VIDEO) {
233
+ it('handles outstream video responses', function () {
234
+ const response = {
235
+ 'tags': [{
236
+ 'uuid': '84ab500420319d',
237
+ 'ads': [{
238
+ 'ad_type': 'video',
239
+ 'cpm': 0.500000,
240
+ 'notify_url': 'imptracker.com',
241
+ 'rtb': {
242
+ 'video': {
243
+ 'content': '<!-- VAST Creative -->'
244
+ }
245
+ },
246
+ 'javascriptTrackers': '<script type=\'text/javascript\' async=\'true\' src=\'https://cdn.adnxs.com/v/s/152/trk.js#v;vk=appnexus.com-omid;tv=native1-18h;dom_id=%native_dom_id%;st=0;d=1x1;vc=iab;vid_ccr=1;tag_id=13232354;cb=https%3A%2F%2Fams1-ib.adnxs.com%2Fvevent%3Freferrer%3Dhttps253A%252F%252Ftestpages-pmahe.tp.adnxs.net%252F01_basic_single%26e%3DwqT_3QLNB6DNAwAAAwDWAAUBCLfl_-MFEMStk8u3lPTjRxih88aF0fq_2QsqNgkAAAECCCRAEQEHEAAAJEAZEQkAIREJACkRCQAxEQmoMOLRpwY47UhA7UhIAlCDy74uWJzxW2AAaM26dXjzjwWAAQGKAQNVU0SSAQEG8FCYAQGgAQGoAQGwAQC4AQHAAQTIAQLQAQDYAQDgAQDwAQCKAjt1ZignYScsIDI1Mjk4ODUsIDE1NTE4ODkwNzkpO3VmKCdyJywgOTc0OTQ0MDM2HgDwjZIC8QEha0RXaXBnajgtTHdLRUlQTHZpNFlBQ0NjOFZzd0FEZ0FRQVJJN1VoUTR0R25CbGdBWU1rR2FBQndMSGlrTDRBQlVvZ0JwQy1RQVFHWUFRR2dBUUdvQVFPd0FRQzVBZk90YXFRQUFDUkF3UUh6cldxa0FBQWtRTWtCbWo4dDA1ZU84VF9aQVFBQUEBAyRQQV80QUVBOVFFAQ4sQW1BSUFvQUlBdFFJBRAAdg0IeHdBSUF5QUlBNEFJQTZBSUEtQUlBZ0FNQm1BTUJxQVAFzIh1Z01KUVUxVE1UbzBNekl3NEFPVENBLi6aAmEhUXcxdGNRagUoEfQkblBGYklBUW9BRAl8AEEBqAREbzJEABRRSk1JU1EBGwRBQQGsAFURDAxBQUFXHQzwWNgCAOACrZhI6gIzaHR0cDovL3Rlc3RwYWdlcy1wbWFoZS50cC5hZG54cy5uZXQvMDFfYmFzaWNfc2luZ2xl8gITCg9DVVNUT01fTU9ERUxfSUQSAPICGgoWMhYAPExFQUZfTkFNRRIA8gIeCho2HQAIQVNUAT7wnElGSUVEEgCAAwCIAwGQAwCYAxegAwGqAwDAA-CoAcgDANgD8ao-4AMA6AMA-AMBgAQAkgQNL3V0L3YzL3ByZWJpZJgEAKIECjEwLjIuMTIuMzioBIqpB7IEDggAEAEYACAAKAAwADgCuAQAwAQAyAQA0gQOOTMyNSNBTVMxOjQzMjDaBAIIAeAEAfAEg8u-LogFAZgFAKAF______8BAxgBwAUAyQUABQEU8D_SBQkJBQt8AAAA2AUB4AUB8AWZ9CH6BQQIABAAkAYBmAYAuAYAwQYBITAAAPA_yAYA2gYWChAAOgEAGBAAGADgBgw.%26s%3D971dce9d49b6bee447c8a58774fb30b40fe98171;ts=1551889079;cet=0;cecb=\'></script>'
247
+ }]
244
248
  }]
245
- }]
246
- };
247
- const bidderRequest = {
248
- bids: [{
249
- bidId: '84ab500420319d',
250
- adUnitCode: 'code',
251
- mediaTypes: {
252
- video: {
253
- context: 'outstream'
249
+ };
250
+ const bidderRequest = {
251
+ bids: [{
252
+ bidId: '84ab500420319d',
253
+ adUnitCode: 'code',
254
+ mediaTypes: {
255
+ video: {
256
+ context: 'outstream'
257
+ }
254
258
  }
255
- }
256
- }]
257
- }
259
+ }]
260
+ }
258
261
 
259
- const result = spec.interpretResponse({ body: response }, {bidderRequest});
260
- expect(result[0]).not.to.have.property('vastXml');
261
- expect(result[0]).not.to.have.property('vastUrl');
262
- expect(result[0]).to.have.property('width', 1);
263
- expect(result[0]).to.have.property('height', 1);
264
- expect(result[0]).to.have.property('mediaType', 'banner');
265
- });
262
+ const result = spec.interpretResponse({ body: response }, {bidderRequest});
263
+ expect(result[0]).not.to.have.property('vastXml');
264
+ expect(result[0]).not.to.have.property('vastUrl');
265
+ expect(result[0]).to.have.property('width', 1);
266
+ expect(result[0]).to.have.property('height', 1);
267
+ expect(result[0]).to.have.property('mediaType', 'banner');
268
+ });
269
+ }
266
270
  });
267
271
 
268
272
  describe('getUserSyncs', function() {
@@ -263,6 +263,7 @@ describe('Conversant adapter tests', function() {
263
263
  const payload = request.data;
264
264
 
265
265
  expect(payload).to.have.property('id', 'req000');
266
+ expect(payload.source).to.have.property('tid', 'req000');
266
267
  expect(payload).to.have.property('at', 1);
267
268
  expect(payload).to.have.property('imp');
268
269
  expect(payload.imp).to.be.an('array').with.lengthOf(8);
@@ -883,6 +883,38 @@ describe('The Criteo bidding adapter', function () {
883
883
  expect(request.data.user.uspIab).to.equal('1YNY');
884
884
  });
885
885
 
886
+ it('should properly build a request with device sua field', function () {
887
+ const sua = {}
888
+ const bidRequests = [
889
+ {
890
+ bidder: 'criteo',
891
+ adUnitCode: 'bid-123',
892
+ transactionId: 'transaction-123',
893
+ mediaTypes: {
894
+ banner: {
895
+ sizes: [[728, 90]]
896
+ }
897
+ },
898
+ params: {
899
+ zoneId: 123,
900
+ },
901
+ },
902
+ ];
903
+ const bidderRequest = {
904
+ timeout: 3000,
905
+ uspConsent: '1YNY',
906
+ ortb2: {
907
+ device: {
908
+ sua: sua
909
+ }
910
+ }
911
+ };
912
+
913
+ const request = spec.buildRequests(bidRequests, bidderRequest);
914
+ expect(request.data.user.ext.sua).to.not.be.null;
915
+ expect(request.data.user.ext.sua).to.equal(sua);
916
+ });
917
+
886
918
  it('should properly build a request with gpp consent field', function () {
887
919
  const bidRequests = [
888
920
  {
@@ -1475,7 +1507,7 @@ describe('The Criteo bidding adapter', function () {
1475
1507
  creativecode: 'test-crId',
1476
1508
  width: 728,
1477
1509
  height: 90,
1478
- dealCode: 'myDealCode',
1510
+ deal: 'myDealCode',
1479
1511
  adomain: ['criteo.com'],
1480
1512
  }],
1481
1513
  },
@@ -1,5 +1,6 @@
1
1
  import { criteoIdSubmodule, storage } from 'modules/criteoIdSystem.js';
2
2
  import * as utils from 'src/utils.js';
3
+ import { gdprDataHandler, uspDataHandler, gppDataHandler } from '../../../src/adapterManager.js';
3
4
  import { server } from '../../mocks/xhr';
4
5
 
5
6
  const pastDateString = new Date(0).toString()
@@ -17,6 +18,9 @@ describe('CriteoId module', function () {
17
18
  let timeStampStub;
18
19
  let parseUrlStub;
19
20
  let triggerPixelStub;
21
+ let gdprConsentDataStub;
22
+ let uspConsentDataStub;
23
+ let gppConsentDataStub;
20
24
 
21
25
  beforeEach(function (done) {
22
26
  getCookieStub = sinon.stub(storage, 'getCookie');
@@ -27,6 +31,9 @@ describe('CriteoId module', function () {
27
31
  timeStampStub = sinon.stub(utils, 'timestamp').returns(nowTimestamp);
28
32
  parseUrlStub = sinon.stub(utils, 'parseUrl').returns({ protocol: 'https', hostname: 'testdev.com' })
29
33
  triggerPixelStub = sinon.stub(utils, 'triggerPixel');
34
+ gdprConsentDataStub = sinon.stub(gdprDataHandler, 'getConsentData');
35
+ uspConsentDataStub = sinon.stub(uspDataHandler, 'getConsentData');
36
+ gppConsentDataStub = sinon.stub(gppDataHandler, 'getConsentData');
30
37
  done();
31
38
  });
32
39
 
@@ -39,6 +46,9 @@ describe('CriteoId module', function () {
39
46
  timeStampStub.restore();
40
47
  triggerPixelStub.restore();
41
48
  parseUrlStub.restore();
49
+ gdprConsentDataStub.restore();
50
+ uspConsentDataStub.restore();
51
+ gppConsentDataStub.restore();
42
52
  });
43
53
 
44
54
  const storageTestCases = [
@@ -136,11 +146,11 @@ describe('CriteoId module', function () {
136
146
  }));
137
147
 
138
148
  const gdprConsentTestCases = [
139
- { consentData: { gdprApplies: true, consentString: 'expectedConsentString' }, expected: 'expectedConsentString' },
140
- { consentData: { gdprApplies: false, consentString: 'expectedConsentString' }, expected: undefined },
141
- { consentData: { gdprApplies: true, consentString: undefined }, expected: undefined },
142
- { consentData: { gdprApplies: 'oui', consentString: 'expectedConsentString' }, expected: undefined },
143
- { consentData: undefined, expected: undefined }
149
+ { consentData: { gdprApplies: true, consentString: 'expectedConsentString' }, expectedGdprConsent: 'expectedConsentString', expectedGdpr: '1' },
150
+ { consentData: { gdprApplies: false, consentString: 'expectedConsentString' }, expectedGdprConsent: 'expectedConsentString', expectedGdpr: '0' },
151
+ { consentData: { gdprApplies: true, consentString: undefined }, expectedGdprConsent: undefined, expectedGdpr: '1' },
152
+ { consentData: { gdprApplies: 'oui', consentString: 'expectedConsentString' }, expectedGdprConsent: 'expectedConsentString', expectedGdpr: '0' },
153
+ { consentData: undefined, expectedGdprConsent: undefined, expectedGdpr: undefined }
144
154
  ];
145
155
 
146
156
  it('should call sync pixels if request by backend', function () {
@@ -225,14 +235,94 @@ describe('CriteoId module', function () {
225
235
 
226
236
  gdprConsentTestCases.forEach(testCase => it('should call user sync url with the gdprConsent', function () {
227
237
  let callBackSpy = sinon.spy();
228
- let result = criteoIdSubmodule.getId(undefined, testCase.consentData);
238
+
239
+ gdprConsentDataStub.returns(testCase.consentData);
240
+
241
+ let result = criteoIdSubmodule.getId(undefined);
242
+ result.callback(callBackSpy);
243
+
244
+ let request = server.requests[0];
245
+
246
+ if (testCase.expectedGdprConsent) {
247
+ expect(request.url).to.have.string(`gdprString=${testCase.expectedGdprConsent}`);
248
+ } else {
249
+ expect(request.url).to.not.have.string('gdprString=');
250
+ }
251
+
252
+ if (testCase.expectedGdpr) {
253
+ expect(request.url).to.have.string(`gdpr=${testCase.expectedGdpr}`);
254
+ } else {
255
+ expect(request.url).to.not.have.string('gdpr=');
256
+ }
257
+
258
+ request.respond(
259
+ 200,
260
+ { 'Content-Type': 'application/json' },
261
+ JSON.stringify({})
262
+ );
263
+
264
+ expect(callBackSpy.calledOnce).to.be.true;
265
+ }));
266
+
267
+ [undefined, 'abc'].forEach(usPrivacy => it('should call user sync url with the us privacy string', function () {
268
+ let callBackSpy = sinon.spy();
269
+
270
+ uspConsentDataStub.returns(usPrivacy);
271
+
272
+ let result = criteoIdSubmodule.getId(undefined);
229
273
  result.callback(callBackSpy);
230
274
 
231
275
  let request = server.requests[0];
232
- if (testCase.expected) {
233
- expect(request.url).to.have.string(`gdprString=${testCase.expected}`);
276
+
277
+ if (usPrivacy) {
278
+ expect(request.url).to.have.string(`us_privacy=${usPrivacy}`);
279
+ } else {
280
+ expect(request.url).to.not.have.string('us_privacy=');
281
+ }
282
+
283
+ request.respond(
284
+ 200,
285
+ { 'Content-Type': 'application/json' },
286
+ JSON.stringify({})
287
+ );
288
+
289
+ expect(callBackSpy.calledOnce).to.be.true;
290
+ }));
291
+
292
+ [
293
+ {
294
+ consentData: {
295
+ gppString: 'abc',
296
+ applicableSections: [1]
297
+ },
298
+ expectedGpp: 'abc',
299
+ expectedGppSid: '1'
300
+ },
301
+ {
302
+ consentData: undefined,
303
+ expectedGpp: undefined,
304
+ expectedGppSid: undefined
305
+ }
306
+ ].forEach(testCase => it('should call user sync url with the gpp string', function () {
307
+ let callBackSpy = sinon.spy();
308
+
309
+ gppConsentDataStub.returns(testCase.consentData);
310
+
311
+ let result = criteoIdSubmodule.getId(undefined);
312
+ result.callback(callBackSpy);
313
+
314
+ let request = server.requests[0];
315
+
316
+ if (testCase.expectedGpp) {
317
+ expect(request.url).to.have.string(`gpp=${testCase.expectedGpp}`);
318
+ } else {
319
+ expect(request.url).to.not.have.string('gpp=');
320
+ }
321
+
322
+ if (testCase.expectedGppSid) {
323
+ expect(request.url).to.have.string(`gpp_sid=${testCase.expectedGppSid}`);
234
324
  } else {
235
- expect(request.url).to.not.have.string('gdprString');
325
+ expect(request.url).to.not.have.string('gpp_sid=');
236
326
  }
237
327
 
238
328
  request.respond(