prebid.js 7.30.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 (197) 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/adkernelBidAdapter.js +1 -1
  7. package/dist/adlooxRtdProvider.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/aidemBidAdapter.js +1 -1
  12. package/dist/ajaBidAdapter.js +1 -1
  13. package/dist/alkimiBidAdapter.js +1 -1
  14. package/dist/amxBidAdapter.js +1 -1
  15. package/dist/amxIdSystem.js +1 -1
  16. package/dist/aolBidAdapter.js +1 -1
  17. package/dist/appierAnalyticsAdapter.js +1 -1
  18. package/dist/appnexusBidAdapter.js +1 -1
  19. package/dist/appushBidAdapter.js +1 -0
  20. package/dist/asoBidAdapter.js +1 -1
  21. package/dist/axonixBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/big-richmediaBidAdapter.js +1 -1
  24. package/dist/bridgewellBidAdapter.js +1 -1
  25. package/dist/brightMountainMediaBidAdapter.js +1 -1
  26. package/dist/carodaBidAdapter.js +1 -1
  27. package/dist/chtnwBidAdapter.js +1 -1
  28. package/dist/concertBidAdapter.js +1 -1
  29. package/dist/confiantRtdProvider.js +1 -0
  30. package/dist/connectIdSystem.js +1 -1
  31. package/dist/connectadBidAdapter.js +1 -1
  32. package/dist/consumableBidAdapter.js +1 -1
  33. package/dist/conversantBidAdapter.js +1 -1
  34. package/dist/craftBidAdapter.js +1 -1
  35. package/dist/criteoBidAdapter.js +1 -1
  36. package/dist/datawrkzBidAdapter.js +1 -1
  37. package/dist/dspxBidAdapter.js +1 -1
  38. package/dist/eplanningBidAdapter.js +1 -1
  39. package/dist/feedadBidAdapter.js +1 -1
  40. package/dist/finativeBidAdapter.js +1 -1
  41. package/dist/glimpseBidAdapter.js +1 -1
  42. package/dist/gmosspBidAdapter.js +1 -1
  43. package/dist/goldbachBidAdapter.js +1 -1
  44. package/dist/gridBidAdapter.js +1 -1
  45. package/dist/gridNMBidAdapter.js +1 -1
  46. package/dist/gumgumBidAdapter.js +1 -1
  47. package/dist/h12mediaBidAdapter.js +1 -1
  48. package/dist/holidBidAdapter.js +1 -0
  49. package/dist/id5IdSystem.js +1 -1
  50. package/dist/improvedigitalBidAdapter.js +1 -1
  51. package/dist/inmarBidAdapter.js +1 -1
  52. package/dist/insticatorBidAdapter.js +1 -1
  53. package/dist/ixBidAdapter.js +1 -1
  54. package/dist/justpremiumBidAdapter.js +1 -1
  55. package/dist/jwplayerVideoProvider.js +1 -1
  56. package/dist/konduitAnalyticsAdapter.js +1 -1
  57. package/dist/kueezBidAdapter.js +1 -1
  58. package/dist/kueezRtbBidAdapter.js +1 -1
  59. package/dist/lassoBidAdapter.js +1 -1
  60. package/dist/lifestreetBidAdapter.js +1 -1
  61. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  62. package/dist/logicadBidAdapter.js +1 -1
  63. package/dist/loglyliftBidAdapter.js +1 -1
  64. package/dist/magniteAnalyticsAdapter.js +1 -1
  65. package/dist/malltvAnalyticsAdapter.js +1 -1
  66. package/dist/marsmediaBidAdapter.js +1 -1
  67. package/dist/mediafuseBidAdapter.js +1 -1
  68. package/dist/medianetRtdProvider.js +1 -1
  69. package/dist/mediasquareBidAdapter.js +1 -1
  70. package/dist/mgidBidAdapter.js +1 -1
  71. package/dist/minutemediaBidAdapter.js +1 -1
  72. package/dist/nexx360BidAdapter.js +1 -1
  73. package/dist/not-for-prod/prebid.js +131 -127
  74. package/dist/oguryBidAdapter.js +1 -1
  75. package/dist/onetagBidAdapter.js +1 -1
  76. package/dist/ooloAnalyticsAdapter.js +1 -1
  77. package/dist/orbitsoftBidAdapter.js +1 -0
  78. package/dist/outbrainBidAdapter.js +1 -1
  79. package/dist/parrableIdSystem.js +1 -1
  80. package/dist/pbsExtensions.js +1 -1
  81. package/dist/permutiveRtdProvider.js +1 -1
  82. package/dist/pixfutureBidAdapter.js +1 -1
  83. package/dist/prebid-core.js +1 -1
  84. package/dist/prebidServerBidAdapter.js +1 -1
  85. package/dist/publinkIdSystem.js +1 -1
  86. package/dist/pubmaticBidAdapter.js +1 -1
  87. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  88. package/dist/pxyzBidAdapter.js +1 -1
  89. package/dist/quantcastBidAdapter.js +1 -1
  90. package/dist/readpeakBidAdapter.js +1 -1
  91. package/dist/relaidoBidAdapter.js +1 -1
  92. package/dist/rhythmoneBidAdapter.js +1 -1
  93. package/dist/riseBidAdapter.js +1 -1
  94. package/dist/rubiconAnalyticsAdapter.js +1 -1
  95. package/dist/rubiconBidAdapter.js +1 -1
  96. package/dist/seedingAllianceBidAdapter.js +1 -1
  97. package/dist/seedtagBidAdapter.js +1 -1
  98. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  99. package/dist/sharethroughBidAdapter.js +1 -1
  100. package/dist/shinezBidAdapter.js +1 -1
  101. package/dist/smaatoBidAdapter.js +1 -1
  102. package/dist/smartadserverBidAdapter.js +1 -1
  103. package/dist/smartxBidAdapter.js +1 -1
  104. package/dist/smilewantedBidAdapter.js +1 -1
  105. package/dist/sonobiBidAdapter.js +1 -1
  106. package/dist/sovrnAnalyticsAdapter.js +1 -1
  107. package/dist/sovrnBidAdapter.js +1 -1
  108. package/dist/sspBCBidAdapter.js +1 -1
  109. package/dist/sublimeBidAdapter.js +1 -1
  110. package/dist/synacormediaBidAdapter.js +1 -1
  111. package/dist/taboolaBidAdapter.js +1 -1
  112. package/dist/targetVideoBidAdapter.js +1 -1
  113. package/dist/teadsBidAdapter.js +1 -1
  114. package/dist/trionBidAdapter.js +1 -1
  115. package/dist/tripleliftBidAdapter.js +1 -1
  116. package/dist/ttdBidAdapter.js +1 -1
  117. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  118. package/dist/uid2IdSystem.js +1 -1
  119. package/dist/underdogmediaBidAdapter.js +1 -1
  120. package/dist/undertoneBidAdapter.js +1 -1
  121. package/dist/vidazooBidAdapter.js +1 -1
  122. package/dist/videobyteBidAdapter.js +1 -1
  123. package/dist/visxBidAdapter.js +1 -1
  124. package/dist/vuukleBidAdapter.js +1 -1
  125. package/dist/widespaceBidAdapter.js +1 -1
  126. package/dist/winrBidAdapter.js +1 -1
  127. package/dist/yahoosspBidAdapter.js +1 -1
  128. package/dist/yieldlabBidAdapter.js +1 -1
  129. package/dist/yieldmoBidAdapter.js +1 -1
  130. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  131. package/integrationExamples/gpt/adloox.html +5 -0
  132. package/libraries/pbsExtensions/processors/adUnitCode.js +13 -0
  133. package/libraries/pbsExtensions/processors/pbs.js +5 -0
  134. package/modules/.submodules.json +1 -0
  135. package/modules/adagioBidAdapter.js +0 -4
  136. package/modules/adagioBidAdapter.md +4 -22
  137. package/modules/adkernelBidAdapter.js +2 -1
  138. package/modules/adlooxAnalyticsAdapter.md +5 -3
  139. package/modules/adlooxRtdProvider.js +82 -278
  140. package/modules/adlooxRtdProvider.md +6 -6
  141. package/modules/aidemBidAdapter.js +4 -0
  142. package/modules/aidemBidAdapter.md +1 -0
  143. package/modules/alkimiBidAdapter.js +23 -6
  144. package/modules/aolBidAdapter.js +12 -0
  145. package/modules/appnexusBidAdapter.js +2 -2
  146. package/modules/appushBidAdapter.js +188 -0
  147. package/modules/appushBidAdapter.md +79 -0
  148. package/modules/asoBidAdapter.js +8 -5
  149. package/modules/confiantRtdProvider.js +128 -0
  150. package/modules/confiantRtdProvider.md +45 -0
  151. package/modules/connectIdSystem.js +15 -1
  152. package/modules/datawrkzBidAdapter.js +24 -4
  153. package/modules/feedadBidAdapter.js +17 -7
  154. package/modules/holidBidAdapter.js +170 -0
  155. package/modules/holidBidAdapter.md +36 -0
  156. package/modules/jwplayerVideoProvider.js +10 -3
  157. package/modules/kueezRtbBidAdapter.js +21 -8
  158. package/modules/medianetRtdProvider.js +4 -4
  159. package/modules/nexx360BidAdapter.js +5 -7
  160. package/modules/orbitsoftBidAdapter.js +150 -0
  161. package/modules/permutiveRtdProvider.js +1 -1
  162. package/modules/prebidServerBidAdapter/ortbConverter.js +1 -0
  163. package/modules/riseBidAdapter.js +2 -1
  164. package/modules/riseBidAdapter.md +2 -0
  165. package/modules/seedtagBidAdapter.js +12 -0
  166. package/modules/smartxBidAdapter.js +6 -0
  167. package/modules/taboolaBidAdapter.js +61 -14
  168. package/modules/yahoosspBidAdapter.js +5 -0
  169. package/modules/yieldlabBidAdapter.js +150 -134
  170. package/modules/yieldmoBidAdapter.js +1 -12
  171. package/package.json +1 -1
  172. package/src/adloader.js +2 -1
  173. package/src/prebid.js +7 -8
  174. package/test/spec/modules/adagioBidAdapter_spec.js +1 -28
  175. package/test/spec/modules/adlooxRtdProvider_spec.js +28 -120
  176. package/test/spec/modules/aidemBidAdapter_spec.js +10 -2
  177. package/test/spec/modules/alkimiBidAdapter_spec.js +15 -3
  178. package/test/spec/modules/aolBidAdapter_spec.js +22 -0
  179. package/test/spec/modules/appnexusBidAdapter_spec.js +7 -3
  180. package/test/spec/modules/appushBidAdapter_spec.js +372 -0
  181. package/test/spec/modules/confiantRtdProvider_spec.js +107 -0
  182. package/test/spec/modules/connectIdSystem_spec.js +17 -5
  183. package/test/spec/modules/feedadBidAdapter_spec.js +60 -13
  184. package/test/spec/modules/holidBidAdapter_spec.js +165 -0
  185. package/test/spec/modules/kueezRtbBidAdapter_spec.js +147 -24
  186. package/test/spec/modules/medianetRtdProvider_spec.js +3 -3
  187. package/test/spec/modules/orbitsoftBidAdapter_spec.js +255 -0
  188. package/test/spec/modules/riseBidAdapter_spec.js +7 -0
  189. package/test/spec/modules/seedtagBidAdapter_spec.js +56 -10
  190. package/test/spec/modules/smartxBidAdapter_spec.js +10 -0
  191. package/test/spec/modules/taboolaBidAdapter_spec.js +142 -5
  192. package/test/spec/modules/videoModule/submodules/jwplayerVideoProvider_spec.js +45 -10
  193. package/test/spec/modules/yahoosspBidAdapter_spec.js +16 -1
  194. package/test/spec/modules/yieldlabBidAdapter_spec.js +311 -301
  195. package/test/spec/modules/yieldmoBidAdapter_spec.js +70 -0
  196. package/test/spec/ortbConverter/pbsExtensions/adUnitCode_spec.js +23 -0
  197. package/test/spec/unit/pbjs_api_spec.js +11 -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
+ });
@@ -0,0 +1,107 @@
1
+ import * as utils from '../../../src/utils.js';
2
+ import * as hook from '../../../src/hook.js'
3
+ import * as events from '../../../src/events.js';
4
+ import CONSTANTS from '../../../src/constants.json';
5
+
6
+ import confiantModule from '../../../modules/confiantRtdProvider.js';
7
+
8
+ const {
9
+ injectConfigScript,
10
+ setupPage,
11
+ subscribeToConfiantCommFrame,
12
+ registerConfiantSubmodule
13
+ } = confiantModule;
14
+
15
+ describe('Confiant RTD module', function () {
16
+ describe('setupPage()', function() {
17
+ it('should return false if propertId is not present in config', function() {
18
+ expect(setupPage({})).to.be.false;
19
+ expect(setupPage({ params: {} })).to.be.false;
20
+ expect(setupPage({ params: { propertyId: '' } })).to.be.false;
21
+ });
22
+
23
+ it('should return true if expected parameters are present', function() {
24
+ expect(setupPage({ params: { propertyId: 'clientId' } })).to.be.true;
25
+ });
26
+ });
27
+
28
+ describe('Module initialization', function() {
29
+ let insertElementStub;
30
+ beforeEach(function() {
31
+ insertElementStub = sinon.stub(utils, 'insertElement');
32
+ });
33
+ afterEach(function() {
34
+ utils.insertElement.restore();
35
+ });
36
+
37
+ it('should subscribe to rovided Window object', function () {
38
+ const mockWindow = { addEventListener: sinon.spy() };
39
+
40
+ subscribeToConfiantCommFrame(mockWindow);
41
+
42
+ sinon.assert.calledOnce(mockWindow.addEventListener);
43
+ });
44
+
45
+ it('should fire BillableEvent as a result for message in comm window', function() {
46
+ let listenerCallback;
47
+ const mockWindow = { addEventListener: (a, cb) => (listenerCallback = cb) };
48
+ let billableEventsCounter = 0;
49
+
50
+ events.on(CONSTANTS.EVENTS.BILLABLE_EVENT, (e) => {
51
+ if (e.vendor === 'confiant') {
52
+ billableEventsCounter++;
53
+ expect(e.type).to.equal('impression');
54
+ expect(e.billingId).to.be.a('number');
55
+ expect(e.auctionId).to.equal('auctionId');
56
+ expect(e.transactionId).to.equal('transactionId');
57
+ }
58
+ });
59
+
60
+ subscribeToConfiantCommFrame(mockWindow);
61
+ listenerCallback({
62
+ data: {
63
+ auctionId: 'auctionId',
64
+ transactionId: 'transactionId'
65
+ }
66
+ });
67
+ listenerCallback({
68
+ data: {
69
+ auctionId: 'auctionId',
70
+ transactionId: 'transactionId'
71
+ }
72
+ });
73
+
74
+ expect(billableEventsCounter).to.equal(2);
75
+ });
76
+ });
77
+
78
+ describe('Sumbodule execution', function() {
79
+ let submoduleStub;
80
+ let insertElementStub;
81
+ beforeEach(function () {
82
+ submoduleStub = sinon.stub(hook, 'submodule');
83
+ insertElementStub = sinon.stub(utils, 'insertElement');
84
+ });
85
+ afterEach(function () {
86
+ utils.insertElement.restore();
87
+ submoduleStub.restore();
88
+ });
89
+
90
+ function initModule() {
91
+ registerConfiantSubmodule();
92
+
93
+ expect(submoduleStub.calledOnceWith('realTimeData')).to.equal(true);
94
+
95
+ const registeredSubmoduleDefinition = submoduleStub.getCall(0).args[1];
96
+ expect(registeredSubmoduleDefinition).to.be.an('object');
97
+ expect(registeredSubmoduleDefinition).to.have.own.property('name', 'confiant');
98
+ expect(registeredSubmoduleDefinition).to.have.own.property('init').that.is.a('function');
99
+
100
+ return registeredSubmoduleDefinition;
101
+ }
102
+
103
+ it('should register Confiant submodule', function () {
104
+ initModule();
105
+ });
106
+ });
107
+ });
@@ -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 () {
@@ -358,14 +373,20 @@ describe('FeedAdAdapter', function () {
358
373
  const pixelSync2 = {type: 'image', url: 'the pixel url 2'};
359
374
  const iFrameSync1 = {type: 'iframe', url: 'the iFrame url 1'};
360
375
  const iFrameSync2 = {type: 'iframe', url: 'the iFrame url 2'};
376
+ const mockServerResponse = (content) => {
377
+ if (!(content instanceof Array)) {
378
+ content = [content];
379
+ }
380
+ return content.map(it => ({body: it}));
381
+ };
361
382
 
362
383
  it('should pass through the syncs out of the extension fields of the server response', function () {
363
- const serverResponse = [{
384
+ const serverResponse = mockServerResponse([{
364
385
  ext: {
365
386
  pixels: [pixelSync1, pixelSync2],
366
387
  iframes: [iFrameSync1, iFrameSync2],
367
388
  }
368
- }];
389
+ }]);
369
390
  const result = spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, serverResponse)
370
391
  expect(result).to.deep.equal([
371
392
  pixelSync1,
@@ -376,7 +397,7 @@ describe('FeedAdAdapter', function () {
376
397
  });
377
398
 
378
399
  it('should concat the syncs of all responses', function () {
379
- const serverResponse = [{
400
+ const serverResponse = mockServerResponse([{
380
401
  ext: {
381
402
  pixels: [pixelSync1],
382
403
  iframes: [iFrameSync2],
@@ -391,7 +412,7 @@ describe('FeedAdAdapter', function () {
391
412
  ext: {
392
413
  pixels: [pixelSync2],
393
414
  }
394
- }];
415
+ }]);
395
416
  const result = spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, serverResponse);
396
417
  expect(result).to.deep.equal([
397
418
  pixelSync1,
@@ -402,7 +423,7 @@ describe('FeedAdAdapter', function () {
402
423
  });
403
424
 
404
425
  it('should filter out duplicates', function () {
405
- const serverResponse = [{
426
+ const serverResponse = mockServerResponse([{
406
427
  ext: {
407
428
  pixels: [pixelSync1, pixelSync1],
408
429
  iframes: [iFrameSync2, iFrameSync2],
@@ -411,7 +432,7 @@ describe('FeedAdAdapter', function () {
411
432
  ext: {
412
433
  iframes: [iFrameSync2, iFrameSync2],
413
434
  }
414
- }];
435
+ }]);
415
436
  const result = spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, serverResponse);
416
437
  expect(result).to.deep.equal([
417
438
  pixelSync1,
@@ -420,12 +441,12 @@ describe('FeedAdAdapter', function () {
420
441
  });
421
442
 
422
443
  it('should not include iFrame syncs if the option is disabled', function () {
423
- const serverResponse = [{
444
+ const serverResponse = mockServerResponse([{
424
445
  ext: {
425
446
  pixels: [pixelSync1, pixelSync2],
426
447
  iframes: [iFrameSync1, iFrameSync2],
427
448
  }
428
- }];
449
+ }]);
429
450
  const result = spec.getUserSyncs({iframeEnabled: false, pixelEnabled: true}, serverResponse);
430
451
  expect(result).to.deep.equal([
431
452
  pixelSync1,
@@ -434,12 +455,12 @@ describe('FeedAdAdapter', function () {
434
455
  });
435
456
 
436
457
  it('should not include pixel syncs if the option is disabled', function () {
437
- const serverResponse = [{
458
+ const serverResponse = mockServerResponse([{
438
459
  ext: {
439
460
  pixels: [pixelSync1, pixelSync2],
440
461
  iframes: [iFrameSync1, iFrameSync2],
441
462
  }
442
- }];
463
+ }]);
443
464
  const result = spec.getUserSyncs({iframeEnabled: true, pixelEnabled: false}, serverResponse);
444
465
  expect(result).to.deep.equal([
445
466
  iFrameSync1,
@@ -448,15 +469,40 @@ describe('FeedAdAdapter', function () {
448
469
  });
449
470
 
450
471
  it('should not include any syncs if the sync options are disabled or missing', function () {
451
- const serverResponse = [{
472
+ const serverResponse = mockServerResponse([{
452
473
  ext: {
453
474
  pixels: [pixelSync1, pixelSync2],
454
475
  iframes: [iFrameSync1, iFrameSync2],
455
476
  }
456
- }];
477
+ }]);
457
478
  const result = spec.getUserSyncs({iframeEnabled: false, pixelEnabled: false}, serverResponse);
458
479
  expect(result).to.deep.equal([]);
459
480
  });
481
+
482
+ it('should handle empty responses', function () {
483
+ const serverResponse = mockServerResponse([]);
484
+ const result = spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, serverResponse)
485
+ expect(result).to.deep.equal([]);
486
+ });
487
+
488
+ it('should not throw if the server response is weird', function () {
489
+ const responses = [
490
+ mockServerResponse(null),
491
+ mockServerResponse('null'),
492
+ mockServerResponse(1234),
493
+ mockServerResponse({}),
494
+ mockServerResponse([{}, 123]),
495
+ ];
496
+ responses.forEach(it => {
497
+ expect(() => spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, it)).not.to.throw;
498
+ });
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
+ });
460
506
  });
461
507
 
462
508
  describe('event tracking calls', function () {
@@ -592,7 +638,8 @@ describe('FeedAdAdapter', function () {
592
638
  prebid_bid_id: bidId,
593
639
  prebid_transaction_id: transactionId,
594
640
  referer,
595
- sdk_version: '1.0.3'
641
+ prebid_adapter_version: EXPECTED_ADAPTER_VERSION,
642
+ prebid_sdk_version: '$prebid.version$',
596
643
  };
597
644
  subject(data);
598
645
  expect(server.requests.length).to.equal(1);