prebid.js 5.18.0 → 6.1.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 (150) hide show
  1. package/.babelrc.js +1 -10
  2. package/README.md +3 -1
  3. package/browsers.json +1 -8
  4. package/gulpfile.js +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/adheseBidAdapter.js +7 -2
  9. package/modules/adkernelBidAdapter.js +1 -0
  10. package/modules/adlivetechBidAdapter.md +61 -0
  11. package/modules/adomikAnalyticsAdapter.js +10 -4
  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/appnexusBidAdapter.js +9 -3
  17. package/modules/atsAnalyticsAdapter.js +67 -46
  18. package/modules/atsAnalyticsAdapter.md +1 -0
  19. package/modules/betweenBidAdapter.js +20 -3
  20. package/modules/browsiRtdProvider.js +106 -18
  21. package/modules/cleanioRtdProvider.js +192 -0
  22. package/modules/cleanioRtdProvider.md +59 -0
  23. package/modules/codefuelBidAdapter.js +181 -0
  24. package/modules/codefuelBidAdapter.md +111 -0
  25. package/modules/connectIdSystem.js +104 -0
  26. package/modules/connectIdSystem.md +33 -0
  27. package/modules/datablocksBidAdapter.js +3 -3
  28. package/modules/deepintentBidAdapter.js +107 -10
  29. package/modules/deepintentBidAdapter.md +36 -1
  30. package/modules/deltaprojectsBidAdapter.js +252 -0
  31. package/modules/deltaprojectsBidAdapter.md +32 -0
  32. package/modules/engageyaBidAdapter.js +171 -0
  33. package/modules/glimpseBidAdapter.js +31 -16
  34. package/modules/gptPreAuction.js +11 -5
  35. package/modules/gridBidAdapter.js +1 -0
  36. package/modules/gumgumBidAdapter.js +8 -0
  37. package/modules/id5IdSystem.md +6 -6
  38. package/modules/imRtdProvider.js +31 -0
  39. package/modules/inskinBidAdapter.js +7 -3
  40. package/modules/ixBidAdapter.js +174 -22
  41. package/modules/jixieBidAdapter.js +8 -2
  42. package/modules/justpremiumBidAdapter.js +6 -1
  43. package/modules/limelightDigitalBidAdapter.js +22 -2
  44. package/modules/livewrappedAnalyticsAdapter.js +49 -1
  45. package/modules/merkleIdSystem.js +5 -0
  46. package/modules/multibid/index.js +3 -3
  47. package/modules/nativoBidAdapter.js +32 -2
  48. package/modules/nextMillenniumBidAdapter.js +12 -3
  49. package/modules/oguryBidAdapter.js +16 -2
  50. package/modules/openxBidAdapter.js +40 -23
  51. package/modules/operaadsBidAdapter.js +21 -1
  52. package/modules/otmBidAdapter.js +146 -0
  53. package/modules/otmBidAdapter.md +27 -26
  54. package/modules/outbrainBidAdapter.js +5 -0
  55. package/modules/playwireBidAdapter.md +61 -0
  56. package/modules/prebidServerBidAdapter/index.js +3 -3
  57. package/modules/publinkIdSystem.js +11 -6
  58. package/modules/pubmaticBidAdapter.js +2 -0
  59. package/modules/rtdModule/index.js +2 -2
  60. package/modules/saambaaBidAdapter.js +420 -0
  61. package/modules/saambaaBidAdapter.md +65 -68
  62. package/modules/seedtagBidAdapter.js +6 -0
  63. package/modules/smaatoBidAdapter.js +6 -1
  64. package/modules/sonobiBidAdapter.js +7 -0
  65. package/modules/sortableBidAdapter.js +1 -0
  66. package/modules/sspBCBidAdapter.js +34 -3
  67. package/modules/teadsBidAdapter.js +3 -0
  68. package/modules/tripleliftBidAdapter.js +22 -5
  69. package/modules/trustxBidAdapter.js +18 -7
  70. package/modules/undertoneBidAdapter.js +9 -5
  71. package/modules/undertoneBidAdapter.md +5 -1
  72. package/modules/userId/eids.js +18 -0
  73. package/modules/userId/eids.md +7 -0
  74. package/modules/userId/userId.md +12 -0
  75. package/modules/ventesBidAdapter.js +370 -0
  76. package/modules/ventesBidAdapter.md +94 -0
  77. package/modules/videobyteBidAdapter.js +13 -6
  78. package/modules/videobyteBidAdapter.md +49 -0
  79. package/modules/vidoomyBidAdapter.js +51 -100
  80. package/modules/visxBidAdapter.js +1 -1
  81. package/modules/yahoosspBidAdapter.js +6 -6
  82. package/modules/yieldlabBidAdapter.js +41 -10
  83. package/modules/yieldlabBidAdapter.md +91 -48
  84. package/modules/yieldmoSyntheticInventoryModule.js +46 -0
  85. package/modules/yieldmoSyntheticInventoryModule.md +68 -0
  86. package/package.json +6 -1
  87. package/src/adapterManager.js +19 -8
  88. package/src/adapters/bidderFactory.js +4 -3
  89. package/src/auction.js +11 -11
  90. package/src/constants.json +1 -0
  91. package/src/secureCreatives.js +6 -7
  92. package/src/targeting.js +11 -9
  93. package/test/spec/modules/adfBidAdapter_spec.js +83 -29
  94. package/test/spec/modules/adheseBidAdapter_spec.js +27 -1
  95. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
  96. package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
  97. package/test/spec/modules/akamaiDapRtdProvider_spec.js +246 -0
  98. package/test/spec/modules/appnexusBidAdapter_spec.js +16 -1
  99. package/test/spec/modules/atsAnalyticsAdapter_spec.js +42 -9
  100. package/test/spec/modules/betweenBidAdapter_spec.js +41 -0
  101. package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
  102. package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
  103. package/test/spec/modules/codefuelBidAdapter_spec.js +316 -0
  104. package/test/spec/modules/connectIdSystem_spec.js +189 -0
  105. package/test/spec/modules/datablocksBidAdapter_spec.js +3 -3
  106. package/test/spec/modules/deepintentBidAdapter_spec.js +153 -3
  107. package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
  108. package/test/spec/modules/engageyaBidAdapter_spec.js +422 -0
  109. package/test/spec/modules/eplanningBidAdapter_spec.js +8 -8
  110. package/test/spec/modules/glimpseBidAdapter_spec.js +33 -0
  111. package/test/spec/modules/gptPreAuction_spec.js +58 -4
  112. package/test/spec/modules/gumgumBidAdapter_spec.js +5 -1
  113. package/test/spec/modules/imRtdProvider_spec.js +25 -0
  114. package/test/spec/modules/ixBidAdapter_spec.js +298 -5
  115. package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
  116. package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
  117. package/test/spec/modules/konduitWrapper_spec.js +0 -1
  118. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +155 -1
  119. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +52 -7
  120. package/test/spec/modules/merkleIdSystem_spec.js +18 -0
  121. package/test/spec/modules/multibid_spec.js +31 -31
  122. package/test/spec/modules/nativoBidAdapter_spec.js +35 -18
  123. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +13 -1
  124. package/test/spec/modules/oguryBidAdapter_spec.js +66 -23
  125. package/test/spec/modules/openxBidAdapter_spec.js +90 -13
  126. package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
  127. package/test/spec/modules/otmBidAdapter_spec.js +67 -0
  128. package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
  129. package/test/spec/modules/prebidServerBidAdapter_spec.js +19 -2
  130. package/test/spec/modules/publinkIdSystem_spec.js +6 -6
  131. package/test/spec/modules/seedtagBidAdapter_spec.js +3 -0
  132. package/test/spec/modules/smaatoBidAdapter_spec.js +30 -0
  133. package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
  134. package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
  135. package/test/spec/modules/sspBCBidAdapter_spec.js +33 -3
  136. package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
  137. package/test/spec/modules/tripleliftBidAdapter_spec.js +128 -0
  138. package/test/spec/modules/trustxBidAdapter_spec.js +45 -3
  139. package/test/spec/modules/undertoneBidAdapter_spec.js +52 -0
  140. package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
  141. package/test/spec/modules/videobyteBidAdapter_spec.js +2 -2
  142. package/test/spec/modules/vidoomyBidAdapter_spec.js +32 -13
  143. package/test/spec/modules/visxBidAdapter_spec.js +1 -1
  144. package/test/spec/modules/yieldlabBidAdapter_spec.js +81 -0
  145. package/test/spec/modules/yieldmoSyntheticInventoryModule_spec.js +89 -0
  146. package/test/spec/unit/core/adapterManager_spec.js +56 -6
  147. package/test/spec/unit/core/bidderFactory_spec.js +61 -1
  148. package/test/spec/unit/pbjs_api_spec.js +37 -2
  149. package/test/spec/unit/secureCreatives_spec.js +54 -25
  150. package/wdio.conf.js +1 -1
@@ -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
  }
@@ -1334,6 +1335,20 @@ describe('AppNexusAdapter', function () {
1334
1335
  expect(Object.keys(result[0].meta)).to.include.members(['advertiserId']);
1335
1336
  });
1336
1337
 
1338
+ it('should add brand id', function() {
1339
+ let responseBrandId = deepClone(response);
1340
+ responseBrandId.tags[0].ads[0].brand_id = 123;
1341
+
1342
+ let bidderRequest = {
1343
+ bids: [{
1344
+ bidId: '3db3773286ee59',
1345
+ adUnitCode: 'code'
1346
+ }]
1347
+ }
1348
+ let result = spec.interpretResponse({ body: responseBrandId }, {bidderRequest});
1349
+ expect(Object.keys(result[0].meta)).to.include.members(['brandId']);
1350
+ });
1351
+
1337
1352
  it('should add advertiserDomains', function() {
1338
1353
  let responseAdvertiserId = deepClone(response);
1339
1354
  responseAdvertiserId.tags[0].ads[0].adomain = ['123'];
@@ -12,11 +12,15 @@ let constants = require('src/constants.json');
12
12
 
13
13
  export const storage = getStorageManager();
14
14
  let sandbox;
15
+ let clock;
16
+ let now = new Date();
17
+
15
18
  describe('ats analytics adapter', function () {
16
19
  beforeEach(function () {
17
20
  sinon.stub(events, 'getEvents').returns([]);
18
21
  storage.setCookie('_lr_env_src_ats', 'true', 'Thu, 01 Jan 1970 00:00:01 GMT');
19
22
  sandbox = sinon.sandbox.create();
23
+ clock = sandbox.useFakeTimers(now.getTime());
20
24
  });
21
25
 
22
26
  afterEach(function () {
@@ -25,18 +29,20 @@ describe('ats analytics adapter', function () {
25
29
  atsAnalyticsAdapter.disableAnalytics();
26
30
  Math.random.restore();
27
31
  sandbox.restore();
32
+ clock.restore();
28
33
  });
29
34
 
30
35
  describe('track', function () {
31
36
  it('builds and sends request and response data', function () {
32
37
  sinon.stub(Math, 'random').returns(0.99);
33
- sinon.stub(atsAnalyticsAdapter, 'shouldFireRequest').returns(true);
34
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');
35
- let now = new Date();
39
+
36
40
  now.setTime(now.getTime() + 3600000);
37
41
  storage.setCookie('_lr_env_src_ats', 'true', now.toUTCString());
38
42
  storage.setCookie('_lr_sampling_rate', '10', now.toUTCString());
39
43
 
44
+ this.timeout(2100);
45
+
40
46
  let initOptions = {
41
47
  pid: '10433394'
42
48
  };
@@ -62,7 +68,7 @@ describe('ats analytics adapter', function () {
62
68
  'refererInfo': {
63
69
  'referer': 'https://example.com/dev'
64
70
  },
65
- 'auctionId': 'a5b849e5-87d7-4205-8300-d063084fcfb7',
71
+ 'auctionId': 'a5b849e5-87d7-4205-8300-d063084fcfb7'
66
72
  };
67
73
  // prepare general auction - response
68
74
  let bidResponse = {
@@ -90,7 +96,7 @@ describe('ats analytics adapter', function () {
90
96
  let expectedAfterBid = {
91
97
  'Data': [{
92
98
  'has_envelope': true,
93
- 'adapter_version': 2,
99
+ 'adapter_version': 3,
94
100
  'bidder': 'appnexus',
95
101
  'bid_id': '30c77d079cdf17',
96
102
  'auction_id': 'a5b849e5-87d7-4205-8300-d063084fcfb7',
@@ -103,10 +109,30 @@ describe('ats analytics adapter', function () {
103
109
  'response_time_stamp': '2020-02-03T14:23:11.978Z',
104
110
  'currency': 'USD',
105
111
  'cpm': 0.5,
106
- 'net_revenue': true
112
+ 'net_revenue': true,
113
+ 'bid_won': true
107
114
  }]
108
115
  };
109
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
+
110
136
  // lets simulate that some bidders timeout
111
137
  let bidTimeoutArgsV1 = [
112
138
  {
@@ -148,6 +174,14 @@ describe('ats analytics adapter', function () {
148
174
 
149
175
  // Step 5: Send auction end event
150
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);
151
185
 
152
186
  let requests = server.requests.filter(req => {
153
187
  return req.url.indexOf(analyticsUrl) > -1;
@@ -156,13 +190,12 @@ describe('ats analytics adapter', function () {
156
190
  expect(requests.length).to.equal(1);
157
191
 
158
192
  let realAfterBid = JSON.parse(requests[0].requestBody);
159
- // Step 6: assert real data after bid and expected data
193
+
194
+ // Step 7: assert real data after bid and expected data
160
195
  expect(realAfterBid['Data']).to.deep.equal(expectedAfterBid['Data']);
161
196
 
162
197
  // check that the publisher ID is configured via options
163
198
  expect(atsAnalyticsAdapter.context.pid).to.equal(initOptions.pid);
164
-
165
- atsAnalyticsAdapter.shouldFireRequest.restore();
166
199
  })
167
200
  it('check browser is safari', function () {
168
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');
@@ -204,7 +237,7 @@ describe('ats analytics adapter', function () {
204
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');
205
238
  sinon.stub(Math, 'random').returns(0.99);
206
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
207
- let result = atsAnalyticsAdapter.shouldFireRequest(10);
240
+ let result = atsAnalyticsAdapter.shouldFireRequest(8);
208
241
  expect(result).to.equal(true);
209
242
  })
210
243
  it('should not fire analytics request if math random is something other then 0.99', function () {
@@ -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: [{
@@ -1,5 +1,6 @@
1
1
  import * as browsiRTD from '../../../modules/browsiRtdProvider.js';
2
2
  import {makeSlot} from '../integration/faker/googletag.js';
3
+ import * as utils from '../../../src/utils'
3
4
 
4
5
  describe('browsi Real time data sub module', function () {
5
6
  const conf = {
@@ -29,11 +30,11 @@ describe('browsi Real time data sub module', function () {
29
30
  });
30
31
 
31
32
  it('should match placement with ad unit', function () {
32
- const slot = makeSlot({code: '/57778053/Browsi_Demo_300x250', divId: 'browsiAd_1'});
33
+ const slot = makeSlot({code: '/123/abc', divId: 'browsiAd_1'});
33
34
 
34
- const test1 = browsiRTD.isIdMatchingAdUnit(slot, ['/57778053/Browsi_Demo_300x250']); // true
35
- const test2 = browsiRTD.isIdMatchingAdUnit(slot, ['/57778053/Browsi_Demo_300x250', '/57778053/Browsi']); // true
36
- const test3 = browsiRTD.isIdMatchingAdUnit(slot, ['/57778053/Browsi_Demo_Low']); // false
35
+ const test1 = browsiRTD.isIdMatchingAdUnit(slot, ['/123/abc']); // true
36
+ const test2 = browsiRTD.isIdMatchingAdUnit(slot, ['/123/abc', '/456/def']); // true
37
+ const test3 = browsiRTD.isIdMatchingAdUnit(slot, ['/123/def']); // false
37
38
  const test4 = browsiRTD.isIdMatchingAdUnit(slot, []); // true
38
39
 
39
40
  expect(test1).to.equal(true);
@@ -43,12 +44,12 @@ describe('browsi Real time data sub module', function () {
43
44
  });
44
45
 
45
46
  it('should return correct macro values', function () {
46
- const slot = makeSlot({code: '/57778053/Browsi_Demo_300x250', divId: 'browsiAd_1'});
47
+ const slot = makeSlot({code: '/123/abc', divId: 'browsiAd_1'});
47
48
 
48
49
  slot.setTargeting('test', ['test', 'value']);
49
50
  // slot getTargeting doesn't act like GPT so we can't expect real value
50
51
  const macroResult = browsiRTD.getMacroId({p: '<AD_UNIT>/<KEY_test>'}, slot);
51
- expect(macroResult).to.equal('/57778053/Browsi_Demo_300x250/NA');
52
+ expect(macroResult).to.equal('/123/abc/NA');
52
53
 
53
54
  const macroResultB = browsiRTD.getMacroId({}, slot);
54
55
  expect(macroResultB).to.equal('browsiAd_1');
@@ -72,7 +73,7 @@ describe('browsi Real time data sub module', function () {
72
73
  it('should return prediction from server', function () {
73
74
  makeSlot({code: 'hasPrediction', divId: 'hasPrediction'});
74
75
  const data = {
75
- p: {'hasPrediction': {p: 0.234}},
76
+ p: {'hasPrediction': {ps: {0: 0.234}}},
76
77
  kn: 'bv',
77
78
  pmd: undefined
78
79
  };
@@ -80,4 +81,58 @@ describe('browsi Real time data sub module', function () {
80
81
  expect(browsiRTD.browsiSubmodule.getTargetingData(['hasPrediction'])).to.eql({hasPrediction: {bv: '0.20'}});
81
82
  })
82
83
  })
84
+
85
+ describe('should return matching prediction', function () {
86
+ const predictions = {
87
+ 0: 0.123,
88
+ 1: 0.254,
89
+ 3: 0,
90
+ 4: 0.8
91
+ }
92
+ const singlePrediction = {
93
+ 0: 0.123
94
+ }
95
+ it('should return raw value if valid', function () {
96
+ expect(browsiRTD.getCurrentData(predictions, 0)).to.equal(0.123);
97
+ expect(browsiRTD.getCurrentData(predictions, 1)).to.equal(0.254);
98
+ })
99
+ it('should return 0 for prediction = 0', function () {
100
+ expect(browsiRTD.getCurrentData(predictions, 3)).to.equal(0);
101
+ })
102
+ it('should return -1 for invalid params', function () {
103
+ expect(browsiRTD.getCurrentData(null, 3)).to.equal(-1);
104
+ expect(browsiRTD.getCurrentData(predictions, null)).to.equal(-1);
105
+ })
106
+ it('should return prediction according to object keys length ', function () {
107
+ expect(browsiRTD.getCurrentData(singlePrediction, 0)).to.equal(0.123);
108
+ expect(browsiRTD.getCurrentData(singlePrediction, 1)).to.equal(-1);
109
+ expect(browsiRTD.getCurrentData(singlePrediction, 2)).to.equal(-1);
110
+ expect(browsiRTD.getCurrentData(predictions, 4)).to.equal(0.8);
111
+ expect(browsiRTD.getCurrentData(predictions, 5)).to.equal(0.8);
112
+ expect(browsiRTD.getCurrentData(predictions, 8)).to.equal(0.8);
113
+ })
114
+ })
115
+ describe('should set bid request data', function () {
116
+ const data = {
117
+ p: {
118
+ 'adUnit1': {ps: {0: 0.234}},
119
+ 'adUnit2': {ps: {0: 0.134}}},
120
+ kn: 'bv',
121
+ pmd: undefined
122
+ };
123
+ browsiRTD.setData(data);
124
+ const fakeAdUnits = [
125
+ {
126
+ code: 'adUnit1'
127
+ },
128
+ {
129
+ code: 'adUnit2'
130
+ }
131
+ ]
132
+ browsiRTD.browsiSubmodule.getBidRequestData({adUnits: fakeAdUnits}, () => {}, {}, null);
133
+ it('should set ad unit params with prediction values', function () {
134
+ expect(utils.deepAccess(fakeAdUnits[0], 'ortb2Imp.ext.data.browsi')).to.eql({bv: '0.20'});
135
+ expect(utils.deepAccess(fakeAdUnits[1], 'ortb2Imp.ext.data.browsi')).to.eql({bv: '0.10'});
136
+ })
137
+ })
83
138
  });