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
@@ -185,6 +185,74 @@ describe('adnuntiusBidAdapter', function () {
185
185
  });
186
186
  });
187
187
 
188
+ describe('user privacy', function () {
189
+ it('should send GDPR Consent data if gdprApplies', function () {
190
+ let request = spec.buildRequests(bidRequests, { gdprConsent: { gdprApplies: true, consentString: 'consentString' } });
191
+ expect(request.length).to.equal(1);
192
+ expect(request[0]).to.have.property('url')
193
+ expect(request[0].url).to.equal(ENDPOINT_URL_CONSENT);
194
+ });
195
+
196
+ it('should not send GDPR Consent data if gdprApplies equals undefined', function () {
197
+ let request = spec.buildRequests(bidRequests, { gdprConsent: { gdprApplies: undefined, consentString: 'consentString' } });
198
+ expect(request.length).to.equal(1);
199
+ expect(request[0]).to.have.property('url')
200
+ expect(request[0].url).to.equal(ENDPOINT_URL);
201
+ });
202
+
203
+ it('should pass segments if available in config', function () {
204
+ config.setBidderConfig({
205
+ bidders: ['adnuntius', 'other'],
206
+ config: {
207
+ ortb2: {
208
+ user: {
209
+ data: [{
210
+ name: 'adnuntius',
211
+ segment: [{ id: 'segment1' }, { id: 'segment2' }]
212
+ },
213
+ {
214
+ name: 'other',
215
+ segment: ['segment3']
216
+ }],
217
+ }
218
+ }
219
+ }
220
+ });
221
+
222
+ const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests));
223
+ expect(request.length).to.equal(1);
224
+ expect(request[0]).to.have.property('url')
225
+ expect(request[0].url).to.equal(ENDPOINT_URL_SEGMENTS);
226
+ });
227
+
228
+ it('should skip segments in config if not either id or array of strings', function () {
229
+ config.setBidderConfig({
230
+ bidders: ['adnuntius', 'other'],
231
+ config: {
232
+ ortb2: {
233
+ user: {
234
+ data: [{
235
+ name: 'adnuntius',
236
+ segment: [{ id: 'segment1' }, { id: 'segment2' }, { id: 'segment3' }]
237
+ },
238
+ {
239
+ name: 'other',
240
+ segment: [{
241
+ notright: 'segment4'
242
+ }]
243
+ }],
244
+ }
245
+ }
246
+ }
247
+ });
248
+
249
+ const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests));
250
+ expect(request.length).to.equal(1);
251
+ expect(request[0]).to.have.property('url')
252
+ expect(request[0].url).to.equal(ENDPOINT_URL_SEGMENTS);
253
+ });
254
+ });
255
+
188
256
  describe('user privacy', function () {
189
257
  it('should send GDPR Consent data if gdprApplies', function () {
190
258
  let request = spec.buildRequests(bidRequests, { gdprConsent: { gdprApplies: true, consentString: 'consentString' } });
@@ -17,6 +17,7 @@ const aliasEP = {
17
17
  mediafuse: 'https://ghb.hbmp.mediafuse.com/v2/auction/',
18
18
  navelix: 'https://ghb.hb.navelix.com/v2/auction/',
19
19
  bidsxchange: 'https://ghb.hbd.bidsxchange.com/v2/auction/',
20
+ streamkey: 'https://ghb.hb.streamkey.net/v2/auction/',
20
21
  };
21
22
 
22
23
  const DEFAULT_ADATPER_REQ = { bidderCode: 'adtelligent' };
@@ -0,0 +1,246 @@
1
+ import {config} from 'src/config.js';
2
+ import {SEGMENTS_STORAGE_KEY, TOKEN_STORAGE_KEY, dapUtils, addRealTimeData, getRealTimeData, akamaiDapRtdSubmodule, storage} from 'modules/akamaiDapRtdProvider.js';
3
+ import {server} from 'test/mocks/xhr.js';
4
+ import logMessage from 'src/utils.js'
5
+ const responseHeader = {'Content-Type': 'application/json'};
6
+
7
+ describe('akamaiDapRtdProvider', function() {
8
+ let getDataFromLocalStorageStub;
9
+ let getDapTokenStub;
10
+
11
+ const testReqBidsConfigObj = {
12
+ adUnits: [
13
+ {
14
+ bids: ['bid1', 'bid2']
15
+ }
16
+ ]
17
+ };
18
+
19
+ const onDone = function() { return true };
20
+
21
+ const onSuccess = function() { return ('request', 200, 'success') };
22
+
23
+ const cmoduleConfig = {
24
+ 'name': 'dap',
25
+ 'waitForIt': true,
26
+ 'params': {
27
+ 'apiHostname': 'prebid.dap.akadns.net',
28
+ 'apiVersion': 'x1',
29
+ 'domain': 'prebid.org',
30
+ 'identityType': 'dap-signature:1.0.0',
31
+ 'segtax': 503,
32
+ 'tokenTtl': 5
33
+ }
34
+ }
35
+
36
+ const sampleConfig = {
37
+ 'api_hostname': 'prebid.dap.akadns.net',
38
+ 'api_version': 'x1',
39
+ 'domain': 'prebid.org',
40
+ 'segtax': 503
41
+ }
42
+ const sampleIdentity = {
43
+ type: 'dap-signature:1.0.0'
44
+ };
45
+
46
+ beforeEach(function() {
47
+ config.resetConfig();
48
+ getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage')
49
+ });
50
+
51
+ afterEach(function () {
52
+ getDataFromLocalStorageStub.restore();
53
+ });
54
+
55
+ describe('akamaiDapRtdSubmodule', function() {
56
+ it('successfully instantiates', function () {
57
+ expect(akamaiDapRtdSubmodule.init()).to.equal(true);
58
+ });
59
+ });
60
+
61
+ describe('Get Real-Time Data', function() {
62
+ it('gets rtd from local storage cache', function() {
63
+ const rtdConfig = {
64
+ params: {
65
+ segmentCache: true
66
+ }
67
+ };
68
+
69
+ const bidConfig = {};
70
+
71
+ const rtdUserObj1 = {
72
+ name: 'www.dataprovider3.com',
73
+ ext: {
74
+ taxonomyname: 'iab_audience_taxonomy'
75
+ },
76
+ segment: [
77
+ {
78
+ id: '1918'
79
+ },
80
+ {
81
+ id: '1939'
82
+ }
83
+ ]
84
+ };
85
+
86
+ const cachedRtd = {
87
+ rtd: {
88
+ ortb2: {
89
+ user: {
90
+ data: [rtdUserObj1]
91
+ }
92
+ }
93
+ }
94
+ };
95
+
96
+ getDataFromLocalStorageStub.withArgs(SEGMENTS_STORAGE_KEY).returns(JSON.stringify(cachedRtd));
97
+
98
+ expect(config.getConfig().ortb2).to.be.undefined;
99
+ getRealTimeData(bidConfig, () => {}, rtdConfig, {});
100
+ expect(config.getConfig().ortb2.user.data).to.deep.include.members([rtdUserObj1]);
101
+ });
102
+
103
+ it('should initalise and return with config', function () {
104
+ expect(getRealTimeData(testReqBidsConfigObj, onDone, cmoduleConfig)).to.equal(undefined)
105
+ });
106
+ });
107
+
108
+ describe('dapTokenize', function () {
109
+ it('dapTokenize error callback', function () {
110
+ let configAsync = JSON.parse(JSON.stringify(sampleConfig));
111
+ let submoduleCallback = dapUtils.dapTokenize(configAsync, sampleIdentity,
112
+ function(token, status, xhr) {
113
+ },
114
+ function(xhr, status, error) {
115
+ }
116
+ );
117
+ let request = server.requests[0];
118
+ request.respond(400, responseHeader, JSON.stringify('error'));
119
+ expect(submoduleCallback).to.equal(undefined);
120
+ });
121
+
122
+ it('dapTokenize success callback', function () {
123
+ let configAsync = JSON.parse(JSON.stringify(sampleConfig));
124
+ let submoduleCallback = dapUtils.dapTokenize(configAsync, sampleIdentity,
125
+ function(token, status, xhr) {
126
+ },
127
+ function(xhr, status, error) {
128
+ }
129
+ );
130
+ let request = server.requests[0];
131
+ request.respond(200, responseHeader, JSON.stringify('success'));
132
+ expect(submoduleCallback).to.equal(undefined);
133
+ });
134
+ });
135
+
136
+ describe('dapTokenize and dapMembership incorrect params', function () {
137
+ it('Onerror and config are null', function () {
138
+ expect(dapUtils.dapTokenize(null, 'identity', null, null)).to.be.equal(undefined);
139
+ expect(dapUtils.dapMembership(null, 'identity', null, null)).to.be.equal(undefined);
140
+ const config = {
141
+ 'api_hostname': 'prebid.dap.akadns.net',
142
+ 'api_version': 1,
143
+ 'domain': '',
144
+ 'segtax': 503
145
+ };
146
+ let identity = {
147
+ type: 'dap-signature:1.0.0'
148
+ };
149
+ expect(dapUtils.dapTokenize(config, identity, null, null)).to.be.equal(undefined);
150
+ expect(dapUtils.dapMembership(config, 'token', null, null)).to.be.equal(undefined);
151
+ });
152
+
153
+ it('dapGetToken success', function () {
154
+ let dapTokenizeStub = sinon.stub(dapUtils, 'dapTokenize').returns(onSuccess);
155
+ expect(dapUtils.dapGetToken(sampleConfig, 'token',
156
+ function(token, status, xhr) {
157
+ },
158
+ function(xhr, status, error) {
159
+ }
160
+ )).to.be.equal(null);
161
+ dapTokenizeStub.restore();
162
+ });
163
+ });
164
+
165
+ describe('dapMembership', function () {
166
+ it('dapMembership success callback', function () {
167
+ let configAsync = JSON.parse(JSON.stringify(sampleConfig));
168
+ let submoduleCallback = dapUtils.dapMembership(configAsync, 'token',
169
+ function(token, status, xhr) {
170
+ },
171
+ function(xhr, status, error) {
172
+ }
173
+ );
174
+ let request = server.requests[0];
175
+ request.respond(200, responseHeader, JSON.stringify('success'));
176
+ expect(submoduleCallback).to.equal(undefined);
177
+ });
178
+
179
+ it('dapMembership error callback', function () {
180
+ let configAsync = JSON.parse(JSON.stringify(sampleConfig));
181
+ let submoduleCallback = dapUtils.dapMembership(configAsync, 'token',
182
+ function(token, status, xhr) {
183
+ },
184
+ function(xhr, status, error) {
185
+ }
186
+ );
187
+ let request = server.requests[0];
188
+ request.respond(400, responseHeader, JSON.stringify('error'));
189
+ expect(submoduleCallback).to.equal(undefined);
190
+ });
191
+ });
192
+
193
+ describe('dapMembership', function () {
194
+ it('should invoke the getDapToken and getDapMembership', function () {
195
+ let config = {
196
+ api_hostname: cmoduleConfig.params.apiHostname,
197
+ api_version: cmoduleConfig.params.apiVersion,
198
+ domain: cmoduleConfig.params.domain,
199
+ segtax: cmoduleConfig.params.segtax
200
+ };
201
+ let identity = {
202
+ type: cmoduleConfig.params.identityType
203
+ };
204
+
205
+ let membership = {
206
+ said: 'item.said1',
207
+ cohorts: 'item.cohorts',
208
+ attributes: null
209
+ };
210
+
211
+ let getDapTokenStub = sinon.stub(dapUtils, 'dapGetToken').returns('token3');
212
+ let getDapMembershipStub = sinon.stub(dapUtils, 'dapGetMembership').returns(membership);
213
+ let dapTokenizeStub = sinon.stub(dapUtils, 'dapTokenize').returns('response', 200, 'request');
214
+ getRealTimeData(testReqBidsConfigObj, onDone, cmoduleConfig);
215
+ expect(getDapTokenStub.calledOnce).to.be.equal(true);
216
+ expect(getDapMembershipStub.calledOnce).to.be.equal(true);
217
+ getDapTokenStub.restore();
218
+ getDapMembershipStub.restore();
219
+ dapTokenizeStub.restore();
220
+ });
221
+ });
222
+
223
+ describe('dapMembershipToRtbSegment', function () {
224
+ it('dapMembershipToRtbSegment', function () {
225
+ let membership1 = {
226
+ said: 'item.said1',
227
+ cohorts: 'item.cohorts',
228
+ attributes: null
229
+ };
230
+ const config = {
231
+ apiHostname: 'prebid.dap.akadns.net',
232
+ apiVersion: 'x1',
233
+ domain: 'prebid.org',
234
+ tokenTtl: 5,
235
+ segtax: 503
236
+ };
237
+ let identity = {
238
+ type: 'dap-signature:1.0.0'
239
+ };
240
+
241
+ expect(dapUtils.dapGetMembership(config, 'token')).to.equal(null)
242
+ const membership = {cohorts: ['1', '5', '7']}
243
+ expect(dapUtils.dapMembershipToRtbSegment(membership, config)).to.not.equal(undefined);
244
+ });
245
+ });
246
+ });
@@ -1047,7 +1047,8 @@ describe('AppNexusAdapter', function () {
1047
1047
  'trackers': [
1048
1048
  {
1049
1049
  'impression_urls': [
1050
- 'https://lax1-ib.adnxs.com/impression'
1050
+ 'https://lax1-ib.adnxs.com/impression',
1051
+ 'https://www.test.com/tracker'
1051
1052
  ],
1052
1053
  'video_events': {}
1053
1054
  }
@@ -5,16 +5,22 @@ import {server} from '../../mocks/xhr.js';
5
5
  import {parseBrowser} from '../../../modules/atsAnalyticsAdapter.js';
6
6
  import {getStorageManager} from '../../../src/storageManager.js';
7
7
  import {analyticsUrl} from '../../../modules/atsAnalyticsAdapter.js';
8
+ let utils = require('src/utils');
8
9
 
9
10
  let events = require('src/events');
10
11
  let constants = require('src/constants.json');
11
12
 
12
13
  export const storage = getStorageManager();
14
+ let sandbox;
15
+ let clock;
16
+ let now = new Date();
13
17
 
14
18
  describe('ats analytics adapter', function () {
15
19
  beforeEach(function () {
16
20
  sinon.stub(events, 'getEvents').returns([]);
17
21
  storage.setCookie('_lr_env_src_ats', 'true', 'Thu, 01 Jan 1970 00:00:01 GMT');
22
+ sandbox = sinon.sandbox.create();
23
+ clock = sandbox.useFakeTimers(now.getTime());
18
24
  });
19
25
 
20
26
  afterEach(function () {
@@ -22,18 +28,21 @@ describe('ats analytics adapter', function () {
22
28
  atsAnalyticsAdapter.getUserAgent.restore();
23
29
  atsAnalyticsAdapter.disableAnalytics();
24
30
  Math.random.restore();
31
+ sandbox.restore();
32
+ clock.restore();
25
33
  });
26
34
 
27
35
  describe('track', function () {
28
36
  it('builds and sends request and response data', function () {
29
37
  sinon.stub(Math, 'random').returns(0.99);
30
- sinon.stub(atsAnalyticsAdapter, 'shouldFireRequest').returns(true);
31
38
  sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
32
- let now = new Date();
39
+
33
40
  now.setTime(now.getTime() + 3600000);
34
41
  storage.setCookie('_lr_env_src_ats', 'true', now.toUTCString());
35
42
  storage.setCookie('_lr_sampling_rate', '10', now.toUTCString());
36
43
 
44
+ this.timeout(2100);
45
+
37
46
  let initOptions = {
38
47
  pid: '10433394'
39
48
  };
@@ -59,7 +68,7 @@ describe('ats analytics adapter', function () {
59
68
  'refererInfo': {
60
69
  'referer': 'https://example.com/dev'
61
70
  },
62
- 'auctionId': 'a5b849e5-87d7-4205-8300-d063084fcfb7',
71
+ 'auctionId': 'a5b849e5-87d7-4205-8300-d063084fcfb7'
63
72
  };
64
73
  // prepare general auction - response
65
74
  let bidResponse = {
@@ -87,7 +96,7 @@ describe('ats analytics adapter', function () {
87
96
  let expectedAfterBid = {
88
97
  'Data': [{
89
98
  'has_envelope': true,
90
- 'adapter_version': 1,
99
+ 'adapter_version': 3,
91
100
  'bidder': 'appnexus',
92
101
  'bid_id': '30c77d079cdf17',
93
102
  'auction_id': 'a5b849e5-87d7-4205-8300-d063084fcfb7',
@@ -100,10 +109,30 @@ describe('ats analytics adapter', function () {
100
109
  'response_time_stamp': '2020-02-03T14:23:11.978Z',
101
110
  'currency': 'USD',
102
111
  'cpm': 0.5,
103
- 'net_revenue': true
112
+ 'net_revenue': true,
113
+ 'bid_won': true
104
114
  }]
105
115
  };
106
116
 
117
+ let wonRequest = {
118
+ 'adId': '2eddfdc0c791dc',
119
+ 'mediaType': 'banner',
120
+ 'requestId': '30c77d079cdf17',
121
+ 'cpm': 0.5,
122
+ 'creativeId': 29681110,
123
+ 'currency': 'USD',
124
+ 'netRevenue': true,
125
+ 'ttl': 300,
126
+ 'auctionId': 'a5b849e5-87d7-4205-8300-d063084fcfb7',
127
+ 'statusMessage': 'Bid available',
128
+ 'responseTimestamp': 1633525319061,
129
+ 'requestTimestamp': 1633525319258,
130
+ 'bidder': 'appnexus',
131
+ 'adUnitCode': 'div-gpt-ad-1438287399331-0',
132
+ 'size': '300x250',
133
+ 'status': 'rendered'
134
+ };
135
+
107
136
  // lets simulate that some bidders timeout
108
137
  let bidTimeoutArgsV1 = [
109
138
  {
@@ -145,6 +174,14 @@ describe('ats analytics adapter', function () {
145
174
 
146
175
  // Step 5: Send auction end event
147
176
  events.emit(constants.EVENTS.AUCTION_END, {});
177
+ // Step 6: Send bid won event
178
+ events.emit(constants.EVENTS.BID_WON, wonRequest);
179
+
180
+ sandbox.stub($$PREBID_GLOBAL$$, 'getAllWinningBids').callsFake((key) => {
181
+ return [wonRequest]
182
+ });
183
+
184
+ clock.tick(2000);
148
185
 
149
186
  let requests = server.requests.filter(req => {
150
187
  return req.url.indexOf(analyticsUrl) > -1;
@@ -153,13 +190,12 @@ describe('ats analytics adapter', function () {
153
190
  expect(requests.length).to.equal(1);
154
191
 
155
192
  let realAfterBid = JSON.parse(requests[0].requestBody);
156
- // Step 6: assert real data after bid and expected data
193
+
194
+ // Step 7: assert real data after bid and expected data
157
195
  expect(realAfterBid['Data']).to.deep.equal(expectedAfterBid['Data']);
158
196
 
159
197
  // check that the publisher ID is configured via options
160
198
  expect(atsAnalyticsAdapter.context.pid).to.equal(initOptions.pid);
161
-
162
- atsAnalyticsAdapter.shouldFireRequest.restore();
163
199
  })
164
200
  it('check browser is safari', function () {
165
201
  sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
@@ -185,6 +221,12 @@ describe('ats analytics adapter', function () {
185
221
  let browser = parseBrowser();
186
222
  expect(browser).to.equal('Firefox');
187
223
  })
224
+ it('check browser is unknown', function () {
225
+ sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns(undefined);
226
+ sinon.stub(Math, 'random').returns(0.99);
227
+ let browser = parseBrowser();
228
+ expect(browser).to.equal('Unknown');
229
+ })
188
230
  it('should not fire analytics request if sampling rate is 0', function () {
189
231
  sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
190
232
  sinon.stub(Math, 'random').returns(0.99);
@@ -195,7 +237,7 @@ describe('ats analytics adapter', function () {
195
237
  sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
196
238
  sinon.stub(Math, 'random').returns(0.99);
197
239
  // publisher can try to pass anything they want but we will set sampling rate to 100, which means we will have 1% of requests
198
- let result = atsAnalyticsAdapter.shouldFireRequest(10);
240
+ let result = atsAnalyticsAdapter.shouldFireRequest(8);
199
241
  expect(result).to.equal(true);
200
242
  })
201
243
  it('should not fire analytics request if math random is something other then 0.99', function () {
@@ -205,5 +247,31 @@ describe('ats analytics adapter', function () {
205
247
  let result = atsAnalyticsAdapter.shouldFireRequest(10);
206
248
  expect(result).to.equal(false);
207
249
  })
250
+
251
+ it('should set cookie value to 10 for _lr_sampling_rate', function () {
252
+ sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
253
+ sinon.stub(Math, 'random').returns(0.99);
254
+ atsAnalyticsAdapter.setSamplingCookie(10);
255
+ let samplingRate = storage.getCookie('_lr_sampling_rate');
256
+ expect(samplingRate).to.equal('10');
257
+ })
258
+
259
+ it('should set cookie value to 0 for _lr_sampling_rate', function () {
260
+ sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
261
+ sinon.stub(Math, 'random').returns(0.99);
262
+ atsAnalyticsAdapter.setSamplingCookie(0);
263
+ let samplingRate = storage.getCookie('_lr_sampling_rate');
264
+ expect(samplingRate).to.equal('0');
265
+ })
266
+
267
+ it('enable analytics', function () {
268
+ sandbox.stub(utils, 'logError');
269
+ sinon.stub(atsAnalyticsAdapter, 'getUserAgent').returns('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25');
270
+ sinon.stub(Math, 'random').returns(0.99);
271
+ atsAnalyticsAdapter.enableAnalytics({
272
+ options: {}
273
+ });
274
+ expect(utils.logError.called).to.equal(true);
275
+ })
208
276
  })
209
277
  })
@@ -23,6 +23,32 @@ describe('betweenBidAdapterTests', function () {
23
23
  let req_data = JSON.parse(request.data)[0].data;
24
24
  expect(req_data.bidid).to.equal('bid1234');
25
25
  });
26
+
27
+ it('validate_video_params', function () {
28
+ let bidRequestData = [{
29
+ bidId: 'bid1234',
30
+ bidder: 'between',
31
+ params: {w: 240, h: 400, s: 1112},
32
+ mediaTypes: {
33
+ video: {
34
+ context: 'outstream',
35
+ playerSize: [970, 250],
36
+ maxd: 123,
37
+ mind: 234,
38
+ codeType: 'unknown code type'
39
+ }
40
+ },
41
+ }];
42
+ let request = spec.buildRequests(bidRequestData);
43
+ let req_data = JSON.parse(request.data)[0].data;
44
+
45
+ expect(req_data.mediaType).to.equal(2);
46
+ expect(req_data.maxd).to.equal(123);
47
+ expect(req_data.mind).to.equal(234);
48
+ expect(req_data.pos).to.equal('atf');
49
+ expect(req_data.codeType).to.equal('inpage');
50
+ });
51
+
26
52
  it('validate itu param', function() {
27
53
  let bidRequestData = [{
28
54
  bidId: 'bid1234',
@@ -230,6 +256,21 @@ describe('betweenBidAdapterTests', function () {
230
256
  expect(bid.requestId).to.equal('bid1234');
231
257
  expect(bid.ad).to.equal('Ad html');
232
258
  });
259
+
260
+ it('validate_response_video_params', function () {
261
+ let serverResponse = {
262
+ body: [{
263
+ mediaType: 2,
264
+ vastXml: 'vastXml',
265
+ }]
266
+ };
267
+ let bids = spec.interpretResponse(serverResponse);
268
+ expect(bids).to.have.lengthOf(1);
269
+ let bid = bids[0];
270
+ expect(bid.mediaType).to.equal(2);
271
+ expect(bid.vastXml).to.equal('vastXml');
272
+ });
273
+
233
274
  it('validate response params without currency', function () {
234
275
  let serverResponse = {
235
276
  body: [{