prebid.js 7.2.0 → 7.5.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 (251) hide show
  1. package/.circleci/config.yml +11 -6
  2. package/.github/dependabot.yml +6 -0
  3. package/.github/workflows/issue_tracker.yml +5 -0
  4. package/.github/workflows/release-drafter.yml +6 -0
  5. package/README.md +35 -0
  6. package/dist/33acrossBidAdapter.js +1 -1
  7. package/dist/adagioBidAdapter.js +1 -1
  8. package/dist/adbookpspBidAdapter.js +1 -1
  9. package/dist/adgenerationBidAdapter.js +1 -1
  10. package/dist/adkernelBidAdapter.js +1 -1
  11. package/dist/adotBidAdapter.js +1 -1
  12. package/dist/adpod.js +1 -1
  13. package/dist/adqueryBidAdapter.js +1 -1
  14. package/dist/adrelevantisBidAdapter.js +1 -1
  15. package/dist/adxcgBidAdapter.js +1 -1
  16. package/dist/adyoulikeBidAdapter.js +1 -1
  17. package/dist/ajaBidAdapter.js +1 -1
  18. package/dist/amxBidAdapter.js +1 -1
  19. package/dist/amxIdSystem.js +1 -1
  20. package/dist/appierAnalyticsAdapter.js +1 -1
  21. package/dist/appnexusBidAdapter.js +1 -1
  22. package/dist/asoBidAdapter.js +1 -1
  23. package/dist/audiencerunBidAdapter.js +1 -1
  24. package/dist/axonixBidAdapter.js +1 -1
  25. package/dist/bidglassBidAdapter.js +1 -1
  26. package/dist/big-richmediaBidAdapter.js +1 -1
  27. package/dist/bluebillywigBidAdapter.js +1 -1
  28. package/dist/bridgewellBidAdapter.js +1 -1
  29. package/dist/brightMountainMediaBidAdapter.js +1 -1
  30. package/dist/concertBidAdapter.js +1 -1
  31. package/dist/connectadBidAdapter.js +1 -1
  32. package/dist/consumableBidAdapter.js +1 -1
  33. package/dist/conversantBidAdapter.js +1 -1
  34. package/dist/cpexIdSystem.js +1 -1
  35. package/dist/craftBidAdapter.js +1 -1
  36. package/dist/criteoBidAdapter.js +1 -1
  37. package/dist/debugging-standalone.js +1 -1
  38. package/dist/debugging.js +1 -1
  39. package/dist/dianomiBidAdapter.js +1 -0
  40. package/dist/dspxBidAdapter.js +1 -1
  41. package/dist/eplanningBidAdapter.js +1 -1
  42. package/dist/finativeBidAdapter.js +1 -0
  43. package/dist/fpdModule.js +1 -1
  44. package/dist/gdprEnforcement.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/hadronIdSystem.js +1 -1
  53. package/dist/hadronRtdProvider.js +1 -1
  54. package/dist/id5IdSystem.js +1 -1
  55. package/dist/impactifyBidAdapter.js +1 -1
  56. package/dist/improvedigitalBidAdapter.js +1 -1
  57. package/dist/inmarBidAdapter.js +1 -1
  58. package/dist/insticatorBidAdapter.js +1 -1
  59. package/dist/ixBidAdapter.js +1 -1
  60. package/dist/jixieBidAdapter.js +1 -1
  61. package/dist/justpremiumBidAdapter.js +1 -1
  62. package/dist/kargoAnalyticsAdapter.js +1 -1
  63. package/dist/kargoBidAdapter.js +1 -1
  64. package/dist/konduitAnalyticsAdapter.js +1 -1
  65. package/dist/kueezBidAdapter.js +1 -1
  66. package/dist/lassoBidAdapter.js +1 -0
  67. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  68. package/dist/logicadBidAdapter.js +1 -1
  69. package/dist/loglyliftBidAdapter.js +1 -1
  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/medianetBidAdapter.js +1 -1
  75. package/dist/mediasquareBidAdapter.js +1 -1
  76. package/dist/mgidBidAdapter.js +1 -1
  77. package/dist/minutemediaBidAdapter.js +1 -1
  78. package/dist/missenaBidAdapter.js +1 -1
  79. package/dist/nativoBidAdapter.js +1 -1
  80. package/dist/not-for-prod/prebid.js +137 -131
  81. package/dist/oguryBidAdapter.js +1 -1
  82. package/dist/onetagBidAdapter.js +1 -1
  83. package/dist/ooloAnalyticsAdapter.js +1 -1
  84. package/dist/openxOrtbBidAdapter.js +1 -0
  85. package/dist/outbrainBidAdapter.js +1 -1
  86. package/dist/parrableIdSystem.js +1 -1
  87. package/dist/pixfutureBidAdapter.js +1 -1
  88. package/dist/prebid-core.js +2 -2
  89. package/dist/pubCommonId.js +1 -1
  90. package/dist/publinkIdSystem.js +1 -1
  91. package/dist/pubmaticBidAdapter.js +1 -1
  92. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  93. package/dist/pxyzBidAdapter.js +1 -1
  94. package/dist/quantcastBidAdapter.js +1 -1
  95. package/dist/readpeakBidAdapter.js +1 -1
  96. package/dist/relaidoBidAdapter.js +1 -1
  97. package/dist/rhythmoneBidAdapter.js +1 -1
  98. package/dist/riseBidAdapter.js +1 -1
  99. package/dist/rubiconAnalyticsAdapter.js +1 -1
  100. package/dist/rubiconBidAdapter.js +1 -1
  101. package/dist/seedingAllianceBidAdapter.js +1 -1
  102. package/dist/seedtagBidAdapter.js +1 -1
  103. package/dist/sharedIdSystem.js +1 -1
  104. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  105. package/dist/sharethroughBidAdapter.js +1 -1
  106. package/dist/shinezBidAdapter.js +1 -0
  107. package/dist/sizeMappingV2.js +1 -1
  108. package/dist/smaatoBidAdapter.js +1 -1
  109. package/dist/smartadserverBidAdapter.js +1 -1
  110. package/dist/smartxBidAdapter.js +1 -1
  111. package/dist/smilewantedBidAdapter.js +1 -1
  112. package/dist/sonobiBidAdapter.js +1 -1
  113. package/dist/sovrnAnalyticsAdapter.js +1 -1
  114. package/dist/sovrnBidAdapter.js +1 -1
  115. package/dist/sspBCBidAdapter.js +1 -1
  116. package/dist/sublimeBidAdapter.js +1 -1
  117. package/dist/synacormediaBidAdapter.js +1 -1
  118. package/dist/taboolaBidAdapter.js +1 -1
  119. package/dist/targetVideoBidAdapter.js +1 -1
  120. package/dist/teadsBidAdapter.js +1 -1
  121. package/dist/tncIdSystem.js +1 -0
  122. package/dist/trionBidAdapter.js +1 -1
  123. package/dist/tripleliftBidAdapter.js +1 -1
  124. package/dist/ttdBidAdapter.js +1 -1
  125. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  126. package/dist/underdogmediaBidAdapter.js +1 -1
  127. package/dist/undertoneBidAdapter.js +1 -1
  128. package/dist/userId.js +1 -1
  129. package/dist/ventesBidAdapter.js +1 -1
  130. package/dist/vidazooBidAdapter.js +1 -1
  131. package/dist/videobyteBidAdapter.js +1 -1
  132. package/dist/visxBidAdapter.js +1 -1
  133. package/dist/vrtcalBidAdapter.js +1 -1
  134. package/dist/vuukleBidAdapter.js +1 -1
  135. package/dist/widespaceBidAdapter.js +1 -1
  136. package/dist/winrBidAdapter.js +1 -1
  137. package/dist/yahoosspBidAdapter.js +1 -1
  138. package/dist/yieldlabBidAdapter.js +1 -1
  139. package/dist/yieldmoBidAdapter.js +1 -1
  140. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  141. package/dist/yieldoneBidAdapter.js +1 -1
  142. package/governance.md +5 -11
  143. package/gulpHelpers.js +1 -1
  144. package/gulpfile.js +1 -1
  145. package/karma.conf.maker.js +3 -1
  146. package/modules/.submodules.json +1 -0
  147. package/modules/33acrossBidAdapter.js +5 -1
  148. package/modules/adkernelBidAdapter.js +2 -1
  149. package/modules/adotBidAdapter.js +3 -3
  150. package/modules/adqueryBidAdapter.js +5 -1
  151. package/modules/appnexusBidAdapter.js +3 -3
  152. package/modules/cpexIdSystem.js +7 -8
  153. package/modules/criteoBidAdapter.js +7 -1
  154. package/modules/cwireBidAdapter.md +1 -1
  155. package/modules/debugging/bidInterceptor.js +1 -1
  156. package/modules/debugging/index.js +2 -1
  157. package/modules/dianomiBidAdapter.js +369 -0
  158. package/modules/dianomiBidAdapter.md +73 -0
  159. package/modules/finativeBidAdapter.js +235 -0
  160. package/modules/finativeBidAdapter.md +45 -0
  161. package/modules/fpdModule/index.js +6 -5
  162. package/modules/gdprEnforcement.js +8 -14
  163. package/modules/gumgumBidAdapter.js +2 -0
  164. package/modules/gumgumBidAdapter.md +19 -1
  165. package/modules/hadronAnalyticsAdapter.md +5 -5
  166. package/modules/hadronIdSystem.js +18 -5
  167. package/modules/hadronIdSystem.md +15 -11
  168. package/modules/hadronRtdProvider.js +14 -1
  169. package/modules/hadronRtdProvider.md +17 -13
  170. package/modules/insticatorBidAdapter.js +9 -0
  171. package/modules/ixBidAdapter.js +457 -57
  172. package/modules/ixBidAdapter.md +95 -5
  173. package/modules/kargoAnalyticsAdapter.js +88 -6
  174. package/modules/kargoAnalyticsAdapter.md +33 -0
  175. package/modules/kargoBidAdapter.js +1 -2
  176. package/modules/lassoBidAdapter.js +133 -0
  177. package/modules/lassoBidAdapter.md +29 -0
  178. package/modules/medianetBidAdapter.js +9 -5
  179. package/modules/missenaBidAdapter.js +20 -2
  180. package/modules/nativoBidAdapter.js +19 -7
  181. package/modules/openxBidAdapter.md +3 -1
  182. package/modules/openxOrtbBidAdapter.js +349 -0
  183. package/modules/openxOrtbBidAdapter.md +105 -0
  184. package/modules/pubCommonId.js +1 -2
  185. package/modules/readpeakBidAdapter.js +15 -6
  186. package/modules/relaidoBidAdapter.js +19 -4
  187. package/modules/riseBidAdapter.js +1 -0
  188. package/modules/seedtagBidAdapter.js +33 -1
  189. package/modules/sharedIdSystem.js +11 -5
  190. package/modules/sharethroughBidAdapter.js +9 -24
  191. package/modules/shinezBidAdapter.js +435 -0
  192. package/modules/shinezBidAdapter.md +76 -0
  193. package/modules/sonobiBidAdapter.js +28 -9
  194. package/modules/sovrnBidAdapter.js +16 -10
  195. package/modules/taboolaBidAdapter.js +1 -1
  196. package/modules/taboolaBidAdapter.md +3 -3
  197. package/modules/tncIdSystem.js +63 -0
  198. package/modules/tncIdSystem.md +33 -0
  199. package/modules/userId/eids.js +12 -0
  200. package/modules/userId/eids.md +7 -0
  201. package/modules/userId/userId.md +17 -0
  202. package/modules/ventesBidAdapter.js +1 -1
  203. package/modules/ventesBidAdapter.md +1 -1
  204. package/modules/vrtcalBidAdapter.js +35 -0
  205. package/modules/yieldlabBidAdapter.js +4 -0
  206. package/modules/yieldmoBidAdapter.js +20 -2
  207. package/modules/yieldoneBidAdapter.js +12 -1
  208. package/package.json +1 -1
  209. package/plugins/pbjsGlobals.js +2 -1
  210. package/src/adloader.js +1 -0
  211. package/src/prebid.js +4 -1
  212. package/src/storageManager.js +4 -5
  213. package/test/spec/modules/33acrossBidAdapter_spec.js +39 -0
  214. package/test/spec/modules/appnexusBidAdapter_spec.js +165 -156
  215. package/test/spec/modules/cpexIdSystem_spec.js +5 -5
  216. package/test/spec/modules/criteoBidAdapter_spec.js +15 -5
  217. package/test/spec/modules/debugging_mod_spec.js +7 -0
  218. package/test/spec/modules/dianomiBidAdapter_spec.js +1223 -0
  219. package/test/spec/modules/eids_spec.js +26 -1
  220. package/test/spec/modules/finativeBidAdapter_spec.js +186 -0
  221. package/test/spec/modules/fpdModule_spec.js +28 -1
  222. package/test/spec/modules/gdprEnforcement_spec.js +53 -100
  223. package/test/spec/modules/gumgumBidAdapter_spec.js +5 -0
  224. package/test/spec/modules/hadronIdSystem_spec.js +2 -2
  225. package/test/spec/modules/insticatorBidAdapter_spec.js +22 -1
  226. package/test/spec/modules/ixBidAdapter_spec.js +429 -10
  227. package/test/spec/modules/kargoAnalyticsAdapter_spec.js +42 -0
  228. package/test/spec/modules/kargoBidAdapter_spec.js +1 -0
  229. package/test/spec/modules/lassoBidAdapter_spec.js +177 -0
  230. package/test/spec/modules/medianetBidAdapter_spec.js +24 -1
  231. package/test/spec/modules/missenaBidAdapter_spec.js +36 -14
  232. package/test/spec/modules/nativoBidAdapter_spec.js +67 -17
  233. package/test/spec/modules/openxOrtbBidAdapter_spec.js +1303 -0
  234. package/test/spec/modules/readpeakBidAdapter_spec.js +1 -0
  235. package/test/spec/modules/relaidoBidAdapter_spec.js +29 -2
  236. package/test/spec/modules/riseBidAdapter_spec.js +3 -0
  237. package/test/spec/modules/seedtagBidAdapter_spec.js +4 -0
  238. package/test/spec/modules/sharethroughBidAdapter_spec.js +4 -4
  239. package/test/spec/modules/shinezBidAdapter_spec.js +479 -0
  240. package/test/spec/modules/sonobiBidAdapter_spec.js +38 -23
  241. package/test/spec/modules/sovrnBidAdapter_spec.js +39 -5
  242. package/test/spec/modules/taboolaBidAdapter_spec.js +1 -1
  243. package/test/spec/modules/tncIdSystem_spec.js +109 -0
  244. package/test/spec/modules/userId_spec.js +6 -3
  245. package/test/spec/modules/ventesBidAdapter_spec.js +2 -2
  246. package/test/spec/modules/vrtcalBidAdapter_spec.js +17 -0
  247. package/test/spec/modules/yieldlabBidAdapter_spec.js +4 -0
  248. package/test/spec/modules/yieldmoBidAdapter_spec.js +15 -2
  249. package/test/spec/modules/yieldoneBidAdapter_spec.js +43 -2
  250. package/test/spec/unit/pbjs_api_spec.js +23 -0
  251. package/webpack.conf.js +1 -1
@@ -0,0 +1,1223 @@
1
+ // jshint esversion: 6, es3: false, node: true
2
+ import { assert } from 'chai';
3
+ import { spec } from 'modules/dianomiBidAdapter.js';
4
+ import { config } from 'src/config.js';
5
+ import { createEidsArray } from 'modules/userId/eids.js';
6
+
7
+ describe('Dianomi adapter', () => {
8
+ let bids = [];
9
+
10
+ describe('isBidRequestValid', () => {
11
+ let bid = {
12
+ bidder: 'dianomi',
13
+ params: {
14
+ smartadId: 1234,
15
+ },
16
+ };
17
+
18
+ it('should return true when required params found', () => {
19
+ assert(spec.isBidRequestValid(bid));
20
+ bid.params = {
21
+ smartadId: 4332,
22
+ };
23
+ assert(spec.isBidRequestValid(bid));
24
+ });
25
+
26
+ it('should return false when required params are missing', () => {
27
+ bid.params = {};
28
+ assert.isFalse(spec.isBidRequestValid(bid));
29
+
30
+ bid.params = {
31
+ smartadId: null,
32
+ };
33
+ assert.isFalse(spec.isBidRequestValid(bid));
34
+ });
35
+ });
36
+
37
+ describe('buildRequests', () => {
38
+ beforeEach(() => {
39
+ config.resetConfig();
40
+ });
41
+ it('should send request with correct structure', () => {
42
+ let validBidRequests = [
43
+ {
44
+ bidId: 'bidId',
45
+ params: { smartadId: 1234 },
46
+ },
47
+ ];
48
+ let request = spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } });
49
+
50
+ assert.equal(request.method, 'POST');
51
+ assert.equal(request.url, 'https://www-prebid.dianomi.com/cgi-bin/smartads_prebid.pl');
52
+ assert.ok(request.data);
53
+ });
54
+
55
+ describe('user privacy', () => {
56
+ it('should send GDPR Consent data to Dianomi if gdprApplies', () => {
57
+ let validBidRequests = [{ bidId: 'bidId', params: { smartadId: 1234 } }];
58
+ let bidderRequest = {
59
+ gdprConsent: { gdprApplies: true, consentString: 'consentDataString' },
60
+ refererInfo: { page: 'page' },
61
+ };
62
+ let request = JSON.parse(spec.buildRequests(validBidRequests, bidderRequest).data);
63
+
64
+ assert.equal(request.user.ext.consent, bidderRequest.gdprConsent.consentString);
65
+ assert.equal(request.regs.ext.gdpr, bidderRequest.gdprConsent.gdprApplies);
66
+ assert.equal(typeof request.regs.ext.gdpr, 'number');
67
+ });
68
+
69
+ it('should send gdpr as number', () => {
70
+ let validBidRequests = [{ bidId: 'bidId', params: { smartadId: 1234 } }];
71
+ let bidderRequest = {
72
+ gdprConsent: { gdprApplies: true, consentString: 'consentDataString' },
73
+ refererInfo: { page: 'page' },
74
+ };
75
+ let request = JSON.parse(spec.buildRequests(validBidRequests, bidderRequest).data);
76
+
77
+ assert.equal(typeof request.regs.ext.gdpr, 'number');
78
+ assert.equal(request.regs.ext.gdpr, 1);
79
+ });
80
+
81
+ it('should send CCPA Consent data to dianomi', () => {
82
+ let validBidRequests = [{ bidId: 'bidId', params: { smartadId: 1234 } }];
83
+ let bidderRequest = { uspConsent: '1YA-', refererInfo: { page: 'page' } };
84
+ let request = JSON.parse(spec.buildRequests(validBidRequests, bidderRequest).data);
85
+
86
+ assert.equal(request.regs.ext.us_privacy, '1YA-');
87
+
88
+ bidderRequest = {
89
+ uspConsent: '1YA-',
90
+ gdprConsent: { gdprApplies: true, consentString: 'consentDataString' },
91
+ refererInfo: { page: 'page' },
92
+ };
93
+ request = JSON.parse(spec.buildRequests(validBidRequests, bidderRequest).data);
94
+
95
+ assert.equal(request.regs.ext.us_privacy, '1YA-');
96
+ assert.equal(request.user.ext.consent, 'consentDataString');
97
+ assert.equal(request.regs.ext.gdpr, 1);
98
+ });
99
+
100
+ it('should not send GDPR Consent data to dianomi if gdprApplies is undefined', () => {
101
+ let validBidRequests = [
102
+ {
103
+ bidId: 'bidId',
104
+ params: { smartadId: 1234 },
105
+ },
106
+ ];
107
+ let bidderRequest = {
108
+ gdprConsent: { gdprApplies: false, consentString: 'consentDataString' },
109
+ refererInfo: { page: 'page' },
110
+ };
111
+ let request = JSON.parse(spec.buildRequests(validBidRequests, bidderRequest).data);
112
+
113
+ assert.equal(request.user.ext.consent, 'consentDataString');
114
+ assert.equal(request.regs.ext.gdpr, 0);
115
+
116
+ bidderRequest = {
117
+ gdprConsent: { consentString: 'consentDataString' },
118
+ refererInfo: { page: 'page' },
119
+ };
120
+ request = JSON.parse(spec.buildRequests(validBidRequests, bidderRequest).data);
121
+
122
+ assert.equal(request.user, undefined);
123
+ assert.equal(request.regs, undefined);
124
+ });
125
+ it('should send default GDPR Consent data to dianomi', () => {
126
+ let validBidRequests = [
127
+ {
128
+ bidId: 'bidId',
129
+ params: { smartadId: 1234 },
130
+ },
131
+ ];
132
+ let request = JSON.parse(
133
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
134
+ );
135
+
136
+ assert.equal(request.user, undefined);
137
+ assert.equal(request.regs, undefined);
138
+ });
139
+ });
140
+
141
+ it('should have default request structure', () => {
142
+ let keys = 'site,device,source,ext,imp'.split(',');
143
+ let validBidRequests = [
144
+ {
145
+ bidId: 'bidId',
146
+ params: { smartadId: 1234 },
147
+ },
148
+ ];
149
+ let request = JSON.parse(
150
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
151
+ );
152
+ let data = Object.keys(request);
153
+
154
+ assert.deepEqual(keys, data);
155
+ });
156
+
157
+ it('should set request keys correct values', () => {
158
+ let validBidRequests = [
159
+ {
160
+ bidId: 'bidId',
161
+ params: { smartadId: 1234 },
162
+ transactionId: 'transactionId',
163
+ },
164
+ ];
165
+ let request = JSON.parse(
166
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
167
+ );
168
+
169
+ assert.equal(request.source.tid, validBidRequests[0].transactionId);
170
+ assert.equal(request.source.fd, 1);
171
+ });
172
+
173
+ it('should send info about device', () => {
174
+ config.setConfig({
175
+ device: { w: 100, h: 100 },
176
+ });
177
+ let validBidRequests = [
178
+ {
179
+ bidId: 'bidId',
180
+ params: { smartadId: 1234 },
181
+ },
182
+ ];
183
+ let request = JSON.parse(
184
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
185
+ );
186
+
187
+ assert.equal(request.device.ua, navigator.userAgent);
188
+ assert.equal(request.device.w, 100);
189
+ assert.equal(request.device.h, 100);
190
+ });
191
+
192
+ it('should send app info', () => {
193
+ config.setConfig({
194
+ app: { id: 'appid' },
195
+ });
196
+ const ortb2 = { app: { name: 'appname' } };
197
+ let validBidRequests = [
198
+ {
199
+ bidId: 'bidId',
200
+ params: { smartadId: 1234 },
201
+ ortb2
202
+ },
203
+ ];
204
+ let request = JSON.parse(
205
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' }, ortb2 }).data
206
+ );
207
+
208
+ assert.equal(request.app.id, 'appid');
209
+ assert.equal(request.app.name, 'appname');
210
+ assert.equal(request.site, undefined);
211
+ });
212
+
213
+ it('should send info about the site', () => {
214
+ config.setConfig({
215
+ site: {
216
+ id: '123123',
217
+ publisher: {
218
+ domain: 'publisher.domain.com',
219
+ },
220
+ },
221
+ });
222
+ const ortb2 = {
223
+ site: {
224
+ publisher: {
225
+ name: "publisher's name",
226
+ },
227
+ },
228
+ }
229
+ let validBidRequests = [
230
+ {
231
+ bidId: 'bidId',
232
+ params: { smartadId: 1234 },
233
+ ortb2
234
+ },
235
+ ];
236
+ let refererInfo = { page: 'page' };
237
+ let request = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo, ortb2 }).data);
238
+
239
+ assert.deepEqual(request.site, {
240
+ page: refererInfo.page,
241
+ publisher: {
242
+ domain: 'publisher.domain.com',
243
+ name: "publisher's name",
244
+ },
245
+ id: '123123',
246
+ });
247
+ });
248
+
249
+ it('should pass extended ids', () => {
250
+ let validBidRequests = [
251
+ {
252
+ bidId: 'bidId',
253
+ params: { smartadId: 1234 },
254
+ userIdAsEids: createEidsArray({
255
+ tdid: 'TTD_ID_FROM_USER_ID_MODULE',
256
+ pubcid: 'pubCommonId_FROM_USER_ID_MODULE',
257
+ }),
258
+ },
259
+ ];
260
+
261
+ let request = JSON.parse(
262
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
263
+ );
264
+ assert.deepEqual(request.user.ext.eids, [
265
+ {
266
+ source: 'adserver.org',
267
+ uids: [{ id: 'TTD_ID_FROM_USER_ID_MODULE', atype: 1, ext: { rtiPartner: 'TDID' } }],
268
+ },
269
+ { source: 'pubcid.org', uids: [{ id: 'pubCommonId_FROM_USER_ID_MODULE', atype: 1 }] },
270
+ ]);
271
+ });
272
+
273
+ it('should send currency if defined', () => {
274
+ config.setConfig({ currency: { adServerCurrency: 'EUR' } });
275
+ let validBidRequests = [{ params: { smartadId: 1234 } }];
276
+ let refererInfo = { page: 'page' };
277
+ let request = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo }).data);
278
+
279
+ assert.deepEqual(request.cur, ['EUR']);
280
+ });
281
+
282
+ it('should pass supply chain object', () => {
283
+ let validBidRequests = [
284
+ {
285
+ bidId: 'bidId',
286
+ params: { smartadId: 1234 },
287
+ schain: {
288
+ validation: 'strict',
289
+ config: {
290
+ ver: '1.0',
291
+ },
292
+ },
293
+ },
294
+ ];
295
+
296
+ let request = JSON.parse(
297
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
298
+ );
299
+ assert.deepEqual(request.source.ext.schain, {
300
+ validation: 'strict',
301
+ config: {
302
+ ver: '1.0',
303
+ },
304
+ });
305
+ });
306
+
307
+ describe('priceType', () => {
308
+ it('should send default priceType', () => {
309
+ let validBidRequests = [
310
+ {
311
+ bidId: 'bidId',
312
+ params: { smartadId: 1234 },
313
+ },
314
+ ];
315
+ let request = JSON.parse(
316
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
317
+ );
318
+
319
+ assert.equal(request.ext.pt, 'net');
320
+ });
321
+ it('should send correct priceType value', () => {
322
+ let validBidRequests = [
323
+ {
324
+ bidId: 'bidId',
325
+ params: { smartadId: 1234 },
326
+ },
327
+ ];
328
+ let request = JSON.parse(
329
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
330
+ );
331
+
332
+ assert.equal(request.ext.pt, 'net');
333
+ });
334
+ });
335
+
336
+ describe('bids', () => {
337
+ it('should add more than one bid to the request', () => {
338
+ let validBidRequests = [
339
+ {
340
+ bidId: 'bidId',
341
+ params: { smartadId: 1234 },
342
+ },
343
+ {
344
+ bidId: 'bidId2',
345
+ params: { smartadId: 1234 }
346
+ },
347
+ ];
348
+ let request = JSON.parse(
349
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
350
+ );
351
+
352
+ assert.equal(request.imp.length, 2);
353
+ });
354
+ it('should add incrementing values of id', () => {
355
+ let validBidRequests = [
356
+ {
357
+ bidId: 'bidId',
358
+ params: { smartadId: 1234 },
359
+ mediaTypes: { video: {} },
360
+ },
361
+ {
362
+ bidId: 'bidId2',
363
+ params: { smartadId: 1234 },
364
+ mediaTypes: { video: {} },
365
+ },
366
+ {
367
+ bidId: 'bidId3',
368
+ params: { smartadId: 1234 },
369
+ mediaTypes: { video: {} },
370
+ },
371
+ ];
372
+ let imps = JSON.parse(
373
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
374
+ ).imp;
375
+
376
+ for (let i = 0; i < 3; i++) {
377
+ assert.equal(imps[i].id, i + 1);
378
+ }
379
+ });
380
+
381
+ describe('price floors', () => {
382
+ it('should not add if floors module not configured', () => {
383
+ const validBidRequests = [
384
+ { bidId: 'bidId', params: { smartadId: 1234 }, mediaTypes: { video: {} } },
385
+ ];
386
+ let imp = getRequestImps(validBidRequests)[0];
387
+
388
+ assert.equal(imp.bidfloor, undefined);
389
+ assert.equal(imp.bidfloorcur, undefined);
390
+ });
391
+
392
+ it('should not add if floor price not defined', () => {
393
+ const validBidRequests = [getBidWithFloor()];
394
+ let imp = getRequestImps(validBidRequests)[0];
395
+
396
+ assert.equal(imp.bidfloor, undefined);
397
+ assert.equal(imp.bidfloorcur, 'USD');
398
+ });
399
+
400
+ it('should request floor price in adserver currency', () => {
401
+ config.setConfig({ currency: { adServerCurrency: 'GBP' } });
402
+ const validBidRequests = [getBidWithFloor()];
403
+ let imp = getRequestImps(validBidRequests)[0];
404
+
405
+ assert.equal(imp.bidfloor, undefined);
406
+ assert.equal(imp.bidfloorcur, 'GBP');
407
+ });
408
+
409
+ it('should add correct floor values', () => {
410
+ const expectedFloors = [1, 1.3, 0.5];
411
+ const validBidRequests = expectedFloors.map(getBidWithFloor);
412
+ let imps = getRequestImps(validBidRequests);
413
+
414
+ expectedFloors.forEach((floor, index) => {
415
+ assert.equal(imps[index].bidfloor, floor);
416
+ assert.equal(imps[index].bidfloorcur, 'USD');
417
+ });
418
+ });
419
+
420
+ function getBidWithFloor(floor) {
421
+ return {
422
+ params: { smartadId: 1234 },
423
+ mediaTypes: { video: {} },
424
+ getFloor: ({ currency }) => {
425
+ return {
426
+ currency: currency,
427
+ floor,
428
+ };
429
+ },
430
+ };
431
+ }
432
+ });
433
+
434
+ describe('multiple media types', () => {
435
+ it('should use all configured media types for bidding', () => {
436
+ let validBidRequests = [
437
+ {
438
+ bidId: 'bidId',
439
+ params: { smartadId: 1234 },
440
+ mediaTypes: {
441
+ banner: {
442
+ sizes: [
443
+ [100, 100],
444
+ [200, 300],
445
+ ],
446
+ },
447
+ video: {},
448
+ },
449
+ },
450
+ {
451
+ bidId: 'bidId1',
452
+ params: { smartadId: 1234 },
453
+ mediaTypes: {
454
+ video: {},
455
+ native: {},
456
+ },
457
+ },
458
+ {
459
+ bidId: 'bidId2',
460
+ params: { smartadId: 1234 },
461
+ nativeParams: {
462
+ title: { required: true, len: 140 },
463
+ },
464
+ mediaTypes: {
465
+ banner: {
466
+ sizes: [
467
+ [100, 100],
468
+ [200, 300],
469
+ ],
470
+ },
471
+ native: {},
472
+ video: {},
473
+ },
474
+ },
475
+ ];
476
+ let [first, second, third] = JSON.parse(
477
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
478
+ ).imp;
479
+
480
+ assert.ok(first.banner);
481
+ assert.ok(first.video);
482
+ assert.equal(first.native, undefined);
483
+
484
+ assert.ok(second.video);
485
+ assert.equal(second.banner, undefined);
486
+ assert.equal(second.native, undefined);
487
+
488
+ assert.ok(third.native);
489
+ assert.ok(third.video);
490
+ assert.ok(third.banner);
491
+ });
492
+ });
493
+
494
+ describe('banner', () => {
495
+ it('should convert sizes to openrtb format', () => {
496
+ let validBidRequests = [
497
+ {
498
+ bidId: 'bidId',
499
+ params: { smartadId: 1234 },
500
+ mediaTypes: {
501
+ banner: {
502
+ sizes: [
503
+ [100, 100],
504
+ [200, 300],
505
+ ],
506
+ },
507
+ },
508
+ },
509
+ ];
510
+ let { banner } = JSON.parse(
511
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
512
+ ).imp[0];
513
+ assert.deepEqual(banner, {
514
+ format: [
515
+ { w: 100, h: 100 },
516
+ { w: 200, h: 300 },
517
+ ],
518
+ });
519
+ });
520
+ });
521
+
522
+ describe('video', () => {
523
+ it('should pass video mediatype config', () => {
524
+ let validBidRequests = [
525
+ {
526
+ bidId: 'bidId',
527
+ params: { smartadId: 1234 },
528
+ mediaTypes: {
529
+ video: {
530
+ playerSize: [640, 480],
531
+ context: 'outstream',
532
+ mimes: ['video/mp4'],
533
+ },
534
+ },
535
+ },
536
+ ];
537
+ let { video } = JSON.parse(
538
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
539
+ ).imp[0];
540
+ assert.deepEqual(video, {
541
+ playerSize: [640, 480],
542
+ context: 'outstream',
543
+ mimes: ['video/mp4'],
544
+ });
545
+ });
546
+ });
547
+
548
+ describe('native', () => {
549
+ describe('assets', () => {
550
+ it('should set correct asset id', () => {
551
+ let validBidRequests = [
552
+ {
553
+ bidId: 'bidId',
554
+ params: { smartadId: 1234 },
555
+ nativeParams: {
556
+ title: { required: true, len: 140 },
557
+ image: {
558
+ required: false,
559
+ wmin: 836,
560
+ hmin: 627,
561
+ w: 325,
562
+ h: 300,
563
+ mimes: ['image/jpg', 'image/gif'],
564
+ },
565
+ body: { len: 140 },
566
+ },
567
+ },
568
+ ];
569
+ let assets = JSON.parse(
570
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
571
+ ).imp[0].native.assets;
572
+
573
+ assert.equal(assets[0].id, 0);
574
+ assert.equal(assets[1].id, 3);
575
+ assert.equal(assets[2].id, 4);
576
+ });
577
+ it('should add required key if it is necessary', () => {
578
+ let validBidRequests = [
579
+ {
580
+ bidId: 'bidId',
581
+ params: { smartadId: 1234 },
582
+ nativeParams: {
583
+ title: { required: true, len: 140 },
584
+ image: {
585
+ required: false,
586
+ wmin: 836,
587
+ hmin: 627,
588
+ w: 325,
589
+ h: 300,
590
+ mimes: ['image/jpg', 'image/gif'],
591
+ },
592
+ body: { len: 140 },
593
+ sponsoredBy: { required: true, len: 140 },
594
+ },
595
+ },
596
+ ];
597
+
598
+ let assets = JSON.parse(
599
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
600
+ ).imp[0].native.assets;
601
+
602
+ assert.equal(assets[0].required, 1);
603
+ assert.ok(!assets[1].required);
604
+ assert.ok(!assets[2].required);
605
+ assert.equal(assets[3].required, 1);
606
+ });
607
+
608
+ it('should map img and data assets', () => {
609
+ let validBidRequests = [
610
+ {
611
+ bidId: 'bidId',
612
+ params: { smartadId: 1234 },
613
+ nativeParams: {
614
+ title: { required: true, len: 140 },
615
+ image: { required: true, sizes: [150, 50] },
616
+ icon: { required: false, sizes: [50, 50] },
617
+ body: { required: false, len: 140 },
618
+ sponsoredBy: { required: true },
619
+ cta: { required: false },
620
+ clickUrl: { required: false },
621
+ },
622
+ },
623
+ ];
624
+
625
+ let assets = JSON.parse(
626
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
627
+ ).imp[0].native.assets;
628
+ assert.ok(assets[0].title);
629
+ assert.equal(assets[0].title.len, 140);
630
+ assert.deepEqual(assets[1].img, { type: 3, w: 150, h: 50 });
631
+ assert.deepEqual(assets[2].img, { type: 1, w: 50, h: 50 });
632
+ assert.deepEqual(assets[3].data, { type: 2, len: 140 });
633
+ assert.deepEqual(assets[4].data, { type: 1 });
634
+ assert.deepEqual(assets[5].data, { type: 12 });
635
+ assert.ok(!assets[6]);
636
+ });
637
+
638
+ describe('icon/image sizing', () => {
639
+ it('should flatten sizes and utilise first pair', () => {
640
+ const validBidRequests = [
641
+ {
642
+ bidId: 'bidId',
643
+ params: { smartadId: 1234 },
644
+ nativeParams: {
645
+ image: {
646
+ sizes: [
647
+ [200, 300],
648
+ [100, 200],
649
+ ],
650
+ },
651
+ },
652
+ },
653
+ ];
654
+
655
+ let assets = JSON.parse(
656
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
657
+ ).imp[0].native.assets;
658
+ assert.ok(assets[0].img);
659
+ assert.equal(assets[0].img.w, 200);
660
+ assert.equal(assets[0].img.h, 300);
661
+ });
662
+ });
663
+
664
+ it('should utilise aspect_ratios', () => {
665
+ const validBidRequests = [
666
+ {
667
+ bidId: 'bidId',
668
+ params: { smartadId: 1234 },
669
+ nativeParams: {
670
+ image: {
671
+ aspect_ratios: [
672
+ {
673
+ min_width: 100,
674
+ ratio_height: 3,
675
+ ratio_width: 1,
676
+ },
677
+ ],
678
+ },
679
+ icon: {
680
+ aspect_ratios: [
681
+ {
682
+ min_width: 10,
683
+ ratio_height: 5,
684
+ ratio_width: 2,
685
+ },
686
+ ],
687
+ },
688
+ },
689
+ },
690
+ ];
691
+
692
+ let assets = JSON.parse(
693
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
694
+ ).imp[0].native.assets;
695
+ assert.ok(assets[0].img);
696
+ assert.equal(assets[0].img.wmin, 100);
697
+ assert.equal(assets[0].img.hmin, 300);
698
+
699
+ assert.ok(assets[1].img);
700
+ assert.equal(assets[1].img.wmin, 10);
701
+ assert.equal(assets[1].img.hmin, 25);
702
+ });
703
+
704
+ it('should not throw error if aspect_ratios config is not defined', () => {
705
+ const validBidRequests = [
706
+ {
707
+ bidId: 'bidId',
708
+ params: { smartadId: 1234 },
709
+ nativeParams: {
710
+ image: {
711
+ aspect_ratios: [],
712
+ },
713
+ icon: {
714
+ aspect_ratios: [],
715
+ },
716
+ },
717
+ },
718
+ ];
719
+
720
+ assert.doesNotThrow(() =>
721
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } })
722
+ );
723
+ });
724
+ });
725
+ });
726
+ });
727
+
728
+ function getRequestImps(validBidRequests) {
729
+ return JSON.parse(
730
+ spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data
731
+ ).imp;
732
+ }
733
+ });
734
+
735
+ describe('interpretResponse', () => {
736
+ it('should return if no body in response', () => {
737
+ let serverResponse = {};
738
+ let bidRequest = {};
739
+
740
+ assert.ok(!spec.interpretResponse(serverResponse, bidRequest));
741
+ });
742
+ it('should return more than one bids', () => {
743
+ let serverResponse = {
744
+ body: {
745
+ seatbid: [
746
+ {
747
+ bid: [
748
+ {
749
+ impid: '1',
750
+ native: {
751
+ ver: '1.1',
752
+ link: { url: 'link' },
753
+ assets: [{ id: 1, title: { text: 'Asset title text' } }],
754
+ },
755
+ },
756
+ ],
757
+ },
758
+ {
759
+ bid: [
760
+ {
761
+ impid: '2',
762
+ native: {
763
+ ver: '1.1',
764
+ link: { url: 'link' },
765
+ assets: [{ id: 1, data: { value: 'Asset title text' } }],
766
+ },
767
+ },
768
+ ],
769
+ },
770
+ ],
771
+ },
772
+ };
773
+ let bidRequest = {
774
+ data: {},
775
+ bids: [
776
+ {
777
+ bidId: 'bidId1',
778
+ params: { smartadId: 1234 },
779
+ nativeParams: {
780
+ title: { required: true, len: 140 },
781
+ image: {
782
+ required: false,
783
+ wmin: 836,
784
+ hmin: 627,
785
+ w: 325,
786
+ h: 300,
787
+ mimes: ['image/jpg', 'image/gif'],
788
+ },
789
+ body: { len: 140 },
790
+ },
791
+ },
792
+ {
793
+ bidId: 'bidId2',
794
+ params: { smartadId: 1234 },
795
+ nativeParams: {
796
+ title: { required: true, len: 140 },
797
+ image: {
798
+ required: false,
799
+ wmin: 836,
800
+ hmin: 627,
801
+ w: 325,
802
+ h: 300,
803
+ mimes: ['image/jpg', 'image/gif'],
804
+ },
805
+ body: { len: 140 },
806
+ },
807
+ },
808
+ ],
809
+ };
810
+
811
+ bids = spec.interpretResponse(serverResponse, bidRequest);
812
+ assert.equal(spec.interpretResponse(serverResponse, bidRequest).length, 2);
813
+ });
814
+
815
+ it('should parse seatbids', () => {
816
+ let serverResponse = {
817
+ body: {
818
+ seatbid: [
819
+ {
820
+ bid: [
821
+ {
822
+ impid: '1',
823
+ native: {
824
+ ver: '1.1',
825
+ link: { url: 'link1' },
826
+ assets: [{ id: 1, title: { text: 'Asset title text' } }],
827
+ },
828
+ },
829
+ {
830
+ impid: '4',
831
+ native: {
832
+ ver: '1.1',
833
+ link: { url: 'link4' },
834
+ assets: [{ id: 1, title: { text: 'Asset title text' } }],
835
+ },
836
+ },
837
+ ],
838
+ },
839
+ {
840
+ bid: [
841
+ {
842
+ impid: '2',
843
+ native: {
844
+ ver: '1.1',
845
+ link: { url: 'link2' },
846
+ assets: [{ id: 1, data: { value: 'Asset title text' } }],
847
+ },
848
+ },
849
+ ],
850
+ },
851
+ ],
852
+ },
853
+ };
854
+ let bidRequest = {
855
+ data: {},
856
+ bids: [
857
+ {
858
+ bidId: 'bidId1',
859
+ params: { smartadId: 1234 },
860
+ nativeParams: {
861
+ title: { required: true, len: 140 },
862
+ image: {
863
+ required: false,
864
+ wmin: 836,
865
+ hmin: 627,
866
+ w: 325,
867
+ h: 300,
868
+ mimes: ['image/jpg', 'image/gif'],
869
+ },
870
+ body: { len: 140 },
871
+ },
872
+ },
873
+ {
874
+ bidId: 'bidId2',
875
+ params: { smartadId: 1234 },
876
+ nativeParams: {
877
+ title: { required: true, len: 140 },
878
+ image: {
879
+ required: false,
880
+ wmin: 836,
881
+ hmin: 627,
882
+ w: 325,
883
+ h: 300,
884
+ mimes: ['image/jpg', 'image/gif'],
885
+ },
886
+ body: { len: 140 },
887
+ },
888
+ },
889
+ {
890
+ bidId: 'bidId3',
891
+ params: { smartadId: 1234 },
892
+ nativeParams: {
893
+ title: { required: true, len: 140 },
894
+ image: {
895
+ required: false,
896
+ wmin: 836,
897
+ hmin: 627,
898
+ w: 325,
899
+ h: 300,
900
+ mimes: ['image/jpg', 'image/gif'],
901
+ },
902
+ body: { len: 140 },
903
+ },
904
+ },
905
+ {
906
+ bidId: 'bidId4',
907
+ params: { smartadId: 1234 },
908
+ nativeParams: {
909
+ title: { required: true, len: 140 },
910
+ image: {
911
+ required: false,
912
+ wmin: 836,
913
+ hmin: 627,
914
+ w: 325,
915
+ h: 300,
916
+ mimes: ['image/jpg', 'image/gif'],
917
+ },
918
+ body: { len: 140 },
919
+ },
920
+ },
921
+ ],
922
+ };
923
+
924
+ bids = spec.interpretResponse(serverResponse, bidRequest).map((bid) => {
925
+ const {
926
+ requestId,
927
+ native: { clickUrl },
928
+ } = bid;
929
+ return [requestId, clickUrl];
930
+ });
931
+
932
+ assert.equal(bids.length, 3);
933
+ assert.deepEqual(bids, [
934
+ ['bidId1', 'link1'],
935
+ ['bidId2', 'link2'],
936
+ ['bidId4', 'link4'],
937
+ ]);
938
+ });
939
+
940
+ it('should set correct values to bid', () => {
941
+ let serverResponse = {
942
+ body: {
943
+ id: null,
944
+ bidid: null,
945
+ seatbid: [
946
+ {
947
+ bid: [
948
+ {
949
+ impid: '1',
950
+ price: 93.1231,
951
+ crid: '12312312',
952
+ native: {
953
+ assets: [],
954
+ link: { url: 'link' },
955
+ imptrackers: ['imptrackers url1', 'imptrackers url2'],
956
+ },
957
+ dealid: 'deal-id',
958
+ adomain: ['demo.com'],
959
+ ext: {
960
+ prebid: {
961
+ type: 'native',
962
+ },
963
+ },
964
+ },
965
+ ],
966
+ },
967
+ ],
968
+ cur: 'USD',
969
+ },
970
+ };
971
+ let bidRequest = {
972
+ data: {},
973
+ bids: [
974
+ {
975
+ bidId: 'bidId1',
976
+ params: { smartadId: 1234 },
977
+ nativeParams: {
978
+ title: { required: true, len: 140 },
979
+ image: {
980
+ required: false,
981
+ wmin: 836,
982
+ hmin: 627,
983
+ w: 325,
984
+ h: 300,
985
+ mimes: ['image/jpg', 'image/gif'],
986
+ },
987
+ body: { len: 140 },
988
+ },
989
+ },
990
+ ],
991
+ };
992
+
993
+ const bids = spec.interpretResponse(serverResponse, bidRequest);
994
+ const bid = serverResponse.body.seatbid[0].bid[0];
995
+ assert.deepEqual(bids[0].requestId, bidRequest.bids[0].bidId);
996
+ assert.deepEqual(bids[0].cpm, bid.price);
997
+ assert.deepEqual(bids[0].creativeId, bid.crid);
998
+ assert.deepEqual(bids[0].ttl, 360);
999
+ assert.deepEqual(bids[0].netRevenue, false);
1000
+ assert.deepEqual(bids[0].currency, serverResponse.body.cur);
1001
+ assert.deepEqual(bids[0].mediaType, 'native');
1002
+ assert.deepEqual(bids[0].meta.mediaType, 'native');
1003
+ assert.deepEqual(bids[0].meta.advertiserDomains, ['demo.com']);
1004
+ assert.deepEqual(bids[0].dealId, 'deal-id');
1005
+ });
1006
+ it('should set correct native params', () => {
1007
+ const bid = [
1008
+ {
1009
+ impid: '1',
1010
+ price: 93.1231,
1011
+ crid: '12312312',
1012
+ native: {
1013
+ assets: [
1014
+ {
1015
+ data: null,
1016
+ id: 0,
1017
+ img: null,
1018
+ required: 0,
1019
+ title: { text: 'title', len: null },
1020
+ video: null,
1021
+ },
1022
+ {
1023
+ data: null,
1024
+ id: 2,
1025
+ img: { type: null, url: 'test.url.com/Files/58345/308185.jpg?bv=1', w: 30, h: 10 },
1026
+ required: 0,
1027
+ title: null,
1028
+ video: null,
1029
+ },
1030
+ {
1031
+ data: null,
1032
+ id: 3,
1033
+ img: {
1034
+ type: null,
1035
+ url: 'test.url.com/Files/58345/308200.jpg?bv=1',
1036
+ w: 100,
1037
+ h: 100,
1038
+ },
1039
+ required: 0,
1040
+ title: null,
1041
+ video: null,
1042
+ },
1043
+ {
1044
+ data: { type: null, len: null, value: 'body' },
1045
+ id: 4,
1046
+ img: null,
1047
+ required: 0,
1048
+ title: null,
1049
+ video: null,
1050
+ },
1051
+ {
1052
+ data: { type: null, len: null, value: 'cta' },
1053
+ id: 1,
1054
+ img: null,
1055
+ required: 0,
1056
+ title: null,
1057
+ video: null,
1058
+ },
1059
+ {
1060
+ data: { type: null, len: null, value: 'sponsoredBy' },
1061
+ id: 5,
1062
+ img: null,
1063
+ required: 0,
1064
+ title: null,
1065
+ video: null,
1066
+ },
1067
+ ],
1068
+ link: { url: 'clickUrl', clicktrackers: ['clickTracker1', 'clickTracker2'] },
1069
+ imptrackers: ['imptrackers url1', 'imptrackers url2'],
1070
+ jstracker: 'jstracker',
1071
+ },
1072
+ },
1073
+ ];
1074
+ const serverResponse = {
1075
+ body: {
1076
+ id: null,
1077
+ bidid: null,
1078
+ seatbid: [{ bid }],
1079
+ cur: 'USD',
1080
+ },
1081
+ };
1082
+ let bidRequest = {
1083
+ data: {},
1084
+ bids: [{ bidId: 'bidId1' }],
1085
+ };
1086
+
1087
+ const result = spec.interpretResponse(serverResponse, bidRequest)[0].native;
1088
+ const native = bid[0].native;
1089
+ const assets = native.assets;
1090
+ assert.deepEqual(
1091
+ {
1092
+ clickUrl: native.link.url,
1093
+ clickTrackers: native.link.clicktrackers,
1094
+ impressionTrackers: native.imptrackers,
1095
+ javascriptTrackers: [native.jstracker],
1096
+ title: assets[0].title.text,
1097
+ icon: { url: assets[1].img.url, width: assets[1].img.w, height: assets[1].img.h },
1098
+ image: { url: assets[2].img.url, width: assets[2].img.w, height: assets[2].img.h },
1099
+ body: assets[3].data.value,
1100
+ cta: assets[4].data.value,
1101
+ sponsoredBy: assets[5].data.value,
1102
+ },
1103
+ result
1104
+ );
1105
+ });
1106
+ it('should return empty when there is no bids in response', () => {
1107
+ const serverResponse = {
1108
+ body: {
1109
+ id: null,
1110
+ bidid: null,
1111
+ seatbid: [{ bid: [] }],
1112
+ cur: 'USD',
1113
+ },
1114
+ };
1115
+ let bidRequest = {
1116
+ data: {},
1117
+ bids: [{ bidId: 'bidId1' }],
1118
+ };
1119
+ const result = spec.interpretResponse(serverResponse, bidRequest)[0];
1120
+ assert.ok(!result);
1121
+ });
1122
+
1123
+ describe('banner', () => {
1124
+ it('should set ad content on response', () => {
1125
+ let serverResponse = {
1126
+ body: {
1127
+ seatbid: [
1128
+ {
1129
+ bid: [{ impid: '1', adm: '<banner>', ext: { prebid: { type: 'banner' } } }],
1130
+ },
1131
+ ],
1132
+ },
1133
+ };
1134
+ let bidRequest = {
1135
+ data: {},
1136
+ bids: [
1137
+ {
1138
+ bidId: 'bidId1',
1139
+ params: { smartadId: 1234 },
1140
+ },
1141
+ ],
1142
+ };
1143
+
1144
+ bids = spec.interpretResponse(serverResponse, bidRequest);
1145
+ assert.equal(bids.length, 1);
1146
+ assert.equal(bids[0].ad, '<banner>');
1147
+ assert.equal(bids[0].mediaType, 'banner');
1148
+ assert.equal(bids[0].meta.mediaType, 'banner');
1149
+ });
1150
+ });
1151
+
1152
+ describe('video', () => {
1153
+ it('should set vastXml on response', () => {
1154
+ let serverResponse = {
1155
+ body: {
1156
+ seatbid: [
1157
+ {
1158
+ bid: [{ impid: '1', adm: '<vast>', ext: { prebid: { type: 'video' } } }],
1159
+ },
1160
+ ],
1161
+ },
1162
+ };
1163
+ let bidRequest = {
1164
+ data: {},
1165
+ bids: [
1166
+ {
1167
+ bidId: 'bidId1',
1168
+ params: { smartadId: 1234 },
1169
+ },
1170
+ ],
1171
+ };
1172
+
1173
+ bids = spec.interpretResponse(serverResponse, bidRequest);
1174
+ assert.equal(bids.length, 1);
1175
+ assert.equal(bids[0].vastXml, '<vast>');
1176
+ assert.equal(bids[0].mediaType, 'video');
1177
+ assert.equal(bids[0].meta.mediaType, 'video');
1178
+ });
1179
+
1180
+ it('should add renderer for outstream bids', () => {
1181
+ let serverResponse = {
1182
+ body: {
1183
+ seatbid: [
1184
+ {
1185
+ bid: [
1186
+ { impid: '1', adm: '<vast>', ext: { prebid: { type: 'video' } } },
1187
+ { impid: '2', adm: '<vast>', ext: { prebid: { type: 'video' } } },
1188
+ ],
1189
+ },
1190
+ ],
1191
+ },
1192
+ };
1193
+ let bidRequest = {
1194
+ data: {},
1195
+ bids: [
1196
+ {
1197
+ bidId: 'bidId1',
1198
+ params: { smartadId: 1234 },
1199
+ mediaTypes: {
1200
+ video: {
1201
+ context: 'outstream',
1202
+ },
1203
+ },
1204
+ },
1205
+ {
1206
+ bidId: 'bidId2',
1207
+ params: { smartadId: 1234 },
1208
+ mediaTypes: {
1209
+ video: {
1210
+ constext: 'instream',
1211
+ },
1212
+ },
1213
+ },
1214
+ ],
1215
+ };
1216
+
1217
+ bids = spec.interpretResponse(serverResponse, bidRequest);
1218
+ assert.ok(bids[0].renderer);
1219
+ assert.equal(bids[1].renderer, undefined);
1220
+ });
1221
+ });
1222
+ });
1223
+ });