prebid.js 6.7.0 → 6.11.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 (160) hide show
  1. package/.eslintrc.js +8 -1
  2. package/integrationExamples/gpt/{haloRtdProvider_example.html → hadronRtdProvider_example.html} +9 -9
  3. package/integrationExamples/gpt/idImportLibrary_example.html +2 -2
  4. package/integrationExamples/gpt/userId_example.html +2 -2
  5. package/integrationExamples/gpt/weboramaRtdProvider_example.html +154 -115
  6. package/integrationExamples/gpt/x-domain/creative.html +63 -29
  7. package/modules/.submodules.json +3 -0
  8. package/modules/adagioBidAdapter.js +0 -8
  9. package/modules/adagioBidAdapter.md +1 -1
  10. package/modules/adkernelBidAdapter.js +2 -1
  11. package/modules/adnuntiusRtdProvider.js +96 -0
  12. package/modules/adnuntiusRtdProvider.md +41 -0
  13. package/modules/adotBidAdapter.js +516 -567
  14. package/modules/adotBidAdapter.md +6 -44
  15. package/modules/adpod.js +12 -14
  16. package/modules/adyoulikeBidAdapter.js +2 -0
  17. package/modules/appnexusBidAdapter.js +14 -2
  18. package/modules/asealBidAdapter.js +58 -0
  19. package/modules/asealBidAdapter.md +52 -0
  20. package/modules/brandmetricsRtdProvider.js +168 -0
  21. package/modules/brandmetricsRtdProvider.md +40 -0
  22. package/modules/conversantBidAdapter.js +7 -0
  23. package/modules/criteoBidAdapter.js +9 -0
  24. package/modules/currency.js +27 -5
  25. package/modules/displayioBidAdapter.js +157 -0
  26. package/modules/displayioBidAdapter.md +148 -0
  27. package/modules/dspxBidAdapter.js +69 -29
  28. package/modules/dspxBidAdapter.md +2 -1
  29. package/modules/e_volutionBidAdapter.js +158 -0
  30. package/modules/gridBidAdapter.js +15 -1
  31. package/modules/gumgumBidAdapter.js +52 -38
  32. package/modules/hadronIdSystem.js +96 -0
  33. package/modules/hadronIdSystem.md +35 -0
  34. package/modules/hadronRtdProvider.js +254 -0
  35. package/modules/hadronRtdProvider.md +126 -0
  36. package/modules/haloIdSystem.md +4 -35
  37. package/modules/haloRtdProvider.md +3 -126
  38. package/modules/imRtdProvider.js +10 -0
  39. package/modules/improvedigitalBidAdapter.js +5 -0
  40. package/modules/interactiveOffersBidAdapter.js +9 -6
  41. package/modules/iqzoneBidAdapter.js +10 -3
  42. package/modules/iqzoneBidAdapter.md +16 -0
  43. package/modules/ixBidAdapter.js +2 -6
  44. package/modules/kubientBidAdapter.js +50 -19
  45. package/modules/lunamediahbBidAdapter.js +32 -4
  46. package/modules/malltvBidAdapter.js +7 -3
  47. package/modules/malltvBidAdapter.md +64 -51
  48. package/modules/mass.js +3 -5
  49. package/modules/mediakeysBidAdapter.js +0 -5
  50. package/modules/medianetAnalyticsAdapter.js +1 -1
  51. package/modules/mediasquareBidAdapter.js +9 -1
  52. package/modules/nextMillenniumBidAdapter.js +1 -0
  53. package/modules/oguryBidAdapter.js +7 -14
  54. package/modules/prebidServerBidAdapter/index.js +61 -39
  55. package/modules/priceFloors.js +20 -12
  56. package/modules/pubmaticBidAdapter.js +1 -1
  57. package/modules/richaudienceBidAdapter.js +8 -3
  58. package/modules/riseBidAdapter.js +17 -6
  59. package/modules/rtbhouseBidAdapter.js +2 -0
  60. package/modules/rubiconAnalyticsAdapter.js +5 -0
  61. package/modules/rubiconBidAdapter.js +2 -2
  62. package/modules/sizeMappingV2.js +1 -8
  63. package/modules/sortableAnalyticsAdapter.js +5 -4
  64. package/modules/sovrnBidAdapter.js +93 -18
  65. package/modules/sovrnBidAdapter.md +80 -2
  66. package/modules/sspBCBidAdapter.js +53 -20
  67. package/modules/telariaBidAdapter.js +22 -29
  68. package/modules/trustpidSystem.js +197 -0
  69. package/modules/trustpidSystem.md +45 -0
  70. package/modules/undertoneBidAdapter.js +17 -1
  71. package/modules/userId/eids.js +16 -1
  72. package/modules/userId/eids.md +10 -2
  73. package/modules/userId/userId.md +17 -2
  74. package/modules/vibrantmediaBidAdapter.js +220 -0
  75. package/modules/vibrantmediaBidAdapter.md +92 -0
  76. package/modules/vidoomyBidAdapter.js +8 -0
  77. package/modules/vidoomyBidAdapter.md +4 -2
  78. package/modules/weboramaRtdProvider.js +264 -34
  79. package/modules/weboramaRtdProvider.md +110 -40
  80. package/modules/yahoosspBidAdapter.js +3 -1
  81. package/modules/yieldoneBidAdapter.js +6 -0
  82. package/package.json +2 -1
  83. package/src/adRendering.js +38 -0
  84. package/src/adapterManager.js +24 -19
  85. package/src/adapters/bidderFactory.js +14 -11
  86. package/src/adloader.js +2 -1
  87. package/src/auction.js +138 -115
  88. package/src/auctionIndex.js +85 -0
  89. package/src/auctionManager.js +3 -0
  90. package/src/bidderSettings.js +69 -0
  91. package/src/bidfactory.js +18 -6
  92. package/src/native.js +29 -21
  93. package/src/prebid.js +3 -19
  94. package/src/secureCreatives.js +128 -45
  95. package/src/targeting.js +11 -2
  96. package/src/utils.js +14 -17
  97. package/src/video.js +10 -11
  98. package/src/videoCache.js +10 -9
  99. package/test/fixtures/fixtures.js +2 -1
  100. package/test/helpers/indexStub.js +28 -0
  101. package/test/helpers/syncPromise.js +71 -0
  102. package/test/spec/auctionmanager_spec.js +268 -89
  103. package/test/spec/config_spec.js +24 -1
  104. package/test/spec/modules/adagioBidAdapter_spec.js +0 -10
  105. package/test/spec/modules/adnuntiusRtdProvider_spec.js +145 -0
  106. package/test/spec/modules/adotBidAdapter_spec.js +294 -3124
  107. package/test/spec/modules/adpod_spec.js +91 -156
  108. package/test/spec/modules/adyoulikeBidAdapter_spec.js +4 -0
  109. package/test/spec/modules/appnexusBidAdapter_spec.js +27 -0
  110. package/test/spec/modules/asealBidAdapter_spec.js +144 -0
  111. package/test/spec/modules/brandmetricsRtdProvider_spec.js +191 -0
  112. package/test/spec/modules/conversantBidAdapter_spec.js +54 -2
  113. package/test/spec/modules/criteoBidAdapter_spec.js +21 -0
  114. package/test/spec/modules/currency_spec.js +36 -15
  115. package/test/spec/modules/displayioBidAdapter_spec.js +239 -0
  116. package/test/spec/modules/dspxBidAdapter_spec.js +20 -15
  117. package/test/spec/modules/e_volutionBidAdapter_spec.js +242 -0
  118. package/test/spec/modules/eids_spec.js +2 -2
  119. package/test/spec/modules/gridBidAdapter_spec.js +18 -0
  120. package/test/spec/modules/gumgumBidAdapter_spec.js +49 -3
  121. package/test/spec/modules/hadronIdSystem_spec.js +57 -0
  122. package/test/spec/modules/hadronRtdProvider_spec.js +762 -0
  123. package/test/spec/modules/imRtdProvider_spec.js +30 -1
  124. package/test/spec/modules/improvedigitalBidAdapter_spec.js +19 -0
  125. package/test/spec/modules/iqzoneBidAdapter_spec.js +1 -0
  126. package/test/spec/modules/ixBidAdapter_spec.js +1 -1
  127. package/test/spec/modules/kubientBidAdapter_spec.js +182 -84
  128. package/test/spec/modules/lunamediahbBidAdapter_spec.js +27 -1
  129. package/test/spec/modules/mass_spec.js +2 -14
  130. package/test/spec/modules/mediakeysBidAdapter_spec.js +9 -5
  131. package/test/spec/modules/mediasquareBidAdapter_spec.js +25 -1
  132. package/test/spec/modules/oguryBidAdapter_spec.js +63 -5
  133. package/test/spec/modules/prebidServerBidAdapter_spec.js +43 -6
  134. package/test/spec/modules/priceFloors_spec.js +83 -24
  135. package/test/spec/modules/pubmaticBidAdapter_spec.js +40 -0
  136. package/test/spec/modules/riseBidAdapter_spec.js +30 -4
  137. package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +31 -1
  138. package/test/spec/modules/rubiconBidAdapter_spec.js +1 -1
  139. package/test/spec/modules/sortableAnalyticsAdapter_spec.js +2 -3
  140. package/test/spec/modules/sovrnBidAdapter_spec.js +413 -333
  141. package/test/spec/modules/sspBCBidAdapter_spec.js +7 -7
  142. package/test/spec/modules/telariaBidAdapter_spec.js +1 -3
  143. package/test/spec/modules/trustpidSystem_spec.js +232 -0
  144. package/test/spec/modules/undertoneBidAdapter_spec.js +55 -2
  145. package/test/spec/modules/userId_spec.js +39 -39
  146. package/test/spec/modules/vibrantmediaBidAdapter_spec.js +1237 -0
  147. package/test/spec/modules/vidoomyBidAdapter_spec.js +7 -1
  148. package/test/spec/modules/weboramaRtdProvider_spec.js +536 -20
  149. package/test/spec/modules/yahoosspBidAdapter_spec.js +10 -0
  150. package/test/spec/modules/yieldoneBidAdapter_spec.js +33 -0
  151. package/test/spec/native_spec.js +62 -40
  152. package/test/spec/unit/core/adapterManager_spec.js +22 -0
  153. package/test/spec/unit/core/auctionIndex_spec.js +129 -0
  154. package/test/spec/unit/core/bidderFactory_spec.js +65 -12
  155. package/test/spec/unit/core/bidderSettings_spec.js +123 -0
  156. package/test/spec/unit/core/targeting_spec.js +93 -0
  157. package/test/spec/unit/pbjs_api_spec.js +80 -42
  158. package/test/spec/unit/secureCreatives_spec.js +143 -24
  159. package/test/spec/videoCache_spec.js +18 -19
  160. package/test/spec/video_spec.js +51 -61
@@ -0,0 +1,762 @@
1
+ import {config} from 'src/config.js';
2
+ import {HALOID_LOCAL_NAME, RTD_LOCAL_NAME, addRealTimeData, getRealTimeData, hadronSubmodule, storage} from 'modules/hadronRtdProvider.js';
3
+ import {server} from 'test/mocks/xhr.js';
4
+
5
+ const responseHeader = {'Content-Type': 'application/json'};
6
+
7
+ describe('hadronRtdProvider', function() {
8
+ let getDataFromLocalStorageStub;
9
+
10
+ beforeEach(function() {
11
+ config.resetConfig();
12
+ getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage');
13
+ });
14
+
15
+ afterEach(function () {
16
+ getDataFromLocalStorageStub.restore();
17
+ });
18
+
19
+ describe('hadronSubmodule', function() {
20
+ it('successfully instantiates', function () {
21
+ expect(hadronSubmodule.init()).to.equal(true);
22
+ });
23
+ });
24
+
25
+ describe('Add Real-Time Data', function() {
26
+ it('merges ortb2 data', function() {
27
+ let rtdConfig = {};
28
+ let bidConfig = {};
29
+
30
+ const setConfigUserObj1 = {
31
+ name: 'www.dataprovider1.com',
32
+ ext: { taxonomyname: 'iab_audience_taxonomy' },
33
+ segment: [{
34
+ id: '1776'
35
+ }]
36
+ };
37
+
38
+ const setConfigUserObj2 = {
39
+ name: 'www.dataprovider2.com',
40
+ ext: { taxonomyname: 'iab_audience_taxonomy' },
41
+ segment: [{
42
+ id: '1914'
43
+ }]
44
+ };
45
+
46
+ const setConfigSiteObj1 = {
47
+ name: 'www.dataprovider3.com',
48
+ ext: {
49
+ taxonomyname: 'iab_audience_taxonomy'
50
+ },
51
+ segment: [
52
+ {
53
+ id: '1812'
54
+ },
55
+ {
56
+ id: '1955'
57
+ }
58
+ ]
59
+ }
60
+
61
+ config.setConfig({
62
+ ortb2: {
63
+ user: {
64
+ data: [setConfigUserObj1, setConfigUserObj2]
65
+ },
66
+ site: {
67
+ content: {
68
+ data: [setConfigSiteObj1]
69
+ }
70
+ }
71
+ }
72
+ });
73
+
74
+ const rtdUserObj1 = {
75
+ name: 'www.dataprovider4.com',
76
+ ext: {
77
+ taxonomyname: 'iab_audience_taxonomy'
78
+ },
79
+ segment: [
80
+ {
81
+ id: '1918'
82
+ },
83
+ {
84
+ id: '1939'
85
+ }
86
+ ]
87
+ };
88
+
89
+ const rtdSiteObj1 = {
90
+ name: 'www.dataprovider5.com',
91
+ ext: {
92
+ taxonomyname: 'iab_audience_taxonomy'
93
+ },
94
+ segment: [
95
+ {
96
+ id: '1945'
97
+ },
98
+ {
99
+ id: '2003'
100
+ }
101
+ ]
102
+ };
103
+
104
+ const rtd = {
105
+ ortb2: {
106
+ user: {
107
+ data: [rtdUserObj1]
108
+ },
109
+ site: {
110
+ content: {
111
+ data: [rtdSiteObj1]
112
+ }
113
+ }
114
+ }
115
+ };
116
+
117
+ addRealTimeData(bidConfig, rtd, rtdConfig);
118
+
119
+ let ortb2Config = config.getConfig().ortb2;
120
+
121
+ expect(ortb2Config.user.data).to.deep.include.members([setConfigUserObj1, setConfigUserObj2, rtdUserObj1]);
122
+ expect(ortb2Config.site.content.data).to.deep.include.members([setConfigSiteObj1, rtdSiteObj1]);
123
+ });
124
+
125
+ it('merges ortb2 data without duplication', function() {
126
+ let rtdConfig = {};
127
+ let bidConfig = {};
128
+
129
+ const userObj1 = {
130
+ name: 'www.dataprovider1.com',
131
+ ext: { taxonomyname: 'iab_audience_taxonomy' },
132
+ segment: [{
133
+ id: '1776'
134
+ }]
135
+ };
136
+
137
+ const userObj2 = {
138
+ name: 'www.dataprovider2.com',
139
+ ext: { taxonomyname: 'iab_audience_taxonomy' },
140
+ segment: [{
141
+ id: '1914'
142
+ }]
143
+ };
144
+
145
+ const siteObj1 = {
146
+ name: 'www.dataprovider3.com',
147
+ ext: {
148
+ taxonomyname: 'iab_audience_taxonomy'
149
+ },
150
+ segment: [
151
+ {
152
+ id: '1812'
153
+ },
154
+ {
155
+ id: '1955'
156
+ }
157
+ ]
158
+ }
159
+
160
+ config.setConfig({
161
+ ortb2: {
162
+ user: {
163
+ data: [userObj1, userObj2]
164
+ },
165
+ site: {
166
+ content: {
167
+ data: [siteObj1]
168
+ }
169
+ }
170
+ }
171
+ });
172
+
173
+ const rtd = {
174
+ ortb2: {
175
+ user: {
176
+ data: [userObj1]
177
+ },
178
+ site: {
179
+ content: {
180
+ data: [siteObj1]
181
+ }
182
+ }
183
+ }
184
+ };
185
+
186
+ addRealTimeData(bidConfig, rtd, rtdConfig);
187
+
188
+ let ortb2Config = config.getConfig().ortb2;
189
+
190
+ expect(ortb2Config.user.data).to.deep.include.members([userObj1, userObj2]);
191
+ expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1]);
192
+ expect(ortb2Config.user.data).to.have.lengthOf(2);
193
+ expect(ortb2Config.site.content.data).to.have.lengthOf(1);
194
+ });
195
+
196
+ it('merges bidder-specific ortb2 data', function() {
197
+ let rtdConfig = {};
198
+ let bidConfig = {};
199
+
200
+ const configUserObj1 = {
201
+ name: 'www.dataprovider1.com',
202
+ ext: { segtax: 3 },
203
+ segment: [{
204
+ id: '1776'
205
+ }]
206
+ };
207
+
208
+ const configUserObj2 = {
209
+ name: 'www.dataprovider2.com',
210
+ ext: { segtax: 3 },
211
+ segment: [{
212
+ id: '1914'
213
+ }]
214
+ };
215
+
216
+ const configUserObj3 = {
217
+ name: 'www.dataprovider1.com',
218
+ ext: { segtax: 3 },
219
+ segment: [{
220
+ id: '2003'
221
+ }]
222
+ };
223
+
224
+ const configSiteObj1 = {
225
+ name: 'www.dataprovider3.com',
226
+ ext: {
227
+ segtax: 1
228
+ },
229
+ segment: [
230
+ {
231
+ id: '1812'
232
+ },
233
+ {
234
+ id: '1955'
235
+ }
236
+ ]
237
+ };
238
+
239
+ const configSiteObj2 = {
240
+ name: 'www.dataprovider3.com',
241
+ ext: {
242
+ segtax: 1
243
+ },
244
+ segment: [
245
+ {
246
+ id: '1812'
247
+ }
248
+ ]
249
+ };
250
+
251
+ config.setBidderConfig({
252
+ bidders: ['adbuzz'],
253
+ config: {
254
+ ortb2: {
255
+ user: {
256
+ data: [configUserObj1, configUserObj2]
257
+ },
258
+ site: {
259
+ content: {
260
+ data: [configSiteObj1]
261
+ }
262
+ }
263
+ }
264
+ }
265
+ });
266
+
267
+ config.setBidderConfig({
268
+ bidders: ['pubvisage'],
269
+ config: {
270
+ ortb2: {
271
+ user: {
272
+ data: [configUserObj3]
273
+ },
274
+ site: {
275
+ content: {
276
+ data: [configSiteObj2]
277
+ }
278
+ }
279
+ }
280
+ }
281
+ });
282
+
283
+ const rtdUserObj1 = {
284
+ name: 'www.dataprovider4.com',
285
+ ext: {
286
+ segtax: 501
287
+ },
288
+ segment: [
289
+ {
290
+ id: '1918'
291
+ },
292
+ {
293
+ id: '1939'
294
+ }
295
+ ]
296
+ };
297
+
298
+ const rtdUserObj2 = {
299
+ name: 'www.dataprovider2.com',
300
+ ext: {
301
+ segtax: 502
302
+ },
303
+ segment: [
304
+ {
305
+ id: '1939'
306
+ }
307
+ ]
308
+ };
309
+
310
+ const rtdSiteObj1 = {
311
+ name: 'www.dataprovider5.com',
312
+ ext: {
313
+ segtax: 1
314
+ },
315
+ segment: [
316
+ {
317
+ id: '441'
318
+ },
319
+ {
320
+ id: '442'
321
+ }
322
+ ]
323
+ };
324
+
325
+ const rtdSiteObj2 = {
326
+ name: 'www.dataprovider6.com',
327
+ ext: {
328
+ segtax: 2
329
+ },
330
+ segment: [
331
+ {
332
+ id: '676'
333
+ }
334
+ ]
335
+ };
336
+
337
+ const rtd = {
338
+ ortb2b: {
339
+ adbuzz: {
340
+ ortb2: {
341
+ user: {
342
+ data: [rtdUserObj1]
343
+ },
344
+ site: {
345
+ content: {
346
+ data: [rtdSiteObj1]
347
+ }
348
+ }
349
+ }
350
+ },
351
+ pubvisage: {
352
+ ortb2: {
353
+ user: {
354
+ data: [rtdUserObj2]
355
+ },
356
+ site: {
357
+ content: {
358
+ data: [rtdSiteObj2]
359
+ }
360
+ }
361
+ }
362
+ }
363
+ }
364
+ };
365
+
366
+ addRealTimeData(bidConfig, rtd, rtdConfig);
367
+
368
+ let ortb2Config = config.getBidderConfig().adbuzz.ortb2;
369
+
370
+ expect(ortb2Config.user.data).to.deep.include.members([configUserObj1, configUserObj2, rtdUserObj1]);
371
+ expect(ortb2Config.site.content.data).to.deep.include.members([configSiteObj1, rtdSiteObj1]);
372
+
373
+ ortb2Config = config.getBidderConfig().pubvisage.ortb2;
374
+
375
+ expect(ortb2Config.user.data).to.deep.include.members([configUserObj3, rtdUserObj2]);
376
+ expect(ortb2Config.site.content.data).to.deep.include.members([configSiteObj2, rtdSiteObj2]);
377
+ });
378
+
379
+ it('merges bidder-specific ortb2 data without duplication', function() {
380
+ let rtdConfig = {};
381
+ let bidConfig = {};
382
+
383
+ const userObj1 = {
384
+ name: 'www.dataprovider1.com',
385
+ ext: { segtax: 3 },
386
+ segment: [{
387
+ id: '1776'
388
+ }]
389
+ };
390
+
391
+ const userObj2 = {
392
+ name: 'www.dataprovider2.com',
393
+ ext: { segtax: 3 },
394
+ segment: [{
395
+ id: '1914'
396
+ }]
397
+ };
398
+
399
+ const userObj3 = {
400
+ name: 'www.dataprovider1.com',
401
+ ext: { segtax: 3 },
402
+ segment: [{
403
+ id: '2003'
404
+ }]
405
+ };
406
+
407
+ const siteObj1 = {
408
+ name: 'www.dataprovider3.com',
409
+ ext: {
410
+ segtax: 1
411
+ },
412
+ segment: [
413
+ {
414
+ id: '1812'
415
+ },
416
+ {
417
+ id: '1955'
418
+ }
419
+ ]
420
+ };
421
+
422
+ const siteObj2 = {
423
+ name: 'www.dataprovider3.com',
424
+ ext: {
425
+ segtax: 1
426
+ },
427
+ segment: [
428
+ {
429
+ id: '1812'
430
+ }
431
+ ]
432
+ };
433
+
434
+ config.setBidderConfig({
435
+ bidders: ['adbuzz'],
436
+ config: {
437
+ ortb2: {
438
+ user: {
439
+ data: [userObj1, userObj2]
440
+ },
441
+ site: {
442
+ content: {
443
+ data: [siteObj1]
444
+ }
445
+ }
446
+ }
447
+ }
448
+ });
449
+
450
+ config.setBidderConfig({
451
+ bidders: ['pubvisage'],
452
+ config: {
453
+ ortb2: {
454
+ user: {
455
+ data: [userObj3]
456
+ },
457
+ site: {
458
+ content: {
459
+ data: [siteObj2]
460
+ }
461
+ }
462
+ }
463
+ }
464
+ });
465
+
466
+ const rtd = {
467
+ ortb2b: {
468
+ adbuzz: {
469
+ ortb2: {
470
+ user: {
471
+ data: [userObj1]
472
+ },
473
+ site: {
474
+ content: {
475
+ data: [siteObj1]
476
+ }
477
+ }
478
+ }
479
+ },
480
+ pubvisage: {
481
+ ortb2: {
482
+ user: {
483
+ data: [userObj2, userObj3]
484
+ },
485
+ site: {
486
+ content: {
487
+ data: [siteObj1, siteObj2]
488
+ }
489
+ }
490
+ }
491
+ }
492
+ }
493
+ };
494
+
495
+ addRealTimeData(bidConfig, rtd, rtdConfig);
496
+
497
+ let ortb2Config = config.getBidderConfig().adbuzz.ortb2;
498
+
499
+ expect(ortb2Config.user.data).to.deep.include.members([userObj1]);
500
+ expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1]);
501
+
502
+ expect(ortb2Config.user.data).to.have.lengthOf(2);
503
+ expect(ortb2Config.site.content.data).to.have.lengthOf(1);
504
+
505
+ ortb2Config = config.getBidderConfig().pubvisage.ortb2;
506
+
507
+ expect(ortb2Config.user.data).to.deep.include.members([userObj3, userObj3]);
508
+ expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1, siteObj2]);
509
+
510
+ expect(ortb2Config.user.data).to.have.lengthOf(2);
511
+ expect(ortb2Config.site.content.data).to.have.lengthOf(2);
512
+ });
513
+
514
+ it('allows publisher defined rtd ortb2 logic', function() {
515
+ const rtdConfig = {
516
+ params: {
517
+ handleRtd: function(bidConfig, rtd, rtdConfig, pbConfig) {
518
+ if (rtd.ortb2.user.data[0].segment[0].id == '1776') {
519
+ pbConfig.setConfig({ortb2: rtd.ortb2});
520
+ } else {
521
+ pbConfig.setConfig({ortb2: {}});
522
+ }
523
+ }
524
+ }
525
+ };
526
+
527
+ let bidConfig = {};
528
+
529
+ const rtdUserObj1 = {
530
+ name: 'www.dataprovider.com',
531
+ ext: { taxonomyname: 'iab_audience_taxonomy' },
532
+ segment: [{
533
+ id: '1776'
534
+ }]
535
+ };
536
+
537
+ let rtd = {
538
+ ortb2: {
539
+ user: {
540
+ data: [rtdUserObj1]
541
+ }
542
+ }
543
+ };
544
+
545
+ config.resetConfig();
546
+
547
+ let pbConfig = config.getConfig();
548
+ addRealTimeData(bidConfig, rtd, rtdConfig);
549
+ expect(config.getConfig().ortb2.user.data).to.deep.include.members([rtdUserObj1]);
550
+
551
+ const rtdUserObj2 = {
552
+ name: 'www.audigent.com',
553
+ ext: {
554
+ segtax: '1',
555
+ taxprovider: '1'
556
+ },
557
+ segment: [{
558
+ id: 'pubseg1'
559
+ }]
560
+ };
561
+
562
+ rtd = {
563
+ ortb2: {
564
+ user: {
565
+ data: [rtdUserObj2]
566
+ }
567
+ }
568
+ };
569
+
570
+ config.resetConfig();
571
+
572
+ pbConfig = config.getConfig();
573
+ addRealTimeData(bidConfig, rtd, rtdConfig);
574
+ expect(config.getConfig().ortb2).to.deep.equal({});
575
+ });
576
+
577
+ it('allows publisher defined adunit logic', function() {
578
+ const rtdConfig = {
579
+ params: {
580
+ handleRtd: function(bidConfig, rtd, rtdConfig, pbConfig) {
581
+ var adUnits = bidConfig.adUnits;
582
+ for (var i = 0; i < adUnits.length; i++) {
583
+ var adUnit = adUnits[i];
584
+ for (var j = 0; j < adUnit.bids.length; j++) {
585
+ var bid = adUnit.bids[j];
586
+ if (bid.bidder == 'adBuzz') {
587
+ for (var k = 0; k < rtd.adBuzz.length; k++) {
588
+ bid.adBuzzData.segments.adBuzz.push(rtd.adBuzz[k]);
589
+ }
590
+ } else if (bid.bidder == 'trueBid') {
591
+ for (var k = 0; k < rtd.trueBid.length; k++) {
592
+ bid.trueBidSegments.push(rtd.trueBid[k]);
593
+ }
594
+ }
595
+ }
596
+ }
597
+ }
598
+ }
599
+ };
600
+
601
+ let bidConfig = {
602
+ adUnits: [
603
+ {
604
+ bids: [
605
+ {
606
+ bidder: 'adBuzz',
607
+ adBuzzData: {
608
+ segments: {
609
+ adBuzz: [
610
+ {
611
+ id: 'adBuzzSeg1'
612
+ }
613
+ ]
614
+ }
615
+ }
616
+ },
617
+ {
618
+ bidder: 'trueBid',
619
+ trueBidSegments: []
620
+ }
621
+ ]
622
+ }
623
+ ]
624
+ };
625
+
626
+ const rtd = {
627
+ adBuzz: [{id: 'adBuzzSeg2'}, {id: 'adBuzzSeg3'}],
628
+ trueBid: [{id: 'truebidSeg1'}, {id: 'truebidSeg2'}, {id: 'truebidSeg3'}]
629
+ };
630
+
631
+ addRealTimeData(bidConfig, rtd, rtdConfig);
632
+
633
+ expect(bidConfig.adUnits[0].bids[0].adBuzzData.segments.adBuzz[0].id).to.equal('adBuzzSeg1');
634
+ expect(bidConfig.adUnits[0].bids[0].adBuzzData.segments.adBuzz[1].id).to.equal('adBuzzSeg2');
635
+ expect(bidConfig.adUnits[0].bids[0].adBuzzData.segments.adBuzz[2].id).to.equal('adBuzzSeg3');
636
+ expect(bidConfig.adUnits[0].bids[1].trueBidSegments[0].id).to.equal('truebidSeg1');
637
+ expect(bidConfig.adUnits[0].bids[1].trueBidSegments[1].id).to.equal('truebidSeg2');
638
+ expect(bidConfig.adUnits[0].bids[1].trueBidSegments[2].id).to.equal('truebidSeg3');
639
+ });
640
+ });
641
+
642
+ describe('Get Real-Time Data', function() {
643
+ it('gets rtd from local storage cache', function() {
644
+ const rtdConfig = {
645
+ params: {
646
+ segmentCache: true
647
+ }
648
+ };
649
+
650
+ const bidConfig = {};
651
+
652
+ const rtdUserObj1 = {
653
+ name: 'www.dataprovider3.com',
654
+ ext: {
655
+ taxonomyname: 'iab_audience_taxonomy'
656
+ },
657
+ segment: [
658
+ {
659
+ id: '1918'
660
+ },
661
+ {
662
+ id: '1939'
663
+ }
664
+ ]
665
+ };
666
+
667
+ const cachedRtd = {
668
+ rtd: {
669
+ ortb2: {
670
+ user: {
671
+ data: [rtdUserObj1]
672
+ }
673
+ }
674
+ }
675
+ };
676
+
677
+ getDataFromLocalStorageStub.withArgs(RTD_LOCAL_NAME).returns(JSON.stringify(cachedRtd));
678
+
679
+ expect(config.getConfig().ortb2).to.be.undefined;
680
+ getRealTimeData(bidConfig, () => {}, rtdConfig, {});
681
+ expect(config.getConfig().ortb2.user.data).to.deep.include.members([rtdUserObj1]);
682
+ });
683
+
684
+ it('gets real-time data via async request', function() {
685
+ const setConfigSiteObj1 = {
686
+ name: 'www.audigent.com',
687
+ ext: {
688
+ segtax: '1',
689
+ taxprovider: '1'
690
+ },
691
+ segment: [
692
+ {
693
+ id: 'pubseg1'
694
+ },
695
+ {
696
+ id: 'pubseg2'
697
+ }
698
+ ]
699
+ }
700
+
701
+ config.setConfig({
702
+ ortb2: {
703
+ site: {
704
+ content: {
705
+ data: [setConfigSiteObj1]
706
+ }
707
+ }
708
+ }
709
+ });
710
+
711
+ const rtdConfig = {
712
+ params: {
713
+ segmentCache: false,
714
+ usePubHadron: true,
715
+ requestParams: {
716
+ publisherId: 'testPub1'
717
+ }
718
+ }
719
+ };
720
+
721
+ let bidConfig = {};
722
+
723
+ const rtdUserObj1 = {
724
+ name: 'www.audigent.com',
725
+ ext: {
726
+ segtax: '1',
727
+ taxprovider: '1'
728
+ },
729
+ segment: [
730
+ {
731
+ id: 'pubseg1'
732
+ },
733
+ {
734
+ id: 'pubseg2'
735
+ }
736
+ ]
737
+ };
738
+
739
+ const data = {
740
+ rtd: {
741
+ ortb2: {
742
+ user: {
743
+ data: [rtdUserObj1]
744
+ }
745
+ }
746
+ }
747
+ };
748
+
749
+ getDataFromLocalStorageStub.withArgs(HALOID_LOCAL_NAME).returns('testHadronId1');
750
+ getRealTimeData(bidConfig, () => {}, rtdConfig, {});
751
+
752
+ let request = server.requests[0];
753
+ let postData = JSON.parse(request.requestBody);
754
+ expect(postData.config).to.have.deep.property('publisherId', 'testPub1');
755
+ expect(postData.userIds).to.have.deep.property('hadronId', 'testHadronId1');
756
+
757
+ request.respond(200, responseHeader, JSON.stringify(data));
758
+
759
+ expect(config.getConfig().ortb2.user.data).to.deep.include.members([rtdUserObj1]);
760
+ });
761
+ });
762
+ });