prebid.js 7.45.0 → 7.47.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 (204) 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/admaticBidAdapter.js +1 -1
  7. package/dist/adnuntiusBidAdapter.js +1 -1
  8. package/dist/adrelevantisBidAdapter.js +1 -1
  9. package/dist/adtrgtmeBidAdapter.js +1 -1
  10. package/dist/adxcgBidAdapter.js +1 -1
  11. package/dist/adyoulikeBidAdapter.js +1 -1
  12. package/dist/ajaBidAdapter.js +1 -1
  13. package/dist/amxBidAdapter.js +1 -1
  14. package/dist/amxIdSystem.js +1 -1
  15. package/dist/appierAnalyticsAdapter.js +1 -1
  16. package/dist/appnexusBidAdapter.js +1 -1
  17. package/dist/asoBidAdapter.js +1 -1
  18. package/dist/axonixBidAdapter.js +1 -1
  19. package/dist/bidglassBidAdapter.js +1 -1
  20. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  21. package/dist/big-richmediaBidAdapter.js +1 -1
  22. package/dist/bridgewellBidAdapter.js +1 -1
  23. package/dist/brightMountainMediaBidAdapter.js +1 -1
  24. package/dist/carodaBidAdapter.js +1 -1
  25. package/dist/chtnwBidAdapter.js +1 -1
  26. package/dist/concertBidAdapter.js +1 -1
  27. package/dist/connectadBidAdapter.js +1 -1
  28. package/dist/consumableBidAdapter.js +1 -1
  29. package/dist/conversantAnalyticsAdapter.js +1 -1
  30. package/dist/conversantBidAdapter.js +1 -1
  31. package/dist/craftBidAdapter.js +1 -1
  32. package/dist/criteoBidAdapter.js +1 -1
  33. package/dist/criteoIdSystem.js +1 -1
  34. package/dist/cwireBidAdapter.js +1 -1
  35. package/dist/debugging-standalone.js +1 -1
  36. package/dist/dependencies.json +3 -0
  37. package/dist/dspxBidAdapter.js +1 -1
  38. package/dist/emtvBidAdapter.js +1 -0
  39. package/dist/eplanningBidAdapter.js +1 -1
  40. package/dist/eskimiBidAdapter.js +1 -0
  41. package/dist/feedadBidAdapter.js +1 -1
  42. package/dist/finativeBidAdapter.js +1 -1
  43. package/dist/freewheel-sspBidAdapter.js +1 -1
  44. package/dist/glimpseBidAdapter.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/gridBidAdapter.js +1 -1
  49. package/dist/gumgumBidAdapter.js +1 -1
  50. package/dist/h12mediaBidAdapter.js +1 -1
  51. package/dist/id5IdSystem.js +1 -1
  52. package/dist/improvedigitalBidAdapter.js +1 -1
  53. package/dist/inmarBidAdapter.js +1 -1
  54. package/dist/insticatorBidAdapter.js +1 -1
  55. package/dist/ixBidAdapter.js +1 -1
  56. package/dist/justpremiumBidAdapter.js +1 -1
  57. package/dist/kargoBidAdapter.js +1 -1
  58. package/dist/konduitAnalyticsAdapter.js +1 -1
  59. package/dist/kueezBidAdapter.js +1 -1
  60. package/dist/kueezRtbBidAdapter.js +1 -1
  61. package/dist/kulturemediaBidAdapter.js +1 -1
  62. package/dist/lassoBidAdapter.js +1 -1
  63. package/dist/lifestreetBidAdapter.js +1 -1
  64. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  65. package/dist/logicadBidAdapter.js +1 -1
  66. package/dist/loglyliftBidAdapter.js +1 -1
  67. package/dist/magniteAnalyticsAdapter.js +1 -1
  68. package/dist/malltvAnalyticsAdapter.js +1 -1
  69. package/dist/marsmediaBidAdapter.js +1 -1
  70. package/dist/mediafuseBidAdapter.js +1 -1
  71. package/dist/mediasquareBidAdapter.js +1 -1
  72. package/dist/mgidBidAdapter.js +1 -1
  73. package/dist/minutemediaBidAdapter.js +1 -1
  74. package/dist/minutemediaplusBidAdapter.js +1 -1
  75. package/dist/missenaBidAdapter.js +1 -1
  76. package/dist/nativoBidAdapter.js +1 -1
  77. package/dist/neuwoRtdProvider.js +1 -1
  78. package/dist/nextMillenniumBidAdapter.js +1 -1
  79. package/dist/nexx360BidAdapter.js +1 -1
  80. package/dist/not-for-prod/prebid.js +137 -135
  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/ortbConverter.js +1 -1
  86. package/dist/outbrainBidAdapter.js +1 -1
  87. package/dist/pairIdSystem.js +1 -0
  88. package/dist/parrableIdSystem.js +1 -1
  89. package/dist/pixfutureBidAdapter.js +1 -1
  90. package/dist/prebid-core.js +1 -1
  91. package/dist/publinkIdSystem.js +1 -1
  92. package/dist/pubmaticBidAdapter.js +1 -1
  93. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  94. package/dist/pxyzBidAdapter.js +1 -1
  95. package/dist/quantcastBidAdapter.js +1 -1
  96. package/dist/readpeakBidAdapter.js +1 -1
  97. package/dist/relaidoBidAdapter.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/rubiconAnalyticsAdapter.js +1 -1
  102. package/dist/rubiconBidAdapter.js +1 -1
  103. package/dist/seedingAllianceBidAdapter.js +1 -1
  104. package/dist/seedtagBidAdapter.js +1 -1
  105. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  106. package/dist/sharethroughBidAdapter.js +1 -1
  107. package/dist/shinezBidAdapter.js +1 -1
  108. package/dist/smaatoBidAdapter.js +1 -1
  109. package/dist/smartadserverBidAdapter.js +1 -1
  110. package/dist/smartxBidAdapter.js +1 -1
  111. package/dist/smilewantedBidAdapter.js +1 -1
  112. package/dist/sonobiBidAdapter.js +1 -1
  113. package/dist/sovrnAnalyticsAdapter.js +1 -1
  114. package/dist/sovrnBidAdapter.js +1 -1
  115. package/dist/sspBCBidAdapter.js +1 -1
  116. package/dist/stvBidAdapter.js +1 -1
  117. package/dist/sublimeBidAdapter.js +1 -1
  118. package/dist/synacormediaBidAdapter.js +1 -1
  119. package/dist/targetVideoBidAdapter.js +1 -1
  120. package/dist/teadsBidAdapter.js +1 -1
  121. package/dist/trionBidAdapter.js +1 -1
  122. package/dist/tripleliftBidAdapter.js +1 -1
  123. package/dist/ttdBidAdapter.js +1 -1
  124. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  125. package/dist/uid2IdSystem.js +1 -1
  126. package/dist/underdogmediaBidAdapter.js +1 -1
  127. package/dist/undertoneBidAdapter.js +1 -1
  128. package/dist/userId.js +1 -1
  129. package/dist/vidazooBidAdapter.js +1 -1
  130. package/dist/videobyteBidAdapter.js +1 -1
  131. package/dist/vidoomyBidAdapter.js +1 -1
  132. package/dist/visxBidAdapter.js +1 -1
  133. package/dist/vuukleBidAdapter.js +1 -1
  134. package/dist/widespaceBidAdapter.js +1 -1
  135. package/dist/winrBidAdapter.js +1 -1
  136. package/dist/yahoosspBidAdapter.js +1 -1
  137. package/dist/yieldmoBidAdapter.js +1 -1
  138. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  139. package/integrationExamples/gpt/fledge_example.html +103 -0
  140. package/integrationExamples/gpt/prebidServer_fledge_example.html +111 -0
  141. package/libraries/ortbConverter/processors/video.js +1 -0
  142. package/modules/admaticBidAdapter.js +7 -2
  143. package/modules/adnuntiusBidAdapter.js +3 -1
  144. package/modules/appnexusBidAdapter.js +108 -102
  145. package/modules/bidwatchAnalyticsAdapter.js +2 -0
  146. package/modules/conversantBidAdapter.js +3 -0
  147. package/modules/criteoBidAdapter.js +5 -1
  148. package/modules/criteoIdSystem.js +27 -14
  149. package/modules/emtvBidAdapter.js +211 -0
  150. package/modules/emtvBidAdapter.md +79 -0
  151. package/modules/eskimiBidAdapter.js +72 -0
  152. package/modules/eskimiBidAdapter.md +34 -0
  153. package/modules/gridBidAdapter.js +42 -19
  154. package/modules/ixBidAdapter.js +30 -0
  155. package/modules/kargoBidAdapter.js +473 -246
  156. package/modules/kueezRtbBidAdapter.js +16 -4
  157. package/modules/mediasquareBidAdapter.js +2 -1
  158. package/modules/minutemediaplusBidAdapter.js +16 -4
  159. package/modules/missenaBidAdapter.js +1 -1
  160. package/modules/nativoBidAdapter.js +110 -21
  161. package/modules/neuwoRtdProvider.js +0 -2
  162. package/modules/nextMillenniumBidAdapter.js +2 -0
  163. package/modules/pairIdSystem.js +79 -0
  164. package/modules/pubmaticBidAdapter.js +12 -9
  165. package/modules/rtbhouseBidAdapter.js +3 -3
  166. package/modules/userId/eids.js +6 -0
  167. package/modules/vidoomyBidAdapter.js +30 -9
  168. package/modules/vidoomyBidAdapter.md +12 -2
  169. package/modules/yieldmoBidAdapter.js +15 -5
  170. package/package.json +1 -1
  171. package/src/config.js +78 -127
  172. package/test/spec/modules/1plusXRtdProvider_spec.js +8 -7
  173. package/test/spec/modules/adagioBidAdapter_spec.js +0 -25
  174. package/test/spec/modules/admaticBidAdapter_spec.js +1 -1
  175. package/test/spec/modules/adnuntiusBidAdapter_spec.js +2 -1
  176. package/test/spec/modules/appnexusBidAdapter_spec.js +464 -448
  177. package/test/spec/modules/axonixBidAdapter_spec.js +0 -27
  178. package/test/spec/modules/big-richmediaBidAdapter_spec.js +68 -64
  179. package/test/spec/modules/conversantBidAdapter_spec.js +1 -0
  180. package/test/spec/modules/criteoBidAdapter_spec.js +33 -1
  181. package/test/spec/modules/criteoIdSystem_spec.js +99 -9
  182. package/test/spec/modules/emtvBidAdapter_spec.js +400 -0
  183. package/test/spec/modules/eskimiBidAdapter_spec.js +155 -0
  184. package/test/spec/modules/gridBidAdapter_spec.js +8 -0
  185. package/test/spec/modules/ixBidAdapter_spec.js +57 -0
  186. package/test/spec/modules/kargoBidAdapter_spec.js +297 -140
  187. package/test/spec/modules/kueezRtbBidAdapter_spec.js +22 -2
  188. package/test/spec/modules/minutemediaplusBidAdapter_spec.js +22 -2
  189. package/test/spec/modules/nativoBidAdapter_spec.js +101 -0
  190. package/test/spec/modules/neuwoRtdProvider_spec.js +0 -1
  191. package/test/spec/modules/ooloAnalyticsAdapter_spec.js +1 -1
  192. package/test/spec/modules/pairIdSystem_spec.js +68 -0
  193. package/test/spec/modules/pubCommonId_spec.js +0 -17
  194. package/test/spec/modules/pubmaticBidAdapter_spec.js +868 -867
  195. package/test/spec/modules/realvuAnalyticsAdapter_spec.js +0 -5
  196. package/test/spec/modules/rtbhouseBidAdapter_spec.js +2 -2
  197. package/test/spec/modules/vidoomyBidAdapter_spec.js +72 -0
  198. package/test/spec/modules/yieldmoBidAdapter_spec.js +19 -1
  199. package/test/spec/unit/pbjs_api_spec.js +19 -3
  200. package/test/test_index.js +13 -3
  201. package/dist/gridNMBidAdapter.js +0 -1
  202. package/modules/gridNMBidAdapter.js +0 -422
  203. package/modules/gridNMBidAdapter.md +0 -39
  204. package/test/spec/modules/gridNMBidAdapter_spec.js +0 -636
@@ -0,0 +1,400 @@
1
+ import { expect } from 'chai';
2
+ import { spec } from '../../../modules/emtvBidAdapter.js';
3
+ import { BANNER, VIDEO, NATIVE } from '../../../src/mediaTypes.js';
4
+ import { getUniqueIdentifierStr } from '../../../src/utils.js';
5
+
6
+ const bidder = 'emtv'
7
+ const adUrl = 'https://us-east-ep.engagemedia.tv/pbjs';
8
+ const syncUrl = 'https://cs.engagemedia.tv';
9
+
10
+ describe('EMTVBidAdapter', function () {
11
+ const bids = [
12
+ {
13
+ bidId: getUniqueIdentifierStr(),
14
+ bidder: bidder,
15
+ mediaTypes: {
16
+ [BANNER]: {
17
+ sizes: [[300, 250]]
18
+ }
19
+ },
20
+ params: {
21
+ placementId: 'testBanner',
22
+ }
23
+ },
24
+ {
25
+ bidId: getUniqueIdentifierStr(),
26
+ bidder: bidder,
27
+ mediaTypes: {
28
+ [VIDEO]: {
29
+ playerSize: [[300, 300]],
30
+ minduration: 5,
31
+ maxduration: 60
32
+ }
33
+ },
34
+ params: {
35
+ placementId: 'testVideo',
36
+ }
37
+ },
38
+ {
39
+ bidId: getUniqueIdentifierStr(),
40
+ bidder: bidder,
41
+ mediaTypes: {
42
+ [NATIVE]: {
43
+ native: {
44
+ title: {
45
+ required: true
46
+ },
47
+ body: {
48
+ required: true
49
+ },
50
+ icon: {
51
+ required: true,
52
+ size: [64, 64]
53
+ }
54
+ }
55
+ }
56
+ },
57
+ params: {
58
+ placementId: 'testNative',
59
+ }
60
+ }
61
+ ];
62
+
63
+ const invalidBid = {
64
+ bidId: getUniqueIdentifierStr(),
65
+ bidder: bidder,
66
+ mediaTypes: {
67
+ [BANNER]: {
68
+ sizes: [[300, 250]]
69
+ }
70
+ },
71
+ params: {
72
+
73
+ }
74
+ }
75
+
76
+ const bidderRequest = {
77
+ uspConsent: '1---',
78
+ gdprConsent: 'COvFyGBOvFyGBAbAAAENAPCAAOAAAAAAAAAAAEEUACCKAAA.IFoEUQQgAIQwgIwQABAEAAAAOIAACAIAAAAQAIAgEAACEAAAAAgAQBAAAAAAAGBAAgAAAAAAAFAAECAAAgAAQARAEQAAAAAJAAIAAgAAAYQEAAAQmAgBC3ZAYzUw',
79
+ refererInfo: {
80
+ referer: 'https://test.com'
81
+ }
82
+ };
83
+
84
+ describe('isBidRequestValid', function () {
85
+ it('Should return true if there are bidId, params and key parameters present', function () {
86
+ expect(spec.isBidRequestValid(bids[0])).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(adUrl);
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(`${syncUrl}/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(`${syncUrl}/image?pbjs=1&ccpa_consent=1---&coppa=0`)
398
+ });
399
+ });
400
+ });
@@ -0,0 +1,155 @@
1
+ import {expect} from 'chai';
2
+ import {spec} from 'modules/eskimiBidAdapter.js';
3
+
4
+ const REQUEST = {
5
+ 'bidderCode': 'eskimi',
6
+ 'auctionId': 'auctionId-56a2-4f71-9098-720a68f2f708',
7
+ 'bidderRequestId': 'requestId',
8
+ 'bidRequest': [{
9
+ 'bidder': 'eskimi',
10
+ 'params': {
11
+ 'placementId': 1003000,
12
+ 'accId': 123
13
+ },
14
+ 'sizes': [
15
+ [300, 250]
16
+ ],
17
+ 'bidId': 'bidId1',
18
+ 'adUnitCode': 'adUnitCode1',
19
+ 'bidderRequestId': 'bidderRequestId',
20
+ 'auctionId': 'auctionId-56a2-4f71-9098-720a68f2f708'
21
+ },
22
+ {
23
+ 'bidder': 'eskimi',
24
+ 'params': {
25
+ 'placementId': 1003001,
26
+ 'accId': 123
27
+ },
28
+ 'sizes': [
29
+ [300, 250]
30
+ ],
31
+ 'bidId': 'bidId2',
32
+ 'adUnitCode': 'adUnitCode2',
33
+ 'bidderRequestId': 'bidderRequestId',
34
+ 'auctionId': 'auctionId-56a2-4f71-9098-720a68f2f708'
35
+ }],
36
+ 'start': 1487883186070,
37
+ 'auctionStart': 1487883186069,
38
+ 'timeout': 3000
39
+ };
40
+
41
+ const RESPONSE = {
42
+ 'headers': null,
43
+ 'body': {
44
+ 'id': 'requestId',
45
+ 'seatbid': [
46
+ {
47
+ 'bid': [
48
+ {
49
+ 'id': 'bidId1',
50
+ 'impid': 'bidId1',
51
+ 'price': 0.18,
52
+ 'adm': '<script>adm</script>',
53
+ 'adid': '144762342',
54
+ 'adomain': [
55
+ 'https://dummydomain.com'
56
+ ],
57
+ 'iurl': 'iurl',
58
+ 'cid': '109',
59
+ 'crid': 'creativeId',
60
+ 'cat': [],
61
+ 'w': 300,
62
+ 'h': 250,
63
+ 'ext': {
64
+ 'prebid': {
65
+ 'type': 'banner'
66
+ },
67
+ 'bidder': {
68
+ 'eskimi': {
69
+ 'brand_id': 334553,
70
+ 'auction_id': 514667951122925701,
71
+ 'bidder_id': 2,
72
+ 'bid_ad_type': 0
73
+ }
74
+ }
75
+ }
76
+ }
77
+ ],
78
+ 'seat': 'seat'
79
+ }
80
+ ]
81
+ }
82
+ };
83
+
84
+ describe('Eskimi bid adapter', function () {
85
+ describe('isBidRequestValid', function () {
86
+ it('should accept request if placementId is passed', function () {
87
+ let bid = {
88
+ bidder: 'eskimi',
89
+ params: {
90
+ placementId: 123
91
+ }
92
+ };
93
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
94
+ });
95
+ it('reject requests without params', function () {
96
+ let bid = {
97
+ bidder: 'eskimi',
98
+ params: {}
99
+ };
100
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
101
+ });
102
+ });
103
+
104
+ describe('buildRequests', function () {
105
+ it('creates request data', function () {
106
+ let request = spec.buildRequests(REQUEST.bidRequest, REQUEST)[0];
107
+ expect(request).to.exist.and.to.be.a('object');
108
+ const payload = request.data;
109
+ expect(payload.imp[0]).to.have.property('id', REQUEST.bidRequest[0].bidId);
110
+ expect(payload.imp[1]).to.have.property('id', REQUEST.bidRequest[1].bidId);
111
+ });
112
+
113
+ it('has gdpr data if applicable', function () {
114
+ const req = Object.assign({}, REQUEST, {
115
+ gdprConsent: {
116
+ consentString: 'consentString',
117
+ gdprApplies: true,
118
+ }
119
+ });
120
+ let request = spec.buildRequests(REQUEST.bidRequest, req)[0];
121
+
122
+ const payload = request.data;
123
+ expect(payload.user.ext).to.have.property('consent', req.gdprConsent.consentString);
124
+ expect(payload.regs.ext).to.have.property('gdpr', 1);
125
+ });
126
+ });
127
+
128
+ describe('interpretResponse', function () {
129
+ it('has bids', function () {
130
+ let request = spec.buildRequests(REQUEST.bidRequest, REQUEST)[0];
131
+ let bids = spec.interpretResponse(RESPONSE, request);
132
+ expect(bids).to.be.an('array').that.is.not.empty;
133
+ validateBidOnIndex(0);
134
+
135
+ function validateBidOnIndex(index) {
136
+ expect(bids[index]).to.have.property('currency', 'USD');
137
+ expect(bids[index]).to.have.property('requestId', RESPONSE.body.seatbid[0].bid[index].id);
138
+ expect(bids[index]).to.have.property('cpm', RESPONSE.body.seatbid[0].bid[index].price);
139
+ expect(bids[index]).to.have.property('width', RESPONSE.body.seatbid[0].bid[index].w);
140
+ expect(bids[index]).to.have.property('height', RESPONSE.body.seatbid[0].bid[index].h);
141
+ expect(bids[index]).to.have.property('ad', RESPONSE.body.seatbid[0].bid[index].adm);
142
+ expect(bids[index]).to.have.property('creativeId', RESPONSE.body.seatbid[0].bid[index].crid);
143
+ expect(bids[index]).to.have.property('ttl', 30);
144
+ expect(bids[index]).to.have.property('netRevenue', true);
145
+ }
146
+ });
147
+
148
+ it('handles empty response', function () {
149
+ let request = spec.buildRequests(REQUEST.bidRequest, REQUEST)[0];
150
+ const EMPTY_RESP = Object.assign({}, RESPONSE, {'body': {}});
151
+ const bids = spec.interpretResponse(EMPTY_RESP, request);
152
+ expect(bids).to.be.empty;
153
+ });
154
+ });
155
+ });
@@ -480,6 +480,14 @@ describe('TheMediaGrid Adapter', function () {
480
480
  'h': 600,
481
481
  'protocols': [1, 2, 3],
482
482
  'mimes': ['video/mp4', 'video/webm', 'application/javascript', 'video/ogg'],
483
+ 'context': 'instream',
484
+ 'maxduration': 30,
485
+ 'minduration': 0,
486
+ 'api': [1, 2],
487
+ 'skip': 1,
488
+ 'placement': 1,
489
+ 'playbackmethod': 1,
490
+ 'startdelay': 0
483
491
  }
484
492
  }, {
485
493
  'id': bidRequests[3].bidId,
@@ -1703,6 +1703,63 @@ describe('IndexexchangeAdapter', function () {
1703
1703
  expect(r.regs.gpp_sid).to.be.an('array');
1704
1704
  expect(r.regs.gpp_sid).to.include(1);
1705
1705
  });
1706
+
1707
+ it('should add adunit specific data to imp ext for banner', function () {
1708
+ const AD_UNIT_CODE = '/19968336/some-adunit-path';
1709
+ const validBids = utils.deepClone(DEFAULT_BANNER_VALID_BID);
1710
+ validBids[0].ortb2Imp = {
1711
+ ext: {
1712
+ data: {
1713
+ adserver: {
1714
+ name: 'gam banner',
1715
+ adslot: AD_UNIT_CODE
1716
+ }
1717
+ }
1718
+ }
1719
+ };
1720
+ const requests = spec.buildRequests(validBids, DEFAULT_OPTION);
1721
+ const imp = extractPayload(requests[0]).imp[0];
1722
+ expect(deepAccess(imp, 'ext.data.adserver.name')).to.equal('gam banner');
1723
+ expect(deepAccess(imp, 'ext.data.adserver.adslot')).to.equal(AD_UNIT_CODE);
1724
+ });
1725
+
1726
+ it('should add adunit specific data to imp ext for native', function () {
1727
+ const AD_UNIT_CODE = '/19968336/some-adunit-path';
1728
+ const validBids = utils.deepClone(DEFAULT_NATIVE_VALID_BID);
1729
+ validBids[0].ortb2Imp = {
1730
+ ext: {
1731
+ data: {
1732
+ adserver: {
1733
+ name: 'gam native',
1734
+ adslot: AD_UNIT_CODE
1735
+ }
1736
+ }
1737
+ }
1738
+ };
1739
+ const requests = spec.buildRequests(validBids, DEFAULT_OPTION);
1740
+ const imp = extractPayload(requests[0]).imp[0];
1741
+ expect(deepAccess(imp, 'ext.data.adserver.name')).to.equal('gam native');
1742
+ expect(deepAccess(imp, 'ext.data.adserver.adslot')).to.equal(AD_UNIT_CODE);
1743
+ });
1744
+
1745
+ it('should add adunit specific data to imp ext for video', function () {
1746
+ const AD_UNIT_CODE = '/19968336/some-adunit-path';
1747
+ const validBids = utils.deepClone(DEFAULT_VIDEO_VALID_BID);
1748
+ validBids[0].ortb2Imp = {
1749
+ ext: {
1750
+ data: {
1751
+ adserver: {
1752
+ name: 'gam video',
1753
+ adslot: AD_UNIT_CODE
1754
+ }
1755
+ }
1756
+ }
1757
+ };
1758
+ const requests = spec.buildRequests(validBids, DEFAULT_OPTION);
1759
+ const imp = extractPayload(requests[0]).imp[0];
1760
+ expect(deepAccess(imp, 'ext.data.adserver.name')).to.equal('gam video');
1761
+ expect(deepAccess(imp, 'ext.data.adserver.adslot')).to.equal(AD_UNIT_CODE);
1762
+ });
1706
1763
  });
1707
1764
 
1708
1765
  describe('buildRequests', function () {