prebid.js 7.8.0 → 7.9.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 (118) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/adagioBidAdapter.js +1 -1
  3. package/dist/adbookpspBidAdapter.js +1 -1
  4. package/dist/adgenerationBidAdapter.js +1 -1
  5. package/dist/adrelevantisBidAdapter.js +1 -1
  6. package/dist/adxcgBidAdapter.js +1 -1
  7. package/dist/ajaBidAdapter.js +1 -1
  8. package/dist/amxBidAdapter.js +1 -1
  9. package/dist/amxIdSystem.js +1 -1
  10. package/dist/andBeyondMediaBidAdapter.js +1 -0
  11. package/dist/appierAnalyticsAdapter.js +1 -1
  12. package/dist/appnexusBidAdapter.js +1 -1
  13. package/dist/asoBidAdapter.js +1 -1
  14. package/dist/axonixBidAdapter.js +1 -1
  15. package/dist/bidglassBidAdapter.js +1 -1
  16. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  17. package/dist/big-richmediaBidAdapter.js +1 -1
  18. package/dist/bridgewellBidAdapter.js +1 -1
  19. package/dist/brightMountainMediaBidAdapter.js +1 -1
  20. package/dist/c1xBidAdapter.js +1 -0
  21. package/dist/concertBidAdapter.js +1 -1
  22. package/dist/connectadBidAdapter.js +1 -1
  23. package/dist/consumableBidAdapter.js +1 -1
  24. package/dist/conversantBidAdapter.js +1 -1
  25. package/dist/craftBidAdapter.js +1 -1
  26. package/dist/criteoBidAdapter.js +1 -1
  27. package/dist/dspxBidAdapter.js +1 -1
  28. package/dist/eplanningBidAdapter.js +1 -1
  29. package/dist/finativeBidAdapter.js +1 -1
  30. package/dist/glimpseBidAdapter.js +1 -1
  31. package/dist/gmosspBidAdapter.js +1 -1
  32. package/dist/goldbachBidAdapter.js +1 -1
  33. package/dist/gridBidAdapter.js +1 -1
  34. package/dist/gridNMBidAdapter.js +1 -1
  35. package/dist/gumgumBidAdapter.js +1 -1
  36. package/dist/h12mediaBidAdapter.js +1 -1
  37. package/dist/id5IdSystem.js +1 -1
  38. package/dist/improvedigitalBidAdapter.js +1 -1
  39. package/dist/inmarBidAdapter.js +1 -1
  40. package/dist/insticatorBidAdapter.js +1 -1
  41. package/dist/ixBidAdapter.js +1 -1
  42. package/dist/justpremiumBidAdapter.js +1 -1
  43. package/dist/konduitAnalyticsAdapter.js +1 -1
  44. package/dist/kueezBidAdapter.js +1 -1
  45. package/dist/lassoBidAdapter.js +1 -1
  46. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  47. package/dist/logicadBidAdapter.js +1 -1
  48. package/dist/loglyliftBidAdapter.js +1 -1
  49. package/dist/malltvAnalyticsAdapter.js +1 -1
  50. package/dist/marsmediaBidAdapter.js +1 -1
  51. package/dist/mediafuseBidAdapter.js +1 -1
  52. package/dist/mediasquareBidAdapter.js +1 -1
  53. package/dist/mgidBidAdapter.js +1 -1
  54. package/dist/minutemediaBidAdapter.js +1 -1
  55. package/dist/not-for-prod/prebid.js +106 -104
  56. package/dist/oguryBidAdapter.js +1 -1
  57. package/dist/onetagBidAdapter.js +1 -1
  58. package/dist/ooloAnalyticsAdapter.js +1 -1
  59. package/dist/outbrainBidAdapter.js +1 -1
  60. package/dist/parrableIdSystem.js +1 -1
  61. package/dist/pixfutureBidAdapter.js +1 -1
  62. package/dist/prebid-core.js +1 -1
  63. package/dist/publinkIdSystem.js +1 -1
  64. package/dist/pubmaticBidAdapter.js +1 -1
  65. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  66. package/dist/pxyzBidAdapter.js +1 -1
  67. package/dist/quantcastBidAdapter.js +1 -1
  68. package/dist/readpeakBidAdapter.js +1 -1
  69. package/dist/relaidoBidAdapter.js +1 -1
  70. package/dist/rhythmoneBidAdapter.js +1 -1
  71. package/dist/riseBidAdapter.js +1 -1
  72. package/dist/rubiconAnalyticsAdapter.js +1 -1
  73. package/dist/rubiconBidAdapter.js +1 -1
  74. package/dist/seedingAllianceBidAdapter.js +1 -1
  75. package/dist/seedtagBidAdapter.js +1 -1
  76. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  77. package/dist/sharethroughBidAdapter.js +1 -1
  78. package/dist/shinezBidAdapter.js +1 -1
  79. package/dist/smaatoBidAdapter.js +1 -1
  80. package/dist/smartadserverBidAdapter.js +1 -1
  81. package/dist/smartxBidAdapter.js +1 -1
  82. package/dist/smilewantedBidAdapter.js +1 -1
  83. package/dist/sonobiBidAdapter.js +1 -1
  84. package/dist/sovrnAnalyticsAdapter.js +1 -1
  85. package/dist/sovrnBidAdapter.js +1 -1
  86. package/dist/sspBCBidAdapter.js +1 -1
  87. package/dist/sublimeBidAdapter.js +1 -1
  88. package/dist/synacormediaBidAdapter.js +1 -1
  89. package/dist/targetVideoBidAdapter.js +1 -1
  90. package/dist/teadsBidAdapter.js +1 -1
  91. package/dist/trionBidAdapter.js +1 -1
  92. package/dist/tripleliftBidAdapter.js +1 -1
  93. package/dist/ttdBidAdapter.js +1 -1
  94. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  95. package/dist/underdogmediaBidAdapter.js +1 -1
  96. package/dist/undertoneBidAdapter.js +1 -1
  97. package/dist/vidazooBidAdapter.js +1 -1
  98. package/dist/videobyteBidAdapter.js +1 -1
  99. package/dist/visxBidAdapter.js +1 -1
  100. package/dist/vuukleBidAdapter.js +1 -1
  101. package/dist/widespaceBidAdapter.js +1 -1
  102. package/dist/winrBidAdapter.js +1 -1
  103. package/dist/yahoosspBidAdapter.js +1 -1
  104. package/dist/yieldmoBidAdapter.js +1 -1
  105. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  106. package/modules/andBeyondMediaBidAdapter.js +202 -0
  107. package/modules/andBeyondMediaBidAdapter.md +79 -0
  108. package/modules/bidwatchAnalyticsAdapter.js +70 -11
  109. package/modules/c1xBidAdapter.js +209 -0
  110. package/modules/c1xBidAdapter.md +70 -0
  111. package/modules/improvedigitalBidAdapter.js +3 -0
  112. package/modules/tripleliftBidAdapter.js +45 -19
  113. package/package.json +1 -1
  114. package/test/spec/modules/andBeyondMediaBidAdapter_spec.js +400 -0
  115. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +17 -1
  116. package/test/spec/modules/c1xBidAdapter_spec.js +189 -0
  117. package/test/spec/modules/improvedigitalBidAdapter_spec.js +4 -4
  118. package/test/spec/modules/tripleliftBidAdapter_spec.js +378 -10
@@ -0,0 +1,400 @@
1
+ import { expect } from 'chai';
2
+ import { spec } from '../../../modules/andBeyondMediaBidAdapter.js';
3
+ import { BANNER, VIDEO, NATIVE } from '../../../src/mediaTypes.js';
4
+ import { getUniqueIdentifierStr } from '../../../src/utils.js';
5
+
6
+ const bidder = 'beyondmedia'
7
+
8
+ describe('AndBeyondMediaBidAdapter', function () {
9
+ const bids = [
10
+ {
11
+ bidId: getUniqueIdentifierStr(),
12
+ bidder: bidder,
13
+ mediaTypes: {
14
+ [BANNER]: {
15
+ sizes: [[300, 250]]
16
+ }
17
+ },
18
+ params: {
19
+ placementId: 'testBanner',
20
+ }
21
+ },
22
+ {
23
+ bidId: getUniqueIdentifierStr(),
24
+ bidder: bidder,
25
+ mediaTypes: {
26
+ [VIDEO]: {
27
+ playerSize: [[300, 300]],
28
+ minduration: 5,
29
+ maxduration: 60
30
+ }
31
+ },
32
+ params: {
33
+ placementId: 'testVideo',
34
+ }
35
+ },
36
+ {
37
+ bidId: getUniqueIdentifierStr(),
38
+ bidder: bidder,
39
+ mediaTypes: {
40
+ [NATIVE]: {
41
+ native: {
42
+ title: {
43
+ required: true
44
+ },
45
+ body: {
46
+ required: true
47
+ },
48
+ icon: {
49
+ required: true,
50
+ size: [64, 64]
51
+ }
52
+ }
53
+ }
54
+ },
55
+ params: {
56
+ placementId: 'testNative',
57
+ }
58
+ }
59
+ ];
60
+
61
+ const invalidBid = {
62
+ bidId: getUniqueIdentifierStr(),
63
+ bidder: bidder,
64
+ mediaTypes: {
65
+ [BANNER]: {
66
+ sizes: [[300, 250]]
67
+ }
68
+ },
69
+ params: {
70
+
71
+ }
72
+ }
73
+
74
+ const bidderRequest = {
75
+ uspConsent: '1---',
76
+ gdprConsent: 'COvFyGBOvFyGBAbAAAENAPCAAOAAAAAAAAAAAEEUACCKAAA.IFoEUQQgAIQwgIwQABAEAAAAOIAACAIAAAAQAIAgEAACEAAAAAgAQBAAAAAAAGBAAgAAAAAAAFAAECAAAgAAQARAEQAAAAAJAAIAAgAAAYQEAAAQmAgBC3ZAYzUw',
77
+ refererInfo: {
78
+ referer: 'https://test.com'
79
+ }
80
+ };
81
+
82
+ describe('isBidRequestValid', function () {
83
+ it('Should return true if there are bidId, params and key parameters present', function () {
84
+ expect(spec.isBidRequestValid(bids[0])).to.be.true;
85
+ expect(spec.isBidRequestValid(bids[1])).to.be.true;
86
+ expect(spec.isBidRequestValid(bids[2])).to.be.true;
87
+ });
88
+ it('Should return false if at least one of parameters is not present', function () {
89
+ expect(spec.isBidRequestValid(invalidBid)).to.be.false;
90
+ });
91
+ });
92
+
93
+ describe('buildRequests', function () {
94
+ let serverRequest = spec.buildRequests(bids, bidderRequest);
95
+
96
+ it('Creates a ServerRequest object with method, URL and data', function () {
97
+ expect(serverRequest).to.exist;
98
+ expect(serverRequest.method).to.exist;
99
+ expect(serverRequest.url).to.exist;
100
+ expect(serverRequest.data).to.exist;
101
+ });
102
+
103
+ it('Returns POST method', function () {
104
+ expect(serverRequest.method).to.equal('POST');
105
+ });
106
+
107
+ it('Returns valid URL', function () {
108
+ expect(serverRequest.url).to.equal('https://backend.andbeyond.media/pbjs');
109
+ });
110
+
111
+ it('Returns general data valid', function () {
112
+ let data = serverRequest.data;
113
+ expect(data).to.be.an('object');
114
+ expect(data).to.have.all.keys('deviceWidth',
115
+ 'deviceHeight',
116
+ 'language',
117
+ 'secure',
118
+ 'host',
119
+ 'page',
120
+ 'placements',
121
+ 'coppa',
122
+ 'ccpa',
123
+ 'gdpr',
124
+ 'tmax'
125
+ );
126
+ expect(data.deviceWidth).to.be.a('number');
127
+ expect(data.deviceHeight).to.be.a('number');
128
+ expect(data.language).to.be.a('string');
129
+ expect(data.secure).to.be.within(0, 1);
130
+ expect(data.host).to.be.a('string');
131
+ expect(data.page).to.be.a('string');
132
+ expect(data.coppa).to.be.a('number');
133
+ expect(data.gdpr).to.be.a('string');
134
+ expect(data.ccpa).to.be.a('string');
135
+ expect(data.tmax).to.be.a('number');
136
+ expect(data.placements).to.have.lengthOf(3);
137
+ });
138
+
139
+ it('Returns valid placements', function () {
140
+ const { placements } = serverRequest.data;
141
+ for (let i = 0, len = placements.length; i < len; i++) {
142
+ const placement = placements[i];
143
+ expect(placement.placementId).to.be.oneOf(['testBanner', 'testVideo', 'testNative']);
144
+ expect(placement.adFormat).to.be.oneOf([BANNER, VIDEO, NATIVE]);
145
+ expect(placement.bidId).to.be.a('string');
146
+ expect(placement.schain).to.be.an('object');
147
+ expect(placement.bidfloor).to.exist.and.to.equal(0);
148
+ expect(placement.type).to.exist.and.to.equal('publisher');
149
+
150
+ if (placement.adFormat === BANNER) {
151
+ expect(placement.sizes).to.be.an('array');
152
+ }
153
+ switch (placement.adFormat) {
154
+ case BANNER:
155
+ expect(placement.sizes).to.be.an('array');
156
+ break;
157
+ case VIDEO:
158
+ expect(placement.playerSize).to.be.an('array');
159
+ expect(placement.minduration).to.be.an('number');
160
+ expect(placement.maxduration).to.be.an('number');
161
+ break;
162
+ case NATIVE:
163
+ expect(placement.native).to.be.an('object');
164
+ break;
165
+ }
166
+ }
167
+ });
168
+
169
+ it('Returns data with gdprConsent and without uspConsent', function () {
170
+ delete bidderRequest.uspConsent;
171
+ serverRequest = spec.buildRequests(bids, bidderRequest);
172
+ let data = serverRequest.data;
173
+ expect(data.gdpr).to.exist;
174
+ expect(data.gdpr).to.be.a('string');
175
+ expect(data.gdpr).to.equal(bidderRequest.gdprConsent);
176
+ expect(data.ccpa).to.not.exist;
177
+ delete bidderRequest.gdprConsent;
178
+ });
179
+
180
+ it('Returns data with uspConsent and without gdprConsent', function () {
181
+ bidderRequest.uspConsent = '1---';
182
+ delete bidderRequest.gdprConsent;
183
+ serverRequest = spec.buildRequests(bids, bidderRequest);
184
+ let data = serverRequest.data;
185
+ expect(data.ccpa).to.exist;
186
+ expect(data.ccpa).to.be.a('string');
187
+ expect(data.ccpa).to.equal(bidderRequest.uspConsent);
188
+ expect(data.gdpr).to.not.exist;
189
+ });
190
+
191
+ it('Returns empty data if no valid requests are passed', function () {
192
+ serverRequest = spec.buildRequests([], bidderRequest);
193
+ let data = serverRequest.data;
194
+ expect(data.placements).to.be.an('array').that.is.empty;
195
+ });
196
+ });
197
+
198
+ describe('interpretResponse', function () {
199
+ it('Should interpret banner response', function () {
200
+ const banner = {
201
+ body: [{
202
+ mediaType: 'banner',
203
+ width: 300,
204
+ height: 250,
205
+ cpm: 0.4,
206
+ ad: 'Test',
207
+ requestId: '23fhj33i987f',
208
+ ttl: 120,
209
+ creativeId: '2',
210
+ netRevenue: true,
211
+ currency: 'USD',
212
+ dealId: '1',
213
+ meta: {
214
+ advertiserDomains: ['google.com'],
215
+ advertiserId: 1234
216
+ }
217
+ }]
218
+ };
219
+ let bannerResponses = spec.interpretResponse(banner);
220
+ expect(bannerResponses).to.be.an('array').that.is.not.empty;
221
+ let dataItem = bannerResponses[0];
222
+ expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
223
+ 'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
224
+ expect(dataItem.requestId).to.equal(banner.body[0].requestId);
225
+ expect(dataItem.cpm).to.equal(banner.body[0].cpm);
226
+ expect(dataItem.width).to.equal(banner.body[0].width);
227
+ expect(dataItem.height).to.equal(banner.body[0].height);
228
+ expect(dataItem.ad).to.equal(banner.body[0].ad);
229
+ expect(dataItem.ttl).to.equal(banner.body[0].ttl);
230
+ expect(dataItem.creativeId).to.equal(banner.body[0].creativeId);
231
+ expect(dataItem.netRevenue).to.be.true;
232
+ expect(dataItem.currency).to.equal(banner.body[0].currency);
233
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
234
+ });
235
+ it('Should interpret video response', function () {
236
+ const video = {
237
+ body: [{
238
+ vastUrl: 'test.com',
239
+ mediaType: 'video',
240
+ cpm: 0.5,
241
+ requestId: '23fhj33i987f',
242
+ ttl: 120,
243
+ creativeId: '2',
244
+ netRevenue: true,
245
+ currency: 'USD',
246
+ dealId: '1',
247
+ meta: {
248
+ advertiserDomains: ['google.com'],
249
+ advertiserId: 1234
250
+ }
251
+ }]
252
+ };
253
+ let videoResponses = spec.interpretResponse(video);
254
+ expect(videoResponses).to.be.an('array').that.is.not.empty;
255
+
256
+ let dataItem = videoResponses[0];
257
+ expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
258
+ 'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
259
+ expect(dataItem.requestId).to.equal('23fhj33i987f');
260
+ expect(dataItem.cpm).to.equal(0.5);
261
+ expect(dataItem.vastUrl).to.equal('test.com');
262
+ expect(dataItem.ttl).to.equal(120);
263
+ expect(dataItem.creativeId).to.equal('2');
264
+ expect(dataItem.netRevenue).to.be.true;
265
+ expect(dataItem.currency).to.equal('USD');
266
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
267
+ });
268
+ it('Should interpret native response', function () {
269
+ const native = {
270
+ body: [{
271
+ mediaType: 'native',
272
+ native: {
273
+ clickUrl: 'test.com',
274
+ title: 'Test',
275
+ image: 'test.com',
276
+ impressionTrackers: ['test.com'],
277
+ },
278
+ ttl: 120,
279
+ cpm: 0.4,
280
+ requestId: '23fhj33i987f',
281
+ creativeId: '2',
282
+ netRevenue: true,
283
+ currency: 'USD',
284
+ meta: {
285
+ advertiserDomains: ['google.com'],
286
+ advertiserId: 1234
287
+ }
288
+ }]
289
+ };
290
+ let nativeResponses = spec.interpretResponse(native);
291
+ expect(nativeResponses).to.be.an('array').that.is.not.empty;
292
+
293
+ let dataItem = nativeResponses[0];
294
+ expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native', 'meta');
295
+ expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
296
+ expect(dataItem.requestId).to.equal('23fhj33i987f');
297
+ expect(dataItem.cpm).to.equal(0.4);
298
+ expect(dataItem.native.clickUrl).to.equal('test.com');
299
+ expect(dataItem.native.title).to.equal('Test');
300
+ expect(dataItem.native.image).to.equal('test.com');
301
+ expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
302
+ expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
303
+ expect(dataItem.ttl).to.equal(120);
304
+ expect(dataItem.creativeId).to.equal('2');
305
+ expect(dataItem.netRevenue).to.be.true;
306
+ expect(dataItem.currency).to.equal('USD');
307
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
308
+ });
309
+ it('Should return an empty array if invalid banner response is passed', function () {
310
+ const invBanner = {
311
+ body: [{
312
+ width: 300,
313
+ cpm: 0.4,
314
+ ad: 'Test',
315
+ requestId: '23fhj33i987f',
316
+ ttl: 120,
317
+ creativeId: '2',
318
+ netRevenue: true,
319
+ currency: 'USD',
320
+ dealId: '1'
321
+ }]
322
+ };
323
+
324
+ let serverResponses = spec.interpretResponse(invBanner);
325
+ expect(serverResponses).to.be.an('array').that.is.empty;
326
+ });
327
+ it('Should return an empty array if invalid video response is passed', function () {
328
+ const invVideo = {
329
+ body: [{
330
+ mediaType: 'video',
331
+ cpm: 0.5,
332
+ requestId: '23fhj33i987f',
333
+ ttl: 120,
334
+ creativeId: '2',
335
+ netRevenue: true,
336
+ currency: 'USD',
337
+ dealId: '1'
338
+ }]
339
+ };
340
+ let serverResponses = spec.interpretResponse(invVideo);
341
+ expect(serverResponses).to.be.an('array').that.is.empty;
342
+ });
343
+ it('Should return an empty array if invalid native response is passed', function () {
344
+ const invNative = {
345
+ body: [{
346
+ mediaType: 'native',
347
+ clickUrl: 'test.com',
348
+ title: 'Test',
349
+ impressionTrackers: ['test.com'],
350
+ ttl: 120,
351
+ requestId: '23fhj33i987f',
352
+ creativeId: '2',
353
+ netRevenue: true,
354
+ currency: 'USD',
355
+ }]
356
+ };
357
+ let serverResponses = spec.interpretResponse(invNative);
358
+ expect(serverResponses).to.be.an('array').that.is.empty;
359
+ });
360
+ it('Should return an empty array if invalid response is passed', function () {
361
+ const invalid = {
362
+ body: [{
363
+ ttl: 120,
364
+ creativeId: '2',
365
+ netRevenue: true,
366
+ currency: 'USD',
367
+ dealId: '1'
368
+ }]
369
+ };
370
+ let serverResponses = spec.interpretResponse(invalid);
371
+ expect(serverResponses).to.be.an('array').that.is.empty;
372
+ });
373
+ });
374
+
375
+ describe('getUserSyncs', function() {
376
+ it('Should return array of objects with proper sync config , include GDPR', function() {
377
+ const syncData = spec.getUserSyncs({}, {}, {
378
+ consentString: 'ALL',
379
+ gdprApplies: true,
380
+ }, {});
381
+ expect(syncData).to.be.an('array').which.is.not.empty;
382
+ expect(syncData[0]).to.be.an('object')
383
+ expect(syncData[0].type).to.be.a('string')
384
+ expect(syncData[0].type).to.equal('image')
385
+ expect(syncData[0].url).to.be.a('string')
386
+ expect(syncData[0].url).to.equal('https://cookies.andbeyond.media/image?pbjs=1&gdpr=1&gdpr_consent=ALL&coppa=0')
387
+ });
388
+ it('Should return array of objects with proper sync config , include CCPA', function() {
389
+ const syncData = spec.getUserSyncs({}, {}, {}, {
390
+ consentString: '1---'
391
+ });
392
+ expect(syncData).to.be.an('array').which.is.not.empty;
393
+ expect(syncData[0]).to.be.an('object')
394
+ expect(syncData[0].type).to.be.a('string')
395
+ expect(syncData[0].type).to.equal('image')
396
+ expect(syncData[0].url).to.be.a('string')
397
+ expect(syncData[0].url).to.equal('https://cookies.andbeyond.media/image?pbjs=1&ccpa_consent=1---&coppa=0')
398
+ });
399
+ });
400
+ });
@@ -106,7 +106,8 @@ describe('BidWatch Analytics', function () {
106
106
  'gdprConsent': {
107
107
  'consentString': 'CONSENT',
108
108
  'gdprApplies': true,
109
- 'apiVersion': 2
109
+ 'apiVersion': 2,
110
+ 'vendorData': 'a lot of borring stuff',
110
111
  },
111
112
  'start': 1647424261189
112
113
  },
@@ -281,7 +282,22 @@ describe('BidWatch Analytics', function () {
281
282
  });
282
283
  events.emit(constants.EVENTS.BID_TIMEOUT, bidTimeout);
283
284
  events.emit(constants.EVENTS.AUCTION_END, auctionEnd);
285
+ expect(server.requests.length).to.equal(1);
286
+ let message = JSON.parse(server.requests[0].requestBody);
287
+ expect(message).to.have.property('auctionEnd').exist;
288
+ expect(message.auctionEnd).to.have.lengthOf(1);
289
+ expect(message.auctionEnd[0]).to.have.property('bidsReceived').and.to.have.lengthOf(1);
290
+ expect(message.auctionEnd[0].bidsReceived[0]).to.have.property('ad');
291
+ expect(message.auctionEnd[0].bidsReceived[0].ad).to.equal('emptied');
292
+ expect(message.auctionEnd[0]).to.have.property('bidderRequests').and.to.have.lengthOf(1);
293
+ expect(message.auctionEnd[0].bidderRequests[0]).to.have.property('gdprConsent');
294
+ expect(message.auctionEnd[0].bidderRequests[0].gdprConsent).to.have.property('vendorData');
295
+ expect(message.auctionEnd[0].bidderRequests[0].gdprConsent.vendorData).to.equal('emptied');
284
296
  events.emit(constants.EVENTS.BID_WON, bidWon);
297
+ expect(server.requests.length).to.equal(2);
298
+ message = JSON.parse(server.requests[1].requestBody);
299
+ expect(message).to.have.property('ad').and.to.equal('emptied');
300
+ expect(message).to.have.property('cpmIncrement').and.to.equal(27.4276);
285
301
  sinon.assert.callCount(bidwatchAnalytics.track, 3);
286
302
  });
287
303
  });
@@ -0,0 +1,189 @@
1
+ import { expect } from 'chai';
2
+ import { newBidder } from 'src/adapters/bidderFactory';
3
+ import { c1xAdapter } from '../../../modules/c1xBidAdapter.js';
4
+
5
+ const ENDPOINT = 'https://hb-stg.c1exchange.com/ht';
6
+ const BIDDER_CODE = 'c1x';
7
+
8
+ describe('C1XAdapter', () => {
9
+ const adapter = newBidder(c1xAdapter);
10
+ describe('inherited functions', () => {
11
+ it('exists and is a function', () => {
12
+ expect(adapter.callBids).to.exist.and.to.be.a('function');
13
+ });
14
+ });
15
+ describe('isBidRequestValid', () => {
16
+ let bid = {
17
+ 'bidder': BIDDER_CODE,
18
+ 'adUnitCode': 'adunit-code',
19
+ 'sizes': [[300, 250], [300, 600]],
20
+ 'params': {
21
+ 'placementId': 'div-gpt-ad-1654594619717-0'
22
+ }
23
+ };
24
+ it('should return true when required params found', function () {
25
+ expect(c1xAdapter.isBidRequestValid(bid)).to.equal(true);
26
+ });
27
+
28
+ it('should return false when placementId not passed correctly', function () {
29
+ bid.params.placementId = undefined;
30
+ expect(c1xAdapter.isBidRequestValid(bid)).to.equal(false);
31
+ });
32
+
33
+ it('should return false when require params are not passed', function () {
34
+ let bid = Object.assign({}, bid);
35
+ bid.params = {};
36
+ expect(c1xAdapter.isBidRequestValid(bid)).to.equal(false);
37
+ });
38
+ });
39
+ describe('buildRequests', () => {
40
+ let bidRequests = [
41
+ {
42
+ 'bidder': BIDDER_CODE,
43
+ 'params': {
44
+ 'placementId': 'div-gpt-ad-1654594619717-0',
45
+ 'dealId': '1233'
46
+ },
47
+ 'mediaTypes': {
48
+ 'banner': {
49
+ 'sizes': [
50
+ [300, 250], [300, 600]
51
+ ]
52
+ }
53
+ },
54
+ 'adUnitCode': 'adunit-code',
55
+ 'sizes': [[300, 250], [300, 600]],
56
+ 'bidId': '30b31c1838de1e',
57
+ 'bidderRequestId': '22edbae2733bf6',
58
+ 'auctionId': '1d1a030790a475',
59
+ }
60
+ ];
61
+ const parseRequest = (data) => {
62
+ const parsedData = '{"' + data.replace(/=|&/g, (foundChar) => {
63
+ if (foundChar == '=') return '":"';
64
+ else if (foundChar == '&') return '","';
65
+ }) + '"}'
66
+ return parsedData;
67
+ };
68
+ it('sends bid request to ENDPOINT via GET', () => {
69
+ const request = c1xAdapter.buildRequests(bidRequests);
70
+ expect(request[0].url).to.contain(ENDPOINT);
71
+ expect(request[0].method).to.equal('GET');
72
+ });
73
+ it('should generate correct bid Id tag', () => {
74
+ const request = c1xAdapter.buildRequests(bidRequests)[0];
75
+ expect(request.bids[0].adUnitCode).to.equal('adunit-code');
76
+ expect(request.bids[0].bidId).to.equal('30b31c1838de1e');
77
+ });
78
+ it('should convert params to proper form and attach to request', () => {
79
+ const request = c1xAdapter.buildRequests(bidRequests)[0];
80
+ const originalPayload = parseRequest(request.data);
81
+ const payloadObj = JSON.parse(originalPayload);
82
+ expect(payloadObj.adunits).to.equal('1');
83
+ expect(payloadObj.a1s).to.equal('300x250,300x600');
84
+ expect(payloadObj.a1).to.equal('adunit-code');
85
+ expect(payloadObj.a1d).to.equal('1233');
86
+ });
87
+ it('should convert floor price to proper form and attach to request', () => {
88
+ let bidRequest = Object.assign({},
89
+ bidRequests[0],
90
+ {
91
+ 'params': {
92
+ 'placementId': 'div-gpt-ad-1654594619717-0',
93
+ 'dealId': '1233',
94
+ 'floorPriceMap': {
95
+ '300x250': 4.35
96
+ }
97
+ }
98
+ });
99
+ const request = c1xAdapter.buildRequests([bidRequest])[0];
100
+ const originalPayload = parseRequest(request.data);
101
+ const payloadObj = JSON.parse(originalPayload);
102
+ expect(payloadObj.a1p).to.equal('4.35');
103
+ });
104
+ it('should convert pageurl to proper form and attach to request', () => {
105
+ let bidRequest = Object.assign({},
106
+ bidRequests[0],
107
+ {
108
+ 'params': {
109
+ 'placementId': 'div-gpt-ad-1654594619717-0',
110
+ 'dealId': '1233',
111
+ 'pageurl': 'http://c1exchange.com/'
112
+ }
113
+ });
114
+
115
+ let bidderRequest = {
116
+ 'bidderCode': 'c1x'
117
+ }
118
+ bidderRequest.bids = bidRequests;
119
+ const request = c1xAdapter.buildRequests([bidRequest], bidderRequest)[0];
120
+ const originalPayload = parseRequest(request.data);
121
+ const payloadObj = JSON.parse(originalPayload);
122
+ expect(payloadObj.pageurl).to.equal('http://c1exchange.com/');
123
+ });
124
+
125
+ it('should convert GDPR Consent to proper form and attach to request', () => {
126
+ let consentString = 'BOP2gFWOQIFovABABAENBGAAAAAAMw';
127
+ let bidderRequest = {
128
+ 'bidderCode': 'c1x',
129
+ 'gdprConsent': {
130
+ 'consentString': consentString,
131
+ 'gdprApplies': true
132
+ }
133
+ }
134
+ bidderRequest.bids = bidRequests;
135
+
136
+ const request = c1xAdapter.buildRequests(bidRequests, bidderRequest)[0];
137
+ const originalPayload = parseRequest(request.data);
138
+ const payloadObj = JSON.parse(originalPayload);
139
+ expect(payloadObj['consent_string']).to.equal('BOP2gFWOQIFovABABAENBGAAAAAAMw');
140
+ expect(payloadObj['consent_required']).to.equal('true');
141
+ });
142
+ });
143
+
144
+ describe('interpretResponse', () => {
145
+ let response = {
146
+ 'bid': true,
147
+ 'cpm': 1.5,
148
+ 'ad': '<!-- Creative -->',
149
+ 'width': 300,
150
+ 'height': 250,
151
+ 'crid': '8888',
152
+ 'adId': 'c1x-test',
153
+ 'bidType': 'GROSS_BID'
154
+ };
155
+ it('should get correct bid response', () => {
156
+ let expectedResponse = [
157
+ {
158
+ width: 300,
159
+ height: 250,
160
+ cpm: 1.5,
161
+ ad: '<!-- Creative -->',
162
+ creativeId: '8888',
163
+ currency: 'USD',
164
+ ttl: 300,
165
+ netRevenue: false,
166
+ requestId: 'yyyy'
167
+ }
168
+ ];
169
+ let bidderRequest = {};
170
+ bidderRequest.bids = [
171
+ {
172
+ adUnitCode: 'c1x-test',
173
+ bidId: 'yyyy'
174
+ }
175
+ ];
176
+ let result = c1xAdapter.interpretResponse({ body: [response] }, bidderRequest);
177
+ expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
178
+ });
179
+ it('handles nobid responses', () => {
180
+ let response = {
181
+ bid: false,
182
+ adId: 'c1x-test'
183
+ };
184
+ let bidderRequest = {};
185
+ let result = c1xAdapter.interpretResponse({ body: [response] }, bidderRequest);
186
+ expect(result.length).to.equal(0);
187
+ });
188
+ });
189
+ });
@@ -248,7 +248,7 @@ describe('Improve Digital Adapter Tests', function () {
248
248
  {
249
249
  id: '33e9500b21129f',
250
250
  native: {
251
- request: '{"assets":[{"id":3,"required":1,"data":{"type":2}}]}',
251
+ request: '{"eventtrackers":[{"event":1,"methods":[1,2]}],"assets":[{"id":3,"required":1,"data":{"type":2}}]}',
252
252
  ver: '1.2'
253
253
  },
254
254
  secure: 0,
@@ -277,7 +277,7 @@ describe('Improve Digital Adapter Tests', function () {
277
277
  const payload = JSON.parse(spec.buildRequests([nativeBidRequest], {})[0].data);
278
278
  expect(payload.imp[0].native).to.deep.equal({
279
279
  ver: '1.2',
280
- request: '{\"assets\":[{\"id\":0,\"required\":1,\"title\":{\"len\":140}},{\"id\":3,\"required\":1,\"data\":{\"type\":2}}]}'
280
+ request: '{"eventtrackers":[{"event":1,"methods":[1,2]}],"assets":[{"id":0,"required":1,"title":{"len":140}},{"id":3,"required":1,"data":{"type":2}}]}'
281
281
  });
282
282
  });
283
283
 
@@ -299,7 +299,7 @@ describe('Improve Digital Adapter Tests', function () {
299
299
  const payload = JSON.parse(spec.buildRequests([nativeBidRequest], {})[0].data);
300
300
  expect(payload.imp[0].native).to.deep.equal({
301
301
  ver: '1.2',
302
- request: '{\"assets\":[{\"id\":0,\"required\":1,\"title\":{\"len\":140}},{\"id\":3,\"required\":1,\"data\":{\"type\":2}}]}'
302
+ request: '{"eventtrackers":[{"event":1,"methods":[1,2]}],"assets":[{"id":0,"required":1,"title":{"len":140}},{"id":3,"required":1,"data":{"type":2}}]}'
303
303
  });
304
304
  });
305
305
 
@@ -930,7 +930,7 @@ describe('Improve Digital Adapter Tests', function () {
930
930
  'exp': 120,
931
931
  'id': '52098fad-20c1-476b-a4fa-41e275e5a4a5',
932
932
  'price': 1.8600000000000003,
933
- 'adm': "{\"ver\":\"1.1\",\"imptrackers\":[\"https://secure.adnxs.com/imptr?id=52311&t=2\",\"https://euw-ice.360yield.com/imp_pixel?ic=hcUBlCANx1FabHBf6FR2gC7UO4xEyXahdZAn0-B5qL-bb3A74BJ1smyWIyW7IWcC0SOjSXzVpevTHXxTqJ.sf.Qhahyy6tSo.0j1QWfXlH8sM4-8vKWjMjw-x.IrJJNlwkQ0s1CdwcwTefcLXm5l2E-W19VhACuV7f3mgrZMNjiSw.SjJAfyPC3SIyAMRjYfj53UmjriQ46T7lhmkqxK8wHmksYCdbZc3PZESk8NWl28sxdjNvnYYCFMcJbeav.LOLabyTXfwy-1cEPbQs.IKMRZIKaqccTDPV3wOtzbNv0jQzatd3Nnv-PGFQcjQ-GW3i27W04Fws4kodpFSn-B6VwZAjzLzoyd5gBncyRnAyCplEbgHU5sZ1IyKHWjgCl3ZtRIK5vqrRD5D-xqgSnOi7-phG.CqZWDZ4bMDSfQg2ZnbvUTyGKcEl0WR59dW5izTMV4Fjizcrvr5T-t.zMbGwz.hGnmLIyhTqh.IcwW.GiDLVExlDlix5S1LXIWVsSyrQ==\"],\"assets\":[{\"id\":1,\"data\":{\"value\":\"ImproveDigital\",\"type\":1}},{\"id\":3,\"data\":{\"value\":\"Test content.\",\"type\":2}},{\"id\":0,\"title\":{\"text\":\"Sample Prebid Test Title\"}}],\"link\":{\"url\":\"https://euw-ice.360yield.com/click/hcUBlHOV7YhVse8RyBa0ajjyPa9Vt17e4g-1m3cRj3E67vq-RYux.SiUeAmBfNBcoOqkUc6A15AWmi4yFu5K-BdkaYjildyyk7fNLyR6hWr411kv4vrFwm5jrIBceuHS6K8oN69f.uCo8zGTdR2TbSlldwcpahQPlufZU.6VaMsu4IC53uEiUT5vb7kAw6TTlxuGBNq6zaGryiWEV2.N3YYJDTyYPh8tv-ZFyeFZFm0Gnjv.xWbC.70JcRUVU9UelQaPsTpTWYTXBhJt84YJUw1-GNtaLNVLSjjZbVoA2fsMti5p6OBmF.7u39on2OPgvseIkSmge7Pqg63pRqdP75hp.DAEk6OkcN1jGnwP2DSbvpaSbin5lVqjfO0B-wnQgfQTCUtM5v4JmkNweLhUf9Q-x.nPKLW5SccEk9ZFXzY2-1wpT3PWm8Tix3NRscLPZub9wHzL..pl6ip8cQ9hp16UjwT4H6RMAxL0R7bl-h2pAicGAzYmuO7ntRESKUoIWA==//http%3A%2F%2Fquantum-advertising.com%2Ffr%2F\"},\"jstracker\":\"<script type=\\\"application/javascript\\\">var js_tracker = ['https://secure.adnxs.com/imptr?id=52312&t=1', 'https://pixel.adsafeprotected.com/rjss/st/291611/36974035/skeleton.js?ias_adpath=[class~=ea_improve_pid_${TAG_ID}]']</script>\"}",
933
+ 'adm': '{"ver":"1.1","imptrackers":["https://secure.adnxs.com/imptr?id=52311&t=2","https://euw-ice.360yield.com/imp_pixel?ic=hcUBlCANx1FabHBf6FR2gC7UO4xEyXahdZAn0-B5qL-bb3A74BJ1smyWIyW7IWcC0SOjSXzVpevTHXxTqJ.sf.Qhahyy6tSo.0j1QWfXlH8sM4-8vKWjMjw-x.IrJJNlwkQ0s1CdwcwTefcLXm5l2E-W19VhACuV7f3mgrZMNjiSw.SjJAfyPC3SIyAMRjYfj53UmjriQ46T7lhmkqxK8wHmksYCdbZc3PZESk8NWl28sxdjNvnYYCFMcJbeav.LOLabyTXfwy-1cEPbQs.IKMRZIKaqccTDPV3wOtzbNv0jQzatd3Nnv-PGFQcjQ-GW3i27W04Fws4kodpFSn-B6VwZAjzLzoyd5gBncyRnAyCplEbgHU5sZ1IyKHWjgCl3ZtRIK5vqrRD5D-xqgSnOi7-phG.CqZWDZ4bMDSfQg2ZnbvUTyGKcEl0WR59dW5izTMV4Fjizcrvr5T-t.zMbGwz.hGnmLIyhTqh.IcwW.GiDLVExlDlix5S1LXIWVsSyrQ=="],"assets":[{"id":1,"data":{"value":"ImproveDigital","type":1}},{"id":3,"data":{"value":"Test content.","type":2}},{"id":0,"title":{"text":"Sample Prebid Test Title"}}],"link":{"url":"https://euw-ice.360yield.com/click/hcUBlHOV7YhVse8RyBa0ajjyPa9Vt17e4g-1m3cRj3E67vq-RYux.SiUeAmBfNBcoOqkUc6A15AWmi4yFu5K-BdkaYjildyyk7fNLyR6hWr411kv4vrFwm5jrIBceuHS6K8oN69f.uCo8zGTdR2TbSlldwcpahQPlufZU.6VaMsu4IC53uEiUT5vb7kAw6TTlxuGBNq6zaGryiWEV2.N3YYJDTyYPh8tv-ZFyeFZFm0Gnjv.xWbC.70JcRUVU9UelQaPsTpTWYTXBhJt84YJUw1-GNtaLNVLSjjZbVoA2fsMti5p6OBmF.7u39on2OPgvseIkSmge7Pqg63pRqdP75hp.DAEk6OkcN1jGnwP2DSbvpaSbin5lVqjfO0B-wnQgfQTCUtM5v4JmkNweLhUf9Q-x.nPKLW5SccEk9ZFXzY2-1wpT3PWm8Tix3NRscLPZub9wHzL..pl6ip8cQ9hp16UjwT4H6RMAxL0R7bl-h2pAicGAzYmuO7ntRESKUoIWA==//http%3A%2F%2Fquantum-advertising.com%2Ffr%2F"},"jstracker":"<script type=\\"application/javascript\\">var js_tracker = [\\"https://secure.adnxs.com/imptr?id=52312&t=1\\", \\"https://pixel.adsafeprotected.com/rjss/st/291611/36974035/skeleton.js?ias_adpath=[class~=ea_improve_pid_${TAG_ID}]\\"]</script>"}',
934
934
  'impid': '33e9500b21129f',
935
935
  'cid': '196108'
936
936
  }