prebid.js 7.4.0 → 7.7.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 (239) hide show
  1. package/.circleci/config.yml +11 -6
  2. package/dist/1plusXRtdProvider.js +1 -0
  3. package/dist/33acrossBidAdapter.js +1 -1
  4. package/dist/adagioBidAdapter.js +1 -1
  5. package/dist/adbookpspBidAdapter.js +1 -1
  6. package/dist/adgenerationBidAdapter.js +1 -1
  7. package/dist/adnuntiusBidAdapter.js +1 -1
  8. package/dist/adoceanBidAdapter.js +1 -1
  9. package/dist/adotBidAdapter.js +1 -1
  10. package/dist/adrelevantisBidAdapter.js +1 -1
  11. package/dist/adrinoBidAdapter.js +1 -1
  12. package/dist/adtelligentBidAdapter.js +1 -1
  13. package/dist/adxcgBidAdapter.js +1 -1
  14. package/dist/ajaBidAdapter.js +1 -1
  15. package/dist/amxBidAdapter.js +1 -1
  16. package/dist/amxIdSystem.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/atsAnalyticsAdapter.js +1 -1
  21. package/dist/axonixBidAdapter.js +1 -1
  22. package/dist/bidglassBidAdapter.js +1 -1
  23. package/dist/big-richmediaBidAdapter.js +1 -1
  24. package/dist/bliinkBidAdapter.js +1 -1
  25. package/dist/bridgewellBidAdapter.js +1 -1
  26. package/dist/brightMountainMediaBidAdapter.js +1 -1
  27. package/dist/byDataAnalyticsAdapter.js +1 -1
  28. package/dist/concertBidAdapter.js +1 -1
  29. package/dist/connectadBidAdapter.js +1 -1
  30. package/dist/consumableBidAdapter.js +1 -1
  31. package/dist/conversantBidAdapter.js +1 -1
  32. package/dist/craftBidAdapter.js +1 -1
  33. package/dist/criteoBidAdapter.js +1 -1
  34. package/dist/currency.js +1 -1
  35. package/dist/dspxBidAdapter.js +1 -1
  36. package/dist/eplanningBidAdapter.js +1 -1
  37. package/dist/finativeBidAdapter.js +1 -1
  38. package/dist/gdprEnforcement.js +1 -1
  39. package/dist/glimpseBidAdapter.js +1 -1
  40. package/dist/gmosspBidAdapter.js +1 -1
  41. package/dist/goldbachBidAdapter.js +1 -1
  42. package/dist/gridBidAdapter.js +1 -1
  43. package/dist/gridNMBidAdapter.js +1 -1
  44. package/dist/gumgumBidAdapter.js +1 -1
  45. package/dist/h12mediaBidAdapter.js +1 -1
  46. package/dist/hadronIdSystem.js +1 -1
  47. package/dist/hadronRtdProvider.js +1 -1
  48. package/dist/id5IdSystem.js +1 -1
  49. package/dist/imRtdProvider.js +1 -1
  50. package/dist/impactifyBidAdapter.js +1 -1
  51. package/dist/improvedigitalBidAdapter.js +1 -1
  52. package/dist/inmarBidAdapter.js +1 -1
  53. package/dist/insticatorBidAdapter.js +1 -1
  54. package/dist/ixBidAdapter.js +1 -1
  55. package/dist/jixieBidAdapter.js +1 -1
  56. package/dist/justpremiumBidAdapter.js +1 -1
  57. package/dist/kargoAnalyticsAdapter.js +1 -1
  58. package/dist/konduitAnalyticsAdapter.js +1 -1
  59. package/dist/kueezBidAdapter.js +1 -1
  60. package/dist/lassoBidAdapter.js +1 -1
  61. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  62. package/dist/logicadBidAdapter.js +1 -1
  63. package/dist/loglyliftBidAdapter.js +1 -1
  64. package/dist/malltvAnalyticsAdapter.js +1 -1
  65. package/dist/marsmediaBidAdapter.js +1 -1
  66. package/dist/mediafuseBidAdapter.js +1 -1
  67. package/dist/mediasquareBidAdapter.js +1 -1
  68. package/dist/mgidBidAdapter.js +1 -1
  69. package/dist/minutemediaBidAdapter.js +1 -1
  70. package/dist/naveggIdSystem.js +1 -1
  71. package/dist/newspassidBidAdapter.js +1 -0
  72. package/dist/nextMillenniumBidAdapter.js +1 -1
  73. package/dist/not-for-prod/prebid.js +131 -128
  74. package/dist/oguryBidAdapter.js +1 -1
  75. package/dist/onetagBidAdapter.js +1 -1
  76. package/dist/ooloAnalyticsAdapter.js +1 -1
  77. package/dist/outbrainBidAdapter.js +1 -1
  78. package/dist/parrableIdSystem.js +1 -1
  79. package/dist/pixfutureBidAdapter.js +1 -1
  80. package/dist/prebid-core.js +1 -1
  81. package/dist/prebidServerBidAdapter.js +1 -1
  82. package/dist/priceFloors.js +1 -1
  83. package/dist/pubCommonId.js +1 -1
  84. package/dist/publinkIdSystem.js +1 -1
  85. package/dist/pubmaticBidAdapter.js +1 -1
  86. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  87. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  88. package/dist/pxyzBidAdapter.js +1 -1
  89. package/dist/quantcastBidAdapter.js +1 -1
  90. package/dist/rasBidAdapter.js +1 -0
  91. package/dist/readpeakBidAdapter.js +1 -1
  92. package/dist/relaidoBidAdapter.js +1 -1
  93. package/dist/rhythmoneBidAdapter.js +1 -1
  94. package/dist/riseBidAdapter.js +1 -1
  95. package/dist/rubiconAnalyticsAdapter.js +1 -1
  96. package/dist/rubiconBidAdapter.js +1 -1
  97. package/dist/seedingAllianceBidAdapter.js +1 -1
  98. package/dist/seedtagBidAdapter.js +1 -1
  99. package/dist/sharedIdSystem.js +1 -1
  100. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  101. package/dist/sharethroughBidAdapter.js +1 -1
  102. package/dist/shinezBidAdapter.js +1 -1
  103. package/dist/smaatoBidAdapter.js +1 -1
  104. package/dist/smartadserverBidAdapter.js +1 -1
  105. package/dist/smartxBidAdapter.js +1 -1
  106. package/dist/smilewantedBidAdapter.js +1 -1
  107. package/dist/sonobiBidAdapter.js +1 -1
  108. package/dist/sovrnAnalyticsAdapter.js +1 -1
  109. package/dist/sovrnBidAdapter.js +1 -1
  110. package/dist/sspBCBidAdapter.js +1 -1
  111. package/dist/sublimeBidAdapter.js +1 -1
  112. package/dist/synacormediaBidAdapter.js +1 -1
  113. package/dist/taboolaBidAdapter.js +1 -1
  114. package/dist/targetVideoBidAdapter.js +1 -1
  115. package/dist/teadsBidAdapter.js +1 -1
  116. package/dist/trionBidAdapter.js +1 -1
  117. package/dist/tripleliftBidAdapter.js +1 -1
  118. package/dist/ttdBidAdapter.js +1 -1
  119. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  120. package/dist/underdogmediaBidAdapter.js +1 -1
  121. package/dist/undertoneBidAdapter.js +1 -1
  122. package/dist/userId.js +1 -1
  123. package/dist/vidazooBidAdapter.js +1 -1
  124. package/dist/videobyteBidAdapter.js +1 -1
  125. package/dist/visxBidAdapter.js +1 -1
  126. package/dist/vuukleBidAdapter.js +1 -1
  127. package/dist/widespaceBidAdapter.js +1 -1
  128. package/dist/winrBidAdapter.js +1 -1
  129. package/dist/yahoosspBidAdapter.js +1 -1
  130. package/dist/yieldmoBidAdapter.js +1 -1
  131. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  132. package/integrationExamples/gpt/1plusXRtdProviderExample.html +112 -0
  133. package/karma.conf.maker.js +3 -1
  134. package/modules/.submodules.json +2 -1
  135. package/modules/1plusXRtdProvider.js +251 -0
  136. package/modules/1plusXRtdProvider.md +65 -0
  137. package/modules/adgenerationBidAdapter.js +24 -1
  138. package/modules/adnuntiusBidAdapter.js +26 -8
  139. package/modules/adoceanBidAdapter.js +10 -3
  140. package/modules/adotBidAdapter.js +13 -4
  141. package/modules/adrinoBidAdapter.js +10 -2
  142. package/modules/adrinoBidAdapter.md +6 -0
  143. package/modules/adtelligentBidAdapter.js +2 -1
  144. package/modules/appnexusBidAdapter.js +3 -3
  145. package/modules/atsAnalyticsAdapter.js +4 -5
  146. package/modules/big-richmediaBidAdapter.js +3 -3
  147. package/modules/bliinkBidAdapter.js +120 -193
  148. package/modules/bliinkBidAdapter.md +2 -5
  149. package/modules/byDataAnalyticsAdapter.js +172 -74
  150. package/modules/byDataAnalyticsAdapter.md +5 -6
  151. package/modules/consumableBidAdapter.js +21 -1
  152. package/modules/criteoBidAdapter.js +7 -1
  153. package/modules/currency.js +2 -2
  154. package/modules/cwireBidAdapter.md +1 -1
  155. package/modules/eplanningBidAdapter.js +82 -97
  156. package/modules/gdprEnforcement.js +8 -14
  157. package/modules/gridNMBidAdapter.js +45 -4
  158. package/modules/hadronAnalyticsAdapter.md +5 -5
  159. package/modules/hadronIdSystem.js +18 -5
  160. package/modules/hadronIdSystem.md +15 -11
  161. package/modules/hadronRtdProvider.js +14 -1
  162. package/modules/hadronRtdProvider.md +17 -13
  163. package/modules/imRtdProvider.js +0 -8
  164. package/modules/impactifyBidAdapter.js +6 -2
  165. package/modules/ixBidAdapter.js +133 -23
  166. package/modules/ixBidAdapter.md +2 -5
  167. package/modules/jixieBidAdapter.js +10 -10
  168. package/modules/kargoAnalyticsAdapter.js +88 -6
  169. package/modules/kargoAnalyticsAdapter.md +33 -0
  170. package/modules/minutemediaBidAdapter.js +1 -0
  171. package/modules/naveggIdSystem.js +1 -12
  172. package/modules/newspassidBidAdapter.js +649 -0
  173. package/modules/nextMillenniumBidAdapter.js +17 -1
  174. package/modules/nextMillenniumBidAdapter.md +1 -1
  175. package/modules/oguryBidAdapter.js +2 -0
  176. package/modules/onetagBidAdapter.js +44 -7
  177. package/modules/prebidServerBidAdapter/index.js +7 -0
  178. package/modules/priceFloors.js +1 -1
  179. package/modules/pubCommonId.js +1 -2
  180. package/modules/pubxaiAnalyticsAdapter.js +6 -1
  181. package/modules/rasBidAdapter.js +149 -0
  182. package/modules/rasBidAdapter.md +50 -0
  183. package/modules/rubiconBidAdapter.js +5 -0
  184. package/modules/seedingAllianceBidAdapter.js +3 -0
  185. package/modules/seedtagBidAdapter.js +37 -1
  186. package/modules/sharedIdSystem.js +11 -5
  187. package/modules/sharethroughBidAdapter.js +9 -24
  188. package/modules/taboolaBidAdapter.js +1 -1
  189. package/modules/taboolaBidAdapter.md +3 -3
  190. package/modules/targetVideoBidAdapter.js +18 -0
  191. package/modules/userId/index.js +39 -21
  192. package/package.json +1 -1
  193. package/src/auction.js +6 -5
  194. package/src/consentHandler.js +11 -11
  195. package/src/debugging.js +5 -3
  196. package/src/hook.js +2 -2
  197. package/src/storageManager.js +4 -5
  198. package/src/utils/promise.js +96 -21
  199. package/src/utils.js +3 -2
  200. package/test/helpers/consentData.js +2 -1
  201. package/test/spec/auctionmanager_spec.js +1 -6
  202. package/test/spec/debugging_spec.js +2 -2
  203. package/test/spec/modules/1plusXRtdProvider_spec.js +430 -0
  204. package/test/spec/modules/adgenerationBidAdapter_spec.js +52 -4
  205. package/test/spec/modules/adnuntiusBidAdapter_spec.js +126 -14
  206. package/test/spec/modules/adoceanBidAdapter_spec.js +4 -1
  207. package/test/spec/modules/adotBidAdapter_spec.js +12 -9
  208. package/test/spec/modules/adrinoBidAdapter_spec.js +22 -0
  209. package/test/spec/modules/appnexusBidAdapter_spec.js +165 -156
  210. package/test/spec/modules/bliinkBidAdapter_spec.js +323 -136
  211. package/test/spec/modules/byDataAnalyticsAdapter_spec.js +74 -24
  212. package/test/spec/modules/consumableBidAdapter_spec.js +122 -1
  213. package/test/spec/modules/criteoBidAdapter_spec.js +15 -5
  214. package/test/spec/modules/eplanningBidAdapter_spec.js +58 -18
  215. package/test/spec/modules/gdprEnforcement_spec.js +53 -100
  216. package/test/spec/modules/gridNMBidAdapter_spec.js +32 -0
  217. package/test/spec/modules/hadronIdSystem_spec.js +2 -2
  218. package/test/spec/modules/idxIdSystem_spec.js +1 -1
  219. package/test/spec/modules/imRtdProvider_spec.js +0 -1
  220. package/test/spec/modules/ixBidAdapter_spec.js +212 -5
  221. package/test/spec/modules/jixieBidAdapter_spec.js +8 -8
  222. package/test/spec/modules/kargoAnalyticsAdapter_spec.js +42 -0
  223. package/test/spec/modules/minutemediaBidAdapter_spec.js +3 -0
  224. package/test/spec/modules/newspassidBidAdapter_spec.js +1793 -0
  225. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +20 -0
  226. package/test/spec/modules/onetagBidAdapter_spec.js +53 -4
  227. package/test/spec/modules/parrableIdSystem_spec.js +2 -1
  228. package/test/spec/modules/prebidServerBidAdapter_spec.js +20 -0
  229. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +5 -0
  230. package/test/spec/modules/rasBidAdapter_spec.js +190 -0
  231. package/test/spec/modules/rubiconBidAdapter_spec.js +27 -0
  232. package/test/spec/modules/seedtagBidAdapter_spec.js +29 -0
  233. package/test/spec/modules/sharethroughBidAdapter_spec.js +4 -4
  234. package/test/spec/modules/taboolaBidAdapter_spec.js +1 -1
  235. package/test/spec/modules/targetVideoBidAdapter_spec.js +43 -0
  236. package/test/spec/modules/userId_spec.js +15 -2
  237. package/test/spec/unit/pbjs_api_spec.js +1 -5
  238. package/test/spec/unit/utils/promise_spec.js +283 -38
  239. package/test/helpers/syncPromise.js +0 -71
@@ -0,0 +1,430 @@
1
+ import { config } from 'src/config';
2
+ import {
3
+ onePlusXSubmodule,
4
+ segtaxes,
5
+ extractConfig,
6
+ buildOrtb2Updates,
7
+ updateBidderConfig,
8
+ setTargetingDataToConfig
9
+ } from 'modules/1plusXRtdProvider';
10
+
11
+ describe('1plusXRtdProvider', () => {
12
+ // Fake server config
13
+ let fakeServer;
14
+ const fakeResponseHeaders = {
15
+ 'Content-Type': 'application/json',
16
+ 'Access-Control-Allow-Origin': '*'
17
+ };
18
+ const fakeResponse = {
19
+ s: ['segment1', 'segment2', 'segment3'],
20
+ t: ['targeting1', 'targeting2', 'targeting3']
21
+ };
22
+
23
+ // Bid request config
24
+ const reqBidsConfigObj = {
25
+ adUnits: [{
26
+ bids: [
27
+ { bidder: 'appnexus' }
28
+ ]
29
+ }]
30
+ };
31
+
32
+ // Bidder configs
33
+ const bidderConfigInitial = {
34
+ ortb2: {
35
+ user: { keywords: '' },
36
+ site: { ext: {} }
37
+ }
38
+ }
39
+ const bidderConfigInitialWith1plusXUserData = {
40
+ ortb2: {
41
+ user: {
42
+ data: [{ name: '1plusX.com', segment: [{ id: 'initial' }] }]
43
+ },
44
+ site: { content: { data: [] } }
45
+ }
46
+ }
47
+ const bidderConfigInitialWithUserData = {
48
+ ortb2: {
49
+ user: {
50
+ data: [{ name: 'hello.world', segment: [{ id: 'initial' }] }]
51
+ },
52
+ site: { content: { data: [] } }
53
+ }
54
+ }
55
+ const bidderConfigInitialWith1plusXSiteContent = {
56
+ ortb2: {
57
+ user: { data: [] },
58
+ site: {
59
+ content: {
60
+ data: [{
61
+ name: '1plusX.com', segment: [{ id: 'initial' }], ext: { segtax: 525 }
62
+ }]
63
+ }
64
+ },
65
+ }
66
+ }
67
+ const bidderConfigInitialWithSiteContent = {
68
+ ortb2: {
69
+ user: { data: [] },
70
+ site: {
71
+ content: {
72
+ data: [{ name: 'hello.world', segment: [{ id: 'initial' }] }]
73
+ }
74
+ },
75
+ }
76
+ }
77
+ // Util functions
78
+ const randomBidder = (len = 5) => Math.random().toString(36).replace(/[^a-z]+/g, '').substring(0, len);
79
+
80
+ before(() => {
81
+ config.resetConfig();
82
+ })
83
+
84
+ after(() => { })
85
+
86
+ beforeEach(() => {
87
+ fakeServer = sinon.createFakeServer();
88
+ fakeServer.respondWith('GET', '*', [200, fakeResponseHeaders, JSON.stringify(fakeResponse)]);
89
+ fakeServer.respondImmediately = true;
90
+ fakeServer.autoRespond = true;
91
+ })
92
+
93
+ describe('onePlusXSubmodule', () => {
94
+ it('init is successfull', () => {
95
+ const initResult = onePlusXSubmodule.init();
96
+ expect(initResult).to.be.true;
97
+ })
98
+
99
+ it('callback is called after getBidRequestData', () => {
100
+ // Nice case; everything runs as expected
101
+ {
102
+ const callbackSpy = sinon.spy();
103
+ const config = { params: { customerId: 'test', bidders: ['appnexus'] } };
104
+ onePlusXSubmodule.getBidRequestData(reqBidsConfigObj, callbackSpy, config);
105
+ setTimeout(() => {
106
+ expect(callbackSpy.calledOnce).to.be.true
107
+ }, 100)
108
+ }
109
+ // No customer id in config => error but still callback called
110
+ {
111
+ const callbackSpy = sinon.spy();
112
+ const config = {}
113
+ onePlusXSubmodule.getBidRequestData(reqBidsConfigObj, callbackSpy, config);
114
+ setTimeout(() => {
115
+ expect(callbackSpy.calledOnce).to.be.true
116
+ }, 100);
117
+ }
118
+ // No bidders in config => error but still callback called
119
+ {
120
+ const callbackSpy = sinon.spy();
121
+ const config = { customerId: 'test' }
122
+ onePlusXSubmodule.getBidRequestData(reqBidsConfigObj, callbackSpy, config);
123
+ setTimeout(() => {
124
+ expect(callbackSpy.calledOnce).to.be.true
125
+ }, 100);
126
+ }
127
+ })
128
+ })
129
+
130
+ describe('extractConfig', () => {
131
+ const customerId = 'test';
132
+ const timeout = 1000;
133
+ const bidders = ['appnexus'];
134
+
135
+ it('Throws an error if no customerId is specified', () => {
136
+ const moduleConfig = { params: { timeout, bidders } };
137
+ expect(() => extractConfig(moduleConfig, reqBidsConfigObj)).to.throw();
138
+ })
139
+ it('Throws an error if no bidder is specified', () => {
140
+ const moduleConfig = { params: { customerId, timeout } };
141
+ expect(() => extractConfig(moduleConfig, reqBidsConfigObj)).to.throw();
142
+ })
143
+ it("Throws an error if there's no bidder in reqBidsConfigObj", () => {
144
+ const moduleConfig = { params: { customerId, timeout, bidders } };
145
+ const reqBidsConfigEmpty = { adUnits: [{ bids: [] }] };
146
+ expect(() => extractConfig(moduleConfig, reqBidsConfigEmpty)).to.throw();
147
+ })
148
+ it('Returns an object containing the parameters specified', () => {
149
+ const moduleConfig = { params: { customerId, timeout, bidders } };
150
+ const expectedKeys = ['customerId', 'timeout', 'bidders']
151
+ const extractedConfig = extractConfig(moduleConfig, reqBidsConfigObj);
152
+ expect(extractedConfig).to.be.an('object').and.to.have.all.keys(expectedKeys);
153
+ expect(extractedConfig.customerId).to.equal(customerId);
154
+ expect(extractedConfig.timeout).to.equal(timeout);
155
+ expect(extractedConfig.bidders).to.deep.equal(bidders);
156
+ })
157
+ /* 1plusX RTD module may only use bidders that are both specified in :
158
+ - the bid request configuration
159
+ - AND in the 1plusX RTD module configuration
160
+ Below 2 tests are enforcing those rules
161
+ */
162
+ it('Returns the intersection of bidders found in bid request config & module config', () => {
163
+ const bidders = ['appnexus', 'rubicon'];
164
+ const moduleConfig = { params: { customerId, timeout, bidders } };
165
+ const { bidders: extractedBidders } = extractConfig(moduleConfig, reqBidsConfigObj);
166
+ expect(extractedBidders).to.be.an('array').and.to.have.length(1); 7
167
+ expect(extractedBidders[0]).to.equal('appnexus');
168
+ })
169
+ it('Throws an error if no bidder can be used by the module', () => {
170
+ const bidders = ['rubicon'];
171
+ const moduleConfig = { params: { customerId, timeout, bidders } };
172
+ expect(() => extractConfig(moduleConfig, reqBidsConfigObj)).to.throw();
173
+ })
174
+ })
175
+
176
+ describe('buildOrtb2Updates', () => {
177
+ it('fills site.content.data & user.data in the ortb2 config', () => {
178
+ const rtdData = { segments: fakeResponse.s, topics: fakeResponse.t };
179
+ const ortb2Updates = buildOrtb2Updates(rtdData, randomBidder());
180
+
181
+ const expectedOutput = {
182
+ siteContentData: {
183
+ name: '1plusX.com',
184
+ segment: rtdData.topics.map((topicId) => ({ id: topicId })),
185
+ ext: { segtax: segtaxes.CONTENT }
186
+ },
187
+ userData: {
188
+ name: '1plusX.com',
189
+ segment: rtdData.segments.map((segmentId) => ({ id: segmentId }))
190
+ }
191
+ }
192
+ expect([ortb2Updates]).to.deep.include.members([expectedOutput]);
193
+ });
194
+ it('fills site.keywords in the ortb2 config (appnexus specific)', () => {
195
+ const rtdData = { segments: fakeResponse.s, topics: fakeResponse.t };
196
+ const ortb2Updates = buildOrtb2Updates(rtdData, 'appnexus');
197
+
198
+ const expectedOutput = {
199
+ site: {
200
+ keywords: rtdData.topics.join(','),
201
+ }
202
+ }
203
+ expect([ortb2Updates]).to.deep.include.members([expectedOutput]);
204
+ });
205
+
206
+ it('defaults to empty array if no segment is given', () => {
207
+ const rtdData = { topics: fakeResponse.t };
208
+ const ortb2Updates = buildOrtb2Updates(rtdData, randomBidder());
209
+
210
+ const expectedOutput = {
211
+ siteContentData: {
212
+ name: '1plusX.com',
213
+ segment: rtdData.topics.map((topicId) => ({ id: topicId })),
214
+ ext: { segtax: segtaxes.CONTENT }
215
+ },
216
+ userData: {
217
+ name: '1plusX.com',
218
+ segment: []
219
+ }
220
+ }
221
+ expect(ortb2Updates).to.deep.include(expectedOutput);
222
+ })
223
+
224
+ it('defaults to empty array if no topic is given', () => {
225
+ const rtdData = { segments: fakeResponse.s };
226
+ const ortb2Updates = buildOrtb2Updates(rtdData, randomBidder());
227
+
228
+ const expectedOutput = {
229
+ siteContentData: {
230
+ name: '1plusX.com',
231
+ segment: [],
232
+ ext: { segtax: segtaxes.CONTENT }
233
+ },
234
+ userData: {
235
+ name: '1plusX.com',
236
+ segment: rtdData.segments.map((segmentId) => ({ id: segmentId }))
237
+ }
238
+ }
239
+ expect(ortb2Updates).to.deep.include(expectedOutput);
240
+ })
241
+ it('defaults to empty string if no topic is given (appnexus specific)', () => {
242
+ const rtdData = { segments: fakeResponse.s };
243
+ const ortb2Updates = buildOrtb2Updates(rtdData, 'appnexus');
244
+
245
+ const expectedOutput = {
246
+ site: {
247
+ keywords: '',
248
+ }
249
+ }
250
+ expect(ortb2Updates).to.deep.include(expectedOutput);
251
+ })
252
+ })
253
+
254
+ describe('updateBidderConfig', () => {
255
+ const ortb2UpdatesAppNexus = {
256
+ site: {
257
+ keywords: fakeResponse.t.join(','),
258
+ },
259
+ userData: {
260
+ name: '1plusX.com',
261
+ segment: fakeResponse.s.map((segmentId) => ({ id: segmentId }))
262
+ }
263
+ }
264
+ const ortb2Updates = {
265
+ siteContentData: {
266
+ name: '1plusX.com',
267
+ segment: fakeResponse.t.map((topicId) => ({ id: topicId })),
268
+ ext: { segtax: segtaxes.CONTENT }
269
+ },
270
+ userData: {
271
+ name: '1plusX.com',
272
+ segment: fakeResponse.s.map((segmentId) => ({ id: segmentId }))
273
+ }
274
+ }
275
+
276
+ it('merges fetched data in bidderConfig for configured bidders', () => {
277
+ const bidder = randomBidder();
278
+ // Set initial config
279
+ config.setBidderConfig({
280
+ bidders: [bidder],
281
+ config: bidderConfigInitial
282
+ });
283
+ // Call submodule's setBidderConfig
284
+ const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
285
+ // Check that the targeting data has been set in the config
286
+ expect(newBidderConfig).not.to.be.null;
287
+ expect(newBidderConfig.ortb2.site.content.data).to.deep.include(ortb2Updates.siteContentData);
288
+ expect(newBidderConfig.ortb2.user.data).to.deep.include(ortb2Updates.userData);
289
+ // Check that existing config didn't get erased
290
+ expect(newBidderConfig.ortb2.site).to.deep.include(bidderConfigInitial.ortb2.site);
291
+ expect(newBidderConfig.ortb2.user).to.deep.include(bidderConfigInitial.ortb2.user);
292
+ })
293
+
294
+ it('merges fetched data in bidderConfig for configured bidders (appnexus specific)', () => {
295
+ const bidder = 'appnexus';
296
+ // Set initial config
297
+ config.setBidderConfig({
298
+ bidders: [bidder],
299
+ config: bidderConfigInitial
300
+ });
301
+ // Call submodule's setBidderConfig
302
+ const newBidderConfig = updateBidderConfig(bidder, ortb2UpdatesAppNexus, config.getBidderConfig());
303
+
304
+ // Check that the targeting data has been set in the config
305
+ expect(newBidderConfig).not.to.be.null;
306
+ expect(newBidderConfig.ortb2.site).to.deep.include(ortb2UpdatesAppNexus.site);
307
+ // Check that existing config didn't get erased
308
+ expect(newBidderConfig.ortb2.site).to.deep.include(bidderConfigInitial.ortb2.site);
309
+ expect(newBidderConfig.ortb2.user).to.deep.include(bidderConfigInitial.ortb2.user);
310
+ })
311
+
312
+ it('overwrites an existing 1plus.com entry in ortb2.user.data', () => {
313
+ const bidder = randomBidder();
314
+ // Set initial config
315
+ config.setBidderConfig({
316
+ bidders: [bidder],
317
+ config: bidderConfigInitialWith1plusXUserData
318
+ });
319
+ // Save previous user.data entry
320
+ const previousUserData = bidderConfigInitialWith1plusXUserData.ortb2.user.data[0];
321
+ // Call submodule's setBidderConfig
322
+ const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
323
+ // Check that the targeting data has been set in the config
324
+ expect(newBidderConfig).not.to.be.null;
325
+ expect(newBidderConfig.ortb2.user.data).to.deep.include(ortb2Updates.userData);
326
+ expect(newBidderConfig.ortb2.user.data).not.to.include(previousUserData);
327
+ })
328
+ it("doesn't overwrite entries in ortb2.user.data that aren't 1plusx.com", () => {
329
+ const bidder = randomBidder();
330
+ // Set initial config
331
+ config.setBidderConfig({
332
+ bidders: [bidder],
333
+ config: bidderConfigInitialWithUserData
334
+ });
335
+ // Save previous user.data entry
336
+ const previousUserData = bidderConfigInitialWithUserData.ortb2.user.data[0];
337
+ // Call submodule's setBidderConfig
338
+ const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
339
+ // Check that the targeting data has been set in the config
340
+ expect(newBidderConfig).not.to.be.null;
341
+ expect(newBidderConfig.ortb2.user.data).to.deep.include(ortb2Updates.userData);
342
+ expect(newBidderConfig.ortb2.user.data).to.deep.include(previousUserData);
343
+ })
344
+
345
+ it('overwrites an existing 1plus.com entry in ortb2.site.content.data', () => {
346
+ const bidder = randomBidder();
347
+ // Set initial config
348
+ config.setBidderConfig({
349
+ bidders: [bidder],
350
+ config: bidderConfigInitialWith1plusXSiteContent
351
+ });
352
+ // Save previous user.data entry
353
+ const previousSiteContent = bidderConfigInitialWith1plusXSiteContent.ortb2.site.content.data[0];
354
+ // Call submodule's setBidderConfig
355
+ const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
356
+ // Check that the targeting data has been set in the config
357
+ expect(newBidderConfig).not.to.be.null;
358
+ expect(newBidderConfig.ortb2.site.content.data).to.deep.include(ortb2Updates.siteContentData);
359
+ expect(newBidderConfig.ortb2.site.content.data).not.to.include(previousSiteContent);
360
+ })
361
+ it("doesn't overwrite entries in ortb2.site.content.data that aren't 1plusx.com", () => {
362
+ const bidder = randomBidder();
363
+ // Set initial config
364
+ config.setBidderConfig({
365
+ bidders: [bidder],
366
+ config: bidderConfigInitialWithSiteContent
367
+ });
368
+ // Save previous user.data entry
369
+ const previousSiteContent = bidderConfigInitialWithSiteContent.ortb2.site.content.data[0];
370
+ // Call submodule's setBidderConfig
371
+ const newBidderConfig = updateBidderConfig(bidder, ortb2Updates, config.getBidderConfig());
372
+ // Check that the targeting data has been set in the config
373
+ expect(newBidderConfig).not.to.be.null;
374
+ expect(newBidderConfig.ortb2.site.content.data).to.deep.include(ortb2Updates.siteContentData);
375
+ expect(newBidderConfig.ortb2.site.content.data).to.deep.include(previousSiteContent);
376
+ })
377
+ })
378
+
379
+ describe('setTargetingDataToConfig', () => {
380
+ const expectedKeywords = fakeResponse.t.join(',');
381
+ const expectedSiteContentObj = {
382
+ data: [{
383
+ name: '1plusX.com',
384
+ segment: fakeResponse.t.map((topicId) => ({ id: topicId })),
385
+ ext: { segtax: segtaxes.CONTENT }
386
+ }]
387
+ }
388
+ const expectedUserObj = {
389
+ data: [{
390
+ name: '1plusX.com',
391
+ segment: fakeResponse.s.map((segmentId) => ({ id: segmentId }))
392
+ }]
393
+ }
394
+ const expectedOrtb2 = {
395
+ appnexus: {
396
+ site: { keywords: expectedKeywords }
397
+ },
398
+ rubicon: {
399
+ site: { content: expectedSiteContentObj },
400
+ user: expectedUserObj
401
+ }
402
+ }
403
+
404
+ it('sets the config for the selected bidders', () => {
405
+ const bidders = ['appnexus', 'rubicon'];
406
+ // setting initial config for those bidders
407
+ config.setBidderConfig({
408
+ bidders,
409
+ config: bidderConfigInitial
410
+ })
411
+ // call setTargetingDataToConfig
412
+ setTargetingDataToConfig(fakeResponse, { bidders });
413
+
414
+ // Check that the targeting data has been set in both configs
415
+ for (const bidder of bidders) {
416
+ const newConfig = config.getBidderConfig()[bidder];
417
+ // Check that we got what we expect
418
+ const expectedConfErr = (prop) => `New config for ${bidder} doesn't comply with expected at ${prop}`;
419
+ expect(newConfig.ortb2.site, expectedConfErr('site')).to.deep.include(expectedOrtb2[bidder].site);
420
+ if (expectedOrtb2[bidder].user) {
421
+ expect(newConfig.ortb2.user, expectedConfErr('user')).to.deep.include(expectedOrtb2[bidder].user);
422
+ }
423
+ // Check that existing config didn't get erased
424
+ const existingConfErr = (prop) => `Existing config for ${bidder} got unlawfully overwritten at ${prop}`;
425
+ expect(newConfig.ortb2.site, existingConfErr('site')).to.deep.include(bidderConfigInitial.ortb2.site);
426
+ expect(newConfig.ortb2.user, existingConfErr('user')).to.deep.include(bidderConfigInitial.ortb2.user);
427
+ }
428
+ })
429
+ })
430
+ })
@@ -101,6 +101,41 @@ describe('AdgenerationAdapter', function () {
101
101
  snowflake: {'id': 'novatiqId', syncResponse: 1}
102
102
  }
103
103
  }
104
+ },
105
+ { // bannerWithAdgextCriteoId
106
+ bidder: 'adg',
107
+ params: {
108
+ id: '58278', // banner
109
+ },
110
+ adUnitCode: 'adunit-code',
111
+ sizes: [[320, 100]],
112
+ bidId: '2f6ac468a9c15e',
113
+ bidderRequestId: '14a9f773e30243',
114
+ auctionId: '4aae9f05-18c6-4fcd-80cf-282708cd584a',
115
+ transactionTd: 'f76f6dfd-d64f-4645-a29f-682bac7f431a',
116
+ userId: {
117
+ criteoId: 'criteo-id-test-1234567890'
118
+ }
119
+ },
120
+ { // bannerWithAdgextId5Id
121
+ bidder: 'adg',
122
+ params: {
123
+ id: '58278', // banner
124
+ },
125
+ adUnitCode: 'adunit-code',
126
+ sizes: [[320, 100]],
127
+ bidId: '2f6ac468a9c15e',
128
+ bidderRequestId: '14a9f773e30243',
129
+ auctionId: '4aae9f05-18c6-4fcd-80cf-282708cd584a',
130
+ transactionTd: 'f76f6dfd-d64f-4645-a29f-682bac7f431a',
131
+ userId: {
132
+ id5id: {
133
+ ext: {
134
+ linkType: 2
135
+ },
136
+ uid: 'id5-id-test-1234567890'
137
+ }
138
+ }
104
139
  }
105
140
  ];
106
141
  const bidderRequest = {
@@ -109,10 +144,12 @@ describe('AdgenerationAdapter', function () {
109
144
  }
110
145
  };
111
146
  const data = {
112
- banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.3.0&imark=1&tp=https%3A%2F%2Fexample.com`,
113
- bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100&currency=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.3.0&imark=1&tp=https%3A%2F%2Fexample.com`,
114
- native: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.3.0&tp=https%3A%2F%2Fexample.com`,
115
- bannerWithHyperId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.3.0&imark=1&tp=https%3A%2F%2Fexample.com&hyper_id=novatiqId`,
147
+ banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&imark=1&tp=https%3A%2F%2Fexample.com`,
148
+ bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100&currency=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&imark=1&tp=https%3A%2F%2Fexample.com`,
149
+ native: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&tp=https%3A%2F%2Fexample.com`,
150
+ bannerWithHyperId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&imark=1&tp=https%3A%2F%2Fexample.com&hyper_id=novatiqId`,
151
+ bannerWithAdgextCriteoId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&adgext_criteo_id=criteo-id-test-1234567890&imark=1&tp=https%3A%2F%2Fexample.com`,
152
+ bannerWithAdgextId5Id: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100&currency=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.4.0&adgext_id5_id=id5-id-test-1234567890&adgext_id5_id_link_type=2&imark=1&tp=https%3A%2F%2Fexample.com`,
116
153
  };
117
154
  it('sends bid request to ENDPOINT via GET', function () {
118
155
  const request = spec.buildRequests(bidRequests, bidderRequest)[0];
@@ -149,6 +186,17 @@ describe('AdgenerationAdapter', function () {
149
186
  });
150
187
  expect(request.data).to.equal(data.bannerWithHyperId);
151
188
  });
189
+
190
+ it('should attache params to the bannerWithAdgextCriteoId request', function () {
191
+ const request = spec.buildRequests(bidRequests, bidderRequest)[3];
192
+ expect(request.data).to.equal(data.bannerWithAdgextCriteoId);
193
+ });
194
+
195
+ it('should attache params to the bannerWithAdgextId5Id request', function () {
196
+ const request = spec.buildRequests(bidRequests, bidderRequest)[4];
197
+ expect(request.data).to.equal(data.bannerWithAdgextId5Id);
198
+ });
199
+
152
200
  it('allows setConfig to set bidder currency for JPY', function () {
153
201
  config.setConfig({
154
202
  currency: {