prebid.js 8.0.0 → 8.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.
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/bedigitechBidAdapter.js +1 -1
- package/dist/beopBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/bidwatchAnalyticsAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/colossussspBidAdapter.js +1 -1
- package/dist/conceptxBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantAnalyticsAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/dependencies.json +3 -0
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freepassBidAdapter.js +1 -0
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/greenbidsAnalyticsAdapter.js +1 -1
- package/dist/greenbidsRtdProvider.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/intentIqIdSystem.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/kiviadsBidAdapter.js +1 -0
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/kulturemediaBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/mgidXBidAdapter.js +1 -0
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/minutemediaplusBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +134 -131
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/oxxionAnalyticsAdapter.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rtbhouseBidAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/uid2IdSystem.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahoosspBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/modules/amxBidAdapter.js +11 -12
- package/modules/bedigitechBidAdapter.js +15 -12
- package/modules/bedigitechBidAdapter.md +2 -2
- package/modules/beopBidAdapter.js +0 -4
- package/modules/bidwatchAnalyticsAdapter.js +33 -5
- package/modules/colossussspBidAdapter.js +9 -0
- package/modules/conceptxBidAdapter.js +6 -3
- package/modules/freepassBidAdapter.js +98 -0
- package/modules/freepassBidAdapter.md +31 -0
- package/modules/freepassIdSystem.md +1 -1
- package/modules/greenbidsAnalyticsAdapter.js +7 -13
- package/modules/gridBidAdapter.js +3 -4
- package/modules/intentIqIdSystem.js +5 -4
- package/modules/ixBidAdapter.js +284 -55
- package/modules/kiviadsBidAdapter.js +212 -0
- package/modules/kiviadsBidAdapter.md +79 -0
- package/modules/mgidXBidAdapter.js +263 -0
- package/modules/mgidXBidAdapter.md +79 -0
- package/modules/oxxionAnalyticsAdapter.js +33 -5
- package/modules/pubmaticBidAdapter.js +18 -2
- package/modules/rtbhouseBidAdapter.js +9 -2
- package/modules/rtbhouseBidAdapter.md +27 -8
- package/modules/rubiconBidAdapter.js +13 -1
- package/modules/sharethroughBidAdapter.js +14 -0
- package/modules/sonobiBidAdapter.js +4 -7
- package/package.json +1 -1
- package/test/spec/modules/amxBidAdapter_spec.js +6 -3
- package/test/spec/modules/bedigitechBidAdapter_spec.js +25 -36
- package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +21 -1
- package/test/spec/modules/colossussspBidAdapter_spec.js +29 -0
- package/test/spec/modules/freepassBidAdapter_spec.js +161 -0
- package/test/spec/modules/greenbidsAnalyticsAdapter_spec.js +0 -15
- package/test/spec/modules/gridBidAdapter_spec.js +29 -28
- package/test/spec/modules/ixBidAdapter_spec.js +745 -3
- package/test/spec/modules/kiviadsBidAdapter_spec.js +404 -0
- package/test/spec/modules/mgidXBidAdapter_spec.js +426 -0
- package/test/spec/modules/oxxionAnalyticsAdapter_spec.js +21 -2
- package/test/spec/modules/pubmaticBidAdapter_spec.js +25 -0
- package/test/spec/modules/rtbhouseBidAdapter_spec.js +35 -0
- package/test/spec/modules/rubiconBidAdapter_spec.js +41 -0
- package/test/spec/modules/sharethroughBidAdapter_spec.js +75 -0
- package/test/spec/modules/sonobiBidAdapter_spec.js +15 -15
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { spec } from '../../../modules/mgidXBidAdapter.js';
|
|
3
|
+
import { BANNER, VIDEO, NATIVE } from '../../../src/mediaTypes.js';
|
|
4
|
+
import { getUniqueIdentifierStr } from '../../../src/utils.js';
|
|
5
|
+
import { config } from '../../../src/config';
|
|
6
|
+
import { USERSYNC_DEFAULT_CONFIG } from '../../../src/userSync';
|
|
7
|
+
|
|
8
|
+
const bidder = 'mgidX'
|
|
9
|
+
const adUrl = 'https://us-east-x.mgid.com/pbjs';
|
|
10
|
+
|
|
11
|
+
describe('MGIDXBidAdapter', function () {
|
|
12
|
+
const bids = [
|
|
13
|
+
{
|
|
14
|
+
bidId: getUniqueIdentifierStr(),
|
|
15
|
+
bidder: bidder,
|
|
16
|
+
mediaTypes: {
|
|
17
|
+
[BANNER]: {
|
|
18
|
+
sizes: [[300, 250]]
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
params: {
|
|
22
|
+
placementId: 'testBanner',
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
bidId: getUniqueIdentifierStr(),
|
|
27
|
+
bidder: bidder,
|
|
28
|
+
mediaTypes: {
|
|
29
|
+
[VIDEO]: {
|
|
30
|
+
playerSize: [[300, 300]],
|
|
31
|
+
minduration: 5,
|
|
32
|
+
maxduration: 60
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
params: {
|
|
36
|
+
placementId: 'testVideo',
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
bidId: getUniqueIdentifierStr(),
|
|
41
|
+
bidder: bidder,
|
|
42
|
+
mediaTypes: {
|
|
43
|
+
[NATIVE]: {
|
|
44
|
+
native: {
|
|
45
|
+
title: {
|
|
46
|
+
required: true
|
|
47
|
+
},
|
|
48
|
+
body: {
|
|
49
|
+
required: true
|
|
50
|
+
},
|
|
51
|
+
icon: {
|
|
52
|
+
required: true,
|
|
53
|
+
size: [64, 64]
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
params: {
|
|
59
|
+
placementId: 'testNative',
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
const invalidBid = {
|
|
65
|
+
bidId: getUniqueIdentifierStr(),
|
|
66
|
+
bidder: bidder,
|
|
67
|
+
mediaTypes: {
|
|
68
|
+
[BANNER]: {
|
|
69
|
+
sizes: [[300, 250]]
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
params: {
|
|
73
|
+
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const bidderRequest = {
|
|
78
|
+
uspConsent: '1---',
|
|
79
|
+
gdprConsent: 'COvFyGBOvFyGBAbAAAENAPCAAOAAAAAAAAAAAEEUACCKAAA.IFoEUQQgAIQwgIwQABAEAAAAOIAACAIAAAAQAIAgEAACEAAAAAgAQBAAAAAAAGBAAgAAAAAAAFAAECAAAgAAQARAEQAAAAAJAAIAAgAAAYQEAAAQmAgBC3ZAYzUw',
|
|
80
|
+
refererInfo: {
|
|
81
|
+
referer: 'https://test.com'
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
describe('isBidRequestValid', function () {
|
|
86
|
+
it('Should return true if there are bidId, params and key parameters present', function () {
|
|
87
|
+
expect(spec.isBidRequestValid(bids[0])).to.be.true;
|
|
88
|
+
});
|
|
89
|
+
it('Should return false if at least one of parameters is not present', function () {
|
|
90
|
+
expect(spec.isBidRequestValid(invalidBid)).to.be.false;
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe('buildRequests', function () {
|
|
95
|
+
let serverRequest = spec.buildRequests(bids, bidderRequest);
|
|
96
|
+
|
|
97
|
+
it('Creates a ServerRequest object with method, URL and data', function () {
|
|
98
|
+
expect(serverRequest).to.exist;
|
|
99
|
+
expect(serverRequest.method).to.exist;
|
|
100
|
+
expect(serverRequest.url).to.exist;
|
|
101
|
+
expect(serverRequest.data).to.exist;
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('Returns POST method', function () {
|
|
105
|
+
expect(serverRequest.method).to.equal('POST');
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('Returns valid URL', function () {
|
|
109
|
+
expect(serverRequest.url).to.equal(adUrl);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('Returns general data valid', function () {
|
|
113
|
+
let data = serverRequest.data;
|
|
114
|
+
expect(data).to.be.an('object');
|
|
115
|
+
expect(data).to.have.all.keys('deviceWidth',
|
|
116
|
+
'deviceHeight',
|
|
117
|
+
'language',
|
|
118
|
+
'secure',
|
|
119
|
+
'host',
|
|
120
|
+
'page',
|
|
121
|
+
'placements',
|
|
122
|
+
'coppa',
|
|
123
|
+
'ccpa',
|
|
124
|
+
'gdpr',
|
|
125
|
+
'tmax'
|
|
126
|
+
);
|
|
127
|
+
expect(data.deviceWidth).to.be.a('number');
|
|
128
|
+
expect(data.deviceHeight).to.be.a('number');
|
|
129
|
+
expect(data.language).to.be.a('string');
|
|
130
|
+
expect(data.secure).to.be.within(0, 1);
|
|
131
|
+
expect(data.host).to.be.a('string');
|
|
132
|
+
expect(data.page).to.be.a('string');
|
|
133
|
+
expect(data.coppa).to.be.a('number');
|
|
134
|
+
expect(data.gdpr).to.be.a('string');
|
|
135
|
+
expect(data.ccpa).to.be.a('string');
|
|
136
|
+
expect(data.tmax).to.be.a('number');
|
|
137
|
+
expect(data.placements).to.have.lengthOf(3);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it('Returns valid placements', function () {
|
|
141
|
+
const { placements } = serverRequest.data;
|
|
142
|
+
for (let i = 0, len = placements.length; i < len; i++) {
|
|
143
|
+
const placement = placements[i];
|
|
144
|
+
expect(placement.placementId).to.be.oneOf(['testBanner', 'testVideo', 'testNative']);
|
|
145
|
+
expect(placement.adFormat).to.be.oneOf([BANNER, VIDEO, NATIVE]);
|
|
146
|
+
expect(placement.bidId).to.be.a('string');
|
|
147
|
+
expect(placement.schain).to.be.an('object');
|
|
148
|
+
expect(placement.bidfloor).to.exist.and.to.equal(0);
|
|
149
|
+
expect(placement.type).to.exist.and.to.equal('publisher');
|
|
150
|
+
|
|
151
|
+
if (placement.adFormat === BANNER) {
|
|
152
|
+
expect(placement.sizes).to.be.an('array');
|
|
153
|
+
}
|
|
154
|
+
switch (placement.adFormat) {
|
|
155
|
+
case BANNER:
|
|
156
|
+
expect(placement.sizes).to.be.an('array');
|
|
157
|
+
break;
|
|
158
|
+
case VIDEO:
|
|
159
|
+
expect(placement.playerSize).to.be.an('array');
|
|
160
|
+
expect(placement.minduration).to.be.an('number');
|
|
161
|
+
expect(placement.maxduration).to.be.an('number');
|
|
162
|
+
break;
|
|
163
|
+
case NATIVE:
|
|
164
|
+
expect(placement.native).to.be.an('object');
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('Returns data with gdprConsent and without uspConsent', function () {
|
|
171
|
+
delete bidderRequest.uspConsent;
|
|
172
|
+
serverRequest = spec.buildRequests(bids, bidderRequest);
|
|
173
|
+
let data = serverRequest.data;
|
|
174
|
+
expect(data.gdpr).to.exist;
|
|
175
|
+
expect(data.gdpr).to.be.a('string');
|
|
176
|
+
expect(data.gdpr).to.equal(bidderRequest.gdprConsent);
|
|
177
|
+
expect(data.ccpa).to.not.exist;
|
|
178
|
+
delete bidderRequest.gdprConsent;
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it('Returns data with uspConsent and without gdprConsent', function () {
|
|
182
|
+
bidderRequest.uspConsent = '1---';
|
|
183
|
+
delete bidderRequest.gdprConsent;
|
|
184
|
+
serverRequest = spec.buildRequests(bids, bidderRequest);
|
|
185
|
+
let data = serverRequest.data;
|
|
186
|
+
expect(data.ccpa).to.exist;
|
|
187
|
+
expect(data.ccpa).to.be.a('string');
|
|
188
|
+
expect(data.ccpa).to.equal(bidderRequest.uspConsent);
|
|
189
|
+
expect(data.gdpr).to.not.exist;
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it('Returns empty data if no valid requests are passed', function () {
|
|
193
|
+
serverRequest = spec.buildRequests([], bidderRequest);
|
|
194
|
+
let data = serverRequest.data;
|
|
195
|
+
expect(data.placements).to.be.an('array').that.is.empty;
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
describe('interpretResponse', function () {
|
|
200
|
+
it('Should interpret banner response', function () {
|
|
201
|
+
const banner = {
|
|
202
|
+
body: [{
|
|
203
|
+
mediaType: 'banner',
|
|
204
|
+
width: 300,
|
|
205
|
+
height: 250,
|
|
206
|
+
cpm: 0.4,
|
|
207
|
+
ad: 'Test',
|
|
208
|
+
requestId: '23fhj33i987f',
|
|
209
|
+
ttl: 120,
|
|
210
|
+
creativeId: '2',
|
|
211
|
+
netRevenue: true,
|
|
212
|
+
currency: 'USD',
|
|
213
|
+
dealId: '1',
|
|
214
|
+
meta: {
|
|
215
|
+
advertiserDomains: ['google.com'],
|
|
216
|
+
advertiserId: 1234
|
|
217
|
+
}
|
|
218
|
+
}]
|
|
219
|
+
};
|
|
220
|
+
let bannerResponses = spec.interpretResponse(banner);
|
|
221
|
+
expect(bannerResponses).to.be.an('array').that.is.not.empty;
|
|
222
|
+
let dataItem = bannerResponses[0];
|
|
223
|
+
expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
|
|
224
|
+
'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
|
|
225
|
+
expect(dataItem.requestId).to.equal(banner.body[0].requestId);
|
|
226
|
+
expect(dataItem.cpm).to.equal(banner.body[0].cpm);
|
|
227
|
+
expect(dataItem.width).to.equal(banner.body[0].width);
|
|
228
|
+
expect(dataItem.height).to.equal(banner.body[0].height);
|
|
229
|
+
expect(dataItem.ad).to.equal(banner.body[0].ad);
|
|
230
|
+
expect(dataItem.ttl).to.equal(banner.body[0].ttl);
|
|
231
|
+
expect(dataItem.creativeId).to.equal(banner.body[0].creativeId);
|
|
232
|
+
expect(dataItem.netRevenue).to.be.true;
|
|
233
|
+
expect(dataItem.currency).to.equal(banner.body[0].currency);
|
|
234
|
+
expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
|
|
235
|
+
});
|
|
236
|
+
it('Should interpret video response', function () {
|
|
237
|
+
const video = {
|
|
238
|
+
body: [{
|
|
239
|
+
vastUrl: 'test.com',
|
|
240
|
+
mediaType: 'video',
|
|
241
|
+
cpm: 0.5,
|
|
242
|
+
requestId: '23fhj33i987f',
|
|
243
|
+
ttl: 120,
|
|
244
|
+
creativeId: '2',
|
|
245
|
+
netRevenue: true,
|
|
246
|
+
currency: 'USD',
|
|
247
|
+
dealId: '1',
|
|
248
|
+
meta: {
|
|
249
|
+
advertiserDomains: ['google.com'],
|
|
250
|
+
advertiserId: 1234
|
|
251
|
+
}
|
|
252
|
+
}]
|
|
253
|
+
};
|
|
254
|
+
let videoResponses = spec.interpretResponse(video);
|
|
255
|
+
expect(videoResponses).to.be.an('array').that.is.not.empty;
|
|
256
|
+
|
|
257
|
+
let dataItem = videoResponses[0];
|
|
258
|
+
expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
|
|
259
|
+
'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
|
|
260
|
+
expect(dataItem.requestId).to.equal('23fhj33i987f');
|
|
261
|
+
expect(dataItem.cpm).to.equal(0.5);
|
|
262
|
+
expect(dataItem.vastUrl).to.equal('test.com');
|
|
263
|
+
expect(dataItem.ttl).to.equal(120);
|
|
264
|
+
expect(dataItem.creativeId).to.equal('2');
|
|
265
|
+
expect(dataItem.netRevenue).to.be.true;
|
|
266
|
+
expect(dataItem.currency).to.equal('USD');
|
|
267
|
+
expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
|
|
268
|
+
});
|
|
269
|
+
it('Should interpret native response', function () {
|
|
270
|
+
const native = {
|
|
271
|
+
body: [{
|
|
272
|
+
mediaType: 'native',
|
|
273
|
+
native: {
|
|
274
|
+
clickUrl: 'test.com',
|
|
275
|
+
title: 'Test',
|
|
276
|
+
image: 'test.com',
|
|
277
|
+
impressionTrackers: ['test.com'],
|
|
278
|
+
},
|
|
279
|
+
ttl: 120,
|
|
280
|
+
cpm: 0.4,
|
|
281
|
+
requestId: '23fhj33i987f',
|
|
282
|
+
creativeId: '2',
|
|
283
|
+
netRevenue: true,
|
|
284
|
+
currency: 'USD',
|
|
285
|
+
meta: {
|
|
286
|
+
advertiserDomains: ['google.com'],
|
|
287
|
+
advertiserId: 1234
|
|
288
|
+
}
|
|
289
|
+
}]
|
|
290
|
+
};
|
|
291
|
+
let nativeResponses = spec.interpretResponse(native);
|
|
292
|
+
expect(nativeResponses).to.be.an('array').that.is.not.empty;
|
|
293
|
+
|
|
294
|
+
let dataItem = nativeResponses[0];
|
|
295
|
+
expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native', 'meta');
|
|
296
|
+
expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
|
|
297
|
+
expect(dataItem.requestId).to.equal('23fhj33i987f');
|
|
298
|
+
expect(dataItem.cpm).to.equal(0.4);
|
|
299
|
+
expect(dataItem.native.clickUrl).to.equal('test.com');
|
|
300
|
+
expect(dataItem.native.title).to.equal('Test');
|
|
301
|
+
expect(dataItem.native.image).to.equal('test.com');
|
|
302
|
+
expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
|
|
303
|
+
expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
|
|
304
|
+
expect(dataItem.ttl).to.equal(120);
|
|
305
|
+
expect(dataItem.creativeId).to.equal('2');
|
|
306
|
+
expect(dataItem.netRevenue).to.be.true;
|
|
307
|
+
expect(dataItem.currency).to.equal('USD');
|
|
308
|
+
expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
|
|
309
|
+
});
|
|
310
|
+
it('Should return an empty array if invalid banner response is passed', function () {
|
|
311
|
+
const invBanner = {
|
|
312
|
+
body: [{
|
|
313
|
+
width: 300,
|
|
314
|
+
cpm: 0.4,
|
|
315
|
+
ad: 'Test',
|
|
316
|
+
requestId: '23fhj33i987f',
|
|
317
|
+
ttl: 120,
|
|
318
|
+
creativeId: '2',
|
|
319
|
+
netRevenue: true,
|
|
320
|
+
currency: 'USD',
|
|
321
|
+
dealId: '1'
|
|
322
|
+
}]
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
let serverResponses = spec.interpretResponse(invBanner);
|
|
326
|
+
expect(serverResponses).to.be.an('array').that.is.empty;
|
|
327
|
+
});
|
|
328
|
+
it('Should return an empty array if invalid video response is passed', function () {
|
|
329
|
+
const invVideo = {
|
|
330
|
+
body: [{
|
|
331
|
+
mediaType: 'video',
|
|
332
|
+
cpm: 0.5,
|
|
333
|
+
requestId: '23fhj33i987f',
|
|
334
|
+
ttl: 120,
|
|
335
|
+
creativeId: '2',
|
|
336
|
+
netRevenue: true,
|
|
337
|
+
currency: 'USD',
|
|
338
|
+
dealId: '1'
|
|
339
|
+
}]
|
|
340
|
+
};
|
|
341
|
+
let serverResponses = spec.interpretResponse(invVideo);
|
|
342
|
+
expect(serverResponses).to.be.an('array').that.is.empty;
|
|
343
|
+
});
|
|
344
|
+
it('Should return an empty array if invalid native response is passed', function () {
|
|
345
|
+
const invNative = {
|
|
346
|
+
body: [{
|
|
347
|
+
mediaType: 'native',
|
|
348
|
+
clickUrl: 'test.com',
|
|
349
|
+
title: 'Test',
|
|
350
|
+
impressionTrackers: ['test.com'],
|
|
351
|
+
ttl: 120,
|
|
352
|
+
requestId: '23fhj33i987f',
|
|
353
|
+
creativeId: '2',
|
|
354
|
+
netRevenue: true,
|
|
355
|
+
currency: 'USD',
|
|
356
|
+
}]
|
|
357
|
+
};
|
|
358
|
+
let serverResponses = spec.interpretResponse(invNative);
|
|
359
|
+
expect(serverResponses).to.be.an('array').that.is.empty;
|
|
360
|
+
});
|
|
361
|
+
it('Should return an empty array if invalid response is passed', function () {
|
|
362
|
+
const invalid = {
|
|
363
|
+
body: [{
|
|
364
|
+
ttl: 120,
|
|
365
|
+
creativeId: '2',
|
|
366
|
+
netRevenue: true,
|
|
367
|
+
currency: 'USD',
|
|
368
|
+
dealId: '1'
|
|
369
|
+
}]
|
|
370
|
+
};
|
|
371
|
+
let serverResponses = spec.interpretResponse(invalid);
|
|
372
|
+
expect(serverResponses).to.be.an('array').that.is.empty;
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
describe('getUserSyncs', function () {
|
|
377
|
+
afterEach(function() {
|
|
378
|
+
config.setConfig({userSync: {syncsPerBidder: USERSYNC_DEFAULT_CONFIG.syncsPerBidder}});
|
|
379
|
+
});
|
|
380
|
+
it('should do nothing on getUserSyncs without inputs', function () {
|
|
381
|
+
expect(spec.getUserSyncs()).to.equal(undefined)
|
|
382
|
+
});
|
|
383
|
+
it('should return frame object with empty consents', function () {
|
|
384
|
+
const sync = spec.getUserSyncs({iframeEnabled: true})
|
|
385
|
+
expect(sync).to.have.length(1)
|
|
386
|
+
expect(sync[0]).to.have.property('type', 'iframe')
|
|
387
|
+
expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=&gdpr=0/)
|
|
388
|
+
});
|
|
389
|
+
it('should return frame object with gdpr consent', function () {
|
|
390
|
+
const sync = spec.getUserSyncs({iframeEnabled: true}, undefined, {consentString: 'consent', gdprApplies: true})
|
|
391
|
+
expect(sync).to.have.length(1)
|
|
392
|
+
expect(sync[0]).to.have.property('type', 'iframe')
|
|
393
|
+
expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent&gdpr=1/)
|
|
394
|
+
});
|
|
395
|
+
it('should return frame object with gdpr + usp', function () {
|
|
396
|
+
const sync = spec.getUserSyncs({iframeEnabled: true}, undefined, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
|
|
397
|
+
expect(sync).to.have.length(1)
|
|
398
|
+
expect(sync[0]).to.have.property('type', 'iframe')
|
|
399
|
+
expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
|
|
400
|
+
});
|
|
401
|
+
it('should return img object with gdpr + usp', function () {
|
|
402
|
+
config.setConfig({userSync: {syncsPerBidder: undefined}});
|
|
403
|
+
const sync = spec.getUserSyncs({pixelEnabled: true}, undefined, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
|
|
404
|
+
expect(sync).to.have.length(USERSYNC_DEFAULT_CONFIG.syncsPerBidder)
|
|
405
|
+
for (let i = 0; i < USERSYNC_DEFAULT_CONFIG.syncsPerBidder; i++) {
|
|
406
|
+
expect(sync[i]).to.have.property('type', 'image')
|
|
407
|
+
expect(sync[i]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
it('should return frame object with gdpr + usp', function () {
|
|
411
|
+
const sync = spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, undefined, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
|
|
412
|
+
expect(sync).to.have.length(1)
|
|
413
|
+
expect(sync[0]).to.have.property('type', 'iframe')
|
|
414
|
+
expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
|
|
415
|
+
});
|
|
416
|
+
it('should return img (pixels) objects with gdpr + usp', function () {
|
|
417
|
+
const response = [{body: {ext: {cm: ['http://cm.mgid.com/i.gif?cdsp=1111', 'http://cm.mgid.com/i.gif']}}}]
|
|
418
|
+
const sync = spec.getUserSyncs({iframeEnabled: false, pixelEnabled: true}, response, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
|
|
419
|
+
expect(sync).to.have.length(2)
|
|
420
|
+
expect(sync[0]).to.have.property('type', 'image')
|
|
421
|
+
expect(sync[0]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cdsp=1111&cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
|
|
422
|
+
expect(sync[1]).to.have.property('type', 'image')
|
|
423
|
+
expect(sync[1]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import oxxionAnalytics from 'modules/oxxionAnalyticsAdapter.js';
|
|
2
|
+
import {dereferenceWithoutRenderer} from 'modules/oxxionAnalyticsAdapter.js';
|
|
2
3
|
import { expect } from 'chai';
|
|
3
4
|
import { server } from 'test/mocks/xhr.js';
|
|
4
5
|
let adapterManager = require('src/adapterManager').default;
|
|
@@ -155,7 +156,7 @@ describe('Oxxion Analytics', function () {
|
|
|
155
156
|
'requestId': '34a63e5d5378a3',
|
|
156
157
|
'transactionId': 'de664ccb-e18b-4436-aeb0-362382eb1b40',
|
|
157
158
|
'auctionId': '1e8b993d-8f0a-4232-83eb-3639ddf3a44b',
|
|
158
|
-
'mediaType': '
|
|
159
|
+
'mediaType': 'video',
|
|
159
160
|
'source': 'client',
|
|
160
161
|
'cpm': 27.4276,
|
|
161
162
|
'creativeId': '158534630',
|
|
@@ -168,6 +169,7 @@ describe('Oxxion Analytics', function () {
|
|
|
168
169
|
'example.com'
|
|
169
170
|
]
|
|
170
171
|
},
|
|
172
|
+
'renderer': 'something',
|
|
171
173
|
'originalCpm': 25.02521,
|
|
172
174
|
'originalCurrency': 'EUR',
|
|
173
175
|
'responseTimestamp': 1647424261559,
|
|
@@ -221,6 +223,7 @@ describe('Oxxion Analytics', function () {
|
|
|
221
223
|
'example.com'
|
|
222
224
|
]
|
|
223
225
|
},
|
|
226
|
+
'renderer': 'something',
|
|
224
227
|
'originalCpm': 25.02521,
|
|
225
228
|
'originalCurrency': 'EUR',
|
|
226
229
|
'responseTimestamp': 1647424261558,
|
|
@@ -267,7 +270,24 @@ describe('Oxxion Analytics', function () {
|
|
|
267
270
|
oxxionAnalytics.disableAnalytics();
|
|
268
271
|
oxxionAnalytics.track.restore();
|
|
269
272
|
});
|
|
273
|
+
it('test dereferenceWithoutRenderer', function () {
|
|
274
|
+
adapterManager.registerAnalyticsAdapter({
|
|
275
|
+
code: 'oxxion',
|
|
276
|
+
adapter: oxxionAnalytics
|
|
277
|
+
});
|
|
270
278
|
|
|
279
|
+
adapterManager.enableAnalytics({
|
|
280
|
+
provider: 'oxxion',
|
|
281
|
+
options: {
|
|
282
|
+
domain: 'test'
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
let resultBidWon = JSON.parse(dereferenceWithoutRenderer(bidWon));
|
|
286
|
+
expect(resultBidWon).not.to.have.property('renderer');
|
|
287
|
+
let resultBid = JSON.parse(dereferenceWithoutRenderer(auctionEnd));
|
|
288
|
+
expect(resultBid).to.have.property('bidsReceived').and.to.have.lengthOf(1);
|
|
289
|
+
expect(resultBid.bidsReceived[0]).not.to.have.property('renderer');
|
|
290
|
+
});
|
|
271
291
|
it('test auctionEnd', function () {
|
|
272
292
|
adapterManager.registerAnalyticsAdapter({
|
|
273
293
|
code: 'oxxion',
|
|
@@ -297,7 +317,6 @@ describe('Oxxion Analytics', function () {
|
|
|
297
317
|
expect(message.auctionEnd[0]).to.have.property('bidderRequests').and.to.have.lengthOf(1);
|
|
298
318
|
expect(message.auctionEnd[0].bidderRequests[0]).to.have.property('gdprConsent');
|
|
299
319
|
expect(message.auctionEnd[0].bidderRequests[0].gdprConsent).not.to.have.property('vendorData');
|
|
300
|
-
sinon.assert.callCount(oxxionAnalytics.track, 5);
|
|
301
320
|
});
|
|
302
321
|
|
|
303
322
|
it('test bidWon', function() {
|
|
@@ -3056,6 +3056,31 @@ describe('PubMatic adapter', function () {
|
|
|
3056
3056
|
expect(data.imp[0]['video']['h']).to.equal(videoBidRequests[0].mediaTypes.video.playerSize[1]);
|
|
3057
3057
|
});
|
|
3058
3058
|
}
|
|
3059
|
+
|
|
3060
|
+
describe('Fledge', function() {
|
|
3061
|
+
it('should not send imp.ext.ae when FLEDGE is disabled, ', function () {
|
|
3062
|
+
let bidRequest = Object.assign([], bidRequests);
|
|
3063
|
+
bidRequest[0].ortb2Imp = {
|
|
3064
|
+
ext: { ae: 1 }
|
|
3065
|
+
};
|
|
3066
|
+
const req = spec.buildRequests(bidRequest, { ...bidRequest, fledgeEnabled: false });
|
|
3067
|
+
let data = JSON.parse(req.data);
|
|
3068
|
+
if (data.imp[0].ext) {
|
|
3069
|
+
expect(data.imp[0].ext).to.not.have.property('ae');
|
|
3070
|
+
}
|
|
3071
|
+
});
|
|
3072
|
+
|
|
3073
|
+
it('when FLEDGE is enabled, should send whatever is set in ortb2imp.ext.ae in all bid requests', function () {
|
|
3074
|
+
let bidRequest = Object.assign([], bidRequests);
|
|
3075
|
+
delete bidRequest[0].params.test;
|
|
3076
|
+
bidRequest[0].ortb2Imp = {
|
|
3077
|
+
ext: { ae: 1 }
|
|
3078
|
+
};
|
|
3079
|
+
const req = spec.buildRequests(bidRequest, { ...bidRequest, fledgeEnabled: true });
|
|
3080
|
+
let data = JSON.parse(req.data);
|
|
3081
|
+
expect(data.imp[0].ext.ae).to.equal(1);
|
|
3082
|
+
});
|
|
3083
|
+
});
|
|
3059
3084
|
});
|
|
3060
3085
|
|
|
3061
3086
|
it('Request params dctr check', function () {
|
|
@@ -318,6 +318,41 @@ describe('RTBHouseAdapter', () => {
|
|
|
318
318
|
expect(request.method).to.equal('POST');
|
|
319
319
|
});
|
|
320
320
|
|
|
321
|
+
it('sets default fledgeConfig object values when none available from config', function () {
|
|
322
|
+
let bidRequest = Object.assign([], bidRequests);
|
|
323
|
+
delete bidRequest[0].params.test;
|
|
324
|
+
|
|
325
|
+
config.setConfig({ fledgeConfig: false });
|
|
326
|
+
const request = spec.buildRequests(bidRequest, { ...bidderRequest, fledgeEnabled: true });
|
|
327
|
+
const data = JSON.parse(request.data);
|
|
328
|
+
expect(data.ext).to.exist.and.to.be.a('object');
|
|
329
|
+
expect(data.ext.fledge_config).to.exist.and.to.be.a('object');
|
|
330
|
+
expect(data.ext.fledge_config).to.contain.keys('seller', 'decisionLogicUrl', 'sellerTimeout');
|
|
331
|
+
expect(data.ext.fledge_config.seller).to.equal('https://fledge-ssp.creativecdn.com');
|
|
332
|
+
expect(data.ext.fledge_config.decisionLogicUrl).to.equal('https://fledge-ssp.creativecdn.com/component-seller-prebid.js');
|
|
333
|
+
expect(data.ext.fledge_config.sellerTimeout).to.equal(500);
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
it('sets a fledgeConfig object values when available from config', function () {
|
|
337
|
+
let bidRequest = Object.assign([], bidRequests);
|
|
338
|
+
delete bidRequest[0].params.test;
|
|
339
|
+
|
|
340
|
+
config.setConfig({
|
|
341
|
+
fledgeConfig: {
|
|
342
|
+
seller: 'https://sellers.domain',
|
|
343
|
+
decisionLogicUrl: 'https://sellers.domain/decision.url'
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
const request = spec.buildRequests(bidRequest, { ...bidderRequest, fledgeEnabled: true });
|
|
347
|
+
const data = JSON.parse(request.data);
|
|
348
|
+
expect(data.ext).to.exist.and.to.be.a('object');
|
|
349
|
+
expect(data.ext.fledge_config).to.exist.and.to.be.a('object');
|
|
350
|
+
expect(data.ext.fledge_config).to.contain.keys('seller', 'decisionLogicUrl');
|
|
351
|
+
expect(data.ext.fledge_config.seller).to.equal('https://sellers.domain');
|
|
352
|
+
expect(data.ext.fledge_config.decisionLogicUrl).to.equal('https://sellers.domain/decision.url');
|
|
353
|
+
expect(data.ext.fledge_config.sellerTimeout).to.not.exist;
|
|
354
|
+
});
|
|
355
|
+
|
|
321
356
|
it('when FLEDGE is disabled, should not send imp.ext.ae', function () {
|
|
322
357
|
let bidRequest = Object.assign([], bidRequests);
|
|
323
358
|
delete bidRequest[0].params.test;
|
|
@@ -825,6 +825,29 @@ describe('the rubicon adapter', function () {
|
|
|
825
825
|
});
|
|
826
826
|
});
|
|
827
827
|
|
|
828
|
+
describe('GPP Consent', function () {
|
|
829
|
+
it('should send gpp information if bidderRequest has a value for gppConsent', function () {
|
|
830
|
+
bidderRequest.gppConsent = {
|
|
831
|
+
gppString: 'consent',
|
|
832
|
+
applicableSections: 2
|
|
833
|
+
};
|
|
834
|
+
let [request] = spec.buildRequests(bidderRequest.bids, bidderRequest);
|
|
835
|
+
let data = parseQuery(request.data);
|
|
836
|
+
delete bidderRequest.gppConsent;
|
|
837
|
+
|
|
838
|
+
expect(data['gpp']).to.equal('consent');
|
|
839
|
+
expect(data['gpp_sid']).to.equal('2');
|
|
840
|
+
});
|
|
841
|
+
|
|
842
|
+
it('should not send gpp information if bidderRequest does not have a value for gppConsent', function () {
|
|
843
|
+
let [request] = spec.buildRequests(bidderRequest.bids, bidderRequest);
|
|
844
|
+
let data = parseQuery(request.data);
|
|
845
|
+
|
|
846
|
+
expect(data['gpp']).to.equal(undefined);
|
|
847
|
+
expect(data['gpp_sid']).to.equal(undefined);
|
|
848
|
+
});
|
|
849
|
+
});
|
|
850
|
+
|
|
828
851
|
describe('first party data', function () {
|
|
829
852
|
it('should not have any tg_v or tg_i params if all are undefined', function () {
|
|
830
853
|
let params = {
|
|
@@ -3653,6 +3676,24 @@ describe('the rubicon adapter', function () {
|
|
|
3653
3676
|
type: 'iframe', url: `${emilyUrl}?gdpr=1&gdpr_consent=foo&us_privacy=1NYN`
|
|
3654
3677
|
});
|
|
3655
3678
|
});
|
|
3679
|
+
|
|
3680
|
+
it('should pass gpp params when gppConsent is present', function () {
|
|
3681
|
+
expect(spec.getUserSyncs({iframeEnabled: true}, {}, {}, undefined, {
|
|
3682
|
+
gppString: 'foo',
|
|
3683
|
+
applicableSections: [2]
|
|
3684
|
+
})).to.deep.equal({
|
|
3685
|
+
type: 'iframe', url: `${emilyUrl}?gpp=foo&gpp_sid=2`
|
|
3686
|
+
});
|
|
3687
|
+
});
|
|
3688
|
+
|
|
3689
|
+
it('should pass multiple sid\'s when multiple are present', function () {
|
|
3690
|
+
expect(spec.getUserSyncs({iframeEnabled: true}, {}, {}, undefined, {
|
|
3691
|
+
gppString: 'foo',
|
|
3692
|
+
applicableSections: [2, 5]
|
|
3693
|
+
})).to.deep.equal({
|
|
3694
|
+
type: 'iframe', url: `${emilyUrl}?gpp=foo&gpp_sid=2,5`
|
|
3695
|
+
});
|
|
3696
|
+
});
|
|
3656
3697
|
});
|
|
3657
3698
|
|
|
3658
3699
|
describe('get price granularity', function () {
|