prebid.js 7.52.0 → 7.53.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 (214) hide show
  1. package/dist/1plusXRtdProvider.js +1 -1
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/adkernelBidAdapter.js +1 -1
  8. package/dist/adqueryBidAdapter.js +1 -1
  9. package/dist/adrelevantisBidAdapter.js +1 -1
  10. package/dist/adtrgtmeBidAdapter.js +1 -1
  11. package/dist/adxcgBidAdapter.js +1 -1
  12. package/dist/adyoulikeBidAdapter.js +1 -1
  13. package/dist/airgridRtdProvider.js +1 -1
  14. package/dist/ajaBidAdapter.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/beopBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/big-richmediaBidAdapter.js +1 -1
  24. package/dist/bridgewellBidAdapter.js +1 -1
  25. package/dist/brightMountainMediaBidAdapter.js +1 -1
  26. package/dist/carodaBidAdapter.js +1 -1
  27. package/dist/chtnwBidAdapter.js +1 -1
  28. package/dist/conceptxBidAdapter.js +1 -0
  29. package/dist/concertBidAdapter.js +1 -1
  30. package/dist/connectadBidAdapter.js +1 -1
  31. package/dist/consumableBidAdapter.js +1 -1
  32. package/dist/conversantAnalyticsAdapter.js +1 -1
  33. package/dist/conversantBidAdapter.js +1 -1
  34. package/dist/craftBidAdapter.js +1 -1
  35. package/dist/criteoBidAdapter.js +1 -1
  36. package/dist/cwireBidAdapter.js +1 -1
  37. package/dist/dspxBidAdapter.js +1 -1
  38. package/dist/eplanningBidAdapter.js +1 -1
  39. package/dist/eskimiBidAdapter.js +1 -1
  40. package/dist/euidIdSystem.js +1 -0
  41. package/dist/feedadBidAdapter.js +1 -1
  42. package/dist/finativeBidAdapter.js +1 -1
  43. package/dist/freepassIdSystem.js +1 -0
  44. package/dist/freewheel-sspBidAdapter.js +1 -1
  45. package/dist/glimpseBidAdapter.js +1 -1
  46. package/dist/gmosspBidAdapter.js +1 -1
  47. package/dist/goldbachBidAdapter.js +1 -1
  48. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  49. package/dist/greenbidsRtdProvider.js +1 -1
  50. package/dist/gridBidAdapter.js +1 -1
  51. package/dist/gumgumBidAdapter.js +1 -1
  52. package/dist/h12mediaBidAdapter.js +1 -1
  53. package/dist/id5IdSystem.js +1 -1
  54. package/dist/improvedigitalBidAdapter.js +1 -1
  55. package/dist/inmarBidAdapter.js +1 -1
  56. package/dist/insticatorBidAdapter.js +1 -1
  57. package/dist/ixBidAdapter.js +1 -1
  58. package/dist/justpremiumBidAdapter.js +1 -1
  59. package/dist/kargoBidAdapter.js +1 -1
  60. package/dist/konduitAnalyticsAdapter.js +1 -1
  61. package/dist/kueezBidAdapter.js +1 -1
  62. package/dist/kueezRtbBidAdapter.js +1 -1
  63. package/dist/kulturemediaBidAdapter.js +1 -1
  64. package/dist/lassoBidAdapter.js +1 -1
  65. package/dist/lifestreetBidAdapter.js +1 -1
  66. package/dist/limelightDigitalBidAdapter.js +1 -1
  67. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  68. package/dist/logicadBidAdapter.js +1 -1
  69. package/dist/loglyliftBidAdapter.js +1 -1
  70. package/dist/magniteAnalyticsAdapter.js +1 -1
  71. package/dist/malltvAnalyticsAdapter.js +1 -1
  72. package/dist/marsmediaBidAdapter.js +1 -1
  73. package/dist/mediafuseBidAdapter.js +1 -1
  74. package/dist/mediasquareBidAdapter.js +1 -1
  75. package/dist/mgidBidAdapter.js +1 -1
  76. package/dist/minutemediaBidAdapter.js +1 -1
  77. package/dist/minutemediaplusBidAdapter.js +1 -1
  78. package/dist/nexx360BidAdapter.js +1 -1
  79. package/dist/not-for-prod/prebid.js +146 -142
  80. package/dist/oguryBidAdapter.js +1 -1
  81. package/dist/onetagBidAdapter.js +1 -1
  82. package/dist/ooloAnalyticsAdapter.js +1 -1
  83. package/dist/optidigitalBidAdapter.js +1 -1
  84. package/dist/outbrainBidAdapter.js +1 -1
  85. package/dist/pairIdSystem.js +1 -1
  86. package/dist/parrableIdSystem.js +1 -1
  87. package/dist/pixfutureBidAdapter.js +1 -1
  88. package/dist/prebid-core.js +1 -1
  89. package/dist/proxistoreBidAdapter.js +1 -1
  90. package/dist/publinkIdSystem.js +1 -1
  91. package/dist/pubmaticBidAdapter.js +1 -1
  92. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  93. package/dist/pxyzBidAdapter.js +1 -1
  94. package/dist/quantcastBidAdapter.js +1 -1
  95. package/dist/readpeakBidAdapter.js +1 -1
  96. package/dist/relaidoBidAdapter.js +1 -1
  97. package/dist/retailspotBidAdapter.js +1 -1
  98. package/dist/rhythmoneBidAdapter.js +1 -1
  99. package/dist/richaudienceBidAdapter.js +1 -1
  100. package/dist/riseBidAdapter.js +1 -1
  101. package/dist/rubiconAnalyticsAdapter.js +1 -1
  102. package/dist/rubiconBidAdapter.js +1 -1
  103. package/dist/schain.js +1 -1
  104. package/dist/seedingAllianceBidAdapter.js +1 -1
  105. package/dist/seedtagBidAdapter.js +1 -1
  106. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  107. package/dist/sharethroughBidAdapter.js +1 -1
  108. package/dist/shinezBidAdapter.js +1 -1
  109. package/dist/sirdataRtdProvider.js +1 -1
  110. package/dist/smaatoBidAdapter.js +1 -1
  111. package/dist/smartadserverBidAdapter.js +1 -1
  112. package/dist/smartxBidAdapter.js +1 -1
  113. package/dist/smilewantedBidAdapter.js +1 -1
  114. package/dist/sonobiBidAdapter.js +1 -1
  115. package/dist/sovrnAnalyticsAdapter.js +1 -1
  116. package/dist/sovrnBidAdapter.js +1 -1
  117. package/dist/sspBCBidAdapter.js +1 -1
  118. package/dist/stroeerCoreBidAdapter.js +1 -1
  119. package/dist/stvBidAdapter.js +1 -1
  120. package/dist/sublimeBidAdapter.js +1 -1
  121. package/dist/synacormediaBidAdapter.js +1 -1
  122. package/dist/targetVideoBidAdapter.js +1 -1
  123. package/dist/teadsBidAdapter.js +1 -1
  124. package/dist/trionBidAdapter.js +1 -1
  125. package/dist/tripleliftBidAdapter.js +1 -1
  126. package/dist/ttdBidAdapter.js +1 -1
  127. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  128. package/dist/uid2IdSystem.js +1 -1
  129. package/dist/uid2IdSystem_shared.js +1 -0
  130. package/dist/underdogmediaBidAdapter.js +1 -1
  131. package/dist/undertoneBidAdapter.js +1 -1
  132. package/dist/userId.js +1 -1
  133. package/dist/vidazooBidAdapter.js +1 -1
  134. package/dist/videobyteBidAdapter.js +1 -1
  135. package/dist/viouslyBidAdapter.js +1 -1
  136. package/dist/visxBidAdapter.js +1 -1
  137. package/dist/vuukleBidAdapter.js +1 -1
  138. package/dist/weboramaRtdProvider.js +1 -1
  139. package/dist/widespaceBidAdapter.js +1 -1
  140. package/dist/winrBidAdapter.js +1 -1
  141. package/dist/yahoosspBidAdapter.js +1 -1
  142. package/dist/yieldlabBidAdapter.js +1 -1
  143. package/dist/yieldmoBidAdapter.js +1 -1
  144. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  145. package/dist/zeta_global_sspBidAdapter.js +1 -1
  146. package/integrationExamples/gpt/userId_example.html +20 -6
  147. package/modules/.submodules.json +3 -1
  148. package/modules/1plusXRtdProvider.js +31 -60
  149. package/modules/adagioBidAdapter.js +86 -24
  150. package/modules/adkernelBidAdapter.js +2 -2
  151. package/modules/airgridRtdProvider.js +11 -12
  152. package/modules/asoBidAdapter.js +2 -1
  153. package/modules/beopBidAdapter.js +6 -0
  154. package/modules/conceptxBidAdapter.js +70 -0
  155. package/modules/conceptxBidAdapter.md +36 -0
  156. package/modules/criteoBidAdapter.js +9 -2
  157. package/modules/eskimiBidAdapter.js +171 -41
  158. package/modules/eskimiBidAdapter.md +35 -16
  159. package/modules/euidIdSystem.js +121 -0
  160. package/modules/euidIdSystem.md +131 -0
  161. package/modules/freepassIdSystem.js +61 -0
  162. package/modules/freepassIdSystem.md +47 -0
  163. package/modules/greenbidsAnalyticsAdapter.js +1 -1
  164. package/modules/id5IdSystem.js +3 -5
  165. package/modules/ixBidAdapter.js +12 -1
  166. package/modules/limelightDigitalBidAdapter.js +1 -1
  167. package/modules/logicadBidAdapter.js +14 -1
  168. package/modules/mediasquareBidAdapter.js +13 -5
  169. package/modules/nexx360BidAdapter.js +1 -0
  170. package/modules/pairIdSystem.js +10 -5
  171. package/modules/proxistoreBidAdapter.js +11 -14
  172. package/modules/richaudienceBidAdapter.js +10 -1
  173. package/modules/riseBidAdapter.js +1 -1
  174. package/modules/schain.js +2 -2
  175. package/modules/sirdataRtdProvider.js +73 -146
  176. package/modules/sovrnBidAdapter.js +4 -1
  177. package/modules/stroeerCoreBidAdapter.js +55 -6
  178. package/modules/uid2IdSystem.js +27 -210
  179. package/modules/uid2IdSystem.md +104 -23
  180. package/modules/uid2IdSystem_shared.js +232 -0
  181. package/modules/userId/eids.js +8 -0
  182. package/modules/userId/userId.md +2 -1
  183. package/modules/viouslyBidAdapter.js +2 -2
  184. package/modules/weboramaRtdProvider.js +25 -95
  185. package/modules/weboramaRtdProvider.md +4 -4
  186. package/modules/yieldlabBidAdapter.js +23 -14
  187. package/modules/zeta_global_sspBidAdapter.js +27 -22
  188. package/package.json +1 -1
  189. package/src/adloader.js +1 -0
  190. package/test/spec/modules/1plusXRtdProvider_spec.js +98 -149
  191. package/test/spec/modules/adagioBidAdapter_spec.js +46 -17
  192. package/test/spec/modules/airgridRtdProvider_spec.js +2 -0
  193. package/test/spec/modules/beopBidAdapter_spec.js +24 -0
  194. package/test/spec/modules/conceptxBidAdapter_spec.js +136 -0
  195. package/test/spec/modules/criteoBidAdapter_spec.js +1 -1
  196. package/test/spec/modules/eids_spec.js +15 -0
  197. package/test/spec/modules/eskimiBidAdapter_spec.js +264 -112
  198. package/test/spec/modules/euidIdSystem_spec.js +130 -0
  199. package/test/spec/modules/freepassIdSystem_spec.js +186 -0
  200. package/test/spec/modules/id5IdSystem_spec.js +10 -3
  201. package/test/spec/modules/ixBidAdapter_spec.js +30 -0
  202. package/test/spec/modules/logicadBidAdapter_spec.js +122 -2
  203. package/test/spec/modules/mediasquareBidAdapter_spec.js +4 -0
  204. package/test/spec/modules/richaudienceBidAdapter_spec.js +44 -0
  205. package/test/spec/modules/schain_spec.js +9 -0
  206. package/test/spec/modules/sirdataRtdProvider_spec.js +110 -17
  207. package/test/spec/modules/sovrnBidAdapter_spec.js +13 -0
  208. package/test/spec/modules/stroeerCoreBidAdapter_spec.js +151 -6
  209. package/test/spec/modules/uid2IdSystem_helpers.js +70 -0
  210. package/test/spec/modules/uid2IdSystem_spec.js +131 -86
  211. package/test/spec/modules/userId_spec.js +16 -12
  212. package/test/spec/modules/weboramaRtdProvider_spec.js +331 -205
  213. package/test/spec/modules/yieldlabBidAdapter_spec.js +42 -2
  214. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +200 -4
@@ -1,16 +1,16 @@
1
+ import assert from 'assert';
1
2
  import { config } from 'src/config';
2
3
  import {
3
4
  onePlusXSubmodule,
4
- segtaxes,
5
- extractConfig,
6
5
  buildOrtb2Updates,
7
- updateBidderConfig,
8
- setTargetingDataToConfig,
6
+ extractConfig,
9
7
  extractConsent,
10
- getPapiUrl
8
+ extractFpid,
9
+ getPapiUrl,
10
+ segtaxes,
11
+ setTargetingDataToConfig,
12
+ updateBidderConfig,
11
13
  } from 'modules/1plusXRtdProvider';
12
- import assert from 'assert';
13
- import { extractFpid } from '../../../modules/1plusXRtdProvider';
14
14
 
15
15
  describe('1plusXRtdProvider', () => {
16
16
  // Fake server config
@@ -35,47 +35,37 @@ describe('1plusXRtdProvider', () => {
35
35
 
36
36
  // Bidder configs
37
37
  const bidderConfigInitial = {
38
- ortb2: {
39
- user: { keywords: '' },
40
- site: { ext: {} }
41
- }
38
+ user: { keywords: '' },
39
+ site: { ext: {} }
42
40
  }
43
41
  const bidderConfigInitialWith1plusXUserData = {
44
- ortb2: {
45
- user: {
46
- data: [{ name: '1plusX.com', segment: [{ id: 'initial' }] }]
47
- },
48
- site: { content: { data: [] } }
49
- }
42
+ user: {
43
+ data: [{ name: '1plusX.com', segment: [{ id: 'initial' }] }]
44
+ },
45
+ site: { content: { data: [] } }
50
46
  }
51
47
  const bidderConfigInitialWithUserData = {
52
- ortb2: {
53
- user: {
54
- data: [{ name: 'hello.world', segment: [{ id: 'initial' }] }]
55
- },
56
- site: { content: { data: [] } }
57
- }
48
+ user: {
49
+ data: [{ name: 'hello.world', segment: [{ id: 'initial' }] }]
50
+ },
51
+ site: { content: { data: [] } }
58
52
  }
59
53
  const bidderConfigInitialWith1plusXSiteContent = {
60
- ortb2: {
61
- user: { data: [] },
62
- site: {
63
- content: {
64
- data: [{
65
- name: '1plusX.com', segment: [{ id: 'initial' }], ext: { segtax: 525 }
66
- }]
67
- }
68
- },
54
+ user: { data: [] },
55
+ site: {
56
+ content: {
57
+ data: [{
58
+ name: '1plusX.com', segment: [{ id: 'initial' }], ext: { segtax: 525 }
59
+ }]
60
+ }
69
61
  }
70
62
  }
71
63
  const bidderConfigInitialWithSiteContent = {
72
- ortb2: {
73
- user: { data: [] },
74
- site: {
75
- content: {
76
- data: [{ name: 'hello.world', segment: [{ id: 'initial' }] }]
77
- }
78
- },
64
+ user: { data: [] },
65
+ site: {
66
+ content: {
67
+ data: [{ name: 'hello.world', segment: [{ id: 'initial' }] }]
68
+ }
79
69
  }
80
70
  }
81
71
  // Util functions
@@ -178,7 +168,7 @@ describe('1plusXRtdProvider', () => {
178
168
  })
179
169
 
180
170
  describe('buildOrtb2Updates', () => {
181
- it('fills site.content.data & user.data in the ortb2 config', () => {
171
+ it('fills site.content.data, user.data & site.keywords in the ortb2 config', () => {
182
172
  const rtdData = { segments: fakeResponse.s, topics: fakeResponse.t };
183
173
  const ortb2Updates = buildOrtb2Updates(rtdData, randomBidder());
184
174
 
@@ -191,18 +181,8 @@ describe('1plusXRtdProvider', () => {
191
181
  userData: {
192
182
  name: '1plusX.com',
193
183
  segment: rtdData.segments.map((segmentId) => ({ id: segmentId }))
194
- }
195
- }
196
- expect([ortb2Updates]).to.deep.include.members([expectedOutput]);
197
- });
198
- it('fills site.keywords in the ortb2 config (appnexus specific)', () => {
199
- const rtdData = { segments: fakeResponse.s, topics: fakeResponse.t };
200
- const ortb2Updates = buildOrtb2Updates(rtdData, 'appnexus');
201
-
202
- const expectedOutput = {
203
- site: {
204
- keywords: rtdData.topics.join(','),
205
- }
184
+ },
185
+ siteKeywords: rtdData.topics.map(topic => `1plusX=${topic}`).join(','),
206
186
  }
207
187
  expect([ortb2Updates]).to.deep.include.members([expectedOutput]);
208
188
  });
@@ -220,7 +200,8 @@ describe('1plusXRtdProvider', () => {
220
200
  userData: {
221
201
  name: '1plusX.com',
222
202
  segment: []
223
- }
203
+ },
204
+ siteKeywords: rtdData.topics.map(topic => `1plusX=${topic}`).join(','),
224
205
  }
225
206
  expect(ortb2Updates).to.deep.include(expectedOutput);
226
207
  })
@@ -238,20 +219,10 @@ describe('1plusXRtdProvider', () => {
238
219
  userData: {
239
220
  name: '1plusX.com',
240
221
  segment: rtdData.segments.map((segmentId) => ({ id: segmentId }))
241
- }
242
- }
243
- expect(ortb2Updates).to.deep.include(expectedOutput);
244
- })
245
- it('defaults to empty string if no topic is given (appnexus specific)', () => {
246
- const rtdData = { segments: fakeResponse.s };
247
- const ortb2Updates = buildOrtb2Updates(rtdData, 'appnexus');
248
-
249
- const expectedOutput = {
250
- site: {
251
- keywords: '',
252
- }
222
+ },
223
+ siteKeywords: '',
253
224
  }
254
- expect(ortb2Updates).to.deep.include(expectedOutput);
225
+ expect(ortb2Updates, `${JSON.stringify(ortb2Updates, null, 2)}`).to.deep.include(expectedOutput);
255
226
  })
256
227
  })
257
228
 
@@ -271,6 +242,7 @@ describe('1plusXRtdProvider', () => {
271
242
  expect(expectedOutput).to.deep.include(output)
272
243
  expect(output).to.deep.include(expectedOutput)
273
244
  })
245
+
274
246
  it('extracts null if consent object is empty', () => {
275
247
  const consent1 = {}
276
248
  expect(extractConsent(consent1)).to.equal(null)
@@ -345,15 +317,6 @@ describe('1plusXRtdProvider', () => {
345
317
  })
346
318
 
347
319
  describe('updateBidderConfig', () => {
348
- const ortb2UpdatesAppNexus = {
349
- site: {
350
- keywords: fakeResponse.t.join(','),
351
- },
352
- userData: {
353
- name: '1plusX.com',
354
- segment: fakeResponse.s.map((segmentId) => ({ id: segmentId }))
355
- }
356
- }
357
320
  const ortb2Updates = {
358
321
  siteContentData: {
359
322
  name: '1plusX.com',
@@ -363,114 +326,98 @@ describe('1plusXRtdProvider', () => {
363
326
  userData: {
364
327
  name: '1plusX.com',
365
328
  segment: fakeResponse.s.map((segmentId) => ({ id: segmentId }))
366
- }
329
+ },
330
+ siteKeywords: fakeResponse.t.map(topic => `1plusX=${topic}`).join(','),
367
331
  }
368
332
 
369
333
  it('merges fetched data in bidderConfig for configured bidders', () => {
370
- const bidder = randomBidder();
371
- // Set initial config
372
- config.setBidderConfig({
373
- bidders: [bidder],
374
- config: bidderConfigInitial
375
- });
376
- // Call submodule's setBidderConfig
377
- const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
378
- // Check that the targeting data has been set in the config
379
- expect(newBidderConfig).not.to.be.null;
380
- expect(newBidderConfig.ortb2.site.content.data).to.deep.include(ortb2Updates.siteContentData);
381
- expect(newBidderConfig.ortb2.user.data).to.deep.include(ortb2Updates.userData);
382
- // Check that existing config didn't get erased
383
- expect(newBidderConfig.ortb2.site).to.deep.include(bidderConfigInitial.ortb2.site);
384
- expect(newBidderConfig.ortb2.user).to.deep.include(bidderConfigInitial.ortb2.user);
385
- })
386
-
387
- it('merges fetched data in bidderConfig for configured bidders (appnexus specific)', () => {
388
- const bidder = 'appnexus';
389
334
  // Set initial config
390
- config.setBidderConfig({
391
- bidders: [bidder],
392
- config: bidderConfigInitial
393
- });
335
+ const bidder = randomBidder();
336
+ const ortb2Fragments = { [bidder]: { ...bidderConfigInitial } }
394
337
  // Call submodule's setBidderConfig
395
- const newBidderConfig = updateBidderConfig(bidder, ortb2UpdatesAppNexus, config.getBidderConfig());
396
-
338
+ updateBidderConfig(bidder, ortb2Updates, ortb2Fragments);
339
+ const newBidderConfig = ortb2Fragments[bidder];
397
340
  // Check that the targeting data has been set in the config
398
- expect(newBidderConfig).not.to.be.null;
399
- expect(newBidderConfig.ortb2.site).to.deep.include(ortb2UpdatesAppNexus.site);
341
+ expect(newBidderConfig).not.to.be.null.and.not.to.be.undefined;
342
+ expect(newBidderConfig.user).not.to.be.null.and.not.to.be.undefined;
343
+ expect(newBidderConfig.site).not.to.be.null.and.not.to.be.undefined;
344
+ expect(newBidderConfig.user.data).to.deep.include(ortb2Updates.userData);
345
+ expect(newBidderConfig.site.keywords).to.deep.include(ortb2Updates.siteKeywords);
346
+ expect(newBidderConfig.site.content.data).to.deep.include(ortb2Updates.siteContentData);
400
347
  // Check that existing config didn't get erased
401
- expect(newBidderConfig.ortb2.site).to.deep.include(bidderConfigInitial.ortb2.site);
402
- expect(newBidderConfig.ortb2.user).to.deep.include(bidderConfigInitial.ortb2.user);
348
+ expect(newBidderConfig.site).to.deep.include(bidderConfigInitial.site);
349
+ expect(newBidderConfig.user).to.deep.include(bidderConfigInitial.user);
403
350
  })
404
351
 
405
352
  it('overwrites an existing 1plus.com entry in ortb2.user.data', () => {
406
- const bidder = randomBidder();
407
353
  // Set initial config
408
- config.setBidderConfig({
409
- bidders: [bidder],
410
- config: bidderConfigInitialWith1plusXUserData
411
- });
354
+ const bidder = randomBidder();
355
+ const ortb2Fragments = { [bidder]: { ...bidderConfigInitialWith1plusXUserData } }
412
356
  // Save previous user.data entry
413
- const previousUserData = bidderConfigInitialWith1plusXUserData.ortb2.user.data[0];
357
+ const previousUserData = bidderConfigInitialWith1plusXUserData.user.data[0];
414
358
  // Call submodule's setBidderConfig
415
- const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
359
+ updateBidderConfig(bidder, ortb2Updates, ortb2Fragments);
360
+ const newBidderConfig = ortb2Fragments[bidder];
416
361
  // Check that the targeting data has been set in the config
417
362
  expect(newBidderConfig).not.to.be.null;
418
- expect(newBidderConfig.ortb2.user.data).to.deep.include(ortb2Updates.userData);
419
- expect(newBidderConfig.ortb2.user.data).not.to.include(previousUserData);
363
+ expect(newBidderConfig.site).not.to.be.null;
364
+ expect(newBidderConfig.user).not.to.be.null;
365
+ expect(newBidderConfig.user.data).to.deep.include(ortb2Updates.userData);
366
+ expect(newBidderConfig.user.data).not.to.include(previousUserData);
420
367
  })
421
368
  it("doesn't overwrite entries in ortb2.user.data that aren't 1plusx.com", () => {
422
- const bidder = randomBidder();
423
369
  // Set initial config
424
- config.setBidderConfig({
425
- bidders: [bidder],
426
- config: bidderConfigInitialWithUserData
427
- });
370
+ const bidder = randomBidder();
371
+ const ortb2Fragments = { [bidder]: { ...bidderConfigInitialWithUserData } }
428
372
  // Save previous user.data entry
429
- const previousUserData = bidderConfigInitialWithUserData.ortb2.user.data[0];
373
+ const previousUserData = bidderConfigInitialWithUserData.user.data[0];
430
374
  // Call submodule's setBidderConfig
431
- const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
375
+ updateBidderConfig(bidder, ortb2Updates, ortb2Fragments);
376
+ const newBidderConfig = ortb2Fragments[bidder];
432
377
  // Check that the targeting data has been set in the config
433
378
  expect(newBidderConfig).not.to.be.null;
434
- expect(newBidderConfig.ortb2.user.data).to.deep.include(ortb2Updates.userData);
435
- expect(newBidderConfig.ortb2.user.data).to.deep.include(previousUserData);
379
+ expect(newBidderConfig.site).not.to.be.null;
380
+ expect(newBidderConfig.user).not.to.be.null;
381
+ expect(newBidderConfig.user.data).to.deep.include(ortb2Updates.userData);
382
+ expect(newBidderConfig.user.data).to.deep.include(previousUserData);
436
383
  })
437
384
 
438
385
  it('overwrites an existing 1plus.com entry in ortb2.site.content.data', () => {
439
- const bidder = randomBidder();
440
386
  // Set initial config
441
- config.setBidderConfig({
442
- bidders: [bidder],
443
- config: bidderConfigInitialWith1plusXSiteContent
444
- });
387
+ const bidder = randomBidder();
388
+ const ortb2Fragments = { [bidder]: { ...bidderConfigInitialWith1plusXSiteContent } }
445
389
  // Save previous user.data entry
446
- const previousSiteContent = bidderConfigInitialWith1plusXSiteContent.ortb2.site.content.data[0];
390
+ const previousSiteContent = bidderConfigInitialWith1plusXSiteContent.site.content.data[0];
447
391
  // Call submodule's setBidderConfig
448
- const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
392
+ updateBidderConfig(bidder, ortb2Updates, ortb2Fragments);
393
+ const newBidderConfig = ortb2Fragments[bidder];
449
394
  // Check that the targeting data has been set in the config
450
395
  expect(newBidderConfig).not.to.be.null;
451
- expect(newBidderConfig.ortb2.site.content.data).to.deep.include(ortb2Updates.siteContentData);
452
- expect(newBidderConfig.ortb2.site.content.data).not.to.include(previousSiteContent);
396
+ expect(newBidderConfig.site).not.to.be.null;
397
+ expect(newBidderConfig.user).not.to.be.null;
398
+ expect(newBidderConfig.site.content.data).to.deep.include(ortb2Updates.siteContentData);
399
+ expect(newBidderConfig.site.content.data).not.to.include(previousSiteContent);
453
400
  })
454
401
  it("doesn't overwrite entries in ortb2.site.content.data that aren't 1plusx.com", () => {
455
- const bidder = randomBidder();
456
402
  // Set initial config
457
- config.setBidderConfig({
458
- bidders: [bidder],
459
- config: bidderConfigInitialWithSiteContent
460
- });
403
+ const bidder = randomBidder();
404
+ const ortb2Fragments = { [bidder]: { ...bidderConfigInitialWithSiteContent } }
461
405
  // Save previous user.data entry
462
- const previousSiteContent = bidderConfigInitialWithSiteContent.ortb2.site.content.data[0];
406
+ const previousSiteContent = bidderConfigInitialWithSiteContent.site.content.data[0];
463
407
  // Call submodule's setBidderConfig
464
- const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
408
+ updateBidderConfig(bidder, ortb2Updates, ortb2Fragments);
409
+ const newBidderConfig = ortb2Fragments[bidder];
465
410
  // Check that the targeting data has been set in the config
466
411
  expect(newBidderConfig).not.to.be.null;
467
- expect(newBidderConfig.ortb2.site.content.data).to.deep.include(ortb2Updates.siteContentData);
468
- expect(newBidderConfig.ortb2.site.content.data).to.deep.include(previousSiteContent);
412
+ expect(newBidderConfig.site).not.to.be.null;
413
+ expect(newBidderConfig.user).not.to.be.null;
414
+ expect(newBidderConfig.site.content.data).to.deep.include(ortb2Updates.siteContentData);
415
+ expect(newBidderConfig.site.content.data).to.deep.include(previousSiteContent);
469
416
  })
470
417
  })
471
418
 
472
419
  describe('setTargetingDataToConfig', () => {
473
- const expectedKeywords = fakeResponse.t.join(',');
420
+ const expectedKeywords = fakeResponse.t.map(topic => `1plusX=${topic}`).join(',');
474
421
  const expectedSiteContentObj = {
475
422
  data: [{
476
423
  name: '1plusX.com',
@@ -486,10 +433,11 @@ describe('1plusXRtdProvider', () => {
486
433
  }
487
434
  const expectedOrtb2 = {
488
435
  appnexus: {
489
- site: { keywords: expectedKeywords }
436
+ site: { content: expectedSiteContentObj, keywords: expectedKeywords },
437
+ user: expectedUserObj
490
438
  },
491
439
  rubicon: {
492
- site: { content: expectedSiteContentObj },
440
+ site: { content: expectedSiteContentObj, keywords: expectedKeywords },
493
441
  user: expectedUserObj
494
442
  }
495
443
  }
@@ -501,22 +449,23 @@ describe('1plusXRtdProvider', () => {
501
449
  bidders,
502
450
  config: bidderConfigInitial
503
451
  })
452
+ const biddersOrtb2 = config.getBidderConfig();
504
453
  // call setTargetingDataToConfig
505
- setTargetingDataToConfig(fakeResponse, { bidders });
454
+ setTargetingDataToConfig(fakeResponse, { bidders, biddersOrtb2 });
506
455
 
507
456
  // Check that the targeting data has been set in both configs
508
457
  for (const bidder of bidders) {
509
458
  const newConfig = config.getBidderConfig()[bidder];
510
459
  // Check that we got what we expect
511
460
  const expectedConfErr = (prop) => `New config for ${bidder} doesn't comply with expected at ${prop}`;
512
- expect(newConfig.ortb2.site, expectedConfErr('site')).to.deep.include(expectedOrtb2[bidder].site);
461
+ expect(newConfig.site, expectedConfErr('site')).to.deep.include(expectedOrtb2[bidder].site);
513
462
  if (expectedOrtb2[bidder].user) {
514
- expect(newConfig.ortb2.user, expectedConfErr('user')).to.deep.include(expectedOrtb2[bidder].user);
463
+ expect(newConfig.user, expectedConfErr('user')).to.deep.include(expectedOrtb2[bidder].user);
515
464
  }
516
465
  // Check that existing config didn't get erased
517
466
  const existingConfErr = (prop) => `Existing config for ${bidder} got unlawfully overwritten at ${prop}`;
518
- expect(newConfig.ortb2.site, existingConfErr('site')).to.deep.include(bidderConfigInitial.ortb2.site);
519
- expect(newConfig.ortb2.user, existingConfErr('user')).to.deep.include(bidderConfigInitial.ortb2.user);
467
+ expect(newConfig.site, existingConfErr('site')).to.deep.include(bidderConfigInitial.site);
468
+ expect(newConfig.user, existingConfErr('user')).to.deep.include(bidderConfigInitial.user);
520
469
  }
521
470
  })
522
471
  })
@@ -9,7 +9,7 @@ import {
9
9
  spec,
10
10
  ENDPOINT,
11
11
  VERSION,
12
- RENDERER_URL,
12
+ BB_RENDERER_URL,
13
13
  GlobalExchange
14
14
  } from '../../../modules/adagioBidAdapter.js';
15
15
  import { loadExternalScript } from '../../../src/adloader.js';
@@ -76,6 +76,7 @@ describe('Adagio bid adapter', () => {
76
76
  let adagioMock;
77
77
  let utilsMock;
78
78
  let sandbox;
79
+ let fakeRenderer;
79
80
 
80
81
  const fixtures = {
81
82
  getElementById(width, height, x, y) {
@@ -1000,42 +1001,70 @@ describe('Adagio bid adapter', () => {
1000
1001
  context: 'outstream',
1001
1002
  playerSize: [[300, 250]],
1002
1003
  mimes: ['video/mp4'],
1003
- skip: true
1004
+ skip: 1,
1005
+ skipafter: 3
1004
1006
  };
1005
1007
 
1006
1008
  const serverResponseWithOutstream = utils.deepClone(serverResponse);
1007
1009
  serverResponseWithOutstream.body.bids[0].vastXml = '<VAST version="4.0"><Ad></Ad></VAST>';
1008
1010
  serverResponseWithOutstream.body.bids[0].mediaType = 'video';
1009
- serverResponseWithOutstream.body.bids[0].outstream = {
1010
- bvwUrl: 'https://foo.baz',
1011
- impUrl: 'https://foo.bar'
1012
- };
1013
1011
 
1014
- it('should set a renderer in video outstream context', function() {
1012
+ const defaultRendererUrl = BB_RENDERER_URL.replace('$RENDERER', 'renderer');
1013
+
1014
+ it('should set related properties for video outstream context', function() {
1015
1015
  const bidResponse = spec.interpretResponse(serverResponseWithOutstream, bidRequestWithOutstream)[0];
1016
- expect(bidResponse).to.have.any.keys('outstream', 'renderer', 'mediaType');
1016
+ expect(bidResponse).to.have.any.keys('renderer', 'mediaType');
1017
1017
  expect(bidResponse.renderer).to.be.a('object');
1018
- expect(bidResponse.renderer.url).to.equal(RENDERER_URL);
1019
- expect(bidResponse.renderer.config.bvwUrl).to.be.ok;
1020
- expect(bidResponse.renderer.config.impUrl).to.be.ok;
1018
+ expect(bidResponse.renderer.url).to.equal(defaultRendererUrl);
1021
1019
  expect(bidResponse.renderer.loaded).to.not.be.ok;
1022
1020
  expect(bidResponse.width).to.equal(300);
1023
1021
  expect(bidResponse.height).to.equal(250);
1024
1022
  expect(bidResponse.vastUrl).to.match(/^data:text\/xml;/)
1025
1023
  });
1026
1024
 
1027
- it('should execute Adagio outstreamPlayer if defined', function() {
1028
- window.ADAGIO.outstreamPlayer = sinon.stub();
1025
+ it('should execute Blue Billywig VAST Renderer bootstrap if defined', function() {
1026
+ window.bluebillywig = {
1027
+ renderers: [{ bootstrap: sinon.stub(), _id: 'adagio-renderer' }]
1028
+ };
1029
+
1030
+ const bidResponse = spec.interpretResponse(serverResponseWithOutstream, bidRequestWithOutstream)[0];
1031
+ executeRenderer(bidResponse.renderer, bidResponse)
1032
+ sinon.assert.calledOnce(window.bluebillywig.renderers[0].bootstrap);
1033
+
1034
+ delete window.bluebillywig;
1035
+ });
1036
+
1037
+ it('Should logError if response does not have a vastXml or vastUrl', function() {
1038
+ utilsMock.expects('logError').withExactArgs('Adagio: no vastXml or vastUrl on bid').once();
1039
+
1040
+ const localServerResponseWithOutstream = utils.deepClone(serverResponse);
1041
+ localServerResponseWithOutstream.body.bids[0].mediaType = 'video';
1042
+
1043
+ const bidResponse = spec.interpretResponse(localServerResponseWithOutstream, bidRequestWithOutstream)[0];
1044
+ executeRenderer(bidResponse.renderer, bidResponse)
1045
+
1046
+ utilsMock.verify();
1047
+ })
1048
+
1049
+ it('should logError if Blue Billywig API is not defined', function() {
1050
+ utilsMock.expects('logError').withExactArgs('Adagio: no BlueBillywig renderers found!').once();
1051
+
1029
1052
  const bidResponse = spec.interpretResponse(serverResponseWithOutstream, bidRequestWithOutstream)[0];
1030
1053
  executeRenderer(bidResponse.renderer, bidResponse)
1031
- sinon.assert.calledOnce(window.ADAGIO.outstreamPlayer);
1032
- delete window.ADAGIO.outstreamPlayer;
1054
+
1055
+ utilsMock.verify();
1033
1056
  });
1034
1057
 
1035
- it('should logError if Adagio outstreamPlayer is not defined', function() {
1058
+ it('should logError if correct renderer is not defined', function() {
1059
+ window.bluebillywig = { renderers: [ { _id: 'adagio-another_renderer' } ] };
1060
+
1061
+ utilsMock.expects('logError').withExactArgs('Adagio: couldn\'t find a renderer with ID adagio-renderer').once();
1062
+
1036
1063
  const bidResponse = spec.interpretResponse(serverResponseWithOutstream, bidRequestWithOutstream)[0];
1037
1064
  executeRenderer(bidResponse.renderer, bidResponse)
1038
- utilsMock.expects('logError').withExactArgs('Adagio: Adagio outstream player is not defined').once();
1065
+
1066
+ delete window.bluebillywig;
1067
+ utilsMock.verify();
1039
1068
  });
1040
1069
  });
1041
1070
 
@@ -2,6 +2,7 @@ import { config } from 'src/config.js';
2
2
  import { deepAccess } from 'src/utils.js';
3
3
  import { getAdUnits } from '../../fixtures/fixtures.js';
4
4
  import * as agRTD from 'modules/airgridRtdProvider.js';
5
+ import { loadExternalScript } from '../../../src/adloader.js';
5
6
 
6
7
  const MATCHED_AUDIENCES = ['travel', 'sport'];
7
8
  const RTD_CONFIG = {
@@ -40,6 +41,7 @@ describe('airgrid RTD Submodule', function () {
40
41
  expect(agRTD.airgridSubmodule.init(RTD_CONFIG.dataProviders[0])).to.equal(
41
42
  true
42
43
  );
44
+ expect(loadExternalScript.called).to.be.true
43
45
  });
44
46
 
45
47
  it('should attach script to DOM with correct config', function () {
@@ -130,6 +130,30 @@ describe('BeOp Bid Adapter tests', () => {
130
130
  expect(payload.url).to.exist;
131
131
  // check that the protocol is added correctly
132
132
  expect(payload.url).to.equal('http://test.te');
133
+ expect(payload.psegs).to.not.exist;
134
+ });
135
+
136
+ it('should call the endpoint with psegs data if any', function () {
137
+ let bidderRequest =
138
+ {
139
+ 'ortb2': {
140
+ 'user': {
141
+ 'ext': {
142
+ 'data': {
143
+ 'permutive': [1234, 5678, 910]
144
+ }
145
+ }
146
+ }
147
+ }
148
+ };
149
+
150
+ const request = spec.buildRequests(bidRequests, bidderRequest);
151
+ const payload = JSON.parse(request.data);
152
+ expect(payload.psegs).to.exist;
153
+ expect(payload.psegs).to.include(1234);
154
+ expect(payload.psegs).to.include(5678);
155
+ expect(payload.psegs).to.include(910);
156
+ expect(payload.psegs).to.not.include(1);
133
157
  });
134
158
 
135
159
  it('should not prepend the protocol in page url if already present', function () {