prebid.js 7.31.0 → 7.32.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 (180) 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/adlooxRtdProvider.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/aidemBidAdapter.js +1 -1
  11. package/dist/ajaBidAdapter.js +1 -1
  12. package/dist/alkimiBidAdapter.js +1 -1
  13. package/dist/amxBidAdapter.js +1 -1
  14. package/dist/amxIdSystem.js +1 -1
  15. package/dist/aolBidAdapter.js +1 -1
  16. package/dist/appierAnalyticsAdapter.js +1 -1
  17. package/dist/appnexusBidAdapter.js +1 -1
  18. package/dist/appushBidAdapter.js +1 -0
  19. package/dist/asoBidAdapter.js +1 -1
  20. package/dist/axonixBidAdapter.js +1 -1
  21. package/dist/bidglassBidAdapter.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/concertBidAdapter.js +1 -1
  28. package/dist/connectIdSystem.js +1 -1
  29. package/dist/connectadBidAdapter.js +1 -1
  30. package/dist/consumableBidAdapter.js +1 -1
  31. package/dist/conversantBidAdapter.js +1 -1
  32. package/dist/craftBidAdapter.js +1 -1
  33. package/dist/criteoBidAdapter.js +1 -1
  34. package/dist/dspxBidAdapter.js +1 -1
  35. package/dist/eplanningBidAdapter.js +1 -1
  36. package/dist/feedadBidAdapter.js +1 -1
  37. package/dist/finativeBidAdapter.js +1 -1
  38. package/dist/glimpseBidAdapter.js +1 -1
  39. package/dist/gmosspBidAdapter.js +1 -1
  40. package/dist/goldbachBidAdapter.js +1 -1
  41. package/dist/gridBidAdapter.js +1 -1
  42. package/dist/gridNMBidAdapter.js +1 -1
  43. package/dist/gumgumBidAdapter.js +1 -1
  44. package/dist/h12mediaBidAdapter.js +1 -1
  45. package/dist/holidBidAdapter.js +1 -0
  46. package/dist/id5IdSystem.js +1 -1
  47. package/dist/improvedigitalBidAdapter.js +1 -1
  48. package/dist/inmarBidAdapter.js +1 -1
  49. package/dist/insticatorBidAdapter.js +1 -1
  50. package/dist/ixBidAdapter.js +1 -1
  51. package/dist/justpremiumBidAdapter.js +1 -1
  52. package/dist/jwplayerVideoProvider.js +1 -1
  53. package/dist/konduitAnalyticsAdapter.js +1 -1
  54. package/dist/kueezBidAdapter.js +1 -1
  55. package/dist/kueezRtbBidAdapter.js +1 -1
  56. package/dist/lassoBidAdapter.js +1 -1
  57. package/dist/lifestreetBidAdapter.js +1 -1
  58. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  59. package/dist/logicadBidAdapter.js +1 -1
  60. package/dist/loglyliftBidAdapter.js +1 -1
  61. package/dist/magniteAnalyticsAdapter.js +1 -1
  62. package/dist/malltvAnalyticsAdapter.js +1 -1
  63. package/dist/marsmediaBidAdapter.js +1 -1
  64. package/dist/mediafuseBidAdapter.js +1 -1
  65. package/dist/medianetRtdProvider.js +1 -1
  66. package/dist/mediasquareBidAdapter.js +1 -1
  67. package/dist/mgidBidAdapter.js +1 -1
  68. package/dist/minutemediaBidAdapter.js +1 -1
  69. package/dist/nexx360BidAdapter.js +1 -1
  70. package/dist/not-for-prod/prebid.js +126 -123
  71. package/dist/oguryBidAdapter.js +1 -1
  72. package/dist/onetagBidAdapter.js +1 -1
  73. package/dist/ooloAnalyticsAdapter.js +1 -1
  74. package/dist/orbitsoftBidAdapter.js +1 -0
  75. package/dist/outbrainBidAdapter.js +1 -1
  76. package/dist/parrableIdSystem.js +1 -1
  77. package/dist/permutiveRtdProvider.js +1 -1
  78. package/dist/pixfutureBidAdapter.js +1 -1
  79. package/dist/prebid-core.js +1 -1
  80. package/dist/publinkIdSystem.js +1 -1
  81. package/dist/pubmaticBidAdapter.js +1 -1
  82. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  83. package/dist/pxyzBidAdapter.js +1 -1
  84. package/dist/quantcastBidAdapter.js +1 -1
  85. package/dist/readpeakBidAdapter.js +1 -1
  86. package/dist/relaidoBidAdapter.js +1 -1
  87. package/dist/rhythmoneBidAdapter.js +1 -1
  88. package/dist/riseBidAdapter.js +1 -1
  89. package/dist/rubiconAnalyticsAdapter.js +1 -1
  90. package/dist/rubiconBidAdapter.js +1 -1
  91. package/dist/seedingAllianceBidAdapter.js +1 -1
  92. package/dist/seedtagBidAdapter.js +1 -1
  93. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  94. package/dist/sharethroughBidAdapter.js +1 -1
  95. package/dist/shinezBidAdapter.js +1 -1
  96. package/dist/smaatoBidAdapter.js +1 -1
  97. package/dist/smartadserverBidAdapter.js +1 -1
  98. package/dist/smartxBidAdapter.js +1 -1
  99. package/dist/smilewantedBidAdapter.js +1 -1
  100. package/dist/sonobiBidAdapter.js +1 -1
  101. package/dist/sovrnAnalyticsAdapter.js +1 -1
  102. package/dist/sovrnBidAdapter.js +1 -1
  103. package/dist/sspBCBidAdapter.js +1 -1
  104. package/dist/sublimeBidAdapter.js +1 -1
  105. package/dist/synacormediaBidAdapter.js +1 -1
  106. package/dist/taboolaBidAdapter.js +1 -1
  107. package/dist/targetVideoBidAdapter.js +1 -1
  108. package/dist/teadsBidAdapter.js +1 -1
  109. package/dist/trionBidAdapter.js +1 -1
  110. package/dist/tripleliftBidAdapter.js +1 -1
  111. package/dist/ttdBidAdapter.js +1 -1
  112. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  113. package/dist/uid2IdSystem.js +1 -1
  114. package/dist/underdogmediaBidAdapter.js +1 -1
  115. package/dist/undertoneBidAdapter.js +1 -1
  116. package/dist/vidazooBidAdapter.js +1 -1
  117. package/dist/videobyteBidAdapter.js +1 -1
  118. package/dist/visxBidAdapter.js +1 -1
  119. package/dist/vuukleBidAdapter.js +1 -1
  120. package/dist/widespaceBidAdapter.js +1 -1
  121. package/dist/winrBidAdapter.js +1 -1
  122. package/dist/yahoosspBidAdapter.js +1 -1
  123. package/dist/yieldlabBidAdapter.js +1 -1
  124. package/dist/yieldmoBidAdapter.js +1 -1
  125. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  126. package/integrationExamples/gpt/adloox.html +5 -0
  127. package/modules/adagioBidAdapter.js +0 -4
  128. package/modules/adagioBidAdapter.md +4 -22
  129. package/modules/adlooxAnalyticsAdapter.md +5 -3
  130. package/modules/adlooxRtdProvider.js +82 -278
  131. package/modules/adlooxRtdProvider.md +6 -6
  132. package/modules/aidemBidAdapter.js +4 -0
  133. package/modules/aidemBidAdapter.md +1 -0
  134. package/modules/alkimiBidAdapter.js +23 -6
  135. package/modules/aolBidAdapter.js +12 -0
  136. package/modules/appnexusBidAdapter.js +2 -2
  137. package/modules/appushBidAdapter.js +188 -0
  138. package/modules/appushBidAdapter.md +79 -0
  139. package/modules/asoBidAdapter.js +8 -5
  140. package/modules/confiantRtdProvider.js +1 -1
  141. package/modules/connectIdSystem.js +15 -1
  142. package/modules/feedadBidAdapter.js +7 -5
  143. package/modules/holidBidAdapter.js +170 -0
  144. package/modules/holidBidAdapter.md +36 -0
  145. package/modules/jwplayerVideoProvider.js +10 -3
  146. package/modules/kueezRtbBidAdapter.js +21 -8
  147. package/modules/medianetRtdProvider.js +4 -4
  148. package/modules/nexx360BidAdapter.js +5 -7
  149. package/modules/orbitsoftBidAdapter.js +150 -0
  150. package/modules/permutiveRtdProvider.js +1 -1
  151. package/modules/riseBidAdapter.js +2 -1
  152. package/modules/riseBidAdapter.md +2 -0
  153. package/modules/seedtagBidAdapter.js +12 -0
  154. package/modules/smartxBidAdapter.js +6 -0
  155. package/modules/taboolaBidAdapter.js +61 -14
  156. package/modules/yahoosspBidAdapter.js +5 -0
  157. package/modules/yieldlabBidAdapter.js +150 -134
  158. package/modules/yieldmoBidAdapter.js +1 -12
  159. package/package.json +1 -1
  160. package/test/spec/modules/adagioBidAdapter_spec.js +1 -28
  161. package/test/spec/modules/adlooxRtdProvider_spec.js +28 -120
  162. package/test/spec/modules/aidemBidAdapter_spec.js +10 -2
  163. package/test/spec/modules/alkimiBidAdapter_spec.js +15 -3
  164. package/test/spec/modules/aolBidAdapter_spec.js +22 -0
  165. package/test/spec/modules/appnexusBidAdapter_spec.js +7 -3
  166. package/test/spec/modules/appushBidAdapter_spec.js +372 -0
  167. package/test/spec/modules/connectIdSystem_spec.js +17 -5
  168. package/test/spec/modules/feedadBidAdapter_spec.js +23 -1
  169. package/test/spec/modules/holidBidAdapter_spec.js +165 -0
  170. package/test/spec/modules/kueezRtbBidAdapter_spec.js +147 -24
  171. package/test/spec/modules/medianetRtdProvider_spec.js +3 -3
  172. package/test/spec/modules/orbitsoftBidAdapter_spec.js +255 -0
  173. package/test/spec/modules/riseBidAdapter_spec.js +7 -0
  174. package/test/spec/modules/seedtagBidAdapter_spec.js +56 -10
  175. package/test/spec/modules/smartxBidAdapter_spec.js +10 -0
  176. package/test/spec/modules/taboolaBidAdapter_spec.js +142 -5
  177. package/test/spec/modules/videoModule/submodules/jwplayerVideoProvider_spec.js +45 -10
  178. package/test/spec/modules/yahoosspBidAdapter_spec.js +16 -1
  179. package/test/spec/modules/yieldlabBidAdapter_spec.js +311 -301
  180. package/test/spec/modules/yieldmoBidAdapter_spec.js +70 -0
@@ -0,0 +1,372 @@
1
+ import { expect } from 'chai';
2
+ import { spec } from '../../../modules/appushBidAdapter.js';
3
+ import { BANNER, VIDEO, NATIVE } from '../../../src/mediaTypes.js';
4
+ import { getUniqueIdentifierStr } from '../../../src/utils.js';
5
+
6
+ const bidder = 'appush'
7
+
8
+ describe('AppushBidAdapter', 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
+ });
86
+ it('Should return false if at least one of parameters is not present', function () {
87
+ expect(spec.isBidRequestValid(invalidBid)).to.be.false;
88
+ });
89
+ });
90
+
91
+ describe('buildRequests', function () {
92
+ let serverRequest = spec.buildRequests(bids, bidderRequest);
93
+
94
+ it('Creates a ServerRequest object with method, URL and data', function () {
95
+ expect(serverRequest).to.exist;
96
+ expect(serverRequest.method).to.exist;
97
+ expect(serverRequest.url).to.exist;
98
+ expect(serverRequest.data).to.exist;
99
+ });
100
+
101
+ it('Returns POST method', function () {
102
+ expect(serverRequest.method).to.equal('POST');
103
+ });
104
+
105
+ it('Returns valid URL', function () {
106
+ expect(serverRequest.url).to.equal('https://hb.appush.com/pbjs');
107
+ });
108
+
109
+ it('Returns general data valid', function () {
110
+ let data = serverRequest.data;
111
+ expect(data).to.be.an('object');
112
+ expect(data).to.have.all.keys('deviceWidth',
113
+ 'deviceHeight',
114
+ 'language',
115
+ 'secure',
116
+ 'host',
117
+ 'page',
118
+ 'placements',
119
+ 'coppa',
120
+ 'ccpa',
121
+ 'gdpr',
122
+ 'tmax'
123
+ );
124
+ expect(data.deviceWidth).to.be.a('number');
125
+ expect(data.deviceHeight).to.be.a('number');
126
+ expect(data.language).to.be.a('string');
127
+ expect(data.secure).to.be.within(0, 1);
128
+ expect(data.host).to.be.a('string');
129
+ expect(data.page).to.be.a('string');
130
+ expect(data.coppa).to.be.a('number');
131
+ expect(data.gdpr).to.be.a('string');
132
+ expect(data.ccpa).to.be.a('string');
133
+ expect(data.tmax).to.be.a('number');
134
+ expect(data.placements).to.have.lengthOf(3);
135
+ });
136
+
137
+ it('Returns valid placements', function () {
138
+ const { placements } = serverRequest.data;
139
+ for (let i = 0, len = placements.length; i < len; i++) {
140
+ const placement = placements[i];
141
+ expect(placement.placementId).to.be.oneOf(['testBanner', 'testVideo', 'testNative']);
142
+ expect(placement.adFormat).to.be.oneOf([BANNER, VIDEO, NATIVE]);
143
+ expect(placement.bidId).to.be.a('string');
144
+ expect(placement.schain).to.be.an('object');
145
+ expect(placement.bidfloor).to.exist.and.to.equal(0);
146
+ expect(placement.type).to.exist.and.to.equal('publisher');
147
+
148
+ if (placement.adFormat === BANNER) {
149
+ expect(placement.sizes).to.be.an('array');
150
+ }
151
+ switch (placement.adFormat) {
152
+ case BANNER:
153
+ expect(placement.sizes).to.be.an('array');
154
+ break;
155
+ case VIDEO:
156
+ expect(placement.playerSize).to.be.an('array');
157
+ expect(placement.minduration).to.be.an('number');
158
+ expect(placement.maxduration).to.be.an('number');
159
+ break;
160
+ case NATIVE:
161
+ expect(placement.native).to.be.an('object');
162
+ break;
163
+ }
164
+ }
165
+ });
166
+
167
+ it('Returns data with gdprConsent and without uspConsent', function () {
168
+ delete bidderRequest.uspConsent;
169
+ serverRequest = spec.buildRequests(bids, bidderRequest);
170
+ let data = serverRequest.data;
171
+ expect(data.gdpr).to.exist;
172
+ expect(data.gdpr).to.be.a('string');
173
+ expect(data.gdpr).to.equal(bidderRequest.gdprConsent);
174
+ expect(data.ccpa).to.not.exist;
175
+ delete bidderRequest.gdprConsent;
176
+ });
177
+
178
+ it('Returns data with uspConsent and without gdprConsent', function () {
179
+ bidderRequest.uspConsent = '1---';
180
+ delete bidderRequest.gdprConsent;
181
+ serverRequest = spec.buildRequests(bids, bidderRequest);
182
+ let data = serverRequest.data;
183
+ expect(data.ccpa).to.exist;
184
+ expect(data.ccpa).to.be.a('string');
185
+ expect(data.ccpa).to.equal(bidderRequest.uspConsent);
186
+ expect(data.gdpr).to.not.exist;
187
+ });
188
+
189
+ it('Returns empty data if no valid requests are passed', function () {
190
+ serverRequest = spec.buildRequests([], bidderRequest);
191
+ let data = serverRequest.data;
192
+ expect(data.placements).to.be.an('array').that.is.empty;
193
+ });
194
+ });
195
+
196
+ describe('interpretResponse', function () {
197
+ it('Should interpret banner response', function () {
198
+ const banner = {
199
+ body: [{
200
+ mediaType: 'banner',
201
+ width: 300,
202
+ height: 250,
203
+ cpm: 0.4,
204
+ ad: 'Test',
205
+ requestId: '23fhj33i987f',
206
+ ttl: 120,
207
+ creativeId: '2',
208
+ netRevenue: true,
209
+ currency: 'USD',
210
+ dealId: '1',
211
+ meta: {
212
+ advertiserDomains: ['google.com'],
213
+ advertiserId: 1234
214
+ }
215
+ }]
216
+ };
217
+ let bannerResponses = spec.interpretResponse(banner);
218
+ expect(bannerResponses).to.be.an('array').that.is.not.empty;
219
+ let dataItem = bannerResponses[0];
220
+ expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
221
+ 'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
222
+ expect(dataItem.requestId).to.equal(banner.body[0].requestId);
223
+ expect(dataItem.cpm).to.equal(banner.body[0].cpm);
224
+ expect(dataItem.width).to.equal(banner.body[0].width);
225
+ expect(dataItem.height).to.equal(banner.body[0].height);
226
+ expect(dataItem.ad).to.equal(banner.body[0].ad);
227
+ expect(dataItem.ttl).to.equal(banner.body[0].ttl);
228
+ expect(dataItem.creativeId).to.equal(banner.body[0].creativeId);
229
+ expect(dataItem.netRevenue).to.be.true;
230
+ expect(dataItem.currency).to.equal(banner.body[0].currency);
231
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
232
+ });
233
+ it('Should interpret video response', function () {
234
+ const video = {
235
+ body: [{
236
+ vastUrl: 'test.com',
237
+ mediaType: 'video',
238
+ cpm: 0.5,
239
+ requestId: '23fhj33i987f',
240
+ ttl: 120,
241
+ creativeId: '2',
242
+ netRevenue: true,
243
+ currency: 'USD',
244
+ dealId: '1',
245
+ meta: {
246
+ advertiserDomains: ['google.com'],
247
+ advertiserId: 1234
248
+ }
249
+ }]
250
+ };
251
+ let videoResponses = spec.interpretResponse(video);
252
+ expect(videoResponses).to.be.an('array').that.is.not.empty;
253
+
254
+ let dataItem = videoResponses[0];
255
+ expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
256
+ 'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
257
+ expect(dataItem.requestId).to.equal('23fhj33i987f');
258
+ expect(dataItem.cpm).to.equal(0.5);
259
+ expect(dataItem.vastUrl).to.equal('test.com');
260
+ expect(dataItem.ttl).to.equal(120);
261
+ expect(dataItem.creativeId).to.equal('2');
262
+ expect(dataItem.netRevenue).to.be.true;
263
+ expect(dataItem.currency).to.equal('USD');
264
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
265
+ });
266
+ it('Should interpret native response', function () {
267
+ const native = {
268
+ body: [{
269
+ mediaType: 'native',
270
+ native: {
271
+ clickUrl: 'test.com',
272
+ title: 'Test',
273
+ image: 'test.com',
274
+ impressionTrackers: ['test.com'],
275
+ },
276
+ ttl: 120,
277
+ cpm: 0.4,
278
+ requestId: '23fhj33i987f',
279
+ creativeId: '2',
280
+ netRevenue: true,
281
+ currency: 'USD',
282
+ meta: {
283
+ advertiserDomains: ['google.com'],
284
+ advertiserId: 1234
285
+ }
286
+ }]
287
+ };
288
+ let nativeResponses = spec.interpretResponse(native);
289
+ expect(nativeResponses).to.be.an('array').that.is.not.empty;
290
+
291
+ let dataItem = nativeResponses[0];
292
+ expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native', 'meta');
293
+ expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
294
+ expect(dataItem.requestId).to.equal('23fhj33i987f');
295
+ expect(dataItem.cpm).to.equal(0.4);
296
+ expect(dataItem.native.clickUrl).to.equal('test.com');
297
+ expect(dataItem.native.title).to.equal('Test');
298
+ expect(dataItem.native.image).to.equal('test.com');
299
+ expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
300
+ expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
301
+ expect(dataItem.ttl).to.equal(120);
302
+ expect(dataItem.creativeId).to.equal('2');
303
+ expect(dataItem.netRevenue).to.be.true;
304
+ expect(dataItem.currency).to.equal('USD');
305
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
306
+ });
307
+ it('Should return an empty array if invalid banner response is passed', function () {
308
+ const invBanner = {
309
+ body: [{
310
+ width: 300,
311
+ cpm: 0.4,
312
+ ad: 'Test',
313
+ requestId: '23fhj33i987f',
314
+ ttl: 120,
315
+ creativeId: '2',
316
+ netRevenue: true,
317
+ currency: 'USD',
318
+ dealId: '1'
319
+ }]
320
+ };
321
+
322
+ let serverResponses = spec.interpretResponse(invBanner);
323
+ expect(serverResponses).to.be.an('array').that.is.empty;
324
+ });
325
+ it('Should return an empty array if invalid video response is passed', function () {
326
+ const invVideo = {
327
+ body: [{
328
+ mediaType: 'video',
329
+ cpm: 0.5,
330
+ requestId: '23fhj33i987f',
331
+ ttl: 120,
332
+ creativeId: '2',
333
+ netRevenue: true,
334
+ currency: 'USD',
335
+ dealId: '1'
336
+ }]
337
+ };
338
+ let serverResponses = spec.interpretResponse(invVideo);
339
+ expect(serverResponses).to.be.an('array').that.is.empty;
340
+ });
341
+ it('Should return an empty array if invalid native response is passed', function () {
342
+ const invNative = {
343
+ body: [{
344
+ mediaType: 'native',
345
+ clickUrl: 'test.com',
346
+ title: 'Test',
347
+ impressionTrackers: ['test.com'],
348
+ ttl: 120,
349
+ requestId: '23fhj33i987f',
350
+ creativeId: '2',
351
+ netRevenue: true,
352
+ currency: 'USD',
353
+ }]
354
+ };
355
+ let serverResponses = spec.interpretResponse(invNative);
356
+ expect(serverResponses).to.be.an('array').that.is.empty;
357
+ });
358
+ it('Should return an empty array if invalid response is passed', function () {
359
+ const invalid = {
360
+ body: [{
361
+ ttl: 120,
362
+ creativeId: '2',
363
+ netRevenue: true,
364
+ currency: 'USD',
365
+ dealId: '1'
366
+ }]
367
+ };
368
+ let serverResponses = spec.interpretResponse(invalid);
369
+ expect(serverResponses).to.be.an('array').that.is.empty;
370
+ });
371
+ });
372
+ });
@@ -31,7 +31,11 @@ describe('Yahoo ConnectID Submodule', () => {
31
31
  gdprApplies: 1,
32
32
  consentString: 'GDPR_CONSENT_STRING'
33
33
  },
34
- uspConsent: 'USP_CONSENT_STRING'
34
+ uspConsent: 'USP_CONSENT_STRING',
35
+ gppConsent: {
36
+ gppString: 'header~section6~section7',
37
+ applicableSections: [6, 7]
38
+ }
35
39
  };
36
40
  });
37
41
 
@@ -157,7 +161,9 @@ describe('Yahoo ConnectID Submodule', () => {
157
161
  '1p': '0',
158
162
  gdpr: '1',
159
163
  gdpr_consent: consentData.gdpr.consentString,
160
- us_privacy: consentData.uspConsent
164
+ us_privacy: consentData.uspConsent,
165
+ gpp: consentData.gppConsent.gppString,
166
+ gpp_sid: '6%2C7'
161
167
  };
162
168
  const requestQueryParams = parseQS(ajaxStub.firstCall.args[0].split('?')[1]);
163
169
 
@@ -178,7 +184,9 @@ describe('Yahoo ConnectID Submodule', () => {
178
184
  '1p': '0',
179
185
  gdpr: '1',
180
186
  gdpr_consent: consentData.gdpr.consentString,
181
- us_privacy: consentData.uspConsent
187
+ us_privacy: consentData.uspConsent,
188
+ gpp: consentData.gppConsent.gppString,
189
+ gpp_sid: '6%2C7'
182
190
  };
183
191
  const requestQueryParams = parseQS(ajaxStub.firstCall.args[0].split('?')[1]);
184
192
 
@@ -201,7 +209,9 @@ describe('Yahoo ConnectID Submodule', () => {
201
209
  '1p': '0',
202
210
  gdpr: '1',
203
211
  gdpr_consent: consentData.gdpr.consentString,
204
- us_privacy: consentData.uspConsent
212
+ us_privacy: consentData.uspConsent,
213
+ gpp: consentData.gppConsent.gppString,
214
+ gpp_sid: '6%2C7'
205
215
  };
206
216
  const requestQueryParams = parseQS(ajaxStub.firstCall.args[0].split('?')[1]);
207
217
 
@@ -221,7 +231,9 @@ describe('Yahoo ConnectID Submodule', () => {
221
231
  '1p': '0',
222
232
  gdpr: '1',
223
233
  gdpr_consent: consentData.gdpr.consentString,
224
- us_privacy: consentData.uspConsent
234
+ us_privacy: consentData.uspConsent,
235
+ gpp: consentData.gppConsent.gppString,
236
+ gpp_sid: '6%2C7'
225
237
  };
226
238
  const requestQueryParams = parseQS(ajaxStub.firstCall.args[0].split('?')[1]);
227
239
 
@@ -4,6 +4,7 @@ import {BANNER, NATIVE, VIDEO} from '../../../src/mediaTypes.js';
4
4
  import {server} from 'test/mocks/xhr.js';
5
5
 
6
6
  const CODE = 'feedad';
7
+ const EXPECTED_ADAPTER_VERSION = '1.0.5';
7
8
 
8
9
  describe('FeedAdAdapter', function () {
9
10
  describe('Public API', function () {
@@ -300,6 +301,20 @@ describe('FeedAdAdapter', function () {
300
301
  expect(result.data.gdprApplies).to.equal(request.gdprConsent.gdprApplies);
301
302
  expect(result.data.consentIabTcf).to.equal(request.gdprConsent.consentString);
302
303
  });
304
+ it('should include adapter and prebid version', function () {
305
+ let bid = {
306
+ code: 'feedad',
307
+ mediaTypes: {
308
+ banner: {
309
+ sizes: [[320, 250]]
310
+ }
311
+ },
312
+ params: {clientToken: 'clientToken', placementId: 'placement-id'}
313
+ };
314
+ let result = spec.buildRequests([bid], bidderRequest);
315
+ expect(result.data.bids[0].params.prebid_adapter_version).to.equal(EXPECTED_ADAPTER_VERSION);
316
+ expect(result.data.bids[0].params.prebid_sdk_version).to.equal('$prebid.version$');
317
+ });
303
318
  });
304
319
 
305
320
  describe('interpretResponse', function () {
@@ -482,6 +497,12 @@ describe('FeedAdAdapter', function () {
482
497
  expect(() => spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, it)).not.to.throw;
483
498
  });
484
499
  });
500
+
501
+ it('should return empty array if the body extension is null', function () {
502
+ const response = mockServerResponse({ext: null});
503
+ const result = spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, response);
504
+ expect(result).to.deep.equal([]);
505
+ });
485
506
  });
486
507
 
487
508
  describe('event tracking calls', function () {
@@ -617,7 +638,8 @@ describe('FeedAdAdapter', function () {
617
638
  prebid_bid_id: bidId,
618
639
  prebid_transaction_id: transactionId,
619
640
  referer,
620
- sdk_version: '1.0.4'
641
+ prebid_adapter_version: EXPECTED_ADAPTER_VERSION,
642
+ prebid_sdk_version: '$prebid.version$',
621
643
  };
622
644
  subject(data);
623
645
  expect(server.requests.length).to.equal(1);
@@ -0,0 +1,165 @@
1
+ import { expect } from 'chai'
2
+ import { spec } from 'modules/holidBidAdapter.js'
3
+
4
+ describe('holidBidAdapterTests', () => {
5
+ const bidRequestData = {
6
+ bidder: 'holid',
7
+ adUnitCode: 'test-div',
8
+ bidId: 'bid-id',
9
+ auctionId: 'test-id',
10
+ params: { adUnitID: '12345' },
11
+ mediaTypes: { banner: {} },
12
+ sizes: [[300, 250]],
13
+ ortb2: {
14
+ site: {
15
+ publisher: {
16
+ domain: 'https://foo.bar',
17
+ }
18
+ },
19
+ regs: {
20
+ gdpr: 1,
21
+ },
22
+ user: {
23
+ ext: {
24
+ consent: 'G4ll0p1ng_Un1c0rn5',
25
+ }
26
+ },
27
+ device: {
28
+ h: 410,
29
+ w: 1860,
30
+ }
31
+ }
32
+ }
33
+
34
+ describe('isBidRequestValid', () => {
35
+ const bid = JSON.parse(JSON.stringify(bidRequestData))
36
+
37
+ it('should return true', () => {
38
+ expect(spec.isBidRequestValid(bid)).to.equal(true)
39
+ })
40
+
41
+ it('should return false when required params are not passed', () => {
42
+ const bid = JSON.parse(JSON.stringify(bidRequestData))
43
+ delete bid.params.adUnitID
44
+
45
+ expect(spec.isBidRequestValid(bid)).to.equal(false)
46
+ })
47
+ })
48
+
49
+ describe('buildRequests', () => {
50
+ const bid = JSON.parse(JSON.stringify(bidRequestData))
51
+ const request = spec.buildRequests([bid], bid)
52
+ const payload = JSON.parse(request[0].data)
53
+
54
+ it('should include ext in imp', () => {
55
+ expect(payload.imp[0].ext).to.exist
56
+ expect(payload.imp[0].ext).to.deep.equal({
57
+ prebid: { storedrequest: { id: '12345' } },
58
+ })
59
+ })
60
+
61
+ it('should include banner format in imp', () => {
62
+ expect(payload.imp[0].banner).to.exist
63
+ expect(payload.imp[0].banner).to.deep.equal({
64
+ format: [{ w: 300, h: 250 }],
65
+ })
66
+ })
67
+
68
+ it('should include ortb2 first party data', () => {
69
+ expect(payload.device.w).to.equal(1860)
70
+ expect(payload.device.h).to.equal(410)
71
+ expect(payload.user.ext.consent).to.equal('G4ll0p1ng_Un1c0rn5')
72
+ expect(payload.regs.gdpr).to.equal(1)
73
+ })
74
+ })
75
+
76
+ describe('interpretResponse', () => {
77
+ const serverResponse = {
78
+ body: {
79
+ id: 'test-id',
80
+ cur: 'USD',
81
+ seatbid: [
82
+ {
83
+ bid: [
84
+ {
85
+ id: 'testbidid',
86
+ price: 0.4,
87
+ adm: 'test-ad',
88
+ adid: 789456,
89
+ crid: 1234,
90
+ w: 300,
91
+ h: 250,
92
+ },
93
+ ],
94
+ },
95
+ ],
96
+ },
97
+ }
98
+
99
+ const interpretedResponse = spec.interpretResponse(
100
+ serverResponse,
101
+ bidRequestData
102
+ )
103
+
104
+ it('should interpret response', () => {
105
+ expect(interpretedResponse[0].requestId).to.equal(bidRequestData.bidId)
106
+ expect(interpretedResponse[0].cpm).to.equal(
107
+ serverResponse.body.seatbid[0].bid[0].price
108
+ )
109
+ expect(interpretedResponse[0].ad).to.equal(
110
+ serverResponse.body.seatbid[0].bid[0].adm
111
+ )
112
+ expect(interpretedResponse[0].creativeId).to.equal(
113
+ serverResponse.body.seatbid[0].bid[0].crid
114
+ )
115
+ expect(interpretedResponse[0].width).to.equal(
116
+ serverResponse.body.seatbid[0].bid[0].w
117
+ )
118
+ expect(interpretedResponse[0].height).to.equal(
119
+ serverResponse.body.seatbid[0].bid[0].h
120
+ )
121
+ expect(interpretedResponse[0].currency).to.equal(serverResponse.body.cur)
122
+ })
123
+ })
124
+
125
+ describe('getUserSyncs', () => {
126
+ it('should return user sync', () => {
127
+ const optionsType = {
128
+ iframeEnabled: true,
129
+ pixelEnabled: true,
130
+ }
131
+ const serverResponse = [
132
+ {
133
+ body: {
134
+ ext: {
135
+ responsetimemillis: {
136
+ 'test seat 1': 2,
137
+ 'test seat 2': 1,
138
+ },
139
+ },
140
+ },
141
+ },
142
+ ]
143
+ const gdprConsent = {
144
+ gdprApplies: 1,
145
+ consentString: 'dkj49Sjmfjuj34as:12jaf90123hufabidfy9u23brfpoig',
146
+ }
147
+ const uspConsent = 'mkjvbiniwot4827obfoy8sdg8203gb'
148
+ const expectedUserSyncs = [
149
+ {
150
+ type: 'iframe',
151
+ url: 'https://null.holid.io/sync.html?bidders=%5B%22test%20seat%201%22%2C%22test%20seat%202%22%5D&gdpr=1&gdpr_consent=dkj49Sjmfjuj34as:12jaf90123hufabidfy9u23brfpoig&usp_consent=mkjvbiniwot4827obfoy8sdg8203gb&type=iframe',
152
+ },
153
+ ]
154
+
155
+ const userSyncs = spec.getUserSyncs(
156
+ optionsType,
157
+ serverResponse,
158
+ gdprConsent,
159
+ uspConsent
160
+ )
161
+
162
+ expect(userSyncs).to.deep.equal(expectedUserSyncs)
163
+ })
164
+ })
165
+ })