prebid.js 7.8.0 → 7.9.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/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/andBeyondMediaBidAdapter.js +1 -0
- 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/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/c1xBidAdapter.js +1 -0
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/glimpseBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gridNMBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/inmarBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/liveyieldAnalyticsAdapter.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.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/minutemediaBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +106 -104
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/outbrainBidAdapter.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/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rubiconAnalyticsAdapter.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/sublimeBidAdapter.js +1 -1
- package/dist/synacormediaBidAdapter.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/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/andBeyondMediaBidAdapter.js +202 -0
- package/modules/andBeyondMediaBidAdapter.md +79 -0
- package/modules/bidwatchAnalyticsAdapter.js +70 -11
- package/modules/c1xBidAdapter.js +209 -0
- package/modules/c1xBidAdapter.md +70 -0
- package/modules/improvedigitalBidAdapter.js +3 -0
- package/modules/tripleliftBidAdapter.js +45 -19
- package/package.json +1 -1
- package/test/spec/modules/andBeyondMediaBidAdapter_spec.js +400 -0
- package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +17 -1
- package/test/spec/modules/c1xBidAdapter_spec.js +189 -0
- package/test/spec/modules/improvedigitalBidAdapter_spec.js +4 -4
- package/test/spec/modules/tripleliftBidAdapter_spec.js +378 -10
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { spec } from '../../../modules/andBeyondMediaBidAdapter.js';
|
|
3
|
+
import { BANNER, VIDEO, NATIVE } from '../../../src/mediaTypes.js';
|
|
4
|
+
import { getUniqueIdentifierStr } from '../../../src/utils.js';
|
|
5
|
+
|
|
6
|
+
const bidder = 'beyondmedia'
|
|
7
|
+
|
|
8
|
+
describe('AndBeyondMediaBidAdapter', function () {
|
|
9
|
+
const bids = [
|
|
10
|
+
{
|
|
11
|
+
bidId: getUniqueIdentifierStr(),
|
|
12
|
+
bidder: bidder,
|
|
13
|
+
mediaTypes: {
|
|
14
|
+
[BANNER]: {
|
|
15
|
+
sizes: [[300, 250]]
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
params: {
|
|
19
|
+
placementId: 'testBanner',
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
bidId: getUniqueIdentifierStr(),
|
|
24
|
+
bidder: bidder,
|
|
25
|
+
mediaTypes: {
|
|
26
|
+
[VIDEO]: {
|
|
27
|
+
playerSize: [[300, 300]],
|
|
28
|
+
minduration: 5,
|
|
29
|
+
maxduration: 60
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
params: {
|
|
33
|
+
placementId: 'testVideo',
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
bidId: getUniqueIdentifierStr(),
|
|
38
|
+
bidder: bidder,
|
|
39
|
+
mediaTypes: {
|
|
40
|
+
[NATIVE]: {
|
|
41
|
+
native: {
|
|
42
|
+
title: {
|
|
43
|
+
required: true
|
|
44
|
+
},
|
|
45
|
+
body: {
|
|
46
|
+
required: true
|
|
47
|
+
},
|
|
48
|
+
icon: {
|
|
49
|
+
required: true,
|
|
50
|
+
size: [64, 64]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
params: {
|
|
56
|
+
placementId: 'testNative',
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
const invalidBid = {
|
|
62
|
+
bidId: getUniqueIdentifierStr(),
|
|
63
|
+
bidder: bidder,
|
|
64
|
+
mediaTypes: {
|
|
65
|
+
[BANNER]: {
|
|
66
|
+
sizes: [[300, 250]]
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
params: {
|
|
70
|
+
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const bidderRequest = {
|
|
75
|
+
uspConsent: '1---',
|
|
76
|
+
gdprConsent: 'COvFyGBOvFyGBAbAAAENAPCAAOAAAAAAAAAAAEEUACCKAAA.IFoEUQQgAIQwgIwQABAEAAAAOIAACAIAAAAQAIAgEAACEAAAAAgAQBAAAAAAAGBAAgAAAAAAAFAAECAAAgAAQARAEQAAAAAJAAIAAgAAAYQEAAAQmAgBC3ZAYzUw',
|
|
77
|
+
refererInfo: {
|
|
78
|
+
referer: 'https://test.com'
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
describe('isBidRequestValid', function () {
|
|
83
|
+
it('Should return true if there are bidId, params and key parameters present', function () {
|
|
84
|
+
expect(spec.isBidRequestValid(bids[0])).to.be.true;
|
|
85
|
+
expect(spec.isBidRequestValid(bids[1])).to.be.true;
|
|
86
|
+
expect(spec.isBidRequestValid(bids[2])).to.be.true;
|
|
87
|
+
});
|
|
88
|
+
it('Should return false if at least one of parameters is not present', function () {
|
|
89
|
+
expect(spec.isBidRequestValid(invalidBid)).to.be.false;
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe('buildRequests', function () {
|
|
94
|
+
let serverRequest = spec.buildRequests(bids, bidderRequest);
|
|
95
|
+
|
|
96
|
+
it('Creates a ServerRequest object with method, URL and data', function () {
|
|
97
|
+
expect(serverRequest).to.exist;
|
|
98
|
+
expect(serverRequest.method).to.exist;
|
|
99
|
+
expect(serverRequest.url).to.exist;
|
|
100
|
+
expect(serverRequest.data).to.exist;
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('Returns POST method', function () {
|
|
104
|
+
expect(serverRequest.method).to.equal('POST');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('Returns valid URL', function () {
|
|
108
|
+
expect(serverRequest.url).to.equal('https://backend.andbeyond.media/pbjs');
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('Returns general data valid', function () {
|
|
112
|
+
let data = serverRequest.data;
|
|
113
|
+
expect(data).to.be.an('object');
|
|
114
|
+
expect(data).to.have.all.keys('deviceWidth',
|
|
115
|
+
'deviceHeight',
|
|
116
|
+
'language',
|
|
117
|
+
'secure',
|
|
118
|
+
'host',
|
|
119
|
+
'page',
|
|
120
|
+
'placements',
|
|
121
|
+
'coppa',
|
|
122
|
+
'ccpa',
|
|
123
|
+
'gdpr',
|
|
124
|
+
'tmax'
|
|
125
|
+
);
|
|
126
|
+
expect(data.deviceWidth).to.be.a('number');
|
|
127
|
+
expect(data.deviceHeight).to.be.a('number');
|
|
128
|
+
expect(data.language).to.be.a('string');
|
|
129
|
+
expect(data.secure).to.be.within(0, 1);
|
|
130
|
+
expect(data.host).to.be.a('string');
|
|
131
|
+
expect(data.page).to.be.a('string');
|
|
132
|
+
expect(data.coppa).to.be.a('number');
|
|
133
|
+
expect(data.gdpr).to.be.a('string');
|
|
134
|
+
expect(data.ccpa).to.be.a('string');
|
|
135
|
+
expect(data.tmax).to.be.a('number');
|
|
136
|
+
expect(data.placements).to.have.lengthOf(3);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('Returns valid placements', function () {
|
|
140
|
+
const { placements } = serverRequest.data;
|
|
141
|
+
for (let i = 0, len = placements.length; i < len; i++) {
|
|
142
|
+
const placement = placements[i];
|
|
143
|
+
expect(placement.placementId).to.be.oneOf(['testBanner', 'testVideo', 'testNative']);
|
|
144
|
+
expect(placement.adFormat).to.be.oneOf([BANNER, VIDEO, NATIVE]);
|
|
145
|
+
expect(placement.bidId).to.be.a('string');
|
|
146
|
+
expect(placement.schain).to.be.an('object');
|
|
147
|
+
expect(placement.bidfloor).to.exist.and.to.equal(0);
|
|
148
|
+
expect(placement.type).to.exist.and.to.equal('publisher');
|
|
149
|
+
|
|
150
|
+
if (placement.adFormat === BANNER) {
|
|
151
|
+
expect(placement.sizes).to.be.an('array');
|
|
152
|
+
}
|
|
153
|
+
switch (placement.adFormat) {
|
|
154
|
+
case BANNER:
|
|
155
|
+
expect(placement.sizes).to.be.an('array');
|
|
156
|
+
break;
|
|
157
|
+
case VIDEO:
|
|
158
|
+
expect(placement.playerSize).to.be.an('array');
|
|
159
|
+
expect(placement.minduration).to.be.an('number');
|
|
160
|
+
expect(placement.maxduration).to.be.an('number');
|
|
161
|
+
break;
|
|
162
|
+
case NATIVE:
|
|
163
|
+
expect(placement.native).to.be.an('object');
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('Returns data with gdprConsent and without uspConsent', function () {
|
|
170
|
+
delete bidderRequest.uspConsent;
|
|
171
|
+
serverRequest = spec.buildRequests(bids, bidderRequest);
|
|
172
|
+
let data = serverRequest.data;
|
|
173
|
+
expect(data.gdpr).to.exist;
|
|
174
|
+
expect(data.gdpr).to.be.a('string');
|
|
175
|
+
expect(data.gdpr).to.equal(bidderRequest.gdprConsent);
|
|
176
|
+
expect(data.ccpa).to.not.exist;
|
|
177
|
+
delete bidderRequest.gdprConsent;
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('Returns data with uspConsent and without gdprConsent', function () {
|
|
181
|
+
bidderRequest.uspConsent = '1---';
|
|
182
|
+
delete bidderRequest.gdprConsent;
|
|
183
|
+
serverRequest = spec.buildRequests(bids, bidderRequest);
|
|
184
|
+
let data = serverRequest.data;
|
|
185
|
+
expect(data.ccpa).to.exist;
|
|
186
|
+
expect(data.ccpa).to.be.a('string');
|
|
187
|
+
expect(data.ccpa).to.equal(bidderRequest.uspConsent);
|
|
188
|
+
expect(data.gdpr).to.not.exist;
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it('Returns empty data if no valid requests are passed', function () {
|
|
192
|
+
serverRequest = spec.buildRequests([], bidderRequest);
|
|
193
|
+
let data = serverRequest.data;
|
|
194
|
+
expect(data.placements).to.be.an('array').that.is.empty;
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
describe('interpretResponse', function () {
|
|
199
|
+
it('Should interpret banner response', function () {
|
|
200
|
+
const banner = {
|
|
201
|
+
body: [{
|
|
202
|
+
mediaType: 'banner',
|
|
203
|
+
width: 300,
|
|
204
|
+
height: 250,
|
|
205
|
+
cpm: 0.4,
|
|
206
|
+
ad: 'Test',
|
|
207
|
+
requestId: '23fhj33i987f',
|
|
208
|
+
ttl: 120,
|
|
209
|
+
creativeId: '2',
|
|
210
|
+
netRevenue: true,
|
|
211
|
+
currency: 'USD',
|
|
212
|
+
dealId: '1',
|
|
213
|
+
meta: {
|
|
214
|
+
advertiserDomains: ['google.com'],
|
|
215
|
+
advertiserId: 1234
|
|
216
|
+
}
|
|
217
|
+
}]
|
|
218
|
+
};
|
|
219
|
+
let bannerResponses = spec.interpretResponse(banner);
|
|
220
|
+
expect(bannerResponses).to.be.an('array').that.is.not.empty;
|
|
221
|
+
let dataItem = bannerResponses[0];
|
|
222
|
+
expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
|
|
223
|
+
'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
|
|
224
|
+
expect(dataItem.requestId).to.equal(banner.body[0].requestId);
|
|
225
|
+
expect(dataItem.cpm).to.equal(banner.body[0].cpm);
|
|
226
|
+
expect(dataItem.width).to.equal(banner.body[0].width);
|
|
227
|
+
expect(dataItem.height).to.equal(banner.body[0].height);
|
|
228
|
+
expect(dataItem.ad).to.equal(banner.body[0].ad);
|
|
229
|
+
expect(dataItem.ttl).to.equal(banner.body[0].ttl);
|
|
230
|
+
expect(dataItem.creativeId).to.equal(banner.body[0].creativeId);
|
|
231
|
+
expect(dataItem.netRevenue).to.be.true;
|
|
232
|
+
expect(dataItem.currency).to.equal(banner.body[0].currency);
|
|
233
|
+
expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
|
|
234
|
+
});
|
|
235
|
+
it('Should interpret video response', function () {
|
|
236
|
+
const video = {
|
|
237
|
+
body: [{
|
|
238
|
+
vastUrl: 'test.com',
|
|
239
|
+
mediaType: 'video',
|
|
240
|
+
cpm: 0.5,
|
|
241
|
+
requestId: '23fhj33i987f',
|
|
242
|
+
ttl: 120,
|
|
243
|
+
creativeId: '2',
|
|
244
|
+
netRevenue: true,
|
|
245
|
+
currency: 'USD',
|
|
246
|
+
dealId: '1',
|
|
247
|
+
meta: {
|
|
248
|
+
advertiserDomains: ['google.com'],
|
|
249
|
+
advertiserId: 1234
|
|
250
|
+
}
|
|
251
|
+
}]
|
|
252
|
+
};
|
|
253
|
+
let videoResponses = spec.interpretResponse(video);
|
|
254
|
+
expect(videoResponses).to.be.an('array').that.is.not.empty;
|
|
255
|
+
|
|
256
|
+
let dataItem = videoResponses[0];
|
|
257
|
+
expect(dataItem).to.have.all.keys('requestId', 'cpm', 'vastUrl', 'ttl', 'creativeId',
|
|
258
|
+
'netRevenue', 'currency', 'dealId', 'mediaType', 'meta');
|
|
259
|
+
expect(dataItem.requestId).to.equal('23fhj33i987f');
|
|
260
|
+
expect(dataItem.cpm).to.equal(0.5);
|
|
261
|
+
expect(dataItem.vastUrl).to.equal('test.com');
|
|
262
|
+
expect(dataItem.ttl).to.equal(120);
|
|
263
|
+
expect(dataItem.creativeId).to.equal('2');
|
|
264
|
+
expect(dataItem.netRevenue).to.be.true;
|
|
265
|
+
expect(dataItem.currency).to.equal('USD');
|
|
266
|
+
expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
|
|
267
|
+
});
|
|
268
|
+
it('Should interpret native response', function () {
|
|
269
|
+
const native = {
|
|
270
|
+
body: [{
|
|
271
|
+
mediaType: 'native',
|
|
272
|
+
native: {
|
|
273
|
+
clickUrl: 'test.com',
|
|
274
|
+
title: 'Test',
|
|
275
|
+
image: 'test.com',
|
|
276
|
+
impressionTrackers: ['test.com'],
|
|
277
|
+
},
|
|
278
|
+
ttl: 120,
|
|
279
|
+
cpm: 0.4,
|
|
280
|
+
requestId: '23fhj33i987f',
|
|
281
|
+
creativeId: '2',
|
|
282
|
+
netRevenue: true,
|
|
283
|
+
currency: 'USD',
|
|
284
|
+
meta: {
|
|
285
|
+
advertiserDomains: ['google.com'],
|
|
286
|
+
advertiserId: 1234
|
|
287
|
+
}
|
|
288
|
+
}]
|
|
289
|
+
};
|
|
290
|
+
let nativeResponses = spec.interpretResponse(native);
|
|
291
|
+
expect(nativeResponses).to.be.an('array').that.is.not.empty;
|
|
292
|
+
|
|
293
|
+
let dataItem = nativeResponses[0];
|
|
294
|
+
expect(dataItem).to.have.keys('requestId', 'cpm', 'ttl', 'creativeId', 'netRevenue', 'currency', 'mediaType', 'native', 'meta');
|
|
295
|
+
expect(dataItem.native).to.have.keys('clickUrl', 'impressionTrackers', 'title', 'image')
|
|
296
|
+
expect(dataItem.requestId).to.equal('23fhj33i987f');
|
|
297
|
+
expect(dataItem.cpm).to.equal(0.4);
|
|
298
|
+
expect(dataItem.native.clickUrl).to.equal('test.com');
|
|
299
|
+
expect(dataItem.native.title).to.equal('Test');
|
|
300
|
+
expect(dataItem.native.image).to.equal('test.com');
|
|
301
|
+
expect(dataItem.native.impressionTrackers).to.be.an('array').that.is.not.empty;
|
|
302
|
+
expect(dataItem.native.impressionTrackers[0]).to.equal('test.com');
|
|
303
|
+
expect(dataItem.ttl).to.equal(120);
|
|
304
|
+
expect(dataItem.creativeId).to.equal('2');
|
|
305
|
+
expect(dataItem.netRevenue).to.be.true;
|
|
306
|
+
expect(dataItem.currency).to.equal('USD');
|
|
307
|
+
expect(dataItem.meta).to.be.an('object').that.has.any.key('advertiserDomains');
|
|
308
|
+
});
|
|
309
|
+
it('Should return an empty array if invalid banner response is passed', function () {
|
|
310
|
+
const invBanner = {
|
|
311
|
+
body: [{
|
|
312
|
+
width: 300,
|
|
313
|
+
cpm: 0.4,
|
|
314
|
+
ad: 'Test',
|
|
315
|
+
requestId: '23fhj33i987f',
|
|
316
|
+
ttl: 120,
|
|
317
|
+
creativeId: '2',
|
|
318
|
+
netRevenue: true,
|
|
319
|
+
currency: 'USD',
|
|
320
|
+
dealId: '1'
|
|
321
|
+
}]
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
let serverResponses = spec.interpretResponse(invBanner);
|
|
325
|
+
expect(serverResponses).to.be.an('array').that.is.empty;
|
|
326
|
+
});
|
|
327
|
+
it('Should return an empty array if invalid video response is passed', function () {
|
|
328
|
+
const invVideo = {
|
|
329
|
+
body: [{
|
|
330
|
+
mediaType: 'video',
|
|
331
|
+
cpm: 0.5,
|
|
332
|
+
requestId: '23fhj33i987f',
|
|
333
|
+
ttl: 120,
|
|
334
|
+
creativeId: '2',
|
|
335
|
+
netRevenue: true,
|
|
336
|
+
currency: 'USD',
|
|
337
|
+
dealId: '1'
|
|
338
|
+
}]
|
|
339
|
+
};
|
|
340
|
+
let serverResponses = spec.interpretResponse(invVideo);
|
|
341
|
+
expect(serverResponses).to.be.an('array').that.is.empty;
|
|
342
|
+
});
|
|
343
|
+
it('Should return an empty array if invalid native response is passed', function () {
|
|
344
|
+
const invNative = {
|
|
345
|
+
body: [{
|
|
346
|
+
mediaType: 'native',
|
|
347
|
+
clickUrl: 'test.com',
|
|
348
|
+
title: 'Test',
|
|
349
|
+
impressionTrackers: ['test.com'],
|
|
350
|
+
ttl: 120,
|
|
351
|
+
requestId: '23fhj33i987f',
|
|
352
|
+
creativeId: '2',
|
|
353
|
+
netRevenue: true,
|
|
354
|
+
currency: 'USD',
|
|
355
|
+
}]
|
|
356
|
+
};
|
|
357
|
+
let serverResponses = spec.interpretResponse(invNative);
|
|
358
|
+
expect(serverResponses).to.be.an('array').that.is.empty;
|
|
359
|
+
});
|
|
360
|
+
it('Should return an empty array if invalid response is passed', function () {
|
|
361
|
+
const invalid = {
|
|
362
|
+
body: [{
|
|
363
|
+
ttl: 120,
|
|
364
|
+
creativeId: '2',
|
|
365
|
+
netRevenue: true,
|
|
366
|
+
currency: 'USD',
|
|
367
|
+
dealId: '1'
|
|
368
|
+
}]
|
|
369
|
+
};
|
|
370
|
+
let serverResponses = spec.interpretResponse(invalid);
|
|
371
|
+
expect(serverResponses).to.be.an('array').that.is.empty;
|
|
372
|
+
});
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
describe('getUserSyncs', function() {
|
|
376
|
+
it('Should return array of objects with proper sync config , include GDPR', function() {
|
|
377
|
+
const syncData = spec.getUserSyncs({}, {}, {
|
|
378
|
+
consentString: 'ALL',
|
|
379
|
+
gdprApplies: true,
|
|
380
|
+
}, {});
|
|
381
|
+
expect(syncData).to.be.an('array').which.is.not.empty;
|
|
382
|
+
expect(syncData[0]).to.be.an('object')
|
|
383
|
+
expect(syncData[0].type).to.be.a('string')
|
|
384
|
+
expect(syncData[0].type).to.equal('image')
|
|
385
|
+
expect(syncData[0].url).to.be.a('string')
|
|
386
|
+
expect(syncData[0].url).to.equal('https://cookies.andbeyond.media/image?pbjs=1&gdpr=1&gdpr_consent=ALL&coppa=0')
|
|
387
|
+
});
|
|
388
|
+
it('Should return array of objects with proper sync config , include CCPA', function() {
|
|
389
|
+
const syncData = spec.getUserSyncs({}, {}, {}, {
|
|
390
|
+
consentString: '1---'
|
|
391
|
+
});
|
|
392
|
+
expect(syncData).to.be.an('array').which.is.not.empty;
|
|
393
|
+
expect(syncData[0]).to.be.an('object')
|
|
394
|
+
expect(syncData[0].type).to.be.a('string')
|
|
395
|
+
expect(syncData[0].type).to.equal('image')
|
|
396
|
+
expect(syncData[0].url).to.be.a('string')
|
|
397
|
+
expect(syncData[0].url).to.equal('https://cookies.andbeyond.media/image?pbjs=1&ccpa_consent=1---&coppa=0')
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
});
|
|
@@ -106,7 +106,8 @@ describe('BidWatch Analytics', function () {
|
|
|
106
106
|
'gdprConsent': {
|
|
107
107
|
'consentString': 'CONSENT',
|
|
108
108
|
'gdprApplies': true,
|
|
109
|
-
'apiVersion': 2
|
|
109
|
+
'apiVersion': 2,
|
|
110
|
+
'vendorData': 'a lot of borring stuff',
|
|
110
111
|
},
|
|
111
112
|
'start': 1647424261189
|
|
112
113
|
},
|
|
@@ -281,7 +282,22 @@ describe('BidWatch Analytics', function () {
|
|
|
281
282
|
});
|
|
282
283
|
events.emit(constants.EVENTS.BID_TIMEOUT, bidTimeout);
|
|
283
284
|
events.emit(constants.EVENTS.AUCTION_END, auctionEnd);
|
|
285
|
+
expect(server.requests.length).to.equal(1);
|
|
286
|
+
let message = JSON.parse(server.requests[0].requestBody);
|
|
287
|
+
expect(message).to.have.property('auctionEnd').exist;
|
|
288
|
+
expect(message.auctionEnd).to.have.lengthOf(1);
|
|
289
|
+
expect(message.auctionEnd[0]).to.have.property('bidsReceived').and.to.have.lengthOf(1);
|
|
290
|
+
expect(message.auctionEnd[0].bidsReceived[0]).to.have.property('ad');
|
|
291
|
+
expect(message.auctionEnd[0].bidsReceived[0].ad).to.equal('emptied');
|
|
292
|
+
expect(message.auctionEnd[0]).to.have.property('bidderRequests').and.to.have.lengthOf(1);
|
|
293
|
+
expect(message.auctionEnd[0].bidderRequests[0]).to.have.property('gdprConsent');
|
|
294
|
+
expect(message.auctionEnd[0].bidderRequests[0].gdprConsent).to.have.property('vendorData');
|
|
295
|
+
expect(message.auctionEnd[0].bidderRequests[0].gdprConsent.vendorData).to.equal('emptied');
|
|
284
296
|
events.emit(constants.EVENTS.BID_WON, bidWon);
|
|
297
|
+
expect(server.requests.length).to.equal(2);
|
|
298
|
+
message = JSON.parse(server.requests[1].requestBody);
|
|
299
|
+
expect(message).to.have.property('ad').and.to.equal('emptied');
|
|
300
|
+
expect(message).to.have.property('cpmIncrement').and.to.equal(27.4276);
|
|
285
301
|
sinon.assert.callCount(bidwatchAnalytics.track, 3);
|
|
286
302
|
});
|
|
287
303
|
});
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { newBidder } from 'src/adapters/bidderFactory';
|
|
3
|
+
import { c1xAdapter } from '../../../modules/c1xBidAdapter.js';
|
|
4
|
+
|
|
5
|
+
const ENDPOINT = 'https://hb-stg.c1exchange.com/ht';
|
|
6
|
+
const BIDDER_CODE = 'c1x';
|
|
7
|
+
|
|
8
|
+
describe('C1XAdapter', () => {
|
|
9
|
+
const adapter = newBidder(c1xAdapter);
|
|
10
|
+
describe('inherited functions', () => {
|
|
11
|
+
it('exists and is a function', () => {
|
|
12
|
+
expect(adapter.callBids).to.exist.and.to.be.a('function');
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
describe('isBidRequestValid', () => {
|
|
16
|
+
let bid = {
|
|
17
|
+
'bidder': BIDDER_CODE,
|
|
18
|
+
'adUnitCode': 'adunit-code',
|
|
19
|
+
'sizes': [[300, 250], [300, 600]],
|
|
20
|
+
'params': {
|
|
21
|
+
'placementId': 'div-gpt-ad-1654594619717-0'
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
it('should return true when required params found', function () {
|
|
25
|
+
expect(c1xAdapter.isBidRequestValid(bid)).to.equal(true);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('should return false when placementId not passed correctly', function () {
|
|
29
|
+
bid.params.placementId = undefined;
|
|
30
|
+
expect(c1xAdapter.isBidRequestValid(bid)).to.equal(false);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('should return false when require params are not passed', function () {
|
|
34
|
+
let bid = Object.assign({}, bid);
|
|
35
|
+
bid.params = {};
|
|
36
|
+
expect(c1xAdapter.isBidRequestValid(bid)).to.equal(false);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe('buildRequests', () => {
|
|
40
|
+
let bidRequests = [
|
|
41
|
+
{
|
|
42
|
+
'bidder': BIDDER_CODE,
|
|
43
|
+
'params': {
|
|
44
|
+
'placementId': 'div-gpt-ad-1654594619717-0',
|
|
45
|
+
'dealId': '1233'
|
|
46
|
+
},
|
|
47
|
+
'mediaTypes': {
|
|
48
|
+
'banner': {
|
|
49
|
+
'sizes': [
|
|
50
|
+
[300, 250], [300, 600]
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
'adUnitCode': 'adunit-code',
|
|
55
|
+
'sizes': [[300, 250], [300, 600]],
|
|
56
|
+
'bidId': '30b31c1838de1e',
|
|
57
|
+
'bidderRequestId': '22edbae2733bf6',
|
|
58
|
+
'auctionId': '1d1a030790a475',
|
|
59
|
+
}
|
|
60
|
+
];
|
|
61
|
+
const parseRequest = (data) => {
|
|
62
|
+
const parsedData = '{"' + data.replace(/=|&/g, (foundChar) => {
|
|
63
|
+
if (foundChar == '=') return '":"';
|
|
64
|
+
else if (foundChar == '&') return '","';
|
|
65
|
+
}) + '"}'
|
|
66
|
+
return parsedData;
|
|
67
|
+
};
|
|
68
|
+
it('sends bid request to ENDPOINT via GET', () => {
|
|
69
|
+
const request = c1xAdapter.buildRequests(bidRequests);
|
|
70
|
+
expect(request[0].url).to.contain(ENDPOINT);
|
|
71
|
+
expect(request[0].method).to.equal('GET');
|
|
72
|
+
});
|
|
73
|
+
it('should generate correct bid Id tag', () => {
|
|
74
|
+
const request = c1xAdapter.buildRequests(bidRequests)[0];
|
|
75
|
+
expect(request.bids[0].adUnitCode).to.equal('adunit-code');
|
|
76
|
+
expect(request.bids[0].bidId).to.equal('30b31c1838de1e');
|
|
77
|
+
});
|
|
78
|
+
it('should convert params to proper form and attach to request', () => {
|
|
79
|
+
const request = c1xAdapter.buildRequests(bidRequests)[0];
|
|
80
|
+
const originalPayload = parseRequest(request.data);
|
|
81
|
+
const payloadObj = JSON.parse(originalPayload);
|
|
82
|
+
expect(payloadObj.adunits).to.equal('1');
|
|
83
|
+
expect(payloadObj.a1s).to.equal('300x250,300x600');
|
|
84
|
+
expect(payloadObj.a1).to.equal('adunit-code');
|
|
85
|
+
expect(payloadObj.a1d).to.equal('1233');
|
|
86
|
+
});
|
|
87
|
+
it('should convert floor price to proper form and attach to request', () => {
|
|
88
|
+
let bidRequest = Object.assign({},
|
|
89
|
+
bidRequests[0],
|
|
90
|
+
{
|
|
91
|
+
'params': {
|
|
92
|
+
'placementId': 'div-gpt-ad-1654594619717-0',
|
|
93
|
+
'dealId': '1233',
|
|
94
|
+
'floorPriceMap': {
|
|
95
|
+
'300x250': 4.35
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
const request = c1xAdapter.buildRequests([bidRequest])[0];
|
|
100
|
+
const originalPayload = parseRequest(request.data);
|
|
101
|
+
const payloadObj = JSON.parse(originalPayload);
|
|
102
|
+
expect(payloadObj.a1p).to.equal('4.35');
|
|
103
|
+
});
|
|
104
|
+
it('should convert pageurl to proper form and attach to request', () => {
|
|
105
|
+
let bidRequest = Object.assign({},
|
|
106
|
+
bidRequests[0],
|
|
107
|
+
{
|
|
108
|
+
'params': {
|
|
109
|
+
'placementId': 'div-gpt-ad-1654594619717-0',
|
|
110
|
+
'dealId': '1233',
|
|
111
|
+
'pageurl': 'http://c1exchange.com/'
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
let bidderRequest = {
|
|
116
|
+
'bidderCode': 'c1x'
|
|
117
|
+
}
|
|
118
|
+
bidderRequest.bids = bidRequests;
|
|
119
|
+
const request = c1xAdapter.buildRequests([bidRequest], bidderRequest)[0];
|
|
120
|
+
const originalPayload = parseRequest(request.data);
|
|
121
|
+
const payloadObj = JSON.parse(originalPayload);
|
|
122
|
+
expect(payloadObj.pageurl).to.equal('http://c1exchange.com/');
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('should convert GDPR Consent to proper form and attach to request', () => {
|
|
126
|
+
let consentString = 'BOP2gFWOQIFovABABAENBGAAAAAAMw';
|
|
127
|
+
let bidderRequest = {
|
|
128
|
+
'bidderCode': 'c1x',
|
|
129
|
+
'gdprConsent': {
|
|
130
|
+
'consentString': consentString,
|
|
131
|
+
'gdprApplies': true
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
bidderRequest.bids = bidRequests;
|
|
135
|
+
|
|
136
|
+
const request = c1xAdapter.buildRequests(bidRequests, bidderRequest)[0];
|
|
137
|
+
const originalPayload = parseRequest(request.data);
|
|
138
|
+
const payloadObj = JSON.parse(originalPayload);
|
|
139
|
+
expect(payloadObj['consent_string']).to.equal('BOP2gFWOQIFovABABAENBGAAAAAAMw');
|
|
140
|
+
expect(payloadObj['consent_required']).to.equal('true');
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
describe('interpretResponse', () => {
|
|
145
|
+
let response = {
|
|
146
|
+
'bid': true,
|
|
147
|
+
'cpm': 1.5,
|
|
148
|
+
'ad': '<!-- Creative -->',
|
|
149
|
+
'width': 300,
|
|
150
|
+
'height': 250,
|
|
151
|
+
'crid': '8888',
|
|
152
|
+
'adId': 'c1x-test',
|
|
153
|
+
'bidType': 'GROSS_BID'
|
|
154
|
+
};
|
|
155
|
+
it('should get correct bid response', () => {
|
|
156
|
+
let expectedResponse = [
|
|
157
|
+
{
|
|
158
|
+
width: 300,
|
|
159
|
+
height: 250,
|
|
160
|
+
cpm: 1.5,
|
|
161
|
+
ad: '<!-- Creative -->',
|
|
162
|
+
creativeId: '8888',
|
|
163
|
+
currency: 'USD',
|
|
164
|
+
ttl: 300,
|
|
165
|
+
netRevenue: false,
|
|
166
|
+
requestId: 'yyyy'
|
|
167
|
+
}
|
|
168
|
+
];
|
|
169
|
+
let bidderRequest = {};
|
|
170
|
+
bidderRequest.bids = [
|
|
171
|
+
{
|
|
172
|
+
adUnitCode: 'c1x-test',
|
|
173
|
+
bidId: 'yyyy'
|
|
174
|
+
}
|
|
175
|
+
];
|
|
176
|
+
let result = c1xAdapter.interpretResponse({ body: [response] }, bidderRequest);
|
|
177
|
+
expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
|
|
178
|
+
});
|
|
179
|
+
it('handles nobid responses', () => {
|
|
180
|
+
let response = {
|
|
181
|
+
bid: false,
|
|
182
|
+
adId: 'c1x-test'
|
|
183
|
+
};
|
|
184
|
+
let bidderRequest = {};
|
|
185
|
+
let result = c1xAdapter.interpretResponse({ body: [response] }, bidderRequest);
|
|
186
|
+
expect(result.length).to.equal(0);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
});
|
|
@@ -248,7 +248,7 @@ describe('Improve Digital Adapter Tests', function () {
|
|
|
248
248
|
{
|
|
249
249
|
id: '33e9500b21129f',
|
|
250
250
|
native: {
|
|
251
|
-
request: '{"assets":[{"id":3,"required":1,"data":{"type":2}}]}',
|
|
251
|
+
request: '{"eventtrackers":[{"event":1,"methods":[1,2]}],"assets":[{"id":3,"required":1,"data":{"type":2}}]}',
|
|
252
252
|
ver: '1.2'
|
|
253
253
|
},
|
|
254
254
|
secure: 0,
|
|
@@ -277,7 +277,7 @@ describe('Improve Digital Adapter Tests', function () {
|
|
|
277
277
|
const payload = JSON.parse(spec.buildRequests([nativeBidRequest], {})[0].data);
|
|
278
278
|
expect(payload.imp[0].native).to.deep.equal({
|
|
279
279
|
ver: '1.2',
|
|
280
|
-
request: '{
|
|
280
|
+
request: '{"eventtrackers":[{"event":1,"methods":[1,2]}],"assets":[{"id":0,"required":1,"title":{"len":140}},{"id":3,"required":1,"data":{"type":2}}]}'
|
|
281
281
|
});
|
|
282
282
|
});
|
|
283
283
|
|
|
@@ -299,7 +299,7 @@ describe('Improve Digital Adapter Tests', function () {
|
|
|
299
299
|
const payload = JSON.parse(spec.buildRequests([nativeBidRequest], {})[0].data);
|
|
300
300
|
expect(payload.imp[0].native).to.deep.equal({
|
|
301
301
|
ver: '1.2',
|
|
302
|
-
request: '{
|
|
302
|
+
request: '{"eventtrackers":[{"event":1,"methods":[1,2]}],"assets":[{"id":0,"required":1,"title":{"len":140}},{"id":3,"required":1,"data":{"type":2}}]}'
|
|
303
303
|
});
|
|
304
304
|
});
|
|
305
305
|
|
|
@@ -930,7 +930,7 @@ describe('Improve Digital Adapter Tests', function () {
|
|
|
930
930
|
'exp': 120,
|
|
931
931
|
'id': '52098fad-20c1-476b-a4fa-41e275e5a4a5',
|
|
932
932
|
'price': 1.8600000000000003,
|
|
933
|
-
'adm':
|
|
933
|
+
'adm': '{"ver":"1.1","imptrackers":["https://secure.adnxs.com/imptr?id=52311&t=2","https://euw-ice.360yield.com/imp_pixel?ic=hcUBlCANx1FabHBf6FR2gC7UO4xEyXahdZAn0-B5qL-bb3A74BJ1smyWIyW7IWcC0SOjSXzVpevTHXxTqJ.sf.Qhahyy6tSo.0j1QWfXlH8sM4-8vKWjMjw-x.IrJJNlwkQ0s1CdwcwTefcLXm5l2E-W19VhACuV7f3mgrZMNjiSw.SjJAfyPC3SIyAMRjYfj53UmjriQ46T7lhmkqxK8wHmksYCdbZc3PZESk8NWl28sxdjNvnYYCFMcJbeav.LOLabyTXfwy-1cEPbQs.IKMRZIKaqccTDPV3wOtzbNv0jQzatd3Nnv-PGFQcjQ-GW3i27W04Fws4kodpFSn-B6VwZAjzLzoyd5gBncyRnAyCplEbgHU5sZ1IyKHWjgCl3ZtRIK5vqrRD5D-xqgSnOi7-phG.CqZWDZ4bMDSfQg2ZnbvUTyGKcEl0WR59dW5izTMV4Fjizcrvr5T-t.zMbGwz.hGnmLIyhTqh.IcwW.GiDLVExlDlix5S1LXIWVsSyrQ=="],"assets":[{"id":1,"data":{"value":"ImproveDigital","type":1}},{"id":3,"data":{"value":"Test content.","type":2}},{"id":0,"title":{"text":"Sample Prebid Test Title"}}],"link":{"url":"https://euw-ice.360yield.com/click/hcUBlHOV7YhVse8RyBa0ajjyPa9Vt17e4g-1m3cRj3E67vq-RYux.SiUeAmBfNBcoOqkUc6A15AWmi4yFu5K-BdkaYjildyyk7fNLyR6hWr411kv4vrFwm5jrIBceuHS6K8oN69f.uCo8zGTdR2TbSlldwcpahQPlufZU.6VaMsu4IC53uEiUT5vb7kAw6TTlxuGBNq6zaGryiWEV2.N3YYJDTyYPh8tv-ZFyeFZFm0Gnjv.xWbC.70JcRUVU9UelQaPsTpTWYTXBhJt84YJUw1-GNtaLNVLSjjZbVoA2fsMti5p6OBmF.7u39on2OPgvseIkSmge7Pqg63pRqdP75hp.DAEk6OkcN1jGnwP2DSbvpaSbin5lVqjfO0B-wnQgfQTCUtM5v4JmkNweLhUf9Q-x.nPKLW5SccEk9ZFXzY2-1wpT3PWm8Tix3NRscLPZub9wHzL..pl6ip8cQ9hp16UjwT4H6RMAxL0R7bl-h2pAicGAzYmuO7ntRESKUoIWA==//http%3A%2F%2Fquantum-advertising.com%2Ffr%2F"},"jstracker":"<script type=\\"application/javascript\\">var js_tracker = [\\"https://secure.adnxs.com/imptr?id=52312&t=1\\", \\"https://pixel.adsafeprotected.com/rjss/st/291611/36974035/skeleton.js?ias_adpath=[class~=ea_improve_pid_${TAG_ID}]\\"]</script>"}',
|
|
934
934
|
'impid': '33e9500b21129f',
|
|
935
935
|
'cid': '196108'
|
|
936
936
|
}
|