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.
- package/.devcontainer/Dockerfile +11 -0
- package/.devcontainer/devcontainer.json +27 -0
- package/.devcontainer/postCreate.sh +6 -0
- package/browsers.json +1 -0
- package/integrationExamples/gpt/akamaidap_segments_example.html +132 -0
- package/modules/.submodules.json +1 -0
- package/modules/adfBidAdapter.js +21 -16
- package/modules/adgenerationBidAdapter.js +28 -4
- package/modules/adkernelBidAdapter.js +3 -1
- package/modules/admixerBidAdapter.js +11 -0
- package/modules/adnuntiusBidAdapter.js +1 -0
- package/modules/adtelligentBidAdapter.js +2 -1
- package/modules/airgridRtdProvider.js +1 -1
- package/modules/akamaiDapRtdProvider.js +474 -0
- package/modules/akamaiDapRtdProvider.md +47 -0
- package/modules/aolBidAdapter.js +2 -1
- package/modules/appnexusBidAdapter.js +5 -3
- package/modules/atsAnalyticsAdapter.js +89 -63
- package/modules/atsAnalyticsAdapter.md +1 -0
- package/modules/betweenBidAdapter.js +20 -3
- package/modules/bliinkBidAdapter.js +58 -32
- package/modules/bliinkBidAdapter.md +29 -6
- package/modules/browsiRtdProvider.js +106 -18
- package/modules/cleanioRtdProvider.js +192 -0
- package/modules/cleanioRtdProvider.md +59 -0
- package/modules/codefuelBidAdapter.js +183 -0
- package/modules/codefuelBidAdapter.md +111 -0
- package/modules/connectIdSystem.js +104 -0
- package/modules/connectIdSystem.md +33 -0
- package/modules/cwireBidAdapter.js +272 -0
- package/modules/cwireBidAdapter.md +43 -0
- package/modules/deepintentBidAdapter.js +106 -9
- package/modules/deepintentBidAdapter.md +36 -1
- package/modules/deltaprojectsBidAdapter.js +252 -0
- package/modules/deltaprojectsBidAdapter.md +32 -0
- package/modules/dgkeywordRtdProvider.js +0 -1
- package/modules/engageyaBidAdapter.js +157 -0
- package/modules/glimpseBidAdapter.js +160 -48
- package/modules/glimpseBidAdapter.md +11 -74
- package/modules/gridBidAdapter.js +1 -0
- package/modules/gridNMBidAdapter.js +7 -6
- package/modules/gumgumBidAdapter.js +16 -2
- package/modules/iasRtdProvider.js +83 -67
- package/modules/inskinBidAdapter.js +7 -3
- package/modules/ixBidAdapter.js +8 -1
- package/modules/jixieBidAdapter.js +8 -2
- package/modules/justpremiumBidAdapter.js +6 -1
- package/modules/kargoBidAdapter.js +14 -7
- package/modules/kargoBidAdapter.md +20 -0
- package/modules/limelightDigitalBidAdapter.js +22 -2
- package/modules/livewrappedAnalyticsAdapter.js +53 -3
- package/modules/mediakeysBidAdapter.js +405 -14
- package/modules/mediakeysBidAdapter.md +108 -0
- package/modules/multibid/index.js +3 -3
- package/modules/mytargetBidAdapter.js +112 -0
- package/modules/nativoBidAdapter.js +48 -29
- package/modules/nativoBidAdapter.md +0 -1
- package/modules/nextMillenniumBidAdapter.js +12 -3
- package/modules/nextrollBidAdapter.js +375 -0
- package/modules/nobidBidAdapter.js +2 -1
- package/modules/oguryBidAdapter.js +36 -7
- package/modules/openxBidAdapter.js +34 -22
- package/modules/operaadsBidAdapter.js +21 -1
- package/modules/otmBidAdapter.js +146 -0
- package/modules/otmBidAdapter.md +27 -26
- package/modules/outbrainBidAdapter.js +5 -0
- package/modules/pixfutureBidAdapter.js +24 -4
- package/modules/pixfutureBidAdapter.md +127 -0
- package/modules/playwireBidAdapter.md +61 -0
- package/modules/prebidServerBidAdapter/index.js +1 -1
- package/modules/proxistoreBidAdapter.js +4 -6
- package/modules/publinkIdSystem.js +17 -7
- package/modules/publinkIdSystem.md +7 -2
- package/modules/pubmaticBidAdapter.js +22 -6
- package/modules/pubmaticBidAdapter.md +1 -1
- package/modules/relaidoBidAdapter.js +8 -2
- package/modules/rtdModule/index.js +2 -2
- package/modules/sharethroughBidAdapter.js +12 -19
- package/modules/slimcutBidAdapter.js +121 -0
- package/modules/sonobiBidAdapter.js +7 -0
- package/modules/sortableBidAdapter.js +1 -0
- package/modules/spotxBidAdapter.js +15 -1
- package/modules/sspBCBidAdapter.js +207 -12
- package/modules/sspBCBidAdapter.md +1 -1
- package/modules/talkadsBidAdapter.js +129 -0
- package/modules/talkadsBidAdapter.md +60 -0
- package/modules/tappxBidAdapter.js +6 -5
- package/modules/teadsBidAdapter.js +3 -0
- package/modules/tripleliftBidAdapter.js +22 -5
- package/modules/trustxBidAdapter.js +17 -11
- package/modules/undertoneBidAdapter.js +9 -5
- package/modules/undertoneBidAdapter.md +5 -1
- package/modules/unicornBidAdapter.js +3 -3
- package/modules/userId/eids.js +18 -0
- package/modules/userId/eids.md +7 -0
- package/modules/userId/userId.md +12 -0
- package/modules/ventesBidAdapter.js +370 -0
- package/modules/ventesBidAdapter.md +94 -0
- package/modules/videobyteBidAdapter.js +13 -6
- package/modules/videobyteBidAdapter.md +49 -0
- package/modules/vidoomyBidAdapter.js +20 -12
- package/modules/visxBidAdapter.js +15 -22
- package/modules/yahoosspBidAdapter.js +637 -0
- package/modules/yahoosspBidAdapter.md +795 -0
- package/modules/yieldlabBidAdapter.js +48 -3
- package/modules/yieldlabBidAdapter.md +16 -1
- package/modules/yieldmoBidAdapter.js +20 -6
- package/modules/yieldmoSyntheticInventoryModule.js +46 -0
- package/modules/yieldmoSyntheticInventoryModule.md +68 -0
- package/package.json +1 -1
- package/src/adapterManager.js +5 -0
- package/src/adapters/bidderFactory.js +4 -3
- package/src/auction.js +11 -11
- package/src/constants.json +1 -0
- package/src/secureCreatives.js +6 -7
- package/src/targeting.js +11 -9
- package/test/.eslintrc.js +2 -1
- package/test/spec/modules/adfBidAdapter_spec.js +83 -29
- package/test/spec/modules/adgenerationBidAdapter_spec.js +121 -50
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +68 -0
- package/test/spec/modules/adtelligentBidAdapter_spec.js +1 -0
- package/test/spec/modules/akamaiDapRtdProvider_spec.js +246 -0
- package/test/spec/modules/appnexusBidAdapter_spec.js +2 -1
- package/test/spec/modules/atsAnalyticsAdapter_spec.js +77 -9
- package/test/spec/modules/betweenBidAdapter_spec.js +41 -0
- package/test/spec/modules/bliinkBidAdapter_spec.js +87 -36
- package/test/spec/modules/browsiRtdProvider_spec.js +62 -7
- package/test/spec/modules/cleanioRtdProvider_spec.js +188 -0
- package/test/spec/modules/codefuelBidAdapter_spec.js +316 -0
- package/test/spec/modules/connectIdSystem_spec.js +189 -0
- package/test/spec/modules/cwireBidAdapter_spec.js +246 -0
- package/test/spec/modules/deepintentBidAdapter_spec.js +153 -3
- package/test/spec/modules/deltaprojectsBidAdapter_spec.js +399 -0
- package/test/spec/modules/engageyaBidAdapter_spec.js +286 -0
- package/test/spec/modules/glimpseBidAdapter_spec.js +302 -204
- package/test/spec/modules/gridNMBidAdapter_spec.js +40 -1
- package/test/spec/modules/gumgumBidAdapter_spec.js +23 -6
- package/test/spec/modules/iasRtdProvider_spec.js +71 -6
- package/test/spec/modules/ixBidAdapter_spec.js +13 -3
- package/test/spec/modules/jixieBidAdapter_spec.js +13 -11
- package/test/spec/modules/justpremiumBidAdapter_spec.js +9 -2
- package/test/spec/modules/limelightDigitalBidAdapter_spec.js +155 -1
- package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +67 -12
- package/test/spec/modules/mediakeysBidAdapter_spec.js +406 -51
- package/test/spec/modules/multibid_spec.js +31 -31
- package/test/spec/modules/mytargetBidAdapter_spec.js +199 -0
- package/test/spec/modules/nativoBidAdapter_spec.js +50 -3
- package/test/spec/modules/nextMillenniumBidAdapter_spec.js +13 -1
- package/test/spec/modules/nextrollBidAdapter_spec.js +290 -0
- package/test/spec/modules/nobidBidAdapter_spec.js +65 -1
- package/test/spec/modules/oguryBidAdapter_spec.js +125 -37
- package/test/spec/modules/openxBidAdapter_spec.js +85 -13
- package/test/spec/modules/operaadsBidAdapter_spec.js +38 -6
- package/test/spec/modules/otmBidAdapter_spec.js +67 -0
- package/test/spec/modules/outbrainBidAdapter_spec.js +18 -0
- package/test/spec/modules/publinkIdSystem_spec.js +34 -15
- package/test/spec/modules/pubmaticBidAdapter_spec.js +217 -1
- package/test/spec/modules/relaidoBidAdapter_spec.js +21 -20
- package/test/spec/modules/sharethroughBidAdapter_spec.js +156 -136
- package/test/spec/modules/slimcutBidAdapter_spec.js +200 -0
- package/test/spec/modules/sonobiBidAdapter_spec.js +34 -1
- package/test/spec/modules/sortableBidAdapter_spec.js +11 -0
- package/test/spec/modules/spotxBidAdapter_spec.js +36 -0
- package/test/spec/modules/sspBCBidAdapter_spec.js +210 -62
- package/test/spec/modules/talkadsBidAdapter_spec.js +231 -0
- package/test/spec/modules/teadsBidAdapter_spec.js +132 -0
- package/test/spec/modules/tripleliftBidAdapter_spec.js +128 -0
- package/test/spec/modules/trustxBidAdapter_spec.js +38 -5
- package/test/spec/modules/undertoneBidAdapter_spec.js +52 -0
- package/test/spec/modules/unicornBidAdapter_spec.js +4 -4
- package/test/spec/modules/ventesBidAdapter_spec.js +845 -0
- package/test/spec/modules/videobyteBidAdapter_spec.js +2 -2
- package/test/spec/modules/visxBidAdapter_spec.js +48 -4
- package/test/spec/modules/yahoosspBidAdapter_spec.js +1332 -0
- package/test/spec/modules/yieldlabBidAdapter_spec.js +65 -1
- package/test/spec/modules/yieldmoBidAdapter_spec.js +30 -9
- package/test/spec/modules/yieldmoSyntheticInventoryModule_spec.js +89 -0
- package/test/spec/unit/core/adapterManager_spec.js +32 -0
- package/test/spec/unit/core/bidderFactory_spec.js +61 -1
- package/test/spec/unit/pbjs_api_spec.js +37 -2
- package/test/spec/unit/secureCreatives_spec.js +54 -25
- 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
|
-
|
|
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':
|
|
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
|
-
|
|
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(
|
|
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: [{
|