prebid.js 5.16.0 → 5.20.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 (182) hide show
  1. package/.devcontainer/Dockerfile +11 -0
  2. package/.devcontainer/devcontainer.json +27 -0
  3. package/.devcontainer/postCreate.sh +6 -0
  4. package/browsers.json +1 -0
  5. package/integrationExamples/gpt/akamaidap_segments_example.html +132 -0
  6. package/modules/.submodules.json +1 -0
  7. package/modules/adfBidAdapter.js +21 -16
  8. package/modules/adgenerationBidAdapter.js +28 -4
  9. package/modules/adkernelBidAdapter.js +3 -1
  10. package/modules/admixerBidAdapter.js +11 -0
  11. package/modules/adnuntiusBidAdapter.js +1 -0
  12. package/modules/adtelligentBidAdapter.js +2 -1
  13. package/modules/airgridRtdProvider.js +1 -1
  14. package/modules/akamaiDapRtdProvider.js +474 -0
  15. package/modules/akamaiDapRtdProvider.md +47 -0
  16. package/modules/aolBidAdapter.js +2 -1
  17. package/modules/appnexusBidAdapter.js +5 -3
  18. package/modules/atsAnalyticsAdapter.js +89 -63
  19. package/modules/atsAnalyticsAdapter.md +1 -0
  20. package/modules/betweenBidAdapter.js +20 -3
  21. package/modules/bliinkBidAdapter.js +58 -32
  22. package/modules/bliinkBidAdapter.md +29 -6
  23. package/modules/browsiRtdProvider.js +106 -18
  24. package/modules/cleanioRtdProvider.js +192 -0
  25. package/modules/cleanioRtdProvider.md +59 -0
  26. package/modules/codefuelBidAdapter.js +183 -0
  27. package/modules/codefuelBidAdapter.md +111 -0
  28. package/modules/connectIdSystem.js +104 -0
  29. package/modules/connectIdSystem.md +33 -0
  30. package/modules/cwireBidAdapter.js +272 -0
  31. package/modules/cwireBidAdapter.md +43 -0
  32. package/modules/deepintentBidAdapter.js +106 -9
  33. package/modules/deepintentBidAdapter.md +36 -1
  34. package/modules/deltaprojectsBidAdapter.js +252 -0
  35. package/modules/deltaprojectsBidAdapter.md +32 -0
  36. package/modules/dgkeywordRtdProvider.js +0 -1
  37. package/modules/engageyaBidAdapter.js +157 -0
  38. package/modules/glimpseBidAdapter.js +160 -48
  39. package/modules/glimpseBidAdapter.md +11 -74
  40. package/modules/gridBidAdapter.js +1 -0
  41. package/modules/gridNMBidAdapter.js +7 -6
  42. package/modules/gumgumBidAdapter.js +16 -2
  43. package/modules/iasRtdProvider.js +83 -67
  44. package/modules/inskinBidAdapter.js +7 -3
  45. package/modules/ixBidAdapter.js +8 -1
  46. package/modules/jixieBidAdapter.js +8 -2
  47. package/modules/justpremiumBidAdapter.js +6 -1
  48. package/modules/kargoBidAdapter.js +14 -7
  49. package/modules/kargoBidAdapter.md +20 -0
  50. package/modules/limelightDigitalBidAdapter.js +22 -2
  51. package/modules/livewrappedAnalyticsAdapter.js +53 -3
  52. package/modules/mediakeysBidAdapter.js +405 -14
  53. package/modules/mediakeysBidAdapter.md +108 -0
  54. package/modules/multibid/index.js +3 -3
  55. package/modules/mytargetBidAdapter.js +112 -0
  56. package/modules/nativoBidAdapter.js +48 -29
  57. package/modules/nativoBidAdapter.md +0 -1
  58. package/modules/nextMillenniumBidAdapter.js +12 -3
  59. package/modules/nextrollBidAdapter.js +375 -0
  60. package/modules/nobidBidAdapter.js +2 -1
  61. package/modules/oguryBidAdapter.js +36 -7
  62. package/modules/openxBidAdapter.js +34 -22
  63. package/modules/operaadsBidAdapter.js +21 -1
  64. package/modules/otmBidAdapter.js +146 -0
  65. package/modules/otmBidAdapter.md +27 -26
  66. package/modules/outbrainBidAdapter.js +5 -0
  67. package/modules/pixfutureBidAdapter.js +24 -4
  68. package/modules/pixfutureBidAdapter.md +127 -0
  69. package/modules/playwireBidAdapter.md +61 -0
  70. package/modules/prebidServerBidAdapter/index.js +1 -1
  71. package/modules/proxistoreBidAdapter.js +4 -6
  72. package/modules/publinkIdSystem.js +17 -7
  73. package/modules/publinkIdSystem.md +7 -2
  74. package/modules/pubmaticBidAdapter.js +22 -6
  75. package/modules/pubmaticBidAdapter.md +1 -1
  76. package/modules/relaidoBidAdapter.js +8 -2
  77. package/modules/rtdModule/index.js +2 -2
  78. package/modules/sharethroughBidAdapter.js +12 -19
  79. package/modules/slimcutBidAdapter.js +121 -0
  80. package/modules/sonobiBidAdapter.js +7 -0
  81. package/modules/sortableBidAdapter.js +1 -0
  82. package/modules/spotxBidAdapter.js +15 -1
  83. package/modules/sspBCBidAdapter.js +207 -12
  84. package/modules/sspBCBidAdapter.md +1 -1
  85. package/modules/talkadsBidAdapter.js +129 -0
  86. package/modules/talkadsBidAdapter.md +60 -0
  87. package/modules/tappxBidAdapter.js +6 -5
  88. package/modules/teadsBidAdapter.js +3 -0
  89. package/modules/tripleliftBidAdapter.js +22 -5
  90. package/modules/trustxBidAdapter.js +17 -11
  91. package/modules/undertoneBidAdapter.js +9 -5
  92. package/modules/undertoneBidAdapter.md +5 -1
  93. package/modules/unicornBidAdapter.js +3 -3
  94. package/modules/userId/eids.js +18 -0
  95. package/modules/userId/eids.md +7 -0
  96. package/modules/userId/userId.md +12 -0
  97. package/modules/ventesBidAdapter.js +370 -0
  98. package/modules/ventesBidAdapter.md +94 -0
  99. package/modules/videobyteBidAdapter.js +13 -6
  100. package/modules/videobyteBidAdapter.md +49 -0
  101. package/modules/vidoomyBidAdapter.js +20 -12
  102. package/modules/visxBidAdapter.js +15 -22
  103. package/modules/yahoosspBidAdapter.js +637 -0
  104. package/modules/yahoosspBidAdapter.md +795 -0
  105. package/modules/yieldlabBidAdapter.js +48 -3
  106. package/modules/yieldlabBidAdapter.md +16 -1
  107. package/modules/yieldmoBidAdapter.js +20 -6
  108. package/modules/yieldmoSyntheticInventoryModule.js +46 -0
  109. package/modules/yieldmoSyntheticInventoryModule.md +68 -0
  110. package/package.json +1 -1
  111. package/src/adapterManager.js +5 -0
  112. package/src/adapters/bidderFactory.js +4 -3
  113. package/src/auction.js +11 -11
  114. package/src/constants.json +1 -0
  115. package/src/secureCreatives.js +6 -7
  116. package/src/targeting.js +11 -9
  117. package/test/.eslintrc.js +2 -1
  118. package/test/spec/modules/adfBidAdapter_spec.js +83 -29
  119. package/test/spec/modules/adgenerationBidAdapter_spec.js +121 -50
  120. package/test/spec/modules/adnuntiusBidAdapter_spec.js +68 -0
  121. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  122. package/test/spec/modules/akamaiDapRtdProvider_spec.js +246 -0
  123. package/test/spec/modules/appnexusBidAdapter_spec.js +2 -1
  124. package/test/spec/modules/atsAnalyticsAdapter_spec.js +77 -9
  125. package/test/spec/modules/betweenBidAdapter_spec.js +41 -0
  126. package/test/spec/modules/bliinkBidAdapter_spec.js +87 -36
  127. package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
  128. package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
  129. package/test/spec/modules/codefuelBidAdapter_spec.js +316 -0
  130. package/test/spec/modules/connectIdSystem_spec.js +189 -0
  131. package/test/spec/modules/cwireBidAdapter_spec.js +246 -0
  132. package/test/spec/modules/deepintentBidAdapter_spec.js +153 -3
  133. package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
  134. package/test/spec/modules/engageyaBidAdapter_spec.js +286 -0
  135. package/test/spec/modules/glimpseBidAdapter_spec.js +302 -204
  136. package/test/spec/modules/gridNMBidAdapter_spec.js +40 -1
  137. package/test/spec/modules/gumgumBidAdapter_spec.js +23 -6
  138. package/test/spec/modules/iasRtdProvider_spec.js +71 -6
  139. package/test/spec/modules/ixBidAdapter_spec.js +13 -3
  140. package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
  141. package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
  142. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +155 -1
  143. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +67 -12
  144. package/test/spec/modules/mediakeysBidAdapter_spec.js +406 -51
  145. package/test/spec/modules/multibid_spec.js +31 -31
  146. package/test/spec/modules/mytargetBidAdapter_spec.js +199 -0
  147. package/test/spec/modules/nativoBidAdapter_spec.js +50 -3
  148. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +13 -1
  149. package/test/spec/modules/nextrollBidAdapter_spec.js +290 -0
  150. package/test/spec/modules/nobidBidAdapter_spec.js +65 -1
  151. package/test/spec/modules/oguryBidAdapter_spec.js +125 -37
  152. package/test/spec/modules/openxBidAdapter_spec.js +85 -13
  153. package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
  154. package/test/spec/modules/otmBidAdapter_spec.js +67 -0
  155. package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
  156. package/test/spec/modules/publinkIdSystem_spec.js +34 -15
  157. package/test/spec/modules/pubmaticBidAdapter_spec.js +217 -1
  158. package/test/spec/modules/relaidoBidAdapter_spec.js +21 -20
  159. package/test/spec/modules/sharethroughBidAdapter_spec.js +156 -136
  160. package/test/spec/modules/slimcutBidAdapter_spec.js +200 -0
  161. package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
  162. package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
  163. package/test/spec/modules/spotxBidAdapter_spec.js +36 -0
  164. package/test/spec/modules/sspBCBidAdapter_spec.js +210 -62
  165. package/test/spec/modules/talkadsBidAdapter_spec.js +231 -0
  166. package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
  167. package/test/spec/modules/tripleliftBidAdapter_spec.js +128 -0
  168. package/test/spec/modules/trustxBidAdapter_spec.js +38 -5
  169. package/test/spec/modules/undertoneBidAdapter_spec.js +52 -0
  170. package/test/spec/modules/unicornBidAdapter_spec.js +4 -4
  171. package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
  172. package/test/spec/modules/videobyteBidAdapter_spec.js +2 -2
  173. package/test/spec/modules/visxBidAdapter_spec.js +48 -4
  174. package/test/spec/modules/yahoosspBidAdapter_spec.js +1332 -0
  175. package/test/spec/modules/yieldlabBidAdapter_spec.js +65 -1
  176. package/test/spec/modules/yieldmoBidAdapter_spec.js +30 -9
  177. package/test/spec/modules/yieldmoSyntheticInventoryModule_spec.js +89 -0
  178. package/test/spec/unit/core/adapterManager_spec.js +32 -0
  179. package/test/spec/unit/core/bidderFactory_spec.js +61 -1
  180. package/test/spec/unit/pbjs_api_spec.js +37 -2
  181. package/test/spec/unit/secureCreatives_spec.js +54 -25
  182. package/modules/turktelekomBidAdapter.md +0 -49
@@ -1,207 +1,305 @@
1
- import { expect } from 'chai';
2
- import { spec } from 'modules/glimpseBidAdapter.js';
3
- import { newBidder } from 'src/adapters/bidderFactory.js';
4
-
5
- /**
6
- * Test Helpers
7
- */
8
-
9
- const API = 'https://api.glimpseprotocol.io/cloud/v1/vault/prebid';
10
-
11
- const templateBidRequest = {
12
- bidder: 'glimpse',
13
- params: {
14
- placementId: 'glimpse-demo-300x250',
1
+ import { expect } from 'chai'
2
+ import { newBidder } from 'src/adapters/bidderFactory.js'
3
+ import { spec } from 'modules/glimpseBidAdapter.js'
4
+
5
+ const ENDPOINT = 'https://api.glimpsevault.io/ads/serving/public/v1/prebid'
6
+
7
+ const mock = {
8
+ bidRequest: {
9
+ bidder: 'glimpse',
10
+ bidId: '26a80b71cfd671',
11
+ bidderRequestId: '133baeded6ac94',
12
+ auctionId: '96692a73-307b-44b8-8e4f-ddfb40341570',
13
+ adUnitCode: 'banner-div-a',
14
+ sizes: [[300, 250]],
15
+ params: {
16
+ placementId: 'glimpse-demo-300x250',
17
+ },
15
18
  },
16
- adUnitCode: 'banner-div-a',
17
- sizes: [[300, 250]],
18
- bidId: '26a80b71cfd671',
19
- bidderRequestId: '133baeded6ac94',
20
- auctionId: '96692a73-307b-44b8-8e4f-ddfb40341570',
21
- };
22
-
23
- const templateBidderRequest = {
24
- bidderCode: 'glimpse',
25
- auctionId: '96692a73-307b-44b8-8e4f-ddfb40341570',
26
- bidderRequestId: '133baeded6ac94',
27
- timeout: 3000,
28
- gdprConsent: {
29
- apiVersion: 2,
30
- consentString:
31
- 'COzP517OzP517AcABBENAlCsAP_AAAAAAAwIF8NX-T5eL2vju2Zdt7JEaYwfZxyigOgThgQIsW8NwIeFbBoGP2EgHBG4JCQAGBAkkgCBAQMsHGBcCQAAgIgRiRKMYE2MjzNKBJJAigkbc0FACDVunsHS2ZCY70-8O__bPAviADAvUC-AAAAA.YAAAAAAAAAAA',
32
- gdprApplies: true,
33
- vendorData: {},
19
+ bidderRequest: {
20
+ bidderCode: 'glimpse',
21
+ bidderRequestId: '133baeded6ac94',
22
+ auctionId: '96692a73-307b-44b8-8e4f-ddfb40341570',
23
+ timeout: 3000,
24
+ gdprConsent: {
25
+ consentString: 'COzP517OzP517AcABBENAlCsAP_AAAAAAAwIF8NX-T5eL2vju2Zdt7JEaYwfZxyigOgThgQIsW8NwIeFbBoGP2EgHBG4JCQAGBAkkgCBAQMsHGBcCQAAgIgRiRKMYE2MjzNKBJJAigkbc0FACDVunsHS2ZCY70-8O__bPAviADAvUC-AAAAA.YAAAAAAAAAAA',
26
+ vendorData: {},
27
+ gdprApplies: true,
28
+ },
29
+ refererInfo: {
30
+ numIframes: 0,
31
+ reachedTop: true,
32
+ referer: 'https://demo.glimpseprotocol.io/prebid/desktop',
33
+ stack: ['https://demo.glimpseprotocol.io/prebid/desktop'],
34
+ },
34
35
  },
35
- refererInfo: {
36
- referer: 'https://demo.glimpseprotocol.io/prebid/desktop',
37
- reachedTop: true,
38
- numIframes: 0,
39
- stack: ['https://demo.glimpseprotocol.io/prebid/desktop'],
36
+ bidResponse: {
37
+ auth: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJoZWxsbyI6IndvcmxkISJ9.1p6T0ORhJ6riLprhXBGdzRhG3Q1egM27uFhPGNapPxs',
38
+ data: {
39
+ bids: [
40
+ {
41
+ bidder: 'glimpse',
42
+ requestId: '133baeded6ac94',
43
+ creativeId: 'glimpse-demo-300x250',
44
+ adUnitCode: 'banner-div-a',
45
+ currency: 'GBP',
46
+ ad: '<div>Hello, World!</div>',
47
+ width: 300,
48
+ height: 250,
49
+ cpm: 1.04,
50
+ pbAg: '1.04',
51
+ pbDg: '1.04',
52
+ pbHg: '1.04',
53
+ pbLg: '1.00',
54
+ pbMg: '1.05',
55
+ netRevenue: true,
56
+ mediaType: 'banner',
57
+ ttl: 300,
58
+ }
59
+ ],
60
+ },
40
61
  },
41
- };
42
-
43
- const templateBidResponse = {
44
- ad: '<div>HelloWorld</div>',
45
- adUnitCode: 'banner-div-a',
46
- bidder: 'glimpse',
47
- cpm: 1.04,
48
- creativeId: 'glimpse-demo-300x250',
49
- currency: 'GBP',
50
- height: 250,
51
- mediaType: 'banner',
52
- netRevenue: true,
53
- pbAg: '1.04',
54
- pbDg: '1.04',
55
- pbHg: '1.04',
56
- pbLg: '1.00',
57
- pbMg: '1.05',
58
- requestId: '133baeded6ac94',
59
- ttl: 60,
60
- width: 300,
61
- };
62
-
63
- const copyBidResponse = () => ({ ...templateBidResponse });
64
- const copyBidderRequest = () => ({
65
- ...templateBidderRequest,
66
- bids: copyBidRequests(),
67
- });
68
- const copyBidRequest = () => ({ ...templateBidRequest });
69
-
70
- const copyBidRequests = () => [copyBidRequest()];
71
- const copyBidResponses = () => ({
72
- body: [copyBidResponse()],
73
- });
74
-
75
- /**
76
- * Tests
77
- */
78
-
79
- describe('GlimpseProtocolAdapter', function () {
80
- const adapter = newBidder(spec);
81
-
82
- describe('inherited functions', function () {
83
- it('exists and is a function', function () {
84
- expect(adapter.callBids).to.exist.and.to.be.a('function');
85
- expect(adapter.getSpec).to.exist.and.to.be.a('function');
86
- });
87
- });
88
-
89
- describe('isBidRequestValid', function () {
90
- it('should return true when params.placementId is valid', function () {
91
- expect(spec.isBidRequestValid(templateBidRequest)).to.equal(true);
92
- });
93
-
94
- it('should return false when params.placementId is invalid', function () {
95
- let bid = copyBidRequest();
96
- delete bid.params;
97
- bid.params = {
98
- placementId: 0,
99
- };
100
- expect(spec.isBidRequestValid(bid)).to.equal(false);
101
- });
102
-
103
- it('should return false when params is not passed', function () {
104
- let bid = copyBidRequest();
105
- delete bid.params;
106
- expect(spec.isBidRequestValid(bid)).to.equal(false);
107
- });
108
-
109
- it('should return false when params.placementId is not passed', function () {
110
- let bid = copyBidRequest();
111
- delete bid.params.placementId;
112
- expect(spec.isBidRequestValid(bid)).to.equal(false);
113
- });
114
- });
115
-
116
- describe('buildRequests', function () {
117
- const bidRequest = copyBidRequest();
118
- const bidRequests = [bidRequest];
119
-
120
- it('should add version and source information', function () {
121
- const request = spec.buildRequests(bidRequests);
122
- const payload = JSON.parse(request.data);
123
-
124
- expect(payload.sdk).to.exist;
125
- expect(payload.sdk).to.deep.equal({
126
- source: 'pbjs',
127
- version: '$prebid.version$',
128
- });
129
- });
130
-
131
- it('should send request to API via POST', function () {
132
- const request = spec.buildRequests(bidRequests);
133
- expect(request.url).to.equal(API);
134
- expect(request.method).to.equal('POST');
135
- });
136
-
137
- it('should add GDPR consent', function () {
138
- const bidderRequest = copyBidderRequest();
139
- const request = spec.buildRequests(bidRequests, bidderRequest);
140
- const payload = JSON.parse(request.data);
141
-
142
- expect(payload.gdprConsent).to.exist;
143
- const { gdprConsent } = payload;
144
- expect(gdprConsent.gdprApplies).to.be.true;
145
- expect(gdprConsent.consentString).to.equal(
146
- bidderRequest.gdprConsent.consentString
147
- );
148
- });
149
-
150
- it('should add referer info', function () {
151
- const bidderRequest = copyBidderRequest();
152
- const request = spec.buildRequests(bidRequests, bidderRequest);
153
- const payload = JSON.parse(request.data);
154
-
155
- expect(payload.refererInfo.referer).to.equal(
156
- templateBidderRequest.refererInfo.referer
157
- );
158
- });
159
- });
160
-
161
- describe('interpretResponse', function () {
162
- it('should handle valid bid responses', function () {
163
- const response = copyBidResponses();
164
-
165
- const bids = spec.interpretResponse(response);
166
- expect(bids).to.have.length(1);
167
- expect(bids[0].adUnitCode).to.equal(templateBidRequest.adUnitCode);
168
- });
169
-
170
- it('should handle no bid responses', function () {
171
- const response = copyBidResponses();
172
- response.body = [];
173
-
174
- const bids = spec.interpretResponse(response);
175
- expect(bids).to.have.length(0);
176
- });
177
-
178
- it('should return no bid on an invalid response', function () {
179
- const response = copyBidResponses();
180
- delete response.body;
181
-
182
- const bids = spec.interpretResponse(response);
183
- expect(bids).to.have.length(0);
184
- });
185
-
186
- it('should include advertiserDomains field in the response', function () {
187
- const response = copyBidResponses();
188
-
189
- const bids = spec.interpretResponse(response);
190
- expect(bids[0].meta.advertiserDomains).to.be.an('array').that.is.empty;
191
- });
192
-
193
- it('should reflect the value of the OpenRTB adomain field', function () {
194
- const advertiserDomainsMock = ['http://example.com'];
195
- let response = copyBidResponses();
196
- response.body = response.body.map((bid) => {
197
- return {
198
- ...bid,
199
- adomain: advertiserDomainsMock,
200
- };
201
- });
202
-
203
- const bids = spec.interpretResponse(response);
204
- expect(bids[0].meta.advertiserDomains).to.equal(advertiserDomainsMock);
205
- });
206
- });
207
- });
62
+ }
63
+
64
+ const getBidRequest = () => getDeepCopy(mock.bidRequest)
65
+ const getBidderRequest = () => ({
66
+ bids: [getBidRequest()],
67
+ ...getDeepCopy(mock.bidderRequest),
68
+ })
69
+
70
+ const getBidResponseHelper = () => getDeepCopy(mock.bidResponse)
71
+ const getBidResponse = () => ({
72
+ body: getBidResponseHelper(),
73
+ })
74
+
75
+ function getDeepCopy(object) {
76
+ return JSON.parse(JSON.stringify(object))
77
+ }
78
+
79
+ describe('GlimpseProtocolAdapter', () => {
80
+ const glimpseAdapter = newBidder(spec)
81
+
82
+ describe('Inherited functions', () => {
83
+ it('Functions exist and are valid types', () => {
84
+ expect(glimpseAdapter.callBids).to.exist.and.to.be.a('function')
85
+ expect(glimpseAdapter.getSpec).to.exist.and.to.be.a('function')
86
+ })
87
+ })
88
+
89
+ describe('isBidRequestValid', () => {
90
+ it('Returns true when a bid request has a valid placement id', () => {
91
+ const bidRequest = getBidRequest()
92
+
93
+ const isValidBidRequest = spec.isBidRequestValid(bidRequest)
94
+ expect(isValidBidRequest).to.be.true
95
+ })
96
+
97
+ it('Returns false when params are empty', () => {
98
+ const bidRequest = getBidRequest()
99
+ bidRequest.params = {}
100
+
101
+ const isValidBidRequest = spec.isBidRequestValid(bidRequest)
102
+ expect(isValidBidRequest).to.be.false
103
+ })
104
+
105
+ it('Returns false when params are null', () => {
106
+ const bidRequest = getBidRequest()
107
+ bidRequest.params = null
108
+
109
+ const isValidBidRequest = spec.isBidRequestValid(bidRequest)
110
+ expect(isValidBidRequest).to.be.false
111
+ })
112
+
113
+ it('Returns false when params are undefined', () => {
114
+ const bidRequest = getBidRequest()
115
+ delete bidRequest.params
116
+
117
+ const isValidBidRequest = spec.isBidRequestValid(bidRequest)
118
+ expect(isValidBidRequest).to.be.false
119
+ })
120
+
121
+ it('Returns false when params are invalid type', () => {
122
+ const bidRequest = getBidRequest()
123
+ bidRequest.params = 123
124
+
125
+ const isValidBidRequest = spec.isBidRequestValid(bidRequest)
126
+ expect(isValidBidRequest).to.be.false
127
+ })
128
+
129
+ it('Returns false when placement id is empty', () => {
130
+ const bidRequest = getBidRequest()
131
+ bidRequest.params.placementId = ''
132
+
133
+ const isValidBidRequest = spec.isBidRequestValid(bidRequest)
134
+ expect(isValidBidRequest).to.be.false
135
+ })
136
+
137
+ it('Returns false when placement id is null', () => {
138
+ const bidRequest = getBidRequest()
139
+ bidRequest.params.placementId = null
140
+
141
+ const isValidBidRequest = spec.isBidRequestValid(bidRequest)
142
+ expect(isValidBidRequest).to.be.false
143
+ })
144
+
145
+ it('Returns false when placement id is undefined', () => {
146
+ const bidRequest = getBidRequest()
147
+ delete bidRequest.params.placementId
148
+
149
+ const isValidBidRequest = spec.isBidRequestValid(bidRequest)
150
+ expect(isValidBidRequest).to.be.false
151
+ })
152
+
153
+ it('Returns false when placement id has an invalid type', () => {
154
+ const bidRequest = getBidRequest()
155
+ bidRequest.params.placementId = 123
156
+
157
+ const isValidBidRequest = spec.isBidRequestValid(bidRequest)
158
+ expect(isValidBidRequest).to.be.false
159
+ })
160
+ })
161
+
162
+ describe('buildRequests', () => {
163
+ const bidRequests = [getBidRequest()]
164
+ const bidderRequest = getBidderRequest()
165
+
166
+ it('Adds GDPR consent', () => {
167
+ const request = spec.buildRequests(bidRequests, bidderRequest)
168
+ const payload = JSON.parse(request.data)
169
+ const expected = bidderRequest.gdprConsent.consentString
170
+
171
+ expect(payload.data.gdprConsent).to.exist
172
+ expect(payload.data.gdprConsent.gdprApplies).to.be.true
173
+ expect(payload.data.gdprConsent.consentString).to.equal(expected)
174
+ })
175
+
176
+ it('Adds referer information', () => {
177
+ const request = spec.buildRequests(bidRequests, bidderRequest)
178
+ const payload = JSON.parse(request.data)
179
+ const expected = mock.bidderRequest.refererInfo.referer
180
+
181
+ expect(payload.data.referer).to.equal(expected)
182
+ })
183
+
184
+ it('Sends a POST request to the Glimpse server', () => {
185
+ const request = spec.buildRequests(bidRequests)
186
+
187
+ expect(request.url).to.equal(ENDPOINT)
188
+ expect(request.method).to.equal('POST')
189
+ })
190
+ })
191
+
192
+ describe('interpretResponse', () => {
193
+ it('Handles valid bid responses', () => {
194
+ const bidResponse = getBidResponse()
195
+ const bids = spec.interpretResponse(bidResponse)
196
+
197
+ expect(bids).to.have.lengthOf(1)
198
+ expect(bids[0].adUnitCode).to.equal(mock.bidRequest.adUnitCode)
199
+ })
200
+
201
+ it('Handles no bid responses', () => {
202
+ const bidResponse = getBidResponse()
203
+ bidResponse.body.data.bids = []
204
+
205
+ const bids = spec.interpretResponse(bidResponse)
206
+ expect(bids).to.have.lengthOf(0)
207
+ })
208
+
209
+ it('Returns no bids if body is empty', () => {
210
+ const bidResponse = getBidResponse()
211
+ bidResponse.body = {}
212
+
213
+ const bids = spec.interpretResponse(bidResponse)
214
+ expect(bids).to.have.lengthOf(0)
215
+ })
216
+
217
+ it('Returns no bids if body is null', () => {
218
+ const bidResponse = getBidResponse()
219
+ bidResponse.body = null
220
+
221
+ const bids = spec.interpretResponse(bidResponse)
222
+ expect(bids).to.have.lengthOf(0)
223
+ })
224
+
225
+ it('Returns no bids if body is undefined', () => {
226
+ const bidResponse = getBidResponse()
227
+ delete bidResponse.body
228
+
229
+ const bids = spec.interpretResponse(bidResponse)
230
+ expect(bids).to.have.lengthOf(0)
231
+ })
232
+
233
+ it('Returns no bids if body is invalid type', () => {
234
+ const bidResponse = getBidResponse()
235
+ bidResponse.body = 123
236
+
237
+ const bids = spec.interpretResponse(bidResponse)
238
+ expect(bids).to.have.lengthOf(0)
239
+ })
240
+
241
+ it('Returns no bids if auth is empty', () => {
242
+ const bidResponse = getBidResponse()
243
+ bidResponse.body.auth = ''
244
+
245
+ const bids = spec.interpretResponse(bidResponse)
246
+ expect(bids).to.have.lengthOf(0)
247
+ })
248
+
249
+ it('Returns no bids if auth is null', () => {
250
+ const bidResponse = getBidResponse()
251
+ bidResponse.body.auth = null
252
+
253
+ const bids = spec.interpretResponse(bidResponse)
254
+ expect(bids).to.have.lengthOf(0)
255
+ })
256
+
257
+ it('Returns no bids if auth is undefined', () => {
258
+ const bidResponse = getBidResponse()
259
+ delete bidResponse.body.auth
260
+
261
+ const bids = spec.interpretResponse(bidResponse)
262
+ expect(bids).to.have.lengthOf(0)
263
+ })
264
+
265
+ it('Returns no bids if auth is invalid type', () => {
266
+ const bidResponse = getBidResponse()
267
+ bidResponse.body.auth = 123
268
+
269
+ const bids = spec.interpretResponse(bidResponse)
270
+ expect(bids).to.have.lengthOf(0)
271
+ })
272
+
273
+ it('Returns no bid if data is empty', () => {
274
+ const bidResponse = getBidResponse()
275
+ bidResponse.body.data = {}
276
+
277
+ const bids = spec.interpretResponse(bidResponse)
278
+ expect(bids).to.have.lengthOf(0)
279
+ })
280
+
281
+ it('Returns no bid if data is null', () => {
282
+ const bidResponse = getBidResponse()
283
+ bidResponse.body.data = null
284
+
285
+ const bids = spec.interpretResponse(bidResponse)
286
+ expect(bids).to.have.lengthOf(0)
287
+ })
288
+
289
+ it('Returns no bid if data is undefined', () => {
290
+ const bidResponse = getBidResponse()
291
+ delete bidResponse.body.data
292
+
293
+ const bids = spec.interpretResponse(bidResponse)
294
+ expect(bids).to.have.lengthOf(0)
295
+ })
296
+
297
+ it('Returns no bid if data is invalid type', () => {
298
+ const bidResponse = getBidResponse()
299
+ bidResponse.body.data = "This shouldn't be a string"
300
+
301
+ const bids = spec.interpretResponse(bidResponse)
302
+ expect(bids).to.have.lengthOf(0)
303
+ })
304
+ })
305
+ })
@@ -341,6 +341,7 @@ describe('TheMediaGridNM Adapter', function () {
341
341
  const responses = [
342
342
  {'bid': [{'price': 1.15, 'adm': '<VAST version=\"3.0\">\n<Ad id=\"21341234\"><\/Ad>\n<\/VAST>', 'content_type': 'video', 'h': 250, 'w': 300, 'dealid': 11}], 'seat': '2'},
343
343
  {'bid': [{'price': 0.5, 'adm': '<VAST version=\"3.0\">\n<Ad id=\"21341235\"><\/Ad>\n<\/VAST>', 'content_type': 'video', 'h': 600, 'w': 300, adomain: ['my_domain.ru']}], 'seat': '2'},
344
+ {'bid': [{'price': 2.00, 'nurl': 'https://some_test_vast_url.com', 'content_type': 'video', 'adomain': ['example.com'], 'w': 300, 'h': 600}], 'seat': '2'},
344
345
  {'bid': [{'price': 0, 'h': 250, 'w': 300}], 'seat': '2'},
345
346
  {'bid': [{'price': 0, 'adm': '<VAST version=\"3.0\">\n<Ad id=\"21341237\"><\/Ad>\n<\/VAST>', 'h': 250, 'w': 300}], 'seat': '2'},
346
347
  undefined,
@@ -394,6 +395,28 @@ describe('TheMediaGridNM Adapter', function () {
394
395
  'context': 'instream'
395
396
  }
396
397
  }
398
+ },
399
+ {
400
+ 'bidder': 'gridNM',
401
+ 'params': {
402
+ 'source': 'jwp',
403
+ 'secid': '11',
404
+ 'pubid': '22',
405
+ 'video': {
406
+ 'mimes': ['video/mp4'],
407
+ 'protocols': [1, 2, 3],
408
+ }
409
+ },
410
+ 'adUnitCode': 'adunit-code-1',
411
+ 'sizes': [[300, 250], [300, 600]],
412
+ 'bidId': '127f4b12a432c',
413
+ 'bidderRequestId': 'a75bc868f32',
414
+ 'auctionId': '1cbd2feafe5e8b',
415
+ 'mediaTypes': {
416
+ 'video': {
417
+ 'context': 'instream'
418
+ }
419
+ }
397
420
  }
398
421
  ];
399
422
  const requests = spec.buildRequests(bidRequests);
@@ -435,6 +458,22 @@ describe('TheMediaGridNM Adapter', function () {
435
458
  'adResponse': {
436
459
  'content': '<VAST version=\"3.0\">\n<Ad id=\"21341235\"><\/Ad>\n<\/VAST>'
437
460
  }
461
+ },
462
+ {
463
+ 'requestId': '127f4b12a432c',
464
+ 'cpm': 2.00,
465
+ 'creativeId': 'a75bc868f32',
466
+ 'dealId': undefined,
467
+ 'width': 300,
468
+ 'height': 600,
469
+ 'currency': 'USD',
470
+ 'mediaType': 'video',
471
+ 'netRevenue': true,
472
+ 'ttl': 360,
473
+ 'meta': {
474
+ advertiserDomains: ['example.com']
475
+ },
476
+ 'vastUrl': 'https://some_test_vast_url.com',
438
477
  }
439
478
  ];
440
479
 
@@ -445,7 +484,7 @@ describe('TheMediaGridNM Adapter', function () {
445
484
  });
446
485
 
447
486
  it('handles wrong and nobid responses', function () {
448
- responses.slice(2).forEach((resp) => {
487
+ responses.slice(3).forEach((resp) => {
449
488
  const request = spec.buildRequests([{
450
489
  'bidder': 'gridNM',
451
490
  'params': {
@@ -531,9 +531,13 @@ describe('gumgumAdapter', function () {
531
531
  const jcsi = JSON.stringify(JCSI);
532
532
  const bidRequest = spec.buildRequests(bidRequests)[0];
533
533
  const actualKeys = Object.keys(JSON.parse(bidRequest.data.jcsi)).sort();
534
- expect(actualKeys).to.eq(actualKeys);
534
+ expect(actualKeys).to.eql(expectedKeys);
535
535
  expect(bidRequest.data.jcsi).to.eq(jcsi);
536
536
  });
537
+ it('should include the local time and timezone offset', function () {
538
+ const bidRequest = spec.buildRequests(bidRequests)[0];
539
+ expect(!!bidRequest.data.lt).to.be.true;
540
+ });
537
541
  })
538
542
 
539
543
  describe('interpretResponse', function () {
@@ -683,11 +687,24 @@ describe('gumgumAdapter', function () {
683
687
  expect(result[0].height).to.equal('1');
684
688
  });
685
689
 
686
- it('uses response width and height for inscreen product', function () {
687
- const result = spec.interpretResponse({ body: serverResponse }, bidRequest)[0];
688
- expect(result.width).to.equal(serverResponse.ad.width.toString());
689
- expect(result.height).to.equal(serverResponse.ad.height.toString());
690
- });
690
+ it('uses request size that nearest matches response size for in-screen', function () {
691
+ const request = { ...bidRequest };
692
+ const body = { ...serverResponse };
693
+ const expectedSize = [ 300, 50 ];
694
+ let result;
695
+
696
+ request.pi = 2;
697
+ request.sizes.unshift(expectedSize);
698
+
699
+ // typical ad server response values for in-screen
700
+ body.ad.width = 300;
701
+ body.ad.height = 100;
702
+
703
+ result = spec.interpretResponse({ body }, request)[0];
704
+
705
+ expect(result.width = expectedSize[0]);
706
+ expect(result.height = expectedSize[1]);
707
+ })
691
708
 
692
709
  it('defaults to use bidRequest sizes', function () {
693
710
  const { ad, jcsi, pag, thms, meta } = serverResponse