prebid.js 7.12.0 → 7.13.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 (200) hide show
  1. package/.github/PULL_REQUEST_TEMPLATE.md +16 -10
  2. package/.github/codeql/codeql-config.yml +4 -0
  3. package/.github/workflows/codeql-analysis.yml +73 -0
  4. package/dist/33acrossBidAdapter.js +1 -1
  5. package/dist/acuityAdsBidAdapter.js +1 -0
  6. package/dist/adagioBidAdapter.js +1 -1
  7. package/dist/adbookpspBidAdapter.js +1 -1
  8. package/dist/adgenerationBidAdapter.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/aolBidAdapter.js +1 -1
  17. package/dist/appierAnalyticsAdapter.js +1 -1
  18. package/dist/appnexusBidAdapter.js +1 -1
  19. package/dist/asoBidAdapter.js +1 -1
  20. package/dist/audiencerunBidAdapter.js +1 -1
  21. package/dist/axonixBidAdapter.js +1 -1
  22. package/dist/beopBidAdapter.js +1 -1
  23. package/dist/bidglassBidAdapter.js +1 -1
  24. package/dist/big-richmediaBidAdapter.js +1 -1
  25. package/dist/bluebillywigBidAdapter.js +1 -1
  26. package/dist/brandmetricsRtdProvider.js +1 -1
  27. package/dist/bridgewellBidAdapter.js +1 -1
  28. package/dist/brightMountainMediaBidAdapter.js +1 -1
  29. package/dist/browsiRtdProvider.js +1 -1
  30. package/dist/cleanioRtdProvider.js +1 -1
  31. package/dist/concertBidAdapter.js +1 -1
  32. package/dist/connectadBidAdapter.js +1 -1
  33. package/dist/consentManagement.js +1 -1
  34. package/dist/consentManagementUsp.js +1 -1
  35. package/dist/consumableBidAdapter.js +1 -1
  36. package/dist/conversantBidAdapter.js +1 -1
  37. package/dist/craftBidAdapter.js +1 -1
  38. package/dist/criteoBidAdapter.js +1 -1
  39. package/dist/currency.js +1 -1
  40. package/dist/debugging-standalone.js +1 -1
  41. package/dist/dspxBidAdapter.js +1 -1
  42. package/dist/enrichmentFpdModule.js +1 -1
  43. package/dist/eplanningBidAdapter.js +1 -1
  44. package/dist/finativeBidAdapter.js +1 -1
  45. package/dist/glimpseBidAdapter.js +1 -1
  46. package/dist/gmosspBidAdapter.js +1 -1
  47. package/dist/goldbachBidAdapter.js +1 -1
  48. package/dist/gridBidAdapter.js +1 -1
  49. package/dist/gridNMBidAdapter.js +1 -1
  50. package/dist/gumgumBidAdapter.js +1 -1
  51. package/dist/h12mediaBidAdapter.js +1 -1
  52. package/dist/id5IdSystem.js +1 -1
  53. package/dist/imRtdProvider.js +1 -1
  54. package/dist/impactifyBidAdapter.js +1 -1
  55. package/dist/improvedigitalBidAdapter.js +1 -1
  56. package/dist/inmarBidAdapter.js +1 -1
  57. package/dist/insticatorBidAdapter.js +1 -1
  58. package/dist/ixBidAdapter.js +1 -1
  59. package/dist/jixieBidAdapter.js +1 -1
  60. package/dist/justpremiumBidAdapter.js +1 -1
  61. package/dist/konduitAnalyticsAdapter.js +1 -1
  62. package/dist/kueezBidAdapter.js +1 -1
  63. package/dist/lassoBidAdapter.js +1 -1
  64. package/dist/lifestreetBidAdapter.js +1 -0
  65. package/dist/limelightDigitalBidAdapter.js +1 -1
  66. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  67. package/dist/logicadBidAdapter.js +1 -1
  68. package/dist/loglyliftBidAdapter.js +1 -1
  69. package/dist/mabidderBidAdapter.js +1 -0
  70. package/dist/malltvAnalyticsAdapter.js +1 -1
  71. package/dist/marsmediaBidAdapter.js +1 -1
  72. package/dist/mediafuseBidAdapter.js +1 -1
  73. package/dist/mediakeysBidAdapter.js +1 -1
  74. package/dist/mediasquareBidAdapter.js +1 -1
  75. package/dist/mgidBidAdapter.js +1 -1
  76. package/dist/minutemediaBidAdapter.js +1 -1
  77. package/dist/not-for-prod/prebid.js +132 -127
  78. package/dist/oguryBidAdapter.js +1 -1
  79. package/dist/oneKeyIdSystem.js +1 -0
  80. package/dist/oneKeyRtdProvider.js +1 -0
  81. package/dist/onetagBidAdapter.js +1 -1
  82. package/dist/ooloAnalyticsAdapter.js +1 -1
  83. package/dist/outbrainBidAdapter.js +1 -1
  84. package/dist/parrableIdSystem.js +1 -1
  85. package/dist/permutiveRtdProvider.js +1 -1
  86. package/dist/pixfutureBidAdapter.js +1 -1
  87. package/dist/prebid-core.js +2 -2
  88. package/dist/publinkIdSystem.js +1 -1
  89. package/dist/pubmaticBidAdapter.js +1 -1
  90. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  91. package/dist/pxyzBidAdapter.js +1 -1
  92. package/dist/quantcastBidAdapter.js +1 -1
  93. package/dist/readpeakBidAdapter.js +1 -1
  94. package/dist/relaidoBidAdapter.js +1 -1
  95. package/dist/rhythmoneBidAdapter.js +1 -1
  96. package/dist/riseBidAdapter.js +1 -1
  97. package/dist/rtbhouseBidAdapter.js +1 -1
  98. package/dist/rubiconAnalyticsAdapter.js +1 -1
  99. package/dist/rubiconBidAdapter.js +1 -1
  100. package/dist/seedingAllianceBidAdapter.js +1 -1
  101. package/dist/seedtagBidAdapter.js +1 -1
  102. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  103. package/dist/sharethroughBidAdapter.js +1 -1
  104. package/dist/shinezBidAdapter.js +1 -1
  105. package/dist/smaatoBidAdapter.js +1 -1
  106. package/dist/smartadserverBidAdapter.js +1 -1
  107. package/dist/smartxBidAdapter.js +1 -1
  108. package/dist/smilewantedBidAdapter.js +1 -1
  109. package/dist/sonobiBidAdapter.js +1 -1
  110. package/dist/sovrnAnalyticsAdapter.js +1 -1
  111. package/dist/sovrnBidAdapter.js +1 -1
  112. package/dist/sspBCBidAdapter.js +1 -1
  113. package/dist/sublimeBidAdapter.js +1 -1
  114. package/dist/synacormediaBidAdapter.js +1 -1
  115. package/dist/targetVideoBidAdapter.js +1 -1
  116. package/dist/teadsBidAdapter.js +1 -1
  117. package/dist/trionBidAdapter.js +1 -1
  118. package/dist/tripleliftBidAdapter.js +1 -1
  119. package/dist/trustpidSystem.js +1 -1
  120. package/dist/ttdBidAdapter.js +1 -1
  121. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  122. package/dist/underdogmediaBidAdapter.js +1 -1
  123. package/dist/undertoneBidAdapter.js +1 -1
  124. package/dist/userId.js +1 -1
  125. package/dist/vidazooBidAdapter.js +1 -1
  126. package/dist/videobyteBidAdapter.js +1 -1
  127. package/dist/viewability.js +1 -1
  128. package/dist/visxBidAdapter.js +1 -1
  129. package/dist/vuukleBidAdapter.js +1 -1
  130. package/dist/widespaceBidAdapter.js +1 -1
  131. package/dist/winrBidAdapter.js +1 -1
  132. package/dist/yahoosspBidAdapter.js +1 -1
  133. package/dist/yieldmoBidAdapter.js +1 -1
  134. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  135. package/modules/.submodules.json +2 -0
  136. package/modules/acuityAdsBidAdapter.js +207 -0
  137. package/modules/acuityAdsBidAdapter.md +79 -0
  138. package/modules/adgenerationBidAdapter.js +2 -2
  139. package/modules/adriverBidAdapter.js +1 -1
  140. package/modules/appnexusBidAdapter.js +13 -93
  141. package/modules/beopBidAdapter.js +4 -4
  142. package/modules/browsiRtdProvider.js +1 -1
  143. package/modules/consentManagement.js +1 -1
  144. package/modules/consentManagementUsp.js +1 -1
  145. package/modules/consumableBidAdapter.js +23 -1
  146. package/modules/currency.js +1 -0
  147. package/modules/datawrkzBidAdapter.js +13 -13
  148. package/modules/enrichmentFpdModule.js +11 -0
  149. package/modules/id5IdSystem.js +2 -2
  150. package/modules/imRtdProvider.js +20 -7
  151. package/modules/imRtdProvider.md +3 -1
  152. package/modules/insticatorBidAdapter.js +1 -1
  153. package/modules/ixBidAdapter.js +8 -22
  154. package/modules/ixBidAdapter.md +1 -19
  155. package/modules/lifestreetBidAdapter.js +143 -0
  156. package/modules/limelightDigitalBidAdapter.js +2 -1
  157. package/modules/mabidderBidAdapter.js +60 -0
  158. package/modules/mabidderBidAdapter.md +31 -0
  159. package/modules/oneKeyIdSystem.js +78 -0
  160. package/modules/oneKeyIdSystem.md +109 -0
  161. package/modules/oneKeyRtdProvider.js +98 -0
  162. package/modules/oneKeyRtdProvider.md +127 -0
  163. package/modules/permutiveRtdProvider.js +55 -8
  164. package/modules/pubmaticBidAdapter.js +14 -0
  165. package/modules/rtbhouseBidAdapter.js +24 -0
  166. package/modules/seedtagBidAdapter.md +25 -56
  167. package/modules/tripleliftBidAdapter.js +20 -1
  168. package/modules/trustpidSystem.js +6 -42
  169. package/modules/trustpidSystem.md +10 -10
  170. package/modules/userId/eids.js +26 -0
  171. package/modules/userId/userId.md +2 -2
  172. package/modules/viewability.js +14 -14
  173. package/modules/yahoosspBidAdapter.js +1 -1
  174. package/package.json +1 -1
  175. package/src/auction.js +2 -1
  176. package/src/native.js +22 -3
  177. package/src/sizeMapping.js +4 -6
  178. package/src/utils/promise.js +3 -1
  179. package/src/utils.js +27 -0
  180. package/src/video.js +5 -4
  181. package/test/pages/instream.html +2 -2
  182. package/test/spec/modules/acuityAdsBidAdapter_spec.js +398 -0
  183. package/test/spec/modules/appnexusBidAdapter_spec.js +1 -0
  184. package/test/spec/modules/beopBidAdapter_spec.js +11 -0
  185. package/test/spec/modules/big-richmediaBidAdapter_spec.js +1 -0
  186. package/test/spec/modules/consumableBidAdapter_spec.js +19 -0
  187. package/test/spec/modules/currency_spec.js +22 -0
  188. package/test/spec/modules/enrichmentFpdModule_spec.js +14 -0
  189. package/test/spec/modules/imRtdProvider_spec.js +10 -5
  190. package/test/spec/modules/ixBidAdapter_spec.js +6 -19
  191. package/test/spec/modules/lifestreetBidAdapter_spec.js +232 -0
  192. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +59 -7
  193. package/test/spec/modules/mabidderBidAdapter_spec.js +125 -0
  194. package/test/spec/modules/oneKeyIdSystem_spec.js +107 -0
  195. package/test/spec/modules/oneKeyRtdProvider_spec.js +152 -0
  196. package/test/spec/modules/permutiveRtdProvider_spec.js +152 -2
  197. package/test/spec/modules/pubmaticBidAdapter_spec.js +16 -0
  198. package/test/spec/modules/tripleliftBidAdapter_spec.js +18 -0
  199. package/test/spec/modules/trustpidSystem_spec.js +27 -45
  200. package/test/spec/native_spec.js +17 -2
@@ -171,7 +171,8 @@ describe('IndexexchangeAdapter', function () {
171
171
  sizes: [[300, 250], [300, 600]],
172
172
  mediaTypes: {
173
173
  banner: {
174
- sizes: [[300, 250], [300, 600]]
174
+ sizes: [[300, 250], [300, 600]],
175
+ pos: 0
175
176
  }
176
177
  },
177
178
  ortb2Imp: {
@@ -1839,6 +1840,7 @@ describe('IndexexchangeAdapter', function () {
1839
1840
  expect(impression.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId);
1840
1841
  expect(impression.banner.format).to.be.length(2);
1841
1842
  expect(impression.banner.topframe).to.be.oneOf([0, 1]);
1843
+ expect(impression.banner.pos).to.equal(0);
1842
1844
  expect(impression.ext.tid).to.equal(DEFAULT_BANNER_VALID_BID[0].transactionId);
1843
1845
 
1844
1846
  impression.banner.format.map(({ w, h, ext }, index) => {
@@ -2323,15 +2325,7 @@ describe('IndexexchangeAdapter', function () {
2323
2325
  });
2324
2326
 
2325
2327
  describe('detect missing sizes', function () {
2326
- beforeEach(function () {
2327
- config.setConfig({
2328
- ix: {
2329
- detectMissingSizes: false
2330
- }
2331
- });
2332
- })
2333
-
2334
- it('request should not contain missing sizes if detectMissingSizes = false', function () {
2328
+ it('request should always contain missing sizes', function () {
2335
2329
  const bid1 = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]);
2336
2330
  bid1.mediaTypes.banner.sizes = LARGE_SET_OF_SIZES;
2337
2331
 
@@ -2448,11 +2442,13 @@ describe('IndexexchangeAdapter', function () {
2448
2442
  bid.mediaTypes.video.protocols = [6];
2449
2443
  bid.mediaTypes.video.mimes = ['video/mp4'];
2450
2444
  bid.mediaTypes.video.api = 2;
2445
+ bid.mediaTypes.video.pos = 0;
2451
2446
  const request = spec.buildRequests([bid], {})[0];
2452
2447
  const impression = JSON.parse(request.data.r).imp[0];
2453
2448
 
2454
2449
  expect(impression.video.protocols[0]).to.equal(6);
2455
2450
  expect(impression.video.api).to.equal(2);
2451
+ expect(impression.video.pos).to.equal(0);
2456
2452
  expect(impression.video.mimes[0]).to.equal('video/mp4');
2457
2453
  });
2458
2454
 
@@ -2689,15 +2685,6 @@ describe('IndexexchangeAdapter', function () {
2689
2685
  expect(videoImp.video.w).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].params.size[0]);
2690
2686
  expect(videoImp.video.h).to.equal(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0].params.size[1]);
2691
2687
  });
2692
-
2693
- it('should get missing sizes count 0 when params.size not used', function () {
2694
- const bid = utils.deepClone(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]);
2695
- delete bid.params.size;
2696
- const request = spec.buildRequests([bid], {});
2697
- const diagObj = JSON.parse(request[0].data.r).ext.ixdiag;
2698
- expect(diagObj.msd).to.equal(0);
2699
- expect(diagObj.msi).to.equal(0);
2700
- });
2701
2688
  });
2702
2689
 
2703
2690
  describe('both banner and video bidder params set', function () {
@@ -0,0 +1,232 @@
1
+ import { expect } from 'chai';
2
+ import { BANNER, VIDEO } from 'src/mediaTypes.js';
3
+ import { spec } from 'modules/lifestreetBidAdapter.js';
4
+
5
+ describe('lifestreetBidAdapter', function() {
6
+ let bidRequests;
7
+ let videoBidRequests;
8
+ let bidResponses;
9
+ let videoBidResponses;
10
+ beforeEach(function() {
11
+ bidRequests = [
12
+ {
13
+ bidder: 'lifestreet',
14
+ params: {
15
+ slot: 'slot166704',
16
+ adkey: '78c',
17
+ ad_size: '160x600'
18
+ },
19
+ mediaTypes: {
20
+ banner: {
21
+ sizes: [
22
+ [160, 600],
23
+ [300, 600]
24
+ ]
25
+ }
26
+ },
27
+ sizes: [
28
+ [160, 600],
29
+ [300, 600]
30
+ ]
31
+ }
32
+ ];
33
+
34
+ bidResponses = {
35
+ body: {
36
+ cpm: 0.1,
37
+ netRevenue: true,
38
+ content_type: 'display_flash',
39
+ width: 160,
40
+ currency: 'USD',
41
+ ttl: 86400,
42
+ content: '<iframe src=\'https://ads.lfstmedia.com/displayAd?__ads=ip37346-u0T8r2uJ8245jv6i2QE8Qu&adt=5748927953915945176&seq=2&plc=K73sUSWIH9WwpIQiGybtg8lYdYFld5NvswMmfGBMz6U&__df=true&clickUrl=https%3A%2F%2Fads.lfstmedia.com%2Fclick%2Fcmp15299%2F5748927953915945176%2F2%3F__ads%3Dip37346-u0T8r2uJ8245jv6i2QE8Qu%26adkey%3D6bd%26slot%3Dslot166704%26__stamp%3D1583331395140%26ad%3Dcrv197050%26_cx%3D%24%24CX%24%24%26_cy%3D%24%24CY%24%24%26_celt%3D%24%24ELT-ID%24%24%26redirectURL%3D\' width=\'160\' height=\'600\' frameBorder=\'0\' scrolling=\'no\' framespacing=\'0\' marginheight=\'0\' marginwidth=\'0\'><!--test--><\/iframe>\n',
43
+ creativeId: 7985076,
44
+ height: 600,
45
+ status: 1
46
+ }
47
+ };
48
+ videoBidRequests = [
49
+ {
50
+ bidder: 'lifestreet',
51
+ params: {
52
+ slot: 'slot1227631',
53
+ adkey: 'a98',
54
+ ad_size: '640x480'
55
+ },
56
+ mediaTypes: {
57
+ video: {
58
+ sizes: [
59
+ [640, 480],
60
+ ]
61
+ }
62
+ }
63
+ }
64
+ ]
65
+
66
+ videoBidResponses = {
67
+ body: {
68
+ cpm: 0.1,
69
+ netRevenue: true,
70
+ content_type: 'vast_3_0',
71
+ width: 640,
72
+ currency: 'USD',
73
+ ttl: 86400,
74
+ content: '<iframe src="https://ads.lfstmedia.com/displayAd?__ads=ip38770-u0T8r2uJ8245jv6i2QE8Qu&adt=7734389071973843496&seq=2&plc=QEw02HSSpFZCrGaMUP5rN01QQtwPM5iEI5EQzt1nV4E&__df=true&clickUrl=https%3A%2F%2Fads.lfstmedia.com%2Fclick%2Fcmp20228%2F7734389071973843496%2F2%3F__ads%3Dip38770-u0T8r2uJ8245jv6i2QE8Qu%26adkey%3Dcdc%26slot%3Dslot1227631%26__stamp%3D1583766419183%26ad%3Dcrv225652%26_cx%3D%24%24CX%24%24%26_cy%3D%24%24CY%24%24%26_celt%3D%24%24ELT-ID%24%24%26redirectURL%3D" width="640" height="480" frameBorder="0" scrolling="no" framespacing="0" marginheight="0" marginwidth="0"><!--test--><\/iframe>\n',
75
+ creativeId: 108323592,
76
+ height: 480,
77
+ status: 1
78
+ }
79
+ };
80
+ });
81
+ describe('implementation', function() {
82
+ describe('Bid validations', function() {
83
+ it('valid bid case', function() {
84
+ const validBid = {
85
+ bidder: 'lifestreet',
86
+ params: {
87
+ slot: 'slot166704',
88
+ adkey: '78c',
89
+ ad_size: '160x600'
90
+ }
91
+ };
92
+ expect(spec.isBidRequestValid(validBid)).to.equal(true);
93
+ });
94
+
95
+ it('invalid bid case', function() {
96
+ expect(spec.isBidRequestValid()).to.equal(false);
97
+ });
98
+
99
+ it('invalid bid case: slot not passed', function() {
100
+ var validBid = {
101
+ bidder: 'lifestreet',
102
+ params: {
103
+ adkey: '78c',
104
+ ad_size: '160x600'
105
+ }
106
+ };
107
+ expect(spec.isBidRequestValid(validBid)).to.equal(false);
108
+ });
109
+
110
+ it('invalid bid case: adkey not passed', function() {
111
+ const validBid = {
112
+ bidder: 'lifestreet',
113
+ params: {
114
+ slot: 'slot166704',
115
+ ad_size: '160x600'
116
+ }
117
+ };
118
+ expect(spec.isBidRequestValid(validBid)).to.equal(false);
119
+ });
120
+
121
+ it('invalid bid case: ad_size is not passed', function() {
122
+ const validBid = {
123
+ bidder: 'lifestreet',
124
+ params: {
125
+ slot: 'slot166704',
126
+ adkey: '78c'
127
+ }
128
+ };
129
+ expect(spec.isBidRequestValid(validBid)).to.equal(false);
130
+ });
131
+ });
132
+
133
+ describe('buildRequests spec method', function () {
134
+ it('method exists and is a function', function () {
135
+ expect(spec.buildRequests).to.exist.and.to.be.a('function');
136
+ });
137
+
138
+ it('should not return request when no bids are present', function () {
139
+ const [request] = spec.buildRequests([]);
140
+ expect(request).to.be.undefined;
141
+ });
142
+
143
+ it('should return an url and request method ', function () {
144
+ const [request] = spec.buildRequests(bidRequests);
145
+ expect(request.method).to.equal('GET');
146
+ expect(request.url).to.be.a('string');
147
+ });
148
+
149
+ it('should return an url that contains all required fields', function () {
150
+ const [request] = spec.buildRequests(bidRequests);
151
+ expect(request.url).to.have.string('adkey');
152
+ expect(request.url).to.have.string('slot');
153
+ expect(request.url).to.have.string('ad_size');
154
+ });
155
+
156
+ it('should add GDPR consent information to the request', function () {
157
+ let consentString = 'BOJ8RZsOJ8RZsABAB8AAAAAZ+A==';
158
+ let bidderRequest = {
159
+ bidderCode: 'lifestreet',
160
+ auctionId: '1d1a030790a875',
161
+ bidderRequestId: '22edbae2744bf6',
162
+ timeout: 3000,
163
+ gdprConsent: {
164
+ consentString: consentString,
165
+ gdprApplies: true
166
+ }
167
+ };
168
+ bidderRequest.bids = bidRequests;
169
+
170
+ const [request] = spec.buildRequests(bidRequests, bidderRequest);
171
+ expect(request.url).to.have.string('__gdpr=1');
172
+ expect(request.url).to.have.string(`__consent=${consentString}`);
173
+ });
174
+
175
+ it('should add US privacy string to request', function() {
176
+ let consentString = '1YA-';
177
+ let bidderRequest = {
178
+ bidderCode: 'lifestreet',
179
+ auctionId: '1d1a030790a875',
180
+ bidderRequestId: '22edbae2744bf6',
181
+ timeout: 3000,
182
+ uspConsent: consentString
183
+ };
184
+ bidderRequest.bids = bidRequests;
185
+
186
+ const [request] = spec.buildRequests(bidRequests, bidderRequest);
187
+ expect(request.url).to.have.string(`__us_privacy=${consentString}`);
188
+ });
189
+ });
190
+
191
+ describe('server response', function() {
192
+ it('should return valid proper values', function() {
193
+ const request = spec.buildRequests(bidRequests);
194
+ const response = spec.interpretResponse(bidResponses, request);
195
+ expect(response).to.be.an('array').with.length.above(0);
196
+ expect(response[0].cpm).to.equal(bidResponses.body.cpm);
197
+ expect(response[0].width).to.equal(bidResponses.body.width);
198
+ expect(response[0].height).to.equal(bidResponses.body.height);
199
+ expect(response[0].creativeId).to.equal(bidResponses.body.creativeId);
200
+ expect(response[0].currency).to.equal('USD');
201
+ expect(response[0].netRevenue).to.equal(true);
202
+ expect(response[0].ttl).to.equal(bidResponses.body.ttl);
203
+ });
204
+
205
+ it('should return proper mediaType for BANNER', function() {
206
+ const request = spec.buildRequests(bidRequests);
207
+ const [response] = spec.interpretResponse(bidResponses, request);
208
+ expect(response.mediaType).to.equal(BANNER);
209
+ });
210
+
211
+ it('should return proper mediaType for VIDEO', function() {
212
+ const request = spec.buildRequests(videoBidRequests);
213
+ const [response] = spec.interpretResponse(videoBidResponses, request);
214
+ expect(response.mediaType).to.equal(VIDEO);
215
+ });
216
+
217
+ it('should return a VAST XML for VIDEO', function() {
218
+ const request = spec.buildRequests(videoBidRequests);
219
+ const [response] = spec.interpretResponse(videoBidResponses, request);
220
+ expect(response.vastXml).to.be.a('string');
221
+ expect(response.vastXml).to.have.string('iframe');
222
+ });
223
+
224
+ it('should return an ad content for BANNER', function() {
225
+ const request = spec.buildRequests(bidRequests);
226
+ const [response] = spec.interpretResponse(bidResponses, request);
227
+ expect(response.ad).to.be.a('string');
228
+ expect(response.ad).to.have.string('iframe');
229
+ });
230
+ });
231
+ });
232
+ });
@@ -1,5 +1,5 @@
1
- import {expect} from 'chai';
2
- import {spec} from '../../../modules/limelightDigitalBidAdapter.js';
1
+ import { expect } from 'chai';
2
+ import { spec } from '../../../modules/limelightDigitalBidAdapter.js';
3
3
 
4
4
  describe('limelightDigitalAdapter', function () {
5
5
  const bid1 = {
@@ -29,7 +29,18 @@ describe('limelightDigitalAdapter', function () {
29
29
  }
30
30
  ]
31
31
  }
32
- ]
32
+ ],
33
+ schain: {
34
+ ver: '1.0',
35
+ complete: 1,
36
+ nodes: [
37
+ {
38
+ asi: 'example.com',
39
+ sid: '1',
40
+ hp: 1
41
+ }
42
+ ]
43
+ }
33
44
  }
34
45
  const bid2 = {
35
46
  bidId: '58ee9870c3164a',
@@ -53,7 +64,23 @@ describe('limelightDigitalAdapter', function () {
53
64
  }
54
65
  ]
55
66
  }
56
- ]
67
+ ],
68
+ schain: {
69
+ ver: '1.0',
70
+ complete: 1,
71
+ nodes: [
72
+ {
73
+ asi: 'example.com',
74
+ sid: '1',
75
+ hp: 1
76
+ },
77
+ {
78
+ asi: 'example1.com',
79
+ sid: '2',
80
+ hp: 1
81
+ }
82
+ ]
83
+ }
57
84
  }
58
85
  const bid3 = {
59
86
  bidId: '019645c7d69460',
@@ -81,7 +108,18 @@ describe('limelightDigitalAdapter', function () {
81
108
  }
82
109
  ]
83
110
  }
84
- ]
111
+ ],
112
+ schain: {
113
+ ver: '1.0',
114
+ complete: 1,
115
+ nodes: [
116
+ {
117
+ asi: 'example.com',
118
+ sid: '1',
119
+ hp: 1
120
+ }
121
+ ]
122
+ }
85
123
  }
86
124
  const bid4 = {
87
125
  bidId: '019645c7d69460',
@@ -107,7 +145,18 @@ describe('limelightDigitalAdapter', function () {
107
145
  }
108
146
  ]
109
147
  }
110
- ]
148
+ ],
149
+ schain: {
150
+ ver: '1.0',
151
+ complete: 1,
152
+ nodes: [
153
+ {
154
+ asi: 'example.com',
155
+ sid: '1',
156
+ hp: 1
157
+ }
158
+ ]
159
+ }
111
160
  }
112
161
 
113
162
  describe('buildRequests', function () {
@@ -146,7 +195,8 @@ describe('limelightDigitalAdapter', function () {
146
195
  'sizes',
147
196
  'transactionId',
148
197
  'publisherId',
149
- 'userIdAsEids'
198
+ 'userIdAsEids',
199
+ 'supplyChain'
150
200
  );
151
201
  expect(adUnit.id).to.be.a('number');
152
202
  expect(adUnit.bidId).to.be.a('string');
@@ -154,6 +204,7 @@ describe('limelightDigitalAdapter', function () {
154
204
  expect(adUnit.transactionId).to.be.a('string');
155
205
  expect(adUnit.sizes).to.be.an('array');
156
206
  expect(adUnit.userIdAsEids).to.be.an('array');
207
+ expect(adUnit.supplyChain).to.be.an('object');
157
208
  })
158
209
  })
159
210
  })
@@ -587,4 +638,5 @@ function validateAdUnit(adUnit, bid) {
587
638
  }));
588
639
  expect(adUnit.publisherId).to.equal(bid.params.publisherId);
589
640
  expect(adUnit.userIdAsEids).to.deep.equal(bid.userIdAsEids);
641
+ expect(adUnit.supplyChain).to.deep.equal(bid.schain);
590
642
  }
@@ -0,0 +1,125 @@
1
+ import { expect } from 'chai'
2
+ import { baseUrl, spec } from 'modules/mabidderBidAdapter.js'
3
+ import { newBidder } from 'src/adapters/bidderFactory.js'
4
+ import { BANNER } from '../../../src/mediaTypes.js';
5
+
6
+ describe('mabidderBidAdapter', () => {
7
+ const adapter = newBidder(spec)
8
+ const bidRequestBanner = {
9
+ 'bidId': '12345',
10
+ 'bidder': 'mabidder',
11
+ 'sizes': [[300, 250]],
12
+ 'mediaTypes': {
13
+ 'banner': {
14
+ 'sizes': [[300, 250]]
15
+ }
16
+ },
17
+ 'params': {
18
+ 'ppid': 'string1',
19
+ }
20
+
21
+ }
22
+
23
+ describe('inherited functions', () => {
24
+ it('exists and is a function', () => {
25
+ expect(adapter.callBids).to.exist.and.to.be.a('function')
26
+ })
27
+ })
28
+
29
+ describe('isBidRequestValid', () => {
30
+ it('should return true when required params are found', () => {
31
+ expect(spec.isBidRequestValid(bidRequestBanner)).to.equal(true)
32
+ })
33
+
34
+ it('should return false when required params are not found', () => {
35
+ let bid = Object.assign({}, bidRequestBanner)
36
+ const ppid = bid.params.ppid
37
+ delete bid.params.ppid
38
+ expect(spec.isBidRequestValid(bid)).to.equal(false)
39
+ bid.params.ppid = ppid
40
+
41
+ bid = Object.assign({}, bidRequestBanner)
42
+ const params = bidRequestBanner.params
43
+ delete bid.params
44
+ expect(spec.isBidRequestValid(bid)).to.equal(false)
45
+ bidRequestBanner.params = params
46
+ })
47
+ })
48
+
49
+ describe('buildRequests', () => {
50
+ const bidRequests = [bidRequestBanner]
51
+ const req = spec.buildRequests(bidRequests, {
52
+ auctionId: '123',
53
+ refererInfo: {
54
+ referer: 'http://test.com/path.html'
55
+ }
56
+ })
57
+
58
+ it('sends bid request to ENDPOINT via POST', () => {
59
+ expect(req.method).to.equal('POST')
60
+ expect(req.url.indexOf('https://')).to.equal(0)
61
+ expect(req.url).to.equal(baseUrl)
62
+ })
63
+
64
+ it('contains prebid version parameter', () => {
65
+ expect(req.data.v).to.equal($$PREBID_GLOBAL$$.version)
66
+ })
67
+
68
+ it('sends the correct bid parameters for banner', () => {
69
+ expect(req.data.bids[0].bidId).to.equal(bidRequestBanner.bidId)
70
+ expect(req.data.bids[0].ppid).to.equal(bidRequestBanner.params.ppid)
71
+ expect(req.data.bids[0].sizes[0].width).to.equal(bidRequestBanner.sizes[0][0])
72
+ expect(req.data.bids[0].sizes[0].height).to.equal(bidRequestBanner.sizes[0][1])
73
+ })
74
+
75
+ it('accepts an optional fpd parameter', () => {
76
+ expect(req.data.fpd).to.exist.and.to.be.a('Object')
77
+ })
78
+ })
79
+
80
+ describe('interpretResponse', () => {
81
+ it('handles banner request and should get correct bid response', () => {
82
+ const BIDDER_RESPONSE_BANNER = {
83
+ 'Responses': [{
84
+ 'width': 300,
85
+ 'height': 250,
86
+ 'creativeId': '123abc',
87
+ 'ad': '<!-- Creative -->',
88
+ 'cpm': 0.5,
89
+ 'requestId': 'abc123',
90
+ 'ttl': 60,
91
+ 'netRevenue': true,
92
+ 'currency': 'USD',
93
+ 'mediaType': BANNER,
94
+ 'meta': {
95
+ 'advertiserDomains': ['https://loblaws.ca']
96
+ }
97
+ }]
98
+ }
99
+ const results = spec.interpretResponse({ body: BIDDER_RESPONSE_BANNER }, {})
100
+ const response = results[0]
101
+ expect(results.length).to.equal(BIDDER_RESPONSE_BANNER.Responses.length)
102
+ expect(response).to.have.property('ad').equal('<!-- Creative -->')
103
+ expect(response).to.have.property('requestId').equal('abc123')
104
+ expect(response).to.have.property('cpm').equal(0.5)
105
+ expect(response).to.have.property('currency').equal('USD')
106
+ expect(response).to.have.property('width').equal(300)
107
+ expect(response).to.have.property('height').equal(250)
108
+ expect(response).to.have.property('ttl').equal(60)
109
+ expect(response).to.have.property('creativeId').equal('123abc')
110
+ expect(response).to.have.property('mediaType').equal(BANNER)
111
+ expect(response).to.have.property('meta')
112
+ expect(response.meta).to.have.property('advertiserDomains')
113
+ expect(response.meta.advertiserDomains).to.be.an('array')
114
+ expect(response.meta.advertiserDomains[0]).equal('https://loblaws.ca')
115
+ })
116
+
117
+ it('handles no bid response by returning empty array', () => {
118
+ let result = spec.interpretResponse({ body: undefined }, {})
119
+ expect(result).to.deep.equal([])
120
+
121
+ result = spec.interpretResponse({ body: '' }, {})
122
+ expect(result).to.deep.equal([])
123
+ })
124
+ })
125
+ })
@@ -0,0 +1,107 @@
1
+ import { oneKeyIdSubmodule } from 'modules/oneKeyIdSystem'
2
+
3
+ const defaultConf = {
4
+ params: {
5
+ proxyHostName: 'proxy.com'
6
+ }
7
+ };
8
+
9
+ const defaultIdsAndPreferences = {
10
+ identifiers: [
11
+ {
12
+ version: '0.1',
13
+ type: 'paf_browser_id',
14
+ value: 'df0a5664-987d-4074-bbd9-e9b12ebae6ef',
15
+ source: {
16
+ domain: 'crto-poc-1.onekey.network',
17
+ timestamp: 1657100291,
18
+ signature: 'ikjV6WwpcroNB5XyLOr3MgYHLpS6UjICEOuv/jEr00uVrjZm0zluDSWh11OeGDZrMhxMBPeTabtQ4U2rNk3IzQ=='
19
+ }
20
+ }
21
+ ],
22
+ preferences: {
23
+ version: '0.1',
24
+ data: {
25
+ use_browsing_for_personalization: true
26
+ },
27
+ source: {
28
+ domain: 'cmp.pafdemopublisher.com',
29
+ timestamp: 1657100294,
30
+ signature: 'aAbMThxyeKpe/EgT5ARI1xecjCwwh0uRagsTuPXNY2fzh7foeW31qljDZf6h8UwOd9M2bAN7XNtM2LYBbJzskQ=='
31
+ }
32
+ }
33
+ };
34
+
35
+ const defaultIdsAndPreferencesResult = {
36
+ status: 'PARTICIPATING',
37
+ data: defaultIdsAndPreferences
38
+ };
39
+
40
+ describe('oneKeyData module', () => {
41
+ describe('getId function', () => {
42
+ beforeEach(() => {
43
+ setUpOneKey();
44
+ });
45
+
46
+ it('return a callback for handling asynchron results', () => {
47
+ const moduleIdResponse = oneKeyIdSubmodule.getId(defaultConf);
48
+
49
+ expect(moduleIdResponse.callback).to.be.an('function');
50
+ });
51
+
52
+ it(`return a callback that waits for OneKey to be loaded`, () => {
53
+ const moduleIdResponse = oneKeyIdSubmodule.getId(defaultConf);
54
+
55
+ moduleIdResponse.callback(function() {})
56
+
57
+ expect(window.OneKey.queue.length).to.equal(1);
58
+ });
59
+
60
+ it('return a callback that gets ids and prefs', () => {
61
+ const moduleIdResponse = oneKeyIdSubmodule.getId(defaultConf);
62
+
63
+ // Act
64
+ return new Promise((resolve) => {
65
+ moduleIdResponse.callback(resolve);
66
+ executeOneKeyQueue();
67
+ })
68
+
69
+ // Assert
70
+ .then((idsAndPrefs) => {
71
+ expect(idsAndPrefs).to.equal(defaultIdsAndPreferences);
72
+ });
73
+ });
74
+
75
+ it('return a callback with undefined if impossible to get ids and prefs', () => {
76
+ window.OneKey.getIdsAndPreferences = () => {
77
+ return Promise.reject(new Error(`Impossible to get ids and prefs`));
78
+ };
79
+ const moduleIdResponse = oneKeyIdSubmodule.getId(defaultConf);
80
+
81
+ // Act
82
+ return new Promise((resolve) => {
83
+ moduleIdResponse.callback(resolve);
84
+ executeOneKeyQueue();
85
+ })
86
+
87
+ // Assert
88
+ .then((idsAndPrefs) => {
89
+ expect(idsAndPrefs).to.be.undefined;
90
+ });
91
+ });
92
+ });
93
+ });
94
+
95
+ const setUpOneKey = () => {
96
+ window.OneKey.queue = [];
97
+ window.OneKey.getIdsAndPreferences = () => {
98
+ return Promise.resolve(defaultIdsAndPreferencesResult);
99
+ };
100
+ }
101
+
102
+ const executeOneKeyQueue = () => {
103
+ while (window.OneKey.queue.length > 0) {
104
+ window.OneKey.queue[0]();
105
+ window.OneKey.queue.shift();
106
+ }
107
+ }