prebid.js 5.19.0 → 6.2.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 (161) hide show
  1. package/.babelrc.js +1 -10
  2. package/README.md +4 -2
  3. package/browsers.json +13 -37
  4. package/gulpfile.js +1 -0
  5. package/karma.conf.maker.js +1 -1
  6. package/modules/adheseBidAdapter.js +7 -2
  7. package/modules/adkernelBidAdapter.js +1 -0
  8. package/modules/adlivetechBidAdapter.md +61 -0
  9. package/modules/admixerBidAdapter.js +2 -1
  10. package/modules/adnuntiusBidAdapter.js +2 -1
  11. package/modules/adomikAnalyticsAdapter.js +10 -4
  12. package/modules/adplusBidAdapter.js +203 -0
  13. package/modules/adplusBidAdapter.md +39 -0
  14. package/modules/adyoulikeBidAdapter.js +7 -2
  15. package/modules/airgridRtdProvider.js +1 -1
  16. package/modules/appnexusBidAdapter.js +28 -5
  17. package/modules/atsAnalyticsAdapter.js +67 -46
  18. package/modules/atsAnalyticsAdapter.md +1 -0
  19. package/modules/beachfrontBidAdapter.js +14 -17
  20. package/modules/betweenBidAdapter.js +2 -1
  21. package/modules/browsiRtdProvider.js +106 -18
  22. package/modules/cleanioRtdProvider.js +192 -0
  23. package/modules/cleanioRtdProvider.md +59 -0
  24. package/modules/codefuelBidAdapter.js +1 -3
  25. package/modules/codefuelBidAdapter.md +3 -3
  26. package/modules/craftBidAdapter.js +5 -3
  27. package/modules/datablocksBidAdapter.js +3 -3
  28. package/modules/dchain.js +149 -0
  29. package/modules/dchain.md +45 -0
  30. package/modules/deepintentBidAdapter.js +1 -1
  31. package/modules/deltaprojectsBidAdapter.js +252 -0
  32. package/modules/deltaprojectsBidAdapter.md +32 -0
  33. package/modules/emx_digitalBidAdapter.js +9 -1
  34. package/modules/engageyaBidAdapter.js +68 -54
  35. package/modules/freewheel-sspBidAdapter.js +6 -0
  36. package/modules/glimpseBidAdapter.js +31 -16
  37. package/modules/goldbachBidAdapter.js +1176 -0
  38. package/modules/goldbachBidAdapter.md +151 -0
  39. package/modules/gptPreAuction.js +11 -5
  40. package/modules/gridBidAdapter.js +1 -0
  41. package/modules/gumgumBidAdapter.js +5 -1
  42. package/modules/id5IdSystem.md +6 -6
  43. package/modules/imRtdProvider.js +31 -0
  44. package/modules/intersectionRtdProvider.js +114 -0
  45. package/modules/invibesBidAdapter.js +15 -9
  46. package/modules/ipromBidAdapter.js +79 -0
  47. package/modules/ixBidAdapter.js +173 -22
  48. package/modules/jixieBidAdapter.js +8 -2
  49. package/modules/justpremiumBidAdapter.js +6 -1
  50. package/modules/limelightDigitalBidAdapter.js +2 -1
  51. package/modules/livewrappedAnalyticsAdapter.js +5 -0
  52. package/modules/luponmediaBidAdapter.js +570 -0
  53. package/modules/merkleIdSystem.js +5 -0
  54. package/modules/missenaBidAdapter.js +89 -0
  55. package/modules/multibid/index.js +3 -3
  56. package/modules/nativoBidAdapter.js +32 -2
  57. package/modules/oguryBidAdapter.js +2 -1
  58. package/modules/openxBidAdapter.js +7 -2
  59. package/modules/operaadsBidAdapter.js +21 -1
  60. package/modules/otmBidAdapter.js +146 -0
  61. package/modules/otmBidAdapter.md +27 -26
  62. package/modules/outbrainBidAdapter.js +5 -0
  63. package/modules/playwireBidAdapter.md +61 -0
  64. package/modules/prebidServerBidAdapter/index.js +3 -3
  65. package/modules/pubmaticBidAdapter.js +5 -3
  66. package/modules/relaidoBidAdapter.js +86 -65
  67. package/modules/richaudienceBidAdapter.js +1 -1
  68. package/modules/rtdModule/index.js +2 -2
  69. package/modules/saambaaBidAdapter.js +420 -0
  70. package/modules/saambaaBidAdapter.md +65 -68
  71. package/modules/seedtagBidAdapter.js +6 -0
  72. package/modules/smaatoBidAdapter.js +9 -1
  73. package/modules/smartxBidAdapter.js +17 -1
  74. package/modules/sonobiBidAdapter.js +7 -0
  75. package/modules/sortableBidAdapter.js +1 -0
  76. package/modules/sspBCBidAdapter.js +34 -3
  77. package/modules/tappxBidAdapter.js +3 -1
  78. package/modules/teadsBidAdapter.js +3 -0
  79. package/modules/trustxBidAdapter.js +18 -7
  80. package/modules/undertoneBidAdapter.js +8 -1
  81. package/modules/userId/index.js +27 -2
  82. package/modules/ventes.md +71 -0
  83. package/modules/ventesBidAdapter.js +410 -0
  84. package/modules/ventesBidAdapter.md +93 -0
  85. package/modules/vidoomyBidAdapter.js +51 -100
  86. package/modules/visxBidAdapter.js +20 -3
  87. package/modules/visxBidAdapter.md +4 -6
  88. package/modules/yahoosspBidAdapter.js +6 -6
  89. package/modules/yahoosspBidAdapter.md +1 -1
  90. package/modules/yieldlabBidAdapter.js +41 -10
  91. package/modules/yieldlabBidAdapter.md +91 -48
  92. package/modules/yieldoneBidAdapter.js +115 -11
  93. package/package.json +6 -1
  94. package/src/adapterManager.js +14 -8
  95. package/src/auction.js +14 -13
  96. package/src/targeting.js +2 -2
  97. package/src/utils.js +7 -0
  98. package/test/spec/integration/faker/googletag.js +6 -0
  99. package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
  100. package/test/spec/modules/adnuntiusBidAdapter_spec.js +18 -0
  101. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
  102. package/test/spec/modules/adplusBidAdapter_spec.js +213 -0
  103. package/test/spec/modules/adyoulikeBidAdapter_spec.js +26 -0
  104. package/test/spec/modules/appnexusBidAdapter_spec.js +65 -2
  105. package/test/spec/modules/atsAnalyticsAdapter_spec.js +42 -9
  106. package/test/spec/modules/beachfrontBidAdapter_spec.js +65 -1
  107. package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
  108. package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
  109. package/test/spec/modules/codefuelBidAdapter_spec.js +1 -1
  110. package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
  111. package/test/spec/modules/dchain_spec.js +329 -0
  112. package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
  113. package/test/spec/modules/emx_digitalBidAdapter_spec.js +10 -0
  114. package/test/spec/modules/engageyaBidAdapter_spec.js +231 -95
  115. package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
  116. package/test/spec/modules/freewheel-sspBidAdapter_spec.js +19 -0
  117. package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
  118. package/test/spec/modules/goldbachBidAdapter_spec.js +1359 -0
  119. package/test/spec/modules/gptPreAuction_spec.js +58 -4
  120. package/test/spec/modules/gumgumBidAdapter_spec.js +6 -0
  121. package/test/spec/modules/imRtdProvider_spec.js +25 -0
  122. package/test/spec/modules/intersectionRtdProvider_spec.js +141 -0
  123. package/test/spec/modules/invibesBidAdapter_spec.js +29 -4
  124. package/test/spec/modules/ipromBidAdapter_spec.js +195 -0
  125. package/test/spec/modules/ixBidAdapter_spec.js +288 -5
  126. package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
  127. package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
  128. package/test/spec/modules/konduitWrapper_spec.js +0 -1
  129. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +10 -7
  130. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +23 -4
  131. package/test/spec/modules/luponmediaBidAdapter_spec.js +412 -0
  132. package/test/spec/modules/merkleIdSystem_spec.js +18 -0
  133. package/test/spec/modules/missenaBidAdapter_spec.js +134 -0
  134. package/test/spec/modules/multibid_spec.js +31 -31
  135. package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
  136. package/test/spec/modules/oguryBidAdapter_spec.js +13 -11
  137. package/test/spec/modules/openxBidAdapter_spec.js +5 -26
  138. package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
  139. package/test/spec/modules/otmBidAdapter_spec.js +67 -0
  140. package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
  141. package/test/spec/modules/prebidServerBidAdapter_spec.js +19 -2
  142. package/test/spec/modules/pubmaticBidAdapter_spec.js +1 -1
  143. package/test/spec/modules/relaidoBidAdapter_spec.js +71 -63
  144. package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
  145. package/test/spec/modules/smaatoBidAdapter_spec.js +61 -0
  146. package/test/spec/modules/smartxBidAdapter_spec.js +9 -0
  147. package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
  148. package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
  149. package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
  150. package/test/spec/modules/tappxBidAdapter_spec.js +4 -0
  151. package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
  152. package/test/spec/modules/trustxBidAdapter_spec.js +45 -3
  153. package/test/spec/modules/userId_spec.js +51 -0
  154. package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
  155. package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
  156. package/test/spec/modules/visxBidAdapter_spec.js +121 -5
  157. package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
  158. package/test/spec/modules/yieldoneBidAdapter_spec.js +299 -53
  159. package/test/spec/unit/core/adapterManager_spec.js +26 -7
  160. package/test/spec/unit/core/targeting_spec.js +44 -0
  161. package/wdio.conf.js +1 -1
@@ -0,0 +1,412 @@
1
+ import { resetUserSync, spec, hasValidSupplyChainParams } from 'modules/luponmediaBidAdapter.js';
2
+ const ENDPOINT_URL = 'https://rtb.adxpremium.services/openrtb2/auction';
3
+
4
+ describe('luponmediaBidAdapter', function () {
5
+ describe('isBidRequestValid', function () {
6
+ let bid = {
7
+ 'bidder': 'luponmedia',
8
+ 'params': {
9
+ 'siteId': 12345,
10
+ 'keyId': '4o2c4'
11
+ },
12
+ 'adUnitCode': 'test-div',
13
+ 'sizes': [[300, 250]],
14
+ 'bidId': 'g1987234bjkads',
15
+ 'bidderRequestId': '290348ksdhkas89324',
16
+ 'auctionId': '20384rlek235',
17
+ };
18
+
19
+ it('should return true when required params are found', function () {
20
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
21
+ });
22
+
23
+ it('should return false when required params are not passed', function () {
24
+ let bid = Object.assign({}, bid);
25
+ delete bid.params;
26
+ bid.params = {
27
+ 'siteId': 12345
28
+ };
29
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
30
+ });
31
+ });
32
+
33
+ describe('buildRequests', function () {
34
+ let bidRequests = [
35
+ {
36
+ 'bidder': 'luponmedia',
37
+ 'params': {
38
+ 'siteId': 303522,
39
+ 'keyId': '4o2c4'
40
+ },
41
+ 'crumbs': {
42
+ 'pubcid': '8d8b16cb-1383-4a0f-b4bb-0be28464d974'
43
+ },
44
+ 'mediaTypes': {
45
+ 'banner': {
46
+ 'sizes': [
47
+ [
48
+ 300,
49
+ 250
50
+ ]
51
+ ]
52
+ }
53
+ },
54
+ 'adUnitCode': 'div-gpt-ad-1533155193780-2',
55
+ 'transactionId': '585d96a5-bd93-4a89-b8ea-0f546f3aaa82',
56
+ 'sizes': [
57
+ [
58
+ 300,
59
+ 250
60
+ ]
61
+ ],
62
+ 'bidId': '268a30af10dd6f',
63
+ 'bidderRequestId': '140411b5010a2a',
64
+ 'auctionId': '7376c117-b7aa-49f5-a661-488543deeefd',
65
+ 'src': 'client',
66
+ 'bidRequestsCount': 1,
67
+ 'bidderRequestsCount': 1,
68
+ 'bidderWinsCount': 0,
69
+ 'schain': {
70
+ 'ver': '1.0',
71
+ 'complete': 1,
72
+ 'nodes': [
73
+ {
74
+ 'asi': 'novi.ba',
75
+ 'sid': '199424',
76
+ 'hp': 1
77
+ }
78
+ ]
79
+ }
80
+ }
81
+ ];
82
+
83
+ let bidderRequest = {
84
+ 'bidderCode': 'luponmedia',
85
+ 'auctionId': '7376c117-b7aa-49f5-a661-488543deeefd',
86
+ 'bidderRequestId': '140411b5010a2a',
87
+ 'bids': [
88
+ {
89
+ 'bidder': 'luponmedia',
90
+ 'params': {
91
+ 'siteId': 303522,
92
+ 'keyId': '4o2c4'
93
+ },
94
+ 'crumbs': {
95
+ 'pubcid': '8d8b16cb-1383-4a0f-b4bb-0be28464d974'
96
+ },
97
+ 'mediaTypes': {
98
+ 'banner': {
99
+ 'sizes': [
100
+ [
101
+ 300,
102
+ 250
103
+ ]
104
+ ]
105
+ }
106
+ },
107
+ 'adUnitCode': 'div-gpt-ad-1533155193780-2',
108
+ 'transactionId': '585d96a5-bd93-4a89-b8ea-0f546f3aaa82',
109
+ 'sizes': [
110
+ [
111
+ 300,
112
+ 250
113
+ ]
114
+ ],
115
+ 'bidId': '268a30af10dd6f',
116
+ 'bidderRequestId': '140411b5010a2a',
117
+ 'auctionId': '7376c117-b7aa-49f5-a661-488543deeefd',
118
+ 'src': 'client',
119
+ 'bidRequestsCount': 1,
120
+ 'bidderRequestsCount': 1,
121
+ 'bidderWinsCount': 0,
122
+ 'schain': {
123
+ 'ver': '1.0',
124
+ 'complete': 1,
125
+ 'nodes': [
126
+ {
127
+ 'asi': 'novi.ba',
128
+ 'sid': '199424',
129
+ 'hp': 1
130
+ }
131
+ ]
132
+ }
133
+ }
134
+ ],
135
+ 'auctionStart': 1587413920820,
136
+ 'timeout': 2000,
137
+ 'refererInfo': {
138
+ 'referer': 'https://novi.ba/clanak/176067/fast-car-beginner-s-guide-to-tuning-turbo-engines',
139
+ 'reachedTop': true,
140
+ 'numIframes': 0,
141
+ 'stack': [
142
+ 'https://novi.ba/clanak/176067/fast-car-beginner-s-guide-to-tuning-turbo-engines'
143
+ ]
144
+ },
145
+ 'start': 1587413920835
146
+ };
147
+
148
+ it('sends bid request to ENDPOINT via POST', function () {
149
+ const requests = spec.buildRequests(bidRequests, bidderRequest);
150
+ let dynRes = JSON.parse(requests.data);
151
+ expect(requests.url).to.equal(ENDPOINT_URL);
152
+ expect(requests.method).to.equal('POST');
153
+ expect(requests.data).to.equal('{"id":"585d96a5-bd93-4a89-b8ea-0f546f3aaa82","test":0,"source":{"tid":"585d96a5-bd93-4a89-b8ea-0f546f3aaa82","ext":{"schain":{"ver":"1.0","complete":1,"nodes":[{"asi":"novi.ba","sid":"199424","hp":1}]}}},"tmax":1500,"imp":[{"id":"268a30af10dd6f","secure":1,"ext":{"luponmedia":{"siteId":303522,"keyId":"4o2c4"}},"banner":{"format":[{"w":300,"h":250}]}}],"ext":{"prebid":{"targeting":{"includewinners":true,"includebidderkeys":false}}},"user":{"id":"' + dynRes.user.id + '","buyeruid":"8d8b16cb-1383-4a0f-b4bb-0be28464d974"},"site":{"page":"https://novi.ba/clanak/176067/fast-car-beginner-s-guide-to-tuning-turbo-engines"}}');
154
+ });
155
+ });
156
+
157
+ describe('interpretResponse', function () {
158
+ it('should get correct banner bid response', function () {
159
+ let response = {
160
+ 'id': '4776d680-15a2-45c3-bad5-db6bebd94a06',
161
+ 'seatbid': [
162
+ {
163
+ 'bid': [
164
+ {
165
+ 'id': '2a122246ef72ea',
166
+ 'impid': '2a122246ef72ea',
167
+ 'price': 0.43,
168
+ 'adm': '<a href="https://novi.ba" target="_blank" style="position:absolute; width:300px; height:250px; z-index:5;"> </a><iframe src="https://lupon.media/vijestiba/300x250new/index.html" height="250" width="300" scrolling="no" frameborder="0"></iframe>',
169
+ 'adid': '56380110',
170
+ 'cid': '44724710',
171
+ 'crid': '443801010',
172
+ 'w': 300,
173
+ 'h': 250,
174
+ 'ext': {
175
+ 'prebid': {
176
+ 'targeting': {
177
+ 'hb_bidder': 'luponmedia',
178
+ 'hb_pb': '0.40',
179
+ 'hb_size': '300x250'
180
+ },
181
+ 'type': 'banner'
182
+ }
183
+ }
184
+ }
185
+ ],
186
+ 'seat': 'luponmedia'
187
+ }
188
+ ],
189
+ 'cur': 'USD',
190
+ 'ext': {
191
+ 'responsetimemillis': {
192
+ 'luponmedia': 233
193
+ },
194
+ 'tmaxrequest': 1500,
195
+ 'usersyncs': {
196
+ 'status': 'ok',
197
+ 'bidder_status': []
198
+ }
199
+ }
200
+ };
201
+
202
+ let expectedResponse = [
203
+ {
204
+ 'requestId': '2a122246ef72ea',
205
+ 'cpm': '0.43',
206
+ 'width': 300,
207
+ 'height': 250,
208
+ 'creativeId': '443801010',
209
+ 'currency': 'USD',
210
+ 'dealId': '23425',
211
+ 'netRevenue': false,
212
+ 'ttl': 300,
213
+ 'referrer': '',
214
+ 'ad': '<a href="https://novi.ba" target="_blank" style="position:absolute; width:300px; height:250px; z-index:5;"> </a><iframe src="https://lupon.media/vijestiba/300x250new/index.html" height="250" width="300" scrolling="no" frameborder="0"></iframe>'
215
+ }
216
+ ];
217
+
218
+ let bidderRequest = {
219
+ 'data': '{"site":{"page":"https://novi.ba/clanak/176067/fast-car-beginner-s-guide-to-tuning-turbo-engines"}}'
220
+ };
221
+
222
+ let result = spec.interpretResponse({ body: response }, bidderRequest);
223
+ expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
224
+ });
225
+
226
+ it('handles nobid responses', function () {
227
+ let noBidResponse = [];
228
+
229
+ let noBidBidderRequest = {
230
+ 'data': '{"site":{"page":""}}'
231
+ }
232
+ let noBidResult = spec.interpretResponse({ body: noBidResponse }, noBidBidderRequest);
233
+ expect(noBidResult.length).to.equal(0);
234
+ });
235
+ });
236
+
237
+ describe('getUserSyncs', function () {
238
+ const bidResponse1 = {
239
+ 'body': {
240
+ 'ext': {
241
+ 'responsetimemillis': {
242
+ 'luponmedia': 233
243
+ },
244
+ 'tmaxrequest': 1500,
245
+ 'usersyncs': {
246
+ 'status': 'ok',
247
+ 'bidder_status': [
248
+ {
249
+ 'bidder': 'luponmedia',
250
+ 'no_cookie': true,
251
+ 'usersync': {
252
+ 'url': 'https://adxpremium.services/api/usersync',
253
+ 'type': 'redirect'
254
+ }
255
+ },
256
+ {
257
+ 'bidder': 'luponmedia',
258
+ 'no_cookie': true,
259
+ 'usersync': {
260
+ 'url': 'https://adxpremium.services/api/iframeusersync',
261
+ 'type': 'iframe'
262
+ }
263
+ }
264
+ ]
265
+ }
266
+ }
267
+ }
268
+ };
269
+
270
+ const bidResponse2 = {
271
+ 'body': {
272
+ 'ext': {
273
+ 'responsetimemillis': {
274
+ 'luponmedia': 233
275
+ },
276
+ 'tmaxrequest': 1500,
277
+ 'usersyncs': {
278
+ 'status': 'no_cookie',
279
+ 'bidder_status': []
280
+ }
281
+ }
282
+ }
283
+ };
284
+
285
+ it('should use a sync url from first response (pixel and iframe)', function () {
286
+ const syncs = spec.getUserSyncs({ pixelEnabled: true, iframeEnabled: true }, [bidResponse1, bidResponse2]);
287
+ expect(syncs).to.deep.equal([
288
+ {
289
+ type: 'image',
290
+ url: 'https://adxpremium.services/api/usersync'
291
+ },
292
+ {
293
+ type: 'iframe',
294
+ url: 'https://adxpremium.services/api/iframeusersync'
295
+ }
296
+ ]);
297
+ });
298
+
299
+ it('handle empty response (e.g. timeout)', function () {
300
+ const syncs = spec.getUserSyncs({ pixelEnabled: true, iframeEnabled: true }, []);
301
+ expect(syncs).to.deep.equal([]);
302
+ });
303
+
304
+ it('returns empty syncs when not pixel enabled and not iframe enabled', function () {
305
+ const syncs = spec.getUserSyncs({ pixelEnabled: false, iframeEnabled: false }, [bidResponse1]);
306
+ expect(syncs).to.deep.equal([]);
307
+ });
308
+
309
+ it('returns pixel syncs when pixel enabled and not iframe enabled', function() {
310
+ resetUserSync();
311
+
312
+ const syncs = spec.getUserSyncs({ pixelEnabled: true, iframeEnabled: false }, [bidResponse1]);
313
+ expect(syncs).to.deep.equal([
314
+ {
315
+ type: 'image',
316
+ url: 'https://adxpremium.services/api/usersync'
317
+ }
318
+ ]);
319
+ });
320
+
321
+ it('returns iframe syncs when not pixel enabled and iframe enabled', function() {
322
+ resetUserSync();
323
+
324
+ const syncs = spec.getUserSyncs({ pixelEnabled: false, iframeEnabled: true }, [bidResponse1]);
325
+ expect(syncs).to.deep.equal([
326
+ {
327
+ type: 'iframe',
328
+ url: 'https://adxpremium.services/api/iframeusersync'
329
+ }
330
+ ]);
331
+ });
332
+ });
333
+
334
+ describe('hasValidSupplyChainParams', function () {
335
+ it('returns true if schain is valid', function () {
336
+ const schain = {
337
+ 'ver': '1.0',
338
+ 'complete': 1,
339
+ 'nodes': [
340
+ {
341
+ 'asi': 'novi.ba',
342
+ 'sid': '199424',
343
+ 'hp': 1
344
+ }
345
+ ]
346
+ };
347
+
348
+ const checkSchain = hasValidSupplyChainParams(schain);
349
+ expect(checkSchain).to.equal(true);
350
+ });
351
+
352
+ it('returns false if schain is invalid', function () {
353
+ const schain = {
354
+ 'ver': '1.0',
355
+ 'complete': 1,
356
+ 'nodes': [
357
+ {
358
+ 'invalid': 'novi.ba'
359
+ }
360
+ ]
361
+ };
362
+
363
+ const checkSchain = hasValidSupplyChainParams(schain);
364
+ expect(checkSchain).to.equal(false);
365
+ });
366
+ });
367
+
368
+ describe('onBidWon', function () {
369
+ const bidWonEvent = {
370
+ 'bidderCode': 'luponmedia',
371
+ 'width': 300,
372
+ 'height': 250,
373
+ 'statusMessage': 'Bid available',
374
+ 'adId': '105bbf8c54453ff',
375
+ 'requestId': '934b8752185955',
376
+ 'mediaType': 'banner',
377
+ 'source': 'client',
378
+ 'cpm': 0.364,
379
+ 'creativeId': '443801010',
380
+ 'currency': 'USD',
381
+ 'netRevenue': false,
382
+ 'ttl': 300,
383
+ 'referrer': '',
384
+ 'ad': '',
385
+ 'auctionId': '926a8ea3-3dd4-4bf2-95ab-c85c2ce7e99b',
386
+ 'responseTimestamp': 1598527728026,
387
+ 'requestTimestamp': 1598527727629,
388
+ 'bidder': 'luponmedia',
389
+ 'adUnitCode': 'div-gpt-ad-1533155193780-5',
390
+ 'timeToRespond': 397,
391
+ 'size': '300x250',
392
+ 'status': 'rendered'
393
+ };
394
+
395
+ let ajaxStub;
396
+
397
+ beforeEach(() => {
398
+ ajaxStub = sinon.stub(spec, 'sendWinningsToServer')
399
+ })
400
+
401
+ afterEach(() => {
402
+ ajaxStub.restore()
403
+ })
404
+
405
+ it('calls luponmedia\'s callback endpoint', () => {
406
+ const result = spec.onBidWon(bidWonEvent);
407
+ expect(result).to.equal(undefined);
408
+ expect(ajaxStub.calledOnce).to.equal(true);
409
+ expect(ajaxStub.firstCall.args[0]).to.deep.equal(JSON.stringify(bidWonEvent));
410
+ });
411
+ });
412
+ });
@@ -192,6 +192,24 @@ describe('Merkle System', function () {
192
192
 
193
193
  expect(id.id).to.exist.and.to.equal(storedId);
194
194
  });
195
+ it('extendId() should warn on missing endpoint', function () {
196
+ let config = {
197
+ params: {
198
+ ...CONFIG_PARAMS,
199
+ endpoint: undefined
200
+ },
201
+ storage: STORAGE_PARAMS
202
+ };
203
+
204
+ let yesterday = new Date(Date.now() - 86400000).toUTCString();
205
+ let storedId = {value: 'Merkle_Stored_ID', date: yesterday};
206
+
207
+ let submoduleCallback = merkleIdSubmodule.extendId(config, undefined,
208
+ storedId).callback;
209
+ submoduleCallback(callbackSpy);
210
+ expect(callbackSpy.calledOnce).to.be.true;
211
+ expect(utils.logWarn.args[0][0]).to.exist.and.to.equal('User ID - merkleId submodule endpoint string is not defined');
212
+ });
195
213
 
196
214
  it('extendId() callback on configured storageParam.refreshInSeconds', function () {
197
215
  let config = {
@@ -0,0 +1,134 @@
1
+ import { expect } from 'chai';
2
+ import { spec, _getPlatform } from 'modules/missenaBidAdapter.js';
3
+ import { newBidder } from 'src/adapters/bidderFactory.js';
4
+
5
+ describe('Missena Adapter', function () {
6
+ const adapter = newBidder(spec);
7
+
8
+ const bidId = 'abc';
9
+
10
+ const bid = {
11
+ bidder: 'missena',
12
+ bidId: bidId,
13
+ sizes: [[1, 1]],
14
+ params: {
15
+ apiKey: 'PA-34745704',
16
+ },
17
+ };
18
+
19
+ describe('codes', function () {
20
+ it('should return a bidder code of missena', function () {
21
+ expect(spec.code).to.equal('missena');
22
+ });
23
+ });
24
+
25
+ describe('isBidRequestValid', function () {
26
+ it('should return true if the apiKey param is present', function () {
27
+ expect(spec.isBidRequestValid(bid)).to.equal(true);
28
+ });
29
+
30
+ it('should return false if the apiKey is missing', function () {
31
+ expect(
32
+ spec.isBidRequestValid(Object.assign(bid, { params: {} }))
33
+ ).to.equal(false);
34
+ });
35
+
36
+ it('should return false if the apiKey is an empty string', function () {
37
+ expect(
38
+ spec.isBidRequestValid(Object.assign(bid, { params: { apiKey: '' } }))
39
+ ).to.equal(false);
40
+ });
41
+ });
42
+
43
+ describe('buildRequests', function () {
44
+ const consentString = 'AAAAAAAAA==';
45
+
46
+ const bidderRequest = {
47
+ gdprConsent: {
48
+ consentString: consentString,
49
+ gdprApplies: true,
50
+ },
51
+ refererInfo: {
52
+ referer: 'https://referer',
53
+ canonicalUrl: 'https://canonical',
54
+ },
55
+ };
56
+
57
+ const requests = spec.buildRequests([bid, bid], bidderRequest);
58
+ const request = requests[0];
59
+ const payload = JSON.parse(request.data);
60
+
61
+ it('should return as many server requests as bidder requests', function () {
62
+ expect(requests.length).to.equal(2);
63
+ });
64
+
65
+ it('should have a post method', function () {
66
+ expect(request.method).to.equal('POST');
67
+ });
68
+
69
+ it('should send the bidder id', function () {
70
+ expect(payload.request_id).to.equal(bidId);
71
+ });
72
+
73
+ it('should send referer information to the request', function () {
74
+ expect(payload.referer).to.equal('https://referer');
75
+ expect(payload.referer_canonical).to.equal('https://canonical');
76
+ });
77
+
78
+ it('should send gdpr consent information to the request', function () {
79
+ expect(payload.consent_string).to.equal(consentString);
80
+ expect(payload.consent_required).to.equal(true);
81
+ });
82
+ });
83
+
84
+ describe('interpretResponse', function () {
85
+ const serverResponse = {
86
+ requestId: bidId,
87
+ cpm: 0.5,
88
+ currency: 'USD',
89
+ ad: '<!-- -->',
90
+ meta: {
91
+ advertiserDomains: ['missena.com']
92
+ },
93
+ };
94
+
95
+ const serverTimeoutResponse = {
96
+ requestId: bidId,
97
+ timeout: true,
98
+ ad: '<!-- -->',
99
+ };
100
+
101
+ const serverEmptyAdResponse = {
102
+ requestId: bidId,
103
+ cpm: 0.5,
104
+ currency: 'USD',
105
+ ad: '',
106
+ };
107
+
108
+ it('should return a proper bid response', function () {
109
+ const result = spec.interpretResponse({ body: serverResponse }, bid);
110
+
111
+ expect(result.length).to.equal(1);
112
+
113
+ expect(Object.keys(result[0])).to.have.members(
114
+ Object.keys(serverResponse)
115
+ );
116
+ });
117
+
118
+ it('should return an empty response when the server answers with a timeout', function () {
119
+ const result = spec.interpretResponse(
120
+ { body: serverTimeoutResponse },
121
+ bid
122
+ );
123
+ expect(result).to.deep.equal([]);
124
+ });
125
+
126
+ it('should return an empty response when the server answers with an empty ad', function () {
127
+ const result = spec.interpretResponse(
128
+ { body: serverEmptyAdResponse },
129
+ bid
130
+ );
131
+ expect(result).to.deep.equal([]);
132
+ });
133
+ });
134
+ });