prebid.js 8.0.0 → 8.1.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 (176) 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/adqueryBidAdapter.js +1 -1
  7. package/dist/adrelevantisBidAdapter.js +1 -1
  8. package/dist/adtrgtmeBidAdapter.js +1 -1
  9. package/dist/adxcgBidAdapter.js +1 -1
  10. package/dist/adyoulikeBidAdapter.js +1 -1
  11. package/dist/ajaBidAdapter.js +1 -1
  12. package/dist/amxBidAdapter.js +1 -1
  13. package/dist/amxIdSystem.js +1 -1
  14. package/dist/appierAnalyticsAdapter.js +1 -1
  15. package/dist/appnexusBidAdapter.js +1 -1
  16. package/dist/asoBidAdapter.js +1 -1
  17. package/dist/axonixBidAdapter.js +1 -1
  18. package/dist/bedigitechBidAdapter.js +1 -1
  19. package/dist/beopBidAdapter.js +1 -1
  20. package/dist/bidglassBidAdapter.js +1 -1
  21. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  22. package/dist/big-richmediaBidAdapter.js +1 -1
  23. package/dist/bridgewellBidAdapter.js +1 -1
  24. package/dist/brightMountainMediaBidAdapter.js +1 -1
  25. package/dist/carodaBidAdapter.js +1 -1
  26. package/dist/chtnwBidAdapter.js +1 -1
  27. package/dist/colossussspBidAdapter.js +1 -1
  28. package/dist/conceptxBidAdapter.js +1 -1
  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/dependencies.json +3 -0
  38. package/dist/dspxBidAdapter.js +1 -1
  39. package/dist/eplanningBidAdapter.js +1 -1
  40. package/dist/euidIdSystem.js +1 -1
  41. package/dist/feedadBidAdapter.js +1 -1
  42. package/dist/finativeBidAdapter.js +1 -1
  43. package/dist/freepassBidAdapter.js +1 -0
  44. package/dist/freewheel-sspBidAdapter.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/greenbidsRtdProvider.js +1 -1
  49. package/dist/gridBidAdapter.js +1 -1
  50. package/dist/gumgumBidAdapter.js +1 -1
  51. package/dist/h12mediaBidAdapter.js +1 -1
  52. package/dist/hypelabBidAdapter.js +1 -1
  53. package/dist/id5IdSystem.js +1 -1
  54. package/dist/imdsBidAdapter.js +1 -1
  55. package/dist/improvedigitalBidAdapter.js +1 -1
  56. package/dist/insticatorBidAdapter.js +1 -1
  57. package/dist/intentIqIdSystem.js +1 -1
  58. package/dist/ixBidAdapter.js +1 -1
  59. package/dist/justpremiumBidAdapter.js +1 -1
  60. package/dist/kargoBidAdapter.js +1 -1
  61. package/dist/kiviadsBidAdapter.js +1 -0
  62. package/dist/konduitAnalyticsAdapter.js +1 -1
  63. package/dist/kueezBidAdapter.js +1 -1
  64. package/dist/kueezRtbBidAdapter.js +1 -1
  65. package/dist/kulturemediaBidAdapter.js +1 -1
  66. package/dist/lassoBidAdapter.js +1 -1
  67. package/dist/lifestreetBidAdapter.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/mgidXBidAdapter.js +1 -0
  77. package/dist/minutemediaBidAdapter.js +1 -1
  78. package/dist/minutemediaplusBidAdapter.js +1 -1
  79. package/dist/nexx360BidAdapter.js +1 -1
  80. package/dist/not-for-prod/prebid.js +134 -131
  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/outbrainBidAdapter.js +1 -1
  86. package/dist/oxxionAnalyticsAdapter.js +1 -1
  87. package/dist/parrableIdSystem.js +1 -1
  88. package/dist/pixfutureBidAdapter.js +1 -1
  89. package/dist/prebid-core.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/riseBidAdapter.js +1 -1
  100. package/dist/rtbhouseBidAdapter.js +1 -1
  101. package/dist/rubiconBidAdapter.js +1 -1
  102. package/dist/seedingAllianceBidAdapter.js +1 -1
  103. package/dist/seedtagBidAdapter.js +1 -1
  104. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  105. package/dist/sharethroughBidAdapter.js +1 -1
  106. package/dist/shinezBidAdapter.js +1 -1
  107. package/dist/smaatoBidAdapter.js +1 -1
  108. package/dist/smartadserverBidAdapter.js +1 -1
  109. package/dist/smartxBidAdapter.js +1 -1
  110. package/dist/smilewantedBidAdapter.js +1 -1
  111. package/dist/sonobiBidAdapter.js +1 -1
  112. package/dist/sovrnAnalyticsAdapter.js +1 -1
  113. package/dist/sovrnBidAdapter.js +1 -1
  114. package/dist/sspBCBidAdapter.js +1 -1
  115. package/dist/stvBidAdapter.js +1 -1
  116. package/dist/sublimeBidAdapter.js +1 -1
  117. package/dist/targetVideoBidAdapter.js +1 -1
  118. package/dist/teadsBidAdapter.js +1 -1
  119. package/dist/trionBidAdapter.js +1 -1
  120. package/dist/tripleliftBidAdapter.js +1 -1
  121. package/dist/ttdBidAdapter.js +1 -1
  122. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  123. package/dist/uid2IdSystem.js +1 -1
  124. package/dist/underdogmediaBidAdapter.js +1 -1
  125. package/dist/undertoneBidAdapter.js +1 -1
  126. package/dist/vidazooBidAdapter.js +1 -1
  127. package/dist/videobyteBidAdapter.js +1 -1
  128. package/dist/visxBidAdapter.js +1 -1
  129. package/dist/vuukleBidAdapter.js +1 -1
  130. package/dist/widespaceBidAdapter.js +1 -1
  131. package/dist/winrBidAdapter.js +1 -1
  132. package/dist/yahoosspBidAdapter.js +1 -1
  133. package/dist/yieldmoBidAdapter.js +1 -1
  134. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  135. package/modules/amxBidAdapter.js +11 -12
  136. package/modules/bedigitechBidAdapter.js +15 -12
  137. package/modules/bedigitechBidAdapter.md +2 -2
  138. package/modules/beopBidAdapter.js +0 -4
  139. package/modules/bidwatchAnalyticsAdapter.js +33 -5
  140. package/modules/colossussspBidAdapter.js +9 -0
  141. package/modules/conceptxBidAdapter.js +6 -3
  142. package/modules/freepassBidAdapter.js +98 -0
  143. package/modules/freepassBidAdapter.md +31 -0
  144. package/modules/freepassIdSystem.md +1 -1
  145. package/modules/greenbidsAnalyticsAdapter.js +7 -13
  146. package/modules/gridBidAdapter.js +3 -4
  147. package/modules/intentIqIdSystem.js +5 -4
  148. package/modules/ixBidAdapter.js +284 -55
  149. package/modules/kiviadsBidAdapter.js +212 -0
  150. package/modules/kiviadsBidAdapter.md +79 -0
  151. package/modules/mgidXBidAdapter.js +263 -0
  152. package/modules/mgidXBidAdapter.md +79 -0
  153. package/modules/oxxionAnalyticsAdapter.js +33 -5
  154. package/modules/pubmaticBidAdapter.js +18 -2
  155. package/modules/rtbhouseBidAdapter.js +9 -2
  156. package/modules/rtbhouseBidAdapter.md +27 -8
  157. package/modules/rubiconBidAdapter.js +13 -1
  158. package/modules/sharethroughBidAdapter.js +14 -0
  159. package/modules/sonobiBidAdapter.js +4 -7
  160. package/package.json +1 -1
  161. package/test/spec/modules/amxBidAdapter_spec.js +6 -3
  162. package/test/spec/modules/bedigitechBidAdapter_spec.js +25 -36
  163. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +21 -1
  164. package/test/spec/modules/colossussspBidAdapter_spec.js +29 -0
  165. package/test/spec/modules/freepassBidAdapter_spec.js +161 -0
  166. package/test/spec/modules/greenbidsAnalyticsAdapter_spec.js +0 -15
  167. package/test/spec/modules/gridBidAdapter_spec.js +29 -28
  168. package/test/spec/modules/ixBidAdapter_spec.js +745 -3
  169. package/test/spec/modules/kiviadsBidAdapter_spec.js +404 -0
  170. package/test/spec/modules/mgidXBidAdapter_spec.js +426 -0
  171. package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +21 -2
  172. package/test/spec/modules/pubmaticBidAdapter_spec.js +25 -0
  173. package/test/spec/modules/rtbhouseBidAdapter_spec.js +35 -0
  174. package/test/spec/modules/rubiconBidAdapter_spec.js +41 -0
  175. package/test/spec/modules/sharethroughBidAdapter_spec.js +75 -0
  176. package/test/spec/modules/sonobiBidAdapter_spec.js +15 -15
@@ -0,0 +1,426 @@
1
+ import { expect } from 'chai';
2
+ import { spec } from '../../../modules/mgidXBidAdapter.js';
3
+ import { BANNER, VIDEO, NATIVE } from '../../../src/mediaTypes.js';
4
+ import { getUniqueIdentifierStr } from '../../../src/utils.js';
5
+ import { config } from '../../../src/config';
6
+ import { USERSYNC_DEFAULT_CONFIG } from '../../../src/userSync';
7
+
8
+ const bidder = 'mgidX'
9
+ const adUrl = 'https://us-east-x.mgid.com/pbjs';
10
+
11
+ describe('MGIDXBidAdapter', function () {
12
+ const bids = [
13
+ {
14
+ bidId: getUniqueIdentifierStr(),
15
+ bidder: bidder,
16
+ mediaTypes: {
17
+ [BANNER]: {
18
+ sizes: [[300, 250]]
19
+ }
20
+ },
21
+ params: {
22
+ placementId: 'testBanner',
23
+ }
24
+ },
25
+ {
26
+ bidId: getUniqueIdentifierStr(),
27
+ bidder: bidder,
28
+ mediaTypes: {
29
+ [VIDEO]: {
30
+ playerSize: [[300, 300]],
31
+ minduration: 5,
32
+ maxduration: 60
33
+ }
34
+ },
35
+ params: {
36
+ placementId: 'testVideo',
37
+ }
38
+ },
39
+ {
40
+ bidId: getUniqueIdentifierStr(),
41
+ bidder: bidder,
42
+ mediaTypes: {
43
+ [NATIVE]: {
44
+ native: {
45
+ title: {
46
+ required: true
47
+ },
48
+ body: {
49
+ required: true
50
+ },
51
+ icon: {
52
+ required: true,
53
+ size: [64, 64]
54
+ }
55
+ }
56
+ }
57
+ },
58
+ params: {
59
+ placementId: 'testNative',
60
+ }
61
+ }
62
+ ];
63
+
64
+ const invalidBid = {
65
+ bidId: getUniqueIdentifierStr(),
66
+ bidder: bidder,
67
+ mediaTypes: {
68
+ [BANNER]: {
69
+ sizes: [[300, 250]]
70
+ }
71
+ },
72
+ params: {
73
+
74
+ }
75
+ }
76
+
77
+ const bidderRequest = {
78
+ uspConsent: '1---',
79
+ gdprConsent: 'COvFyGBOvFyGBAbAAAENAPCAAOAAAAAAAAAAAEEUACCKAAA.IFoEUQQgAIQwgIwQABAEAAAAOIAACAIAAAAQAIAgEAACEAAAAAgAQBAAAAAAAGBAAgAAAAAAAFAAECAAAgAAQARAEQAAAAAJAAIAAgAAAYQEAAAQmAgBC3ZAYzUw',
80
+ refererInfo: {
81
+ referer: 'https://test.com'
82
+ }
83
+ };
84
+
85
+ describe('isBidRequestValid', function () {
86
+ it('Should return true if there are bidId, params and key parameters present', function () {
87
+ expect(spec.isBidRequestValid(bids[0])).to.be.true;
88
+ });
89
+ it('Should return false if at least one of parameters is not present', function () {
90
+ expect(spec.isBidRequestValid(invalidBid)).to.be.false;
91
+ });
92
+ });
93
+
94
+ describe('buildRequests', function () {
95
+ let serverRequest = spec.buildRequests(bids, bidderRequest);
96
+
97
+ it('Creates a ServerRequest object with method, URL and data', function () {
98
+ expect(serverRequest).to.exist;
99
+ expect(serverRequest.method).to.exist;
100
+ expect(serverRequest.url).to.exist;
101
+ expect(serverRequest.data).to.exist;
102
+ });
103
+
104
+ it('Returns POST method', function () {
105
+ expect(serverRequest.method).to.equal('POST');
106
+ });
107
+
108
+ it('Returns valid URL', function () {
109
+ expect(serverRequest.url).to.equal(adUrl);
110
+ });
111
+
112
+ it('Returns general data valid', function () {
113
+ let data = serverRequest.data;
114
+ expect(data).to.be.an('object');
115
+ expect(data).to.have.all.keys('deviceWidth',
116
+ 'deviceHeight',
117
+ 'language',
118
+ 'secure',
119
+ 'host',
120
+ 'page',
121
+ 'placements',
122
+ 'coppa',
123
+ 'ccpa',
124
+ 'gdpr',
125
+ 'tmax'
126
+ );
127
+ expect(data.deviceWidth).to.be.a('number');
128
+ expect(data.deviceHeight).to.be.a('number');
129
+ expect(data.language).to.be.a('string');
130
+ expect(data.secure).to.be.within(0, 1);
131
+ expect(data.host).to.be.a('string');
132
+ expect(data.page).to.be.a('string');
133
+ expect(data.coppa).to.be.a('number');
134
+ expect(data.gdpr).to.be.a('string');
135
+ expect(data.ccpa).to.be.a('string');
136
+ expect(data.tmax).to.be.a('number');
137
+ expect(data.placements).to.have.lengthOf(3);
138
+ });
139
+
140
+ it('Returns valid placements', function () {
141
+ const { placements } = serverRequest.data;
142
+ for (let i = 0, len = placements.length; i < len; i++) {
143
+ const placement = placements[i];
144
+ expect(placement.placementId).to.be.oneOf(['testBanner', 'testVideo', 'testNative']);
145
+ expect(placement.adFormat).to.be.oneOf([BANNER, VIDEO, NATIVE]);
146
+ expect(placement.bidId).to.be.a('string');
147
+ expect(placement.schain).to.be.an('object');
148
+ expect(placement.bidfloor).to.exist.and.to.equal(0);
149
+ expect(placement.type).to.exist.and.to.equal('publisher');
150
+
151
+ if (placement.adFormat === BANNER) {
152
+ expect(placement.sizes).to.be.an('array');
153
+ }
154
+ switch (placement.adFormat) {
155
+ case BANNER:
156
+ expect(placement.sizes).to.be.an('array');
157
+ break;
158
+ case VIDEO:
159
+ expect(placement.playerSize).to.be.an('array');
160
+ expect(placement.minduration).to.be.an('number');
161
+ expect(placement.maxduration).to.be.an('number');
162
+ break;
163
+ case NATIVE:
164
+ expect(placement.native).to.be.an('object');
165
+ break;
166
+ }
167
+ }
168
+ });
169
+
170
+ it('Returns data with gdprConsent and without uspConsent', function () {
171
+ delete bidderRequest.uspConsent;
172
+ serverRequest = spec.buildRequests(bids, bidderRequest);
173
+ let data = serverRequest.data;
174
+ expect(data.gdpr).to.exist;
175
+ expect(data.gdpr).to.be.a('string');
176
+ expect(data.gdpr).to.equal(bidderRequest.gdprConsent);
177
+ expect(data.ccpa).to.not.exist;
178
+ delete bidderRequest.gdprConsent;
179
+ });
180
+
181
+ it('Returns data with uspConsent and without gdprConsent', function () {
182
+ bidderRequest.uspConsent = '1---';
183
+ delete bidderRequest.gdprConsent;
184
+ serverRequest = spec.buildRequests(bids, bidderRequest);
185
+ let data = serverRequest.data;
186
+ expect(data.ccpa).to.exist;
187
+ expect(data.ccpa).to.be.a('string');
188
+ expect(data.ccpa).to.equal(bidderRequest.uspConsent);
189
+ expect(data.gdpr).to.not.exist;
190
+ });
191
+
192
+ it('Returns empty data if no valid requests are passed', function () {
193
+ serverRequest = spec.buildRequests([], bidderRequest);
194
+ let data = serverRequest.data;
195
+ expect(data.placements).to.be.an('array').that.is.empty;
196
+ });
197
+ });
198
+
199
+ describe('interpretResponse', function () {
200
+ it('Should interpret banner response', function () {
201
+ const banner = {
202
+ body: [{
203
+ mediaType: 'banner',
204
+ width: 300,
205
+ height: 250,
206
+ cpm: 0.4,
207
+ ad: 'Test',
208
+ requestId: '23fhj33i987f',
209
+ ttl: 120,
210
+ creativeId: '2',
211
+ netRevenue: true,
212
+ currency: 'USD',
213
+ dealId: '1',
214
+ meta: {
215
+ advertiserDomains: ['google.com'],
216
+ advertiserId: 1234
217
+ }
218
+ }]
219
+ };
220
+ let bannerResponses = spec.interpretResponse(banner);
221
+ expect(bannerResponses).to.be.an('array').that.is.not.empty;
222
+ let dataItem = bannerResponses[0];
223
+ expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
224
+ 'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
225
+ expect(dataItem.requestId).to.equal(banner.body[0].requestId);
226
+ expect(dataItem.cpm).to.equal(banner.body[0].cpm);
227
+ expect(dataItem.width).to.equal(banner.body[0].width);
228
+ expect(dataItem.height).to.equal(banner.body[0].height);
229
+ expect(dataItem.ad).to.equal(banner.body[0].ad);
230
+ expect(dataItem.ttl).to.equal(banner.body[0].ttl);
231
+ expect(dataItem.creativeId).to.equal(banner.body[0].creativeId);
232
+ expect(dataItem.netRevenue).to.be.true;
233
+ expect(dataItem.currency).to.equal(banner.body[0].currency);
234
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
235
+ });
236
+ it('Should interpret video response', function () {
237
+ const video = {
238
+ body: [{
239
+ vastUrl: 'test.com',
240
+ mediaType: 'video',
241
+ cpm: 0.5,
242
+ requestId: '23fhj33i987f',
243
+ ttl: 120,
244
+ creativeId: '2',
245
+ netRevenue: true,
246
+ currency: 'USD',
247
+ dealId: '1',
248
+ meta: {
249
+ advertiserDomains: ['google.com'],
250
+ advertiserId: 1234
251
+ }
252
+ }]
253
+ };
254
+ let videoResponses = spec.interpretResponse(video);
255
+ expect(videoResponses).to.be.an('array').that.is.not.empty;
256
+
257
+ let dataItem = videoResponses[0];
258
+ expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
259
+ 'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
260
+ expect(dataItem.requestId).to.equal('23fhj33i987f');
261
+ expect(dataItem.cpm).to.equal(0.5);
262
+ expect(dataItem.vastUrl).to.equal('test.com');
263
+ expect(dataItem.ttl).to.equal(120);
264
+ expect(dataItem.creativeId).to.equal('2');
265
+ expect(dataItem.netRevenue).to.be.true;
266
+ expect(dataItem.currency).to.equal('USD');
267
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
268
+ });
269
+ it('Should interpret native response', function () {
270
+ const native = {
271
+ body: [{
272
+ mediaType: 'native',
273
+ native: {
274
+ clickUrl: 'test.com',
275
+ title: 'Test',
276
+ image: 'test.com',
277
+ impressionTrackers: ['test.com'],
278
+ },
279
+ ttl: 120,
280
+ cpm: 0.4,
281
+ requestId: '23fhj33i987f',
282
+ creativeId: '2',
283
+ netRevenue: true,
284
+ currency: 'USD',
285
+ meta: {
286
+ advertiserDomains: ['google.com'],
287
+ advertiserId: 1234
288
+ }
289
+ }]
290
+ };
291
+ let nativeResponses = spec.interpretResponse(native);
292
+ expect(nativeResponses).to.be.an('array').that.is.not.empty;
293
+
294
+ let dataItem = nativeResponses[0];
295
+ expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native', 'meta');
296
+ expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
297
+ expect(dataItem.requestId).to.equal('23fhj33i987f');
298
+ expect(dataItem.cpm).to.equal(0.4);
299
+ expect(dataItem.native.clickUrl).to.equal('test.com');
300
+ expect(dataItem.native.title).to.equal('Test');
301
+ expect(dataItem.native.image).to.equal('test.com');
302
+ expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
303
+ expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
304
+ expect(dataItem.ttl).to.equal(120);
305
+ expect(dataItem.creativeId).to.equal('2');
306
+ expect(dataItem.netRevenue).to.be.true;
307
+ expect(dataItem.currency).to.equal('USD');
308
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
309
+ });
310
+ it('Should return an empty array if invalid banner response is passed', function () {
311
+ const invBanner = {
312
+ body: [{
313
+ width: 300,
314
+ cpm: 0.4,
315
+ ad: 'Test',
316
+ requestId: '23fhj33i987f',
317
+ ttl: 120,
318
+ creativeId: '2',
319
+ netRevenue: true,
320
+ currency: 'USD',
321
+ dealId: '1'
322
+ }]
323
+ };
324
+
325
+ let serverResponses = spec.interpretResponse(invBanner);
326
+ expect(serverResponses).to.be.an('array').that.is.empty;
327
+ });
328
+ it('Should return an empty array if invalid video response is passed', function () {
329
+ const invVideo = {
330
+ body: [{
331
+ mediaType: 'video',
332
+ cpm: 0.5,
333
+ requestId: '23fhj33i987f',
334
+ ttl: 120,
335
+ creativeId: '2',
336
+ netRevenue: true,
337
+ currency: 'USD',
338
+ dealId: '1'
339
+ }]
340
+ };
341
+ let serverResponses = spec.interpretResponse(invVideo);
342
+ expect(serverResponses).to.be.an('array').that.is.empty;
343
+ });
344
+ it('Should return an empty array if invalid native response is passed', function () {
345
+ const invNative = {
346
+ body: [{
347
+ mediaType: 'native',
348
+ clickUrl: 'test.com',
349
+ title: 'Test',
350
+ impressionTrackers: ['test.com'],
351
+ ttl: 120,
352
+ requestId: '23fhj33i987f',
353
+ creativeId: '2',
354
+ netRevenue: true,
355
+ currency: 'USD',
356
+ }]
357
+ };
358
+ let serverResponses = spec.interpretResponse(invNative);
359
+ expect(serverResponses).to.be.an('array').that.is.empty;
360
+ });
361
+ it('Should return an empty array if invalid response is passed', function () {
362
+ const invalid = {
363
+ body: [{
364
+ ttl: 120,
365
+ creativeId: '2',
366
+ netRevenue: true,
367
+ currency: 'USD',
368
+ dealId: '1'
369
+ }]
370
+ };
371
+ let serverResponses = spec.interpretResponse(invalid);
372
+ expect(serverResponses).to.be.an('array').that.is.empty;
373
+ });
374
+ });
375
+
376
+ describe('getUserSyncs', function () {
377
+ afterEach(function() {
378
+ config.setConfig({userSync: {syncsPerBidder: USERSYNC_DEFAULT_CONFIG.syncsPerBidder}});
379
+ });
380
+ it('should do nothing on getUserSyncs without inputs', function () {
381
+ expect(spec.getUserSyncs()).to.equal(undefined)
382
+ });
383
+ it('should return frame object with empty consents', function () {
384
+ const sync = spec.getUserSyncs({iframeEnabled: true})
385
+ expect(sync).to.have.length(1)
386
+ expect(sync[0]).to.have.property('type', 'iframe')
387
+ expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=&gdpr=0/)
388
+ });
389
+ it('should return frame object with gdpr consent', function () {
390
+ const sync = spec.getUserSyncs({iframeEnabled: true}, undefined, {consentString: 'consent', gdprApplies: true})
391
+ expect(sync).to.have.length(1)
392
+ expect(sync[0]).to.have.property('type', 'iframe')
393
+ expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent&gdpr=1/)
394
+ });
395
+ it('should return frame object with gdpr + usp', function () {
396
+ const sync = spec.getUserSyncs({iframeEnabled: true}, undefined, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
397
+ expect(sync).to.have.length(1)
398
+ expect(sync[0]).to.have.property('type', 'iframe')
399
+ expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
400
+ });
401
+ it('should return img object with gdpr + usp', function () {
402
+ config.setConfig({userSync: {syncsPerBidder: undefined}});
403
+ const sync = spec.getUserSyncs({pixelEnabled: true}, undefined, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
404
+ expect(sync).to.have.length(USERSYNC_DEFAULT_CONFIG.syncsPerBidder)
405
+ for (let i = 0; i < USERSYNC_DEFAULT_CONFIG.syncsPerBidder; i++) {
406
+ expect(sync[i]).to.have.property('type', 'image')
407
+ expect(sync[i]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
408
+ }
409
+ });
410
+ it('should return frame object with gdpr + usp', function () {
411
+ const sync = spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, undefined, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
412
+ expect(sync).to.have.length(1)
413
+ expect(sync[0]).to.have.property('type', 'iframe')
414
+ expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
415
+ });
416
+ it('should return img (pixels) objects with gdpr + usp', function () {
417
+ const response = [{body: {ext: {cm: ['http://cm.mgid.com/i.gif?cdsp=1111', 'http://cm.mgid.com/i.gif']}}}]
418
+ const sync = spec.getUserSyncs({iframeEnabled: false, pixelEnabled: true}, response, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
419
+ expect(sync).to.have.length(2)
420
+ expect(sync[0]).to.have.property('type', 'image')
421
+ expect(sync[0]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cdsp=1111&cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
422
+ expect(sync[1]).to.have.property('type', 'image')
423
+ expect(sync[1]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
424
+ });
425
+ });
426
+ });
@@ -1,4 +1,5 @@
1
1
  import oxxionAnalytics from 'modules/oxxionAnalyticsAdapter.js';
2
+ import {dereferenceWithoutRenderer} from 'modules/oxxionAnalyticsAdapter.js';
2
3
  import { expect } from 'chai';
3
4
  import { server } from 'test/mocks/xhr.js';
4
5
  let adapterManager = require('src/adapterManager').default;
@@ -155,7 +156,7 @@ describe('Oxxion Analytics', function () {
155
156
  'requestId': '34a63e5d5378a3',
156
157
  'transactionId': 'de664ccb-e18b-4436-aeb0-362382eb1b40',
157
158
  'auctionId': '1e8b993d-8f0a-4232-83eb-3639ddf3a44b',
158
- 'mediaType': 'banner',
159
+ 'mediaType': 'video',
159
160
  'source': 'client',
160
161
  'cpm': 27.4276,
161
162
  'creativeId': '158534630',
@@ -168,6 +169,7 @@ describe('Oxxion Analytics', function () {
168
169
  'example.com'
169
170
  ]
170
171
  },
172
+ 'renderer': 'something',
171
173
  'originalCpm': 25.02521,
172
174
  'originalCurrency': 'EUR',
173
175
  'responseTimestamp': 1647424261559,
@@ -221,6 +223,7 @@ describe('Oxxion Analytics', function () {
221
223
  'example.com'
222
224
  ]
223
225
  },
226
+ 'renderer': 'something',
224
227
  'originalCpm': 25.02521,
225
228
  'originalCurrency': 'EUR',
226
229
  'responseTimestamp': 1647424261558,
@@ -267,7 +270,24 @@ describe('Oxxion Analytics', function () {
267
270
  oxxionAnalytics.disableAnalytics();
268
271
  oxxionAnalytics.track.restore();
269
272
  });
273
+ it('test dereferenceWithoutRenderer', function () {
274
+ adapterManager.registerAnalyticsAdapter({
275
+ code: 'oxxion',
276
+ adapter: oxxionAnalytics
277
+ });
270
278
 
279
+ adapterManager.enableAnalytics({
280
+ provider: 'oxxion',
281
+ options: {
282
+ domain: 'test'
283
+ }
284
+ });
285
+ let resultBidWon = JSON.parse(dereferenceWithoutRenderer(bidWon));
286
+ expect(resultBidWon).not.to.have.property('renderer');
287
+ let resultBid = JSON.parse(dereferenceWithoutRenderer(auctionEnd));
288
+ expect(resultBid).to.have.property('bidsReceived').and.to.have.lengthOf(1);
289
+ expect(resultBid.bidsReceived[0]).not.to.have.property('renderer');
290
+ });
271
291
  it('test auctionEnd', function () {
272
292
  adapterManager.registerAnalyticsAdapter({
273
293
  code: 'oxxion',
@@ -297,7 +317,6 @@ describe('Oxxion Analytics', function () {
297
317
  expect(message.auctionEnd[0]).to.have.property('bidderRequests').and.to.have.lengthOf(1);
298
318
  expect(message.auctionEnd[0].bidderRequests[0]).to.have.property('gdprConsent');
299
319
  expect(message.auctionEnd[0].bidderRequests[0].gdprConsent).not.to.have.property('vendorData');
300
- sinon.assert.callCount(oxxionAnalytics.track, 5);
301
320
  });
302
321
 
303
322
  it('test bidWon', function() {
@@ -3056,6 +3056,31 @@ describe('PubMatic adapter', function () {
3056
3056
  expect(data.imp[0]['video']['h']).to.equal(videoBidRequests[0].mediaTypes.video.playerSize[1]);
3057
3057
  });
3058
3058
  }
3059
+
3060
+ describe('Fledge', function() {
3061
+ it('should not send imp.ext.ae when FLEDGE is disabled, ', function () {
3062
+ let bidRequest = Object.assign([], bidRequests);
3063
+ bidRequest[0].ortb2Imp = {
3064
+ ext: { ae: 1 }
3065
+ };
3066
+ const req = spec.buildRequests(bidRequest, { ...bidRequest, fledgeEnabled: false });
3067
+ let data = JSON.parse(req.data);
3068
+ if (data.imp[0].ext) {
3069
+ expect(data.imp[0].ext).to.not.have.property('ae');
3070
+ }
3071
+ });
3072
+
3073
+ it('when FLEDGE is enabled, should send whatever is set in ortb2imp.ext.ae in all bid requests', function () {
3074
+ let bidRequest = Object.assign([], bidRequests);
3075
+ delete bidRequest[0].params.test;
3076
+ bidRequest[0].ortb2Imp = {
3077
+ ext: { ae: 1 }
3078
+ };
3079
+ const req = spec.buildRequests(bidRequest, { ...bidRequest, fledgeEnabled: true });
3080
+ let data = JSON.parse(req.data);
3081
+ expect(data.imp[0].ext.ae).to.equal(1);
3082
+ });
3083
+ });
3059
3084
  });
3060
3085
 
3061
3086
  it('Request params dctr check', function () {
@@ -318,6 +318,41 @@ describe('RTBHouseAdapter', () => {
318
318
  expect(request.method).to.equal('POST');
319
319
  });
320
320
 
321
+ it('sets default fledgeConfig object values when none available from config', function () {
322
+ let bidRequest = Object.assign([], bidRequests);
323
+ delete bidRequest[0].params.test;
324
+
325
+ config.setConfig({ fledgeConfig: false });
326
+ const request = spec.buildRequests(bidRequest, { ...bidderRequest, fledgeEnabled: true });
327
+ const data = JSON.parse(request.data);
328
+ expect(data.ext).to.exist.and.to.be.a('object');
329
+ expect(data.ext.fledge_config).to.exist.and.to.be.a('object');
330
+ expect(data.ext.fledge_config).to.contain.keys('seller', 'decisionLogicUrl', 'sellerTimeout');
331
+ expect(data.ext.fledge_config.seller).to.equal('https://fledge-ssp.creativecdn.com');
332
+ expect(data.ext.fledge_config.decisionLogicUrl).to.equal('https://fledge-ssp.creativecdn.com/component-seller-prebid.js');
333
+ expect(data.ext.fledge_config.sellerTimeout).to.equal(500);
334
+ });
335
+
336
+ it('sets a fledgeConfig object values when available from config', function () {
337
+ let bidRequest = Object.assign([], bidRequests);
338
+ delete bidRequest[0].params.test;
339
+
340
+ config.setConfig({
341
+ fledgeConfig: {
342
+ seller: 'https://sellers.domain',
343
+ decisionLogicUrl: 'https://sellers.domain/decision.url'
344
+ }
345
+ });
346
+ const request = spec.buildRequests(bidRequest, { ...bidderRequest, fledgeEnabled: true });
347
+ const data = JSON.parse(request.data);
348
+ expect(data.ext).to.exist.and.to.be.a('object');
349
+ expect(data.ext.fledge_config).to.exist.and.to.be.a('object');
350
+ expect(data.ext.fledge_config).to.contain.keys('seller', 'decisionLogicUrl');
351
+ expect(data.ext.fledge_config.seller).to.equal('https://sellers.domain');
352
+ expect(data.ext.fledge_config.decisionLogicUrl).to.equal('https://sellers.domain/decision.url');
353
+ expect(data.ext.fledge_config.sellerTimeout).to.not.exist;
354
+ });
355
+
321
356
  it('when FLEDGE is disabled, should not send imp.ext.ae', function () {
322
357
  let bidRequest = Object.assign([], bidRequests);
323
358
  delete bidRequest[0].params.test;
@@ -825,6 +825,29 @@ describe('the rubicon adapter', function () {
825
825
  });
826
826
  });
827
827
 
828
+ describe('GPP Consent', function () {
829
+ it('should send gpp information if bidderRequest has a value for gppConsent', function () {
830
+ bidderRequest.gppConsent = {
831
+ gppString: 'consent',
832
+ applicableSections: 2
833
+ };
834
+ let [request] = spec.buildRequests(bidderRequest.bids, bidderRequest);
835
+ let data = parseQuery(request.data);
836
+ delete bidderRequest.gppConsent;
837
+
838
+ expect(data['gpp']).to.equal('consent');
839
+ expect(data['gpp_sid']).to.equal('2');
840
+ });
841
+
842
+ it('should not send gpp information if bidderRequest does not have a value for gppConsent', function () {
843
+ let [request] = spec.buildRequests(bidderRequest.bids, bidderRequest);
844
+ let data = parseQuery(request.data);
845
+
846
+ expect(data['gpp']).to.equal(undefined);
847
+ expect(data['gpp_sid']).to.equal(undefined);
848
+ });
849
+ });
850
+
828
851
  describe('first party data', function () {
829
852
  it('should not have any tg_v or tg_i params if all are undefined', function () {
830
853
  let params = {
@@ -3653,6 +3676,24 @@ describe('the rubicon adapter', function () {
3653
3676
  type: 'iframe', url: `${emilyUrl}?gdpr=1&gdpr_consent=foo&us_privacy=1NYN`
3654
3677
  });
3655
3678
  });
3679
+
3680
+ it('should pass gpp params when gppConsent is present', function () {
3681
+ expect(spec.getUserSyncs({iframeEnabled: true}, {}, {}, undefined, {
3682
+ gppString: 'foo',
3683
+ applicableSections: [2]
3684
+ })).to.deep.equal({
3685
+ type: 'iframe', url: `${emilyUrl}?gpp=foo&gpp_sid=2`
3686
+ });
3687
+ });
3688
+
3689
+ it('should pass multiple sid\'s when multiple are present', function () {
3690
+ expect(spec.getUserSyncs({iframeEnabled: true}, {}, {}, undefined, {
3691
+ gppString: 'foo',
3692
+ applicableSections: [2, 5]
3693
+ })).to.deep.equal({
3694
+ type: 'iframe', url: `${emilyUrl}?gpp=foo&gpp_sid=2,5`
3695
+ });
3696
+ });
3656
3697
  });
3657
3698
 
3658
3699
  describe('get price granularity', function () {