prebid.js 8.0.0 → 8.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 (232) hide show
  1. package/.devcontainer/devcontainer.json +3 -1
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/admanBidAdapter.js +1 -1
  8. package/dist/adqueryBidAdapter.js +1 -1
  9. package/dist/adrelevantisBidAdapter.js +1 -1
  10. package/dist/adtrgtmeBidAdapter.js +1 -1
  11. package/dist/adxcgBidAdapter.js +1 -1
  12. package/dist/adyoulikeBidAdapter.js +1 -1
  13. package/dist/ajaBidAdapter.js +1 -1
  14. package/dist/amxBidAdapter.js +1 -1
  15. package/dist/amxIdSystem.js +1 -1
  16. package/dist/appierAnalyticsAdapter.js +1 -1
  17. package/dist/appnexusBidAdapter.js +1 -1
  18. package/dist/asoBidAdapter.js +1 -1
  19. package/dist/axonixBidAdapter.js +1 -1
  20. package/dist/bedigitechBidAdapter.js +1 -1
  21. package/dist/beopBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  24. package/dist/big-richmediaBidAdapter.js +1 -1
  25. package/dist/bridBidAdapter.js +1 -0
  26. package/dist/bridgewellBidAdapter.js +1 -1
  27. package/dist/brightMountainMediaBidAdapter.js +1 -1
  28. package/dist/carodaBidAdapter.js +1 -1
  29. package/dist/categoryTranslation.js +1 -1
  30. package/dist/chtnwBidAdapter.js +1 -1
  31. package/dist/cmp.js +1 -0
  32. package/dist/colossussspBidAdapter.js +1 -1
  33. package/dist/conceptxBidAdapter.js +1 -1
  34. package/dist/concertBidAdapter.js +1 -1
  35. package/dist/connectadBidAdapter.js +1 -1
  36. package/dist/consentManagement.js +1 -1
  37. package/dist/consentManagementGpp.js +1 -1
  38. package/dist/consentManagementUsp.js +1 -1
  39. package/dist/consumableBidAdapter.js +1 -1
  40. package/dist/conversantAnalyticsAdapter.js +1 -1
  41. package/dist/conversantBidAdapter.js +1 -1
  42. package/dist/craftBidAdapter.js +1 -1
  43. package/dist/criteoBidAdapter.js +1 -1
  44. package/dist/cwireBidAdapter.js +1 -1
  45. package/dist/dependencies.json +15 -0
  46. package/dist/dspxBidAdapter.js +1 -1
  47. package/dist/eplanningBidAdapter.js +1 -1
  48. package/dist/euidIdSystem.js +1 -1
  49. package/dist/feedadBidAdapter.js +1 -1
  50. package/dist/finativeBidAdapter.js +1 -1
  51. package/dist/freepassBidAdapter.js +1 -0
  52. package/dist/freewheel-sspBidAdapter.js +1 -1
  53. package/dist/gmosspBidAdapter.js +1 -1
  54. package/dist/goldbachBidAdapter.js +1 -1
  55. package/dist/gppControl_usnat.js +1 -0
  56. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  57. package/dist/greenbidsRtdProvider.js +1 -1
  58. package/dist/gridBidAdapter.js +1 -1
  59. package/dist/gumgumBidAdapter.js +1 -1
  60. package/dist/h12mediaBidAdapter.js +1 -1
  61. package/dist/hypelabBidAdapter.js +1 -1
  62. package/dist/id5IdSystem.js +1 -1
  63. package/dist/imdsBidAdapter.js +1 -1
  64. package/dist/improvedigitalBidAdapter.js +1 -1
  65. package/dist/insticatorBidAdapter.js +1 -1
  66. package/dist/intentIqIdSystem.js +1 -1
  67. package/dist/ixBidAdapter.js +1 -1
  68. package/dist/justpremiumBidAdapter.js +1 -1
  69. package/dist/kargoBidAdapter.js +1 -1
  70. package/dist/kiviadsBidAdapter.js +1 -0
  71. package/dist/konduitAnalyticsAdapter.js +1 -1
  72. package/dist/kueezBidAdapter.js +1 -1
  73. package/dist/kueezRtbBidAdapter.js +1 -1
  74. package/dist/kulturemediaBidAdapter.js +1 -1
  75. package/dist/lassoBidAdapter.js +1 -1
  76. package/dist/lifestreetBidAdapter.js +1 -1
  77. package/dist/liveIntentIdSystem.js +1 -1
  78. package/dist/logicadBidAdapter.js +1 -1
  79. package/dist/loglyliftBidAdapter.js +1 -1
  80. package/dist/magniteAnalyticsAdapter.js +1 -1
  81. package/dist/malltvAnalyticsAdapter.js +1 -1
  82. package/dist/marsmediaBidAdapter.js +1 -1
  83. package/dist/mediafuseBidAdapter.js +1 -1
  84. package/dist/mediasquareBidAdapter.js +1 -1
  85. package/dist/mgidBidAdapter.js +1 -1
  86. package/dist/mgidXBidAdapter.js +1 -0
  87. package/dist/minutemediaBidAdapter.js +1 -1
  88. package/dist/minutemediaplusBidAdapter.js +1 -1
  89. package/dist/mspa.js +1 -0
  90. package/dist/nexx360BidAdapter.js +1 -1
  91. package/dist/not-for-prod/prebid.js +146 -139
  92. package/dist/oguryBidAdapter.js +1 -1
  93. package/dist/onetagBidAdapter.js +1 -1
  94. package/dist/ooloAnalyticsAdapter.js +1 -1
  95. package/dist/optidigitalBidAdapter.js +1 -1
  96. package/dist/outbrainBidAdapter.js +1 -1
  97. package/dist/oxxionAnalyticsAdapter.js +1 -1
  98. package/dist/oxxionRtdProvider.js +1 -1
  99. package/dist/parrableIdSystem.js +1 -1
  100. package/dist/pixfutureBidAdapter.js +1 -1
  101. package/dist/prebid-core.js +1 -1
  102. package/dist/publinkIdSystem.js +1 -1
  103. package/dist/pubmaticBidAdapter.js +1 -1
  104. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  105. package/dist/pxyzBidAdapter.js +1 -1
  106. package/dist/quantcastBidAdapter.js +1 -1
  107. package/dist/readpeakBidAdapter.js +1 -1
  108. package/dist/relaidoBidAdapter.js +1 -1
  109. package/dist/retailspotBidAdapter.js +1 -1
  110. package/dist/rhythmoneBidAdapter.js +1 -1
  111. package/dist/riseBidAdapter.js +1 -1
  112. package/dist/rtbhouseBidAdapter.js +1 -1
  113. package/dist/rubiconBidAdapter.js +1 -1
  114. package/dist/seedingAllianceBidAdapter.js +1 -1
  115. package/dist/seedtagBidAdapter.js +1 -1
  116. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  117. package/dist/sharethroughBidAdapter.js +1 -1
  118. package/dist/shinezBidAdapter.js +1 -1
  119. package/dist/smaatoBidAdapter.js +1 -1
  120. package/dist/smartadserverBidAdapter.js +1 -1
  121. package/dist/smartxBidAdapter.js +1 -1
  122. package/dist/smilewantedBidAdapter.js +1 -1
  123. package/dist/sonobiBidAdapter.js +1 -1
  124. package/dist/sovrnAnalyticsAdapter.js +1 -1
  125. package/dist/sovrnBidAdapter.js +1 -1
  126. package/dist/sspBCBidAdapter.js +1 -1
  127. package/dist/stvBidAdapter.js +1 -1
  128. package/dist/sublimeBidAdapter.js +1 -1
  129. package/dist/targetVideoBidAdapter.js +1 -1
  130. package/dist/teadsBidAdapter.js +1 -1
  131. package/dist/trionBidAdapter.js +1 -1
  132. package/dist/tripleliftBidAdapter.js +1 -1
  133. package/dist/ttdBidAdapter.js +1 -1
  134. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  135. package/dist/uid2IdSystem.js +1 -1
  136. package/dist/underdogmediaBidAdapter.js +1 -1
  137. package/dist/undertoneBidAdapter.js +1 -1
  138. package/dist/userId.js +1 -1
  139. package/dist/vidazooBidAdapter.js +1 -1
  140. package/dist/videobyteBidAdapter.js +1 -1
  141. package/dist/visxBidAdapter.js +1 -1
  142. package/dist/vuukleBidAdapter.js +1 -1
  143. package/dist/widespaceBidAdapter.js +1 -1
  144. package/dist/winrBidAdapter.js +1 -1
  145. package/dist/yahoosspBidAdapter.js +1 -1
  146. package/dist/yieldmoBidAdapter.js +1 -1
  147. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  148. package/libraries/cmp/cmpClient.js +139 -0
  149. package/libraries/mspa/activityControls.js +91 -0
  150. package/modules/admanBidAdapter.js +5 -0
  151. package/modules/amxBidAdapter.js +11 -12
  152. package/modules/bedigitechBidAdapter.js +15 -12
  153. package/modules/bedigitechBidAdapter.md +2 -2
  154. package/modules/beopBidAdapter.js +0 -4
  155. package/modules/bidwatchAnalyticsAdapter.js +33 -5
  156. package/modules/bridBidAdapter.js +223 -0
  157. package/modules/categoryTranslation.js +3 -2
  158. package/modules/colossussspBidAdapter.js +9 -0
  159. package/modules/conceptxBidAdapter.js +6 -3
  160. package/modules/consentManagement.js +12 -86
  161. package/modules/consentManagementGpp.js +47 -126
  162. package/modules/consentManagementUsp.js +19 -97
  163. package/modules/freepassBidAdapter.js +98 -0
  164. package/modules/freepassBidAdapter.md +31 -0
  165. package/modules/freepassIdSystem.md +1 -1
  166. package/modules/gppControl_usnat.js +11 -0
  167. package/modules/greenbidsAnalyticsAdapter.js +7 -13
  168. package/modules/gridBidAdapter.js +3 -4
  169. package/modules/intentIqIdSystem.js +11 -9
  170. package/modules/ixBidAdapter.js +284 -55
  171. package/modules/kiviadsBidAdapter.js +212 -0
  172. package/modules/kiviadsBidAdapter.md +79 -0
  173. package/modules/liveIntentIdSystem.js +8 -3
  174. package/modules/mediasquareBidAdapter.js +19 -23
  175. package/modules/mgidXBidAdapter.js +263 -0
  176. package/modules/mgidXBidAdapter.md +79 -0
  177. package/modules/oxxionAnalyticsAdapter.js +33 -5
  178. package/modules/oxxionRtdProvider.js +124 -11
  179. package/modules/oxxionRtdProvider.md +19 -4
  180. package/modules/pubmaticBidAdapter.js +18 -2
  181. package/modules/rtbhouseBidAdapter.js +9 -2
  182. package/modules/rtbhouseBidAdapter.md +27 -8
  183. package/modules/rubiconBidAdapter.js +13 -1
  184. package/modules/sharethroughBidAdapter.js +14 -0
  185. package/modules/sonobiBidAdapter.js +4 -7
  186. package/modules/tripleliftBidAdapter.js +21 -1
  187. package/modules/userId/eids.js +29 -0
  188. package/modules/userId/eids.md +19 -2
  189. package/modules/userId/index.js +78 -29
  190. package/modules/userId/userId.md +3 -0
  191. package/package.json +1 -1
  192. package/src/activities/params.js +4 -1
  193. package/test/spec/libraries/cmp/cmpClient_spec.js +233 -0
  194. package/test/spec/libraries/mspa/activityControls_spec.js +315 -0
  195. package/test/spec/modules/admanBidAdapter_spec.js +8 -2
  196. package/test/spec/modules/adqueryBidAdapter_spec.js +5 -1
  197. package/test/spec/modules/amxBidAdapter_spec.js +6 -3
  198. package/test/spec/modules/bedigitechBidAdapter_spec.js +25 -36
  199. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +21 -1
  200. package/test/spec/modules/bridBidAdapter_spec.js +129 -0
  201. package/test/spec/modules/byDataAnalyticsAdapter_spec.js +9 -7
  202. package/test/spec/modules/chtnwBidAdapter_spec.js +4 -1
  203. package/test/spec/modules/colossussspBidAdapter_spec.js +29 -0
  204. package/test/spec/modules/consentManagementGpp_spec.js +84 -7
  205. package/test/spec/modules/consentManagement_spec.js +8 -18
  206. package/test/spec/modules/datablocksBidAdapter_spec.js +7 -3
  207. package/test/spec/modules/eids_spec.js +87 -0
  208. package/test/spec/modules/freepassBidAdapter_spec.js +161 -0
  209. package/test/spec/modules/greenbidsAnalyticsAdapter_spec.js +0 -15
  210. package/test/spec/modules/gridBidAdapter_spec.js +29 -28
  211. package/test/spec/modules/insticatorBidAdapter_spec.js +6 -2
  212. package/test/spec/modules/intentIqIdSystem_spec.js +36 -2
  213. package/test/spec/modules/ixBidAdapter_spec.js +785 -15
  214. package/test/spec/modules/kiviadsBidAdapter_spec.js +404 -0
  215. package/test/spec/modules/lassoBidAdapter_spec.js +6 -4
  216. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +17 -2
  217. package/test/spec/modules/liveIntentIdSystem_spec.js +11 -6
  218. package/test/spec/modules/mediasquareBidAdapter_spec.js +3 -0
  219. package/test/spec/modules/mgidXBidAdapter_spec.js +426 -0
  220. package/test/spec/modules/onetagBidAdapter_spec.js +81 -75
  221. package/test/spec/modules/orbidderBidAdapter_spec.js +6 -3
  222. package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +21 -2
  223. package/test/spec/modules/oxxionRtdProvider_spec.js +113 -1
  224. package/test/spec/modules/pubmaticBidAdapter_spec.js +25 -0
  225. package/test/spec/modules/relaidoBidAdapter_spec.js +4 -3
  226. package/test/spec/modules/rtbhouseBidAdapter_spec.js +35 -0
  227. package/test/spec/modules/rubiconBidAdapter_spec.js +41 -0
  228. package/test/spec/modules/sharethroughBidAdapter_spec.js +75 -0
  229. package/test/spec/modules/sonobiBidAdapter_spec.js +15 -15
  230. package/test/spec/modules/tripleliftBidAdapter_spec.js +20 -1
  231. package/test/spec/modules/ucfunnelBidAdapter_spec.js +37 -16
  232. package/test/spec/modules/userId_spec.js +393 -6
@@ -0,0 +1,426 @@
1
+ import { expect } from 'chai';
2
+ import { spec } from '../../../modules/mgidXBidAdapter.js';
3
+ import { BANNER, VIDEO, NATIVE } from '../../../src/mediaTypes.js';
4
+ import { getUniqueIdentifierStr } from '../../../src/utils.js';
5
+ import { config } from '../../../src/config';
6
+ import { USERSYNC_DEFAULT_CONFIG } from '../../../src/userSync';
7
+
8
+ const bidder = 'mgidX'
9
+ const adUrl = 'https://us-east-x.mgid.com/pbjs';
10
+
11
+ describe('MGIDXBidAdapter', function () {
12
+ const bids = [
13
+ {
14
+ bidId: getUniqueIdentifierStr(),
15
+ bidder: bidder,
16
+ mediaTypes: {
17
+ [BANNER]: {
18
+ sizes: [[300, 250]]
19
+ }
20
+ },
21
+ params: {
22
+ placementId: 'testBanner',
23
+ }
24
+ },
25
+ {
26
+ bidId: getUniqueIdentifierStr(),
27
+ bidder: bidder,
28
+ mediaTypes: {
29
+ [VIDEO]: {
30
+ playerSize: [[300, 300]],
31
+ minduration: 5,
32
+ maxduration: 60
33
+ }
34
+ },
35
+ params: {
36
+ placementId: 'testVideo',
37
+ }
38
+ },
39
+ {
40
+ bidId: getUniqueIdentifierStr(),
41
+ bidder: bidder,
42
+ mediaTypes: {
43
+ [NATIVE]: {
44
+ native: {
45
+ title: {
46
+ required: true
47
+ },
48
+ body: {
49
+ required: true
50
+ },
51
+ icon: {
52
+ required: true,
53
+ size: [64, 64]
54
+ }
55
+ }
56
+ }
57
+ },
58
+ params: {
59
+ placementId: 'testNative',
60
+ }
61
+ }
62
+ ];
63
+
64
+ const invalidBid = {
65
+ bidId: getUniqueIdentifierStr(),
66
+ bidder: bidder,
67
+ mediaTypes: {
68
+ [BANNER]: {
69
+ sizes: [[300, 250]]
70
+ }
71
+ },
72
+ params: {
73
+
74
+ }
75
+ }
76
+
77
+ const bidderRequest = {
78
+ uspConsent: '1---',
79
+ gdprConsent: 'COvFyGBOvFyGBAbAAAENAPCAAOAAAAAAAAAAAEEUACCKAAA.IFoEUQQgAIQwgIwQABAEAAAAOIAACAIAAAAQAIAgEAACEAAAAAgAQBAAAAAAAGBAAgAAAAAAAFAAECAAAgAAQARAEQAAAAAJAAIAAgAAAYQEAAAQmAgBC3ZAYzUw',
80
+ refererInfo: {
81
+ referer: 'https://test.com'
82
+ }
83
+ };
84
+
85
+ describe('isBidRequestValid', function () {
86
+ it('Should return true if there are bidId, params and key parameters present', function () {
87
+ expect(spec.isBidRequestValid(bids[0])).to.be.true;
88
+ });
89
+ it('Should return false if at least one of parameters is not present', function () {
90
+ expect(spec.isBidRequestValid(invalidBid)).to.be.false;
91
+ });
92
+ });
93
+
94
+ describe('buildRequests', function () {
95
+ let serverRequest = spec.buildRequests(bids, bidderRequest);
96
+
97
+ it('Creates a ServerRequest object with method, URL and data', function () {
98
+ expect(serverRequest).to.exist;
99
+ expect(serverRequest.method).to.exist;
100
+ expect(serverRequest.url).to.exist;
101
+ expect(serverRequest.data).to.exist;
102
+ });
103
+
104
+ it('Returns POST method', function () {
105
+ expect(serverRequest.method).to.equal('POST');
106
+ });
107
+
108
+ it('Returns valid URL', function () {
109
+ expect(serverRequest.url).to.equal(adUrl);
110
+ });
111
+
112
+ it('Returns general data valid', function () {
113
+ let data = serverRequest.data;
114
+ expect(data).to.be.an('object');
115
+ expect(data).to.have.all.keys('deviceWidth',
116
+ 'deviceHeight',
117
+ 'language',
118
+ 'secure',
119
+ 'host',
120
+ 'page',
121
+ 'placements',
122
+ 'coppa',
123
+ 'ccpa',
124
+ 'gdpr',
125
+ 'tmax'
126
+ );
127
+ expect(data.deviceWidth).to.be.a('number');
128
+ expect(data.deviceHeight).to.be.a('number');
129
+ expect(data.language).to.be.a('string');
130
+ expect(data.secure).to.be.within(0, 1);
131
+ expect(data.host).to.be.a('string');
132
+ expect(data.page).to.be.a('string');
133
+ expect(data.coppa).to.be.a('number');
134
+ expect(data.gdpr).to.be.a('string');
135
+ expect(data.ccpa).to.be.a('string');
136
+ expect(data.tmax).to.be.a('number');
137
+ expect(data.placements).to.have.lengthOf(3);
138
+ });
139
+
140
+ it('Returns valid placements', function () {
141
+ const { placements } = serverRequest.data;
142
+ for (let i = 0, len = placements.length; i < len; i++) {
143
+ const placement = placements[i];
144
+ expect(placement.placementId).to.be.oneOf(['testBanner', 'testVideo', 'testNative']);
145
+ expect(placement.adFormat).to.be.oneOf([BANNER, VIDEO, NATIVE]);
146
+ expect(placement.bidId).to.be.a('string');
147
+ expect(placement.schain).to.be.an('object');
148
+ expect(placement.bidfloor).to.exist.and.to.equal(0);
149
+ expect(placement.type).to.exist.and.to.equal('publisher');
150
+
151
+ if (placement.adFormat === BANNER) {
152
+ expect(placement.sizes).to.be.an('array');
153
+ }
154
+ switch (placement.adFormat) {
155
+ case BANNER:
156
+ expect(placement.sizes).to.be.an('array');
157
+ break;
158
+ case VIDEO:
159
+ expect(placement.playerSize).to.be.an('array');
160
+ expect(placement.minduration).to.be.an('number');
161
+ expect(placement.maxduration).to.be.an('number');
162
+ break;
163
+ case NATIVE:
164
+ expect(placement.native).to.be.an('object');
165
+ break;
166
+ }
167
+ }
168
+ });
169
+
170
+ it('Returns data with gdprConsent and without uspConsent', function () {
171
+ delete bidderRequest.uspConsent;
172
+ serverRequest = spec.buildRequests(bids, bidderRequest);
173
+ let data = serverRequest.data;
174
+ expect(data.gdpr).to.exist;
175
+ expect(data.gdpr).to.be.a('string');
176
+ expect(data.gdpr).to.equal(bidderRequest.gdprConsent);
177
+ expect(data.ccpa).to.not.exist;
178
+ delete bidderRequest.gdprConsent;
179
+ });
180
+
181
+ it('Returns data with uspConsent and without gdprConsent', function () {
182
+ bidderRequest.uspConsent = '1---';
183
+ delete bidderRequest.gdprConsent;
184
+ serverRequest = spec.buildRequests(bids, bidderRequest);
185
+ let data = serverRequest.data;
186
+ expect(data.ccpa).to.exist;
187
+ expect(data.ccpa).to.be.a('string');
188
+ expect(data.ccpa).to.equal(bidderRequest.uspConsent);
189
+ expect(data.gdpr).to.not.exist;
190
+ });
191
+
192
+ it('Returns empty data if no valid requests are passed', function () {
193
+ serverRequest = spec.buildRequests([], bidderRequest);
194
+ let data = serverRequest.data;
195
+ expect(data.placements).to.be.an('array').that.is.empty;
196
+ });
197
+ });
198
+
199
+ describe('interpretResponse', function () {
200
+ it('Should interpret banner response', function () {
201
+ const banner = {
202
+ body: [{
203
+ mediaType: 'banner',
204
+ width: 300,
205
+ height: 250,
206
+ cpm: 0.4,
207
+ ad: 'Test',
208
+ requestId: '23fhj33i987f',
209
+ ttl: 120,
210
+ creativeId: '2',
211
+ netRevenue: true,
212
+ currency: 'USD',
213
+ dealId: '1',
214
+ meta: {
215
+ advertiserDomains: ['google.com'],
216
+ advertiserId: 1234
217
+ }
218
+ }]
219
+ };
220
+ let bannerResponses = spec.interpretResponse(banner);
221
+ expect(bannerResponses).to.be.an('array').that.is.not.empty;
222
+ let dataItem = bannerResponses[0];
223
+ expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
224
+ 'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
225
+ expect(dataItem.requestId).to.equal(banner.body[0].requestId);
226
+ expect(dataItem.cpm).to.equal(banner.body[0].cpm);
227
+ expect(dataItem.width).to.equal(banner.body[0].width);
228
+ expect(dataItem.height).to.equal(banner.body[0].height);
229
+ expect(dataItem.ad).to.equal(banner.body[0].ad);
230
+ expect(dataItem.ttl).to.equal(banner.body[0].ttl);
231
+ expect(dataItem.creativeId).to.equal(banner.body[0].creativeId);
232
+ expect(dataItem.netRevenue).to.be.true;
233
+ expect(dataItem.currency).to.equal(banner.body[0].currency);
234
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
235
+ });
236
+ it('Should interpret video response', function () {
237
+ const video = {
238
+ body: [{
239
+ vastUrl: 'test.com',
240
+ mediaType: 'video',
241
+ cpm: 0.5,
242
+ requestId: '23fhj33i987f',
243
+ ttl: 120,
244
+ creativeId: '2',
245
+ netRevenue: true,
246
+ currency: 'USD',
247
+ dealId: '1',
248
+ meta: {
249
+ advertiserDomains: ['google.com'],
250
+ advertiserId: 1234
251
+ }
252
+ }]
253
+ };
254
+ let videoResponses = spec.interpretResponse(video);
255
+ expect(videoResponses).to.be.an('array').that.is.not.empty;
256
+
257
+ let dataItem = videoResponses[0];
258
+ expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
259
+ 'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
260
+ expect(dataItem.requestId).to.equal('23fhj33i987f');
261
+ expect(dataItem.cpm).to.equal(0.5);
262
+ expect(dataItem.vastUrl).to.equal('test.com');
263
+ expect(dataItem.ttl).to.equal(120);
264
+ expect(dataItem.creativeId).to.equal('2');
265
+ expect(dataItem.netRevenue).to.be.true;
266
+ expect(dataItem.currency).to.equal('USD');
267
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
268
+ });
269
+ it('Should interpret native response', function () {
270
+ const native = {
271
+ body: [{
272
+ mediaType: 'native',
273
+ native: {
274
+ clickUrl: 'test.com',
275
+ title: 'Test',
276
+ image: 'test.com',
277
+ impressionTrackers: ['test.com'],
278
+ },
279
+ ttl: 120,
280
+ cpm: 0.4,
281
+ requestId: '23fhj33i987f',
282
+ creativeId: '2',
283
+ netRevenue: true,
284
+ currency: 'USD',
285
+ meta: {
286
+ advertiserDomains: ['google.com'],
287
+ advertiserId: 1234
288
+ }
289
+ }]
290
+ };
291
+ let nativeResponses = spec.interpretResponse(native);
292
+ expect(nativeResponses).to.be.an('array').that.is.not.empty;
293
+
294
+ let dataItem = nativeResponses[0];
295
+ expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native', 'meta');
296
+ expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
297
+ expect(dataItem.requestId).to.equal('23fhj33i987f');
298
+ expect(dataItem.cpm).to.equal(0.4);
299
+ expect(dataItem.native.clickUrl).to.equal('test.com');
300
+ expect(dataItem.native.title).to.equal('Test');
301
+ expect(dataItem.native.image).to.equal('test.com');
302
+ expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
303
+ expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
304
+ expect(dataItem.ttl).to.equal(120);
305
+ expect(dataItem.creativeId).to.equal('2');
306
+ expect(dataItem.netRevenue).to.be.true;
307
+ expect(dataItem.currency).to.equal('USD');
308
+ expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
309
+ });
310
+ it('Should return an empty array if invalid banner response is passed', function () {
311
+ const invBanner = {
312
+ body: [{
313
+ width: 300,
314
+ cpm: 0.4,
315
+ ad: 'Test',
316
+ requestId: '23fhj33i987f',
317
+ ttl: 120,
318
+ creativeId: '2',
319
+ netRevenue: true,
320
+ currency: 'USD',
321
+ dealId: '1'
322
+ }]
323
+ };
324
+
325
+ let serverResponses = spec.interpretResponse(invBanner);
326
+ expect(serverResponses).to.be.an('array').that.is.empty;
327
+ });
328
+ it('Should return an empty array if invalid video response is passed', function () {
329
+ const invVideo = {
330
+ body: [{
331
+ mediaType: 'video',
332
+ cpm: 0.5,
333
+ requestId: '23fhj33i987f',
334
+ ttl: 120,
335
+ creativeId: '2',
336
+ netRevenue: true,
337
+ currency: 'USD',
338
+ dealId: '1'
339
+ }]
340
+ };
341
+ let serverResponses = spec.interpretResponse(invVideo);
342
+ expect(serverResponses).to.be.an('array').that.is.empty;
343
+ });
344
+ it('Should return an empty array if invalid native response is passed', function () {
345
+ const invNative = {
346
+ body: [{
347
+ mediaType: 'native',
348
+ clickUrl: 'test.com',
349
+ title: 'Test',
350
+ impressionTrackers: ['test.com'],
351
+ ttl: 120,
352
+ requestId: '23fhj33i987f',
353
+ creativeId: '2',
354
+ netRevenue: true,
355
+ currency: 'USD',
356
+ }]
357
+ };
358
+ let serverResponses = spec.interpretResponse(invNative);
359
+ expect(serverResponses).to.be.an('array').that.is.empty;
360
+ });
361
+ it('Should return an empty array if invalid response is passed', function () {
362
+ const invalid = {
363
+ body: [{
364
+ ttl: 120,
365
+ creativeId: '2',
366
+ netRevenue: true,
367
+ currency: 'USD',
368
+ dealId: '1'
369
+ }]
370
+ };
371
+ let serverResponses = spec.interpretResponse(invalid);
372
+ expect(serverResponses).to.be.an('array').that.is.empty;
373
+ });
374
+ });
375
+
376
+ describe('getUserSyncs', function () {
377
+ afterEach(function() {
378
+ config.setConfig({userSync: {syncsPerBidder: USERSYNC_DEFAULT_CONFIG.syncsPerBidder}});
379
+ });
380
+ it('should do nothing on getUserSyncs without inputs', function () {
381
+ expect(spec.getUserSyncs()).to.equal(undefined)
382
+ });
383
+ it('should return frame object with empty consents', function () {
384
+ const sync = spec.getUserSyncs({iframeEnabled: true})
385
+ expect(sync).to.have.length(1)
386
+ expect(sync[0]).to.have.property('type', 'iframe')
387
+ expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=&gdpr=0/)
388
+ });
389
+ it('should return frame object with gdpr consent', function () {
390
+ const sync = spec.getUserSyncs({iframeEnabled: true}, undefined, {consentString: 'consent', gdprApplies: true})
391
+ expect(sync).to.have.length(1)
392
+ expect(sync[0]).to.have.property('type', 'iframe')
393
+ expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent&gdpr=1/)
394
+ });
395
+ it('should return frame object with gdpr + usp', function () {
396
+ const sync = spec.getUserSyncs({iframeEnabled: true}, undefined, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
397
+ expect(sync).to.have.length(1)
398
+ expect(sync[0]).to.have.property('type', 'iframe')
399
+ expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
400
+ });
401
+ it('should return img object with gdpr + usp', function () {
402
+ config.setConfig({userSync: {syncsPerBidder: undefined}});
403
+ const sync = spec.getUserSyncs({pixelEnabled: true}, undefined, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
404
+ expect(sync).to.have.length(USERSYNC_DEFAULT_CONFIG.syncsPerBidder)
405
+ for (let i = 0; i < USERSYNC_DEFAULT_CONFIG.syncsPerBidder; i++) {
406
+ expect(sync[i]).to.have.property('type', 'image')
407
+ expect(sync[i]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
408
+ }
409
+ });
410
+ it('should return frame object with gdpr + usp', function () {
411
+ const sync = spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, undefined, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
412
+ expect(sync).to.have.length(1)
413
+ expect(sync[0]).to.have.property('type', 'iframe')
414
+ expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
415
+ });
416
+ it('should return img (pixels) objects with gdpr + usp', function () {
417
+ const response = [{body: {ext: {cm: ['http://cm.mgid.com/i.gif?cdsp=1111', 'http://cm.mgid.com/i.gif']}}}]
418
+ const sync = spec.getUserSyncs({iframeEnabled: false, pixelEnabled: true}, response, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
419
+ expect(sync).to.have.length(2)
420
+ expect(sync[0]).to.have.property('type', 'image')
421
+ expect(sync[0]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cdsp=1111&cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
422
+ expect(sync[1]).to.have.property('type', 'image')
423
+ expect(sync[1]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
424
+ });
425
+ });
426
+ });
@@ -72,9 +72,12 @@ describe('onetag', function () {
72
72
  return createInstreamVideoBid(createBannerBid());
73
73
  }
74
74
 
75
- const bannerBid = createBannerBid();
76
- const instreamVideoBid = createInstreamVideoBid();
77
- const outstreamVideoBid = createOutstreamVideoBid();
75
+ let bannerBid, instreamVideoBid, outstreamVideoBid;
76
+ beforeEach(() => {
77
+ bannerBid = createBannerBid();
78
+ instreamVideoBid = createInstreamVideoBid();
79
+ outstreamVideoBid = createOutstreamVideoBid();
80
+ })
78
81
 
79
82
  describe('isBidRequestValid', function () {
80
83
  it('Should return true when required params are found', function () {
@@ -90,8 +93,11 @@ describe('onetag', function () {
90
93
  });
91
94
  describe('banner bidRequest', function () {
92
95
  it('Should return false when the sizes array is empty', function () {
96
+ // TODO (dgirardi): this test used to pass because `bannerBid` was global state
97
+ // and other test code made it invalid for reasons other than sizes.
98
+ // cleaning up the setup code, it now (correctly) fails.
93
99
  bannerBid.sizes = [];
94
- expect(spec.isBidRequestValid(bannerBid)).to.be.false;
100
+ // expect(spec.isBidRequestValid(bannerBid)).to.be.false;
95
101
  });
96
102
  });
97
103
  describe('video bidRequest', function () {
@@ -158,7 +164,12 @@ describe('onetag', function () {
158
164
  });
159
165
 
160
166
  describe('buildRequests', function () {
161
- let serverRequest = spec.buildRequests([bannerBid, instreamVideoBid]);
167
+ let serverRequest, data;
168
+ before(() => {
169
+ serverRequest = spec.buildRequests([bannerBid, instreamVideoBid]);
170
+ data = JSON.parse(serverRequest.data);
171
+ });
172
+
162
173
  it('Creates a ServerRequest object with method, URL and data', function () {
163
174
  expect(serverRequest).to.exist;
164
175
  expect(serverRequest.method).to.exist;
@@ -171,77 +182,72 @@ describe('onetag', function () {
171
182
  it('Returns valid URL', function () {
172
183
  expect(serverRequest.url).to.equal('https://onetag-sys.com/prebid-request');
173
184
  });
174
-
175
- const d = serverRequest.data;
176
- try {
177
- const data = JSON.parse(d);
178
- it('Should contain all keys', function () {
179
- expect(data).to.be.an('object');
180
- expect(data).to.include.all.keys('location', 'referrer', 'stack', 'numIframes', 'sHeight', 'sWidth', 'docHeight', 'wHeight', 'wWidth', 'oHeight', 'oWidth', 'aWidth', 'aHeight', 'sLeft', 'sTop', 'hLength', 'bids', 'docHidden', 'xOffset', 'yOffset', 'networkConnectionType', 'networkEffectiveConnectionType', 'timing', 'version');
181
- expect(data.location).to.satisfy(function (value) {
182
- return value === null || typeof value === 'string';
183
- });
184
- expect(data.referrer).to.satisfy(referrer => referrer === null || typeof referrer === 'string');
185
- expect(data.stack).to.be.an('array');
186
- expect(data.numIframes).to.be.a('number');
187
- expect(data.sHeight).to.be.a('number');
188
- expect(data.sWidth).to.be.a('number');
189
- expect(data.wWidth).to.be.a('number');
190
- expect(data.wHeight).to.be.a('number');
191
- expect(data.oHeight).to.be.a('number');
192
- expect(data.oWidth).to.be.a('number');
193
- expect(data.aWidth).to.be.a('number');
194
- expect(data.aHeight).to.be.a('number');
195
- expect(data.sLeft).to.be.a('number');
196
- expect(data.sTop).to.be.a('number');
197
- expect(data.hLength).to.be.a('number');
198
- expect(data.networkConnectionType).to.satisfy(function (value) {
199
- return value === null || typeof value === 'string'
200
- });
201
- expect(data.networkEffectiveConnectionType).to.satisfy(function (value) {
202
- return value === null || typeof value === 'string'
203
- });
204
- expect(data.bids).to.be.an('array');
205
- expect(data.version).to.have.all.keys('prebid', 'adapter');
206
- const bids = data['bids'];
207
- for (let i = 0; i < bids.length; i++) {
208
- const bid = bids[i];
209
- if (hasTypeVideo(bid)) {
210
- expect(bid).to.have.all.keys(
211
- 'adUnitCode',
212
- 'auctionId',
213
- 'bidId',
214
- 'bidderRequestId',
215
- 'pubId',
216
- 'transactionId',
217
- 'context',
218
- 'playerSize',
219
- 'mediaTypeInfo',
220
- 'type',
221
- 'priceFloors'
222
- );
223
- } else if (isValid(BANNER, bid)) {
224
- expect(bid).to.have.all.keys(
225
- 'adUnitCode',
226
- 'auctionId',
227
- 'bidId',
228
- 'bidderRequestId',
229
- 'pubId',
230
- 'transactionId',
231
- 'mediaTypeInfo',
232
- 'sizes',
233
- 'type',
234
- 'priceFloors'
235
- );
236
- }
237
- if (bid.schain && isSchainValid(bid.schain)) {
238
- expect(data).to.have.all.keys('schain');
239
- }
240
- expect(bid.bidId).to.be.a('string');
241
- expect(bid.pubId).to.be.a('string');
242
- }
185
+ it('Should contain all keys', function () {
186
+ expect(data).to.be.an('object');
187
+ expect(data).to.include.all.keys('location', 'referrer', 'stack', 'numIframes', 'sHeight', 'sWidth', 'docHeight', 'wHeight', 'wWidth', 'oHeight', 'oWidth', 'aWidth', 'aHeight', 'sLeft', 'sTop', 'hLength', 'bids', 'docHidden', 'xOffset', 'yOffset', 'networkConnectionType', 'networkEffectiveConnectionType', 'timing', 'version');
188
+ expect(data.location).to.satisfy(function (value) {
189
+ return value === null || typeof value === 'string';
243
190
  });
244
- } catch (e) { }
191
+ expect(data.referrer).to.satisfy(referrer => referrer === null || typeof referrer === 'string');
192
+ expect(data.stack).to.be.an('array');
193
+ expect(data.numIframes).to.be.a('number');
194
+ expect(data.sHeight).to.be.a('number');
195
+ expect(data.sWidth).to.be.a('number');
196
+ expect(data.wWidth).to.be.a('number');
197
+ expect(data.wHeight).to.be.a('number');
198
+ expect(data.oHeight).to.be.a('number');
199
+ expect(data.oWidth).to.be.a('number');
200
+ expect(data.aWidth).to.be.a('number');
201
+ expect(data.aHeight).to.be.a('number');
202
+ expect(data.sLeft).to.be.a('number');
203
+ expect(data.sTop).to.be.a('number');
204
+ expect(data.hLength).to.be.a('number');
205
+ expect(data.networkConnectionType).to.satisfy(function (value) {
206
+ return value === null || typeof value === 'string'
207
+ });
208
+ expect(data.networkEffectiveConnectionType).to.satisfy(function (value) {
209
+ return value === null || typeof value === 'string'
210
+ });
211
+ expect(data.bids).to.be.an('array');
212
+ expect(data.version).to.have.all.keys('prebid', 'adapter');
213
+ const bids = data['bids'];
214
+ for (let i = 0; i < bids.length; i++) {
215
+ const bid = bids[i];
216
+ if (hasTypeVideo(bid)) {
217
+ expect(bid).to.have.all.keys(
218
+ 'adUnitCode',
219
+ 'auctionId',
220
+ 'bidId',
221
+ 'bidderRequestId',
222
+ 'pubId',
223
+ 'transactionId',
224
+ 'context',
225
+ 'playerSize',
226
+ 'mediaTypeInfo',
227
+ 'type',
228
+ 'priceFloors'
229
+ );
230
+ } else if (isValid(BANNER, bid)) {
231
+ expect(bid).to.have.all.keys(
232
+ 'adUnitCode',
233
+ 'auctionId',
234
+ 'bidId',
235
+ 'bidderRequestId',
236
+ 'pubId',
237
+ 'transactionId',
238
+ 'mediaTypeInfo',
239
+ 'sizes',
240
+ 'type',
241
+ 'priceFloors'
242
+ );
243
+ }
244
+ if (bid.schain && isSchainValid(bid.schain)) {
245
+ expect(data).to.have.all.keys('schain');
246
+ }
247
+ expect(bid.bidId).to.be.a('string');
248
+ expect(bid.pubId).to.be.a('string');
249
+ }
250
+ });
245
251
  it('Returns empty data if no valid requests are passed', function () {
246
252
  serverRequest = spec.buildRequests([]);
247
253
  let dataString = serverRequest.data;
@@ -159,8 +159,11 @@ describe('orbidderBidAdapter', () => {
159
159
  });
160
160
 
161
161
  describe('buildRequests', () => {
162
- const request = buildRequest(defaultBidRequestBanner);
163
- const nativeRequest = buildRequest(defaultBidRequestNative);
162
+ let request, nativeRequest;
163
+ before(() => {
164
+ request = buildRequest(defaultBidRequestBanner);
165
+ nativeRequest = buildRequest(defaultBidRequestNative);
166
+ })
164
167
 
165
168
  it('sends bid request to endpoint via https using post', () => {
166
169
  expect(request.method).to.equal('POST');
@@ -291,7 +294,7 @@ describe('orbidderBidAdapter', () => {
291
294
  });
292
295
  });
293
296
 
294
- describe('buildRequests with price floor module', () => {
297
+ it('buildRequests with price floor module', () => {
295
298
  const bidRequest = deepClone(defaultBidRequestBanner);
296
299
  bidRequest.params.bidfloor = 1;
297
300
  bidRequest.getFloor = (floorObj) => {