prebid.js 7.48.0 → 7.49.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/README.md +3 -0
- 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/admixerBidAdapter.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/aidemBidAdapter.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/bidglassBidAdapter.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/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/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/glimpseBidAdapter.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/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/kargoBidAdapter.js +1 -1
- 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/liveyieldAnalyticsAdapter.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/minutemediaBidAdapter.js +1 -1
- package/dist/minutemediaplusBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +129 -128
- 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/parrableIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.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 -0
- 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/stvBidAdapter.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/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/yieldlabBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/modules/adgenerationBidAdapter.js +24 -15
- package/modules/admixerBidAdapter.js +15 -9
- package/modules/aidemBidAdapter.js +3 -1
- package/modules/ixBidAdapter.js +65 -47
- package/modules/kueezRtbBidAdapter.js +30 -33
- package/modules/mgidBidAdapter.js +9 -8
- package/modules/minutemediaBidAdapter.js +6 -0
- package/modules/minutemediaplusBidAdapter.js +30 -32
- package/modules/nexx360BidAdapter.js +2 -1
- package/modules/prebidServerBidAdapter/index.js +1 -3
- package/modules/prebidServerBidAdapter/ortbConverter.js +5 -1
- package/modules/pubmaticAnalyticsAdapter.js +3 -2
- package/modules/retailspotBidAdapter .md +32 -0
- package/modules/retailspotBidAdapter.js +186 -0
- package/modules/riseBidAdapter.js +6 -0
- package/modules/ttdBidAdapter.js +23 -22
- package/modules/vidazooBidAdapter.js +28 -32
- package/modules/yieldlabBidAdapter.js +27 -5
- package/package.json +1 -1
- package/src/adapterManager.js +4 -0
- package/src/adapters/bidderFactory.js +1 -0
- package/src/auction.js +2 -0
- package/src/prebid.js +36 -12
- package/src/utils/cpm.js +4 -1
- package/test/spec/modules/adgenerationBidAdapter_spec.js +6 -6
- package/test/spec/modules/admixerBidAdapter_spec.js +64 -25
- package/test/spec/modules/aidemBidAdapter_spec.js +3 -0
- package/test/spec/modules/ixBidAdapter_spec.js +66 -1
- package/test/spec/modules/kueezRtbBidAdapter_spec.js +3 -2
- package/test/spec/modules/mgidBidAdapter_spec.js +9 -9
- package/test/spec/modules/minutemediaBidAdapter_spec.js +18 -0
- package/test/spec/modules/minutemediaplusBidAdapter_spec.js +3 -2
- package/test/spec/modules/prebidServerBidAdapter_spec.js +96 -1
- package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +6 -1
- package/test/spec/modules/retailspotBidAdapter_spec.js +426 -0
- package/test/spec/modules/riseBidAdapter_spec.js +18 -0
- package/test/spec/modules/ttdBidAdapter_spec.js +129 -2
- package/test/spec/modules/vidazooBidAdapter_spec.js +3 -2
- package/test/spec/modules/yieldlabBidAdapter_spec.js +8 -1
- package/test/spec/unit/core/bidderFactory_spec.js +9 -9
- package/test/spec/unit/pbjs_api_spec.js +59 -1
- package/test/spec/unit/utils/cpm_spec.js +56 -1
|
@@ -184,13 +184,12 @@ export const spec = {
|
|
|
184
184
|
|
|
185
185
|
if (isNative(bidRequest, adType)) {
|
|
186
186
|
// there may be publishers still rely on it
|
|
187
|
-
|
|
188
|
-
bidResponse.adUrl = url;
|
|
187
|
+
bidResponse.adUrl = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}`;
|
|
189
188
|
bidResponse.mediaType = NATIVE;
|
|
190
|
-
const nativeImageAssetObj = find(matchedBid.native.assets,
|
|
189
|
+
const nativeImageAssetObj = find(matchedBid.native.assets, asset => isMainImage(asset));
|
|
191
190
|
const nativeImageAsset = nativeImageAssetObj ? nativeImageAssetObj.img : { url: '', w: 0, h: 0 };
|
|
192
|
-
const nativeTitleAsset = find(matchedBid.native.assets,
|
|
193
|
-
const nativeBodyAsset = find(matchedBid.native.assets,
|
|
191
|
+
const nativeTitleAsset = find(matchedBid.native.assets, asset => hasValidProperty(asset, 'title'));
|
|
192
|
+
const nativeBodyAsset = find(matchedBid.native.assets, asset => hasValidProperty(asset, 'data'));
|
|
194
193
|
bidResponse.native = {
|
|
195
194
|
title: nativeTitleAsset ? nativeTitleAsset.title.text : '',
|
|
196
195
|
body: nativeBodyAsset ? nativeBodyAsset.data.value : '',
|
|
@@ -201,6 +200,7 @@ export const spec = {
|
|
|
201
200
|
},
|
|
202
201
|
clickUrl: matchedBid.native.link.url,
|
|
203
202
|
impressionTrackers: matchedBid.native.imptrackers,
|
|
203
|
+
assets: matchedBid.native.assets,
|
|
204
204
|
};
|
|
205
205
|
}
|
|
206
206
|
|
|
@@ -505,4 +505,26 @@ function getBidFloor(bid, sizes) {
|
|
|
505
505
|
return undefined;
|
|
506
506
|
}
|
|
507
507
|
|
|
508
|
+
/**
|
|
509
|
+
* Checks if an object has a property with a given name and the property value is not null or undefined.
|
|
510
|
+
*
|
|
511
|
+
* @param {Object} obj - The object to check.
|
|
512
|
+
* @param {string} propName - The name of the property to check.
|
|
513
|
+
* @returns {boolean} Returns true if the object has a property with the given name and the property value is not null or undefined, otherwise false.
|
|
514
|
+
*/
|
|
515
|
+
function hasValidProperty(obj, propName) {
|
|
516
|
+
return obj.hasOwnProperty(propName) && obj[propName] != null;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/**
|
|
520
|
+
* Checks if an asset object is a main image.
|
|
521
|
+
* A main image is defined as an image asset whose type value is 3.
|
|
522
|
+
*
|
|
523
|
+
* @param {Object} asset - The asset object to check.
|
|
524
|
+
* @returns {boolean} Returns true if the object has a property img.type with a value of 3, otherwise false.
|
|
525
|
+
*/
|
|
526
|
+
function isMainImage(asset) {
|
|
527
|
+
return asset?.img?.type === 3
|
|
528
|
+
}
|
|
529
|
+
|
|
508
530
|
registerBidder(spec);
|
package/package.json
CHANGED
package/src/adapterManager.js
CHANGED
|
@@ -612,6 +612,10 @@ adapterManager.callBidWonBidder = function(bidder, bid, adUnits) {
|
|
|
612
612
|
tryCallBidderMethod(bidder, 'onBidWon', bid);
|
|
613
613
|
};
|
|
614
614
|
|
|
615
|
+
adapterManager.callBidBillableBidder = function(bid) {
|
|
616
|
+
tryCallBidderMethod(bid.bidder, 'onBidBillable', bid);
|
|
617
|
+
};
|
|
618
|
+
|
|
615
619
|
adapterManager.callSetTargetingBidder = function(bidder, bid) {
|
|
616
620
|
tryCallBidderMethod(bidder, 'onSetTargeting', bid);
|
|
617
621
|
};
|
package/src/auction.js
CHANGED
|
@@ -367,8 +367,10 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a
|
|
|
367
367
|
}
|
|
368
368
|
|
|
369
369
|
function addWinningBid(winningBid) {
|
|
370
|
+
const winningAd = adUnits.find(adUnit => adUnit.transactionId === winningBid.transactionId);
|
|
370
371
|
_winningBids = _winningBids.concat(winningBid);
|
|
371
372
|
adapterManager.callBidWonBidder(winningBid.adapterCode || winningBid.bidder, winningBid, adUnits);
|
|
373
|
+
if (winningAd && !winningAd.deferBilling) adapterManager.callBidBillableBidder(winningBid);
|
|
372
374
|
}
|
|
373
375
|
|
|
374
376
|
function setBidTargeting(bid) {
|
package/src/prebid.js
CHANGED
|
@@ -1001,18 +1001,7 @@ if (FEATURES.VIDEO) {
|
|
|
1001
1001
|
* @alias module:pbjs.markWinningBidAsUsed
|
|
1002
1002
|
*/
|
|
1003
1003
|
pbjsInstance.markWinningBidAsUsed = function (markBidRequest) {
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
if (markBidRequest.adUnitCode && markBidRequest.adId) {
|
|
1007
|
-
bids = auctionManager.getBidsReceived()
|
|
1008
|
-
.filter(bid => bid.adId === markBidRequest.adId && bid.adUnitCode === markBidRequest.adUnitCode);
|
|
1009
|
-
} else if (markBidRequest.adUnitCode) {
|
|
1010
|
-
bids = targeting.getWinningBids(markBidRequest.adUnitCode);
|
|
1011
|
-
} else if (markBidRequest.adId) {
|
|
1012
|
-
bids = auctionManager.getBidsReceived().filter(bid => bid.adId === markBidRequest.adId);
|
|
1013
|
-
} else {
|
|
1014
|
-
logWarn('Improper use of markWinningBidAsUsed. It needs an adUnitCode or an adId to function.');
|
|
1015
|
-
}
|
|
1004
|
+
const bids = fetchReceivedBids(markBidRequest, 'Improper use of markWinningBidAsUsed. It needs an adUnitCode or an adId to function.');
|
|
1016
1005
|
|
|
1017
1006
|
if (bids.length > 0) {
|
|
1018
1007
|
bids[0].status = CONSTANTS.BID_STATUS.RENDERED;
|
|
@@ -1020,6 +1009,23 @@ if (FEATURES.VIDEO) {
|
|
|
1020
1009
|
}
|
|
1021
1010
|
}
|
|
1022
1011
|
|
|
1012
|
+
const fetchReceivedBids = (bidRequest, warningMessage) => {
|
|
1013
|
+
let bids = [];
|
|
1014
|
+
|
|
1015
|
+
if (bidRequest.adUnitCode && bidRequest.adId) {
|
|
1016
|
+
bids = auctionManager.getBidsReceived()
|
|
1017
|
+
.filter(bid => bid.adId === bidRequest.adId && bid.adUnitCode === bidRequest.adUnitCode);
|
|
1018
|
+
} else if (bidRequest.adUnitCode) {
|
|
1019
|
+
bids = targeting.getWinningBids(bidRequest.adUnitCode);
|
|
1020
|
+
} else if (bidRequest.adId) {
|
|
1021
|
+
bids = auctionManager.getBidsReceived().filter(bid => bid.adId === bidRequest.adId);
|
|
1022
|
+
} else {
|
|
1023
|
+
logWarn(warningMessage);
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
return bids;
|
|
1027
|
+
};
|
|
1028
|
+
|
|
1023
1029
|
/**
|
|
1024
1030
|
* Get Prebid config options
|
|
1025
1031
|
* @param {Object} options
|
|
@@ -1097,4 +1103,22 @@ pbjsInstance.processQueue = function () {
|
|
|
1097
1103
|
processQueue(pbjsInstance.cmd);
|
|
1098
1104
|
};
|
|
1099
1105
|
|
|
1106
|
+
/**
|
|
1107
|
+
* @alias module:pbjs.triggerBilling
|
|
1108
|
+
*/
|
|
1109
|
+
pbjsInstance.triggerBilling = (winningBid) => {
|
|
1110
|
+
const bids = fetchReceivedBids(winningBid, 'Improper use of triggerBilling. It requires a bid with at least an adUnitCode or an adId to function.');
|
|
1111
|
+
const triggerBillingBid = bids.find(bid => bid.requestId === winningBid.requestId) || bids[0];
|
|
1112
|
+
|
|
1113
|
+
if (bids.length > 0 && triggerBillingBid) {
|
|
1114
|
+
try {
|
|
1115
|
+
adapterManager.callBidBillableBidder(triggerBillingBid);
|
|
1116
|
+
} catch (e) {
|
|
1117
|
+
logError('Error when triggering billing :', e);
|
|
1118
|
+
}
|
|
1119
|
+
} else {
|
|
1120
|
+
logWarn('The bid provided to triggerBilling did not match any bids received.');
|
|
1121
|
+
}
|
|
1122
|
+
};
|
|
1123
|
+
|
|
1100
1124
|
export default pbjsInstance;
|
package/src/utils/cpm.js
CHANGED
|
@@ -4,7 +4,10 @@ import {logError} from '../utils.js';
|
|
|
4
4
|
|
|
5
5
|
export function adjustCpm(cpm, bidResponse, bidRequest, {index = auctionManager.index, bs = bidderSettings} = {}) {
|
|
6
6
|
bidRequest = bidRequest || index.getBidRequest(bidResponse);
|
|
7
|
-
const
|
|
7
|
+
const adapterCode = bidResponse?.adapterCode;
|
|
8
|
+
const bidderCode = bidResponse?.bidderCode || bidRequest?.bidder;
|
|
9
|
+
const adjustAlternateBids = bs.get(bidResponse?.adapterCode, 'adjustAlternateBids');
|
|
10
|
+
const bidCpmAdjustment = bs.getOwn(bidderCode, 'bidCpmAdjustment') || bs.get(adjustAlternateBids ? adapterCode : bidderCode, 'bidCpmAdjustment');
|
|
8
11
|
|
|
9
12
|
if (bidCpmAdjustment && typeof bidCpmAdjustment === 'function') {
|
|
10
13
|
try {
|
|
@@ -144,12 +144,12 @@ describe('AdgenerationAdapter', function () {
|
|
|
144
144
|
}
|
|
145
145
|
};
|
|
146
146
|
const data = {
|
|
147
|
-
banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
148
|
-
bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
149
|
-
native: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
150
|
-
bannerWithHyperId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
151
|
-
bannerWithAdgextCriteoId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
152
|
-
bannerWithAdgextId5Id: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.
|
|
147
|
+
banner: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&imark=1&tp=https%3A%2F%2Fexample.com`,
|
|
148
|
+
bannerUSD: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=300x250%2C320x100¤cy=USD&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&imark=1&tp=https%3A%2F%2Fexample.com`,
|
|
149
|
+
native: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=1x1¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&tp=https%3A%2F%2Fexample.com`,
|
|
150
|
+
bannerWithHyperId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&imark=1&tp=https%3A%2F%2Fexample.com&hyper_id=novatiqId`,
|
|
151
|
+
bannerWithAdgextCriteoId: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&adgext_criteo_id=criteo-id-test-1234567890&imark=1&tp=https%3A%2F%2Fexample.com`,
|
|
152
|
+
bannerWithAdgextId5Id: `posall=SSPLOC&id=58278&sdktype=0&hb=true&t=json3&sizes=320x100¤cy=JPY&pbver=${prebid.version}&sdkname=prebidjs&adapterver=1.5.0&adgext_id5_id=id5-id-test-1234567890&adgext_id5_id_link_type=2&imark=1&tp=https%3A%2F%2Fexample.com`,
|
|
153
153
|
};
|
|
154
154
|
it('sends bid request to ENDPOINT via GET', function () {
|
|
155
155
|
const request = spec.buildRequests(bidRequests, bidderRequest)[0];
|
|
@@ -100,33 +100,72 @@ describe('AdmixerAdapter', function () {
|
|
|
100
100
|
});
|
|
101
101
|
});
|
|
102
102
|
|
|
103
|
-
describe('
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
103
|
+
describe('buildRequests URL check', function () {
|
|
104
|
+
const requestParamsFor = (bidder) => ({
|
|
105
|
+
validRequest: [
|
|
106
|
+
{
|
|
107
|
+
bidder: bidder,
|
|
108
|
+
params: {
|
|
109
|
+
zone: ZONE_ID,
|
|
110
|
+
},
|
|
111
|
+
adUnitCode: 'adunit-code',
|
|
112
|
+
sizes: [
|
|
113
|
+
[300, 250],
|
|
114
|
+
[300, 600],
|
|
115
|
+
],
|
|
116
|
+
bidId: '30b31c1838de1e',
|
|
117
|
+
bidderRequestId: '22edbae2733bf6',
|
|
118
|
+
auctionId: '1d1a030790a475',
|
|
109
119
|
},
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
},
|
|
119
|
-
];
|
|
120
|
-
let bidderRequest = {
|
|
121
|
-
bidderCode: BIDDER_CODE_ADX,
|
|
122
|
-
refererInfo: {
|
|
123
|
-
page: 'https://example.com',
|
|
124
|
-
},
|
|
125
|
-
};
|
|
120
|
+
],
|
|
121
|
+
bidderRequest: {
|
|
122
|
+
bidderCode: bidder,
|
|
123
|
+
refererInfo: {
|
|
124
|
+
page: 'https://example.com',
|
|
125
|
+
},
|
|
126
|
+
}
|
|
127
|
+
})
|
|
126
128
|
|
|
127
|
-
it('
|
|
128
|
-
const
|
|
129
|
-
|
|
129
|
+
it('build request for admixer', function () {
|
|
130
|
+
const requestParams = requestParamsFor('admixer');
|
|
131
|
+
const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
|
|
132
|
+
expect(request.url).to.equal('https://inv-nets.admixer.net/prebid.1.2.aspx');
|
|
133
|
+
expect(request.method).to.equal('POST');
|
|
134
|
+
});
|
|
135
|
+
it('build request for go2net', function () {
|
|
136
|
+
const requestParams = requestParamsFor('go2net');
|
|
137
|
+
const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
|
|
138
|
+
expect(request.url).to.equal('https://ads.go2net.com.ua/prebid.1.2.aspx');
|
|
139
|
+
expect(request.method).to.equal('POST');
|
|
140
|
+
});
|
|
141
|
+
it('build request for adblender', function () {
|
|
142
|
+
const requestParams = requestParamsFor('adblender');
|
|
143
|
+
const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
|
|
144
|
+
expect(request.url).to.equal('https://inv-nets.admixer.net/prebid.1.2.aspx');
|
|
145
|
+
expect(request.method).to.equal('POST');
|
|
146
|
+
});
|
|
147
|
+
it('build request for adsyield', function () {
|
|
148
|
+
const requestParams = requestParamsFor('adsyield');
|
|
149
|
+
const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
|
|
150
|
+
expect(request.url).to.equal('https://ads.adsyield.com/prebid.1.2.aspx');
|
|
151
|
+
expect(request.method).to.equal('POST');
|
|
152
|
+
});
|
|
153
|
+
it('build request for futureads', function () {
|
|
154
|
+
const requestParams = requestParamsFor('futureads');
|
|
155
|
+
const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
|
|
156
|
+
expect(request.url).to.equal('https://ads.futureads.io/prebid.1.2.aspx');
|
|
157
|
+
expect(request.method).to.equal('POST');
|
|
158
|
+
});
|
|
159
|
+
it('build request for smn', function () {
|
|
160
|
+
const requestParams = requestParamsFor('smn');
|
|
161
|
+
const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
|
|
162
|
+
expect(request.url).to.equal('https://ads.smn.rs/prebid.1.2.aspx');
|
|
163
|
+
expect(request.method).to.equal('POST');
|
|
164
|
+
});
|
|
165
|
+
it('build request for admixeradx', function () {
|
|
166
|
+
const requestParams = requestParamsFor('admixeradx');
|
|
167
|
+
const request = spec.buildRequests(requestParams.validRequest, requestParams.bidderRequest);
|
|
168
|
+
expect(request.url).to.equal('https://inv-nets.admixer.net/adxprebid.1.2.aspx');
|
|
130
169
|
expect(request.method).to.equal('POST');
|
|
131
170
|
});
|
|
132
171
|
});
|
|
@@ -725,6 +725,11 @@ describe('IndexexchangeAdapter', function () {
|
|
|
725
725
|
refererInfo: {
|
|
726
726
|
page: 'https://www.prebid.org',
|
|
727
727
|
canonicalUrl: 'https://www.prebid.org/the/link/to/the/page'
|
|
728
|
+
},
|
|
729
|
+
ortb2: {
|
|
730
|
+
site: {
|
|
731
|
+
page: 'https://www.prebid.org'
|
|
732
|
+
}
|
|
728
733
|
}
|
|
729
734
|
};
|
|
730
735
|
|
|
@@ -2135,7 +2140,7 @@ describe('IndexexchangeAdapter', function () {
|
|
|
2135
2140
|
|
|
2136
2141
|
const requestWithFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
|
|
2137
2142
|
const pageUrl = extractPayload(requestWithFirstPartyData).site.page;
|
|
2138
|
-
const expectedPageUrl = DEFAULT_OPTION.
|
|
2143
|
+
const expectedPageUrl = DEFAULT_OPTION.ortb2.site.page + '/?ab=123&cd=123%23ab&e%2Ff=456&h%3Fg=456%23cd';
|
|
2139
2144
|
expect(pageUrl).to.equal(expectedPageUrl);
|
|
2140
2145
|
});
|
|
2141
2146
|
|
|
@@ -2233,6 +2238,66 @@ describe('IndexexchangeAdapter', function () {
|
|
|
2233
2238
|
});
|
|
2234
2239
|
});
|
|
2235
2240
|
|
|
2241
|
+
describe('getIxFirstPartyDataPageUrl', () => {
|
|
2242
|
+
beforeEach(() => {
|
|
2243
|
+
config.setConfig({ ix: { firstPartyData: { key1: 'value1', key2: 'value2' } } });
|
|
2244
|
+
});
|
|
2245
|
+
|
|
2246
|
+
afterEach(() => {
|
|
2247
|
+
config.resetConfig();
|
|
2248
|
+
});
|
|
2249
|
+
|
|
2250
|
+
it('should return the modified URL with first party data query parameters appended', () => {
|
|
2251
|
+
const requestWithIXFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
|
|
2252
|
+
const pageUrl = extractPayload(requestWithIXFirstPartyData).site.page;
|
|
2253
|
+
expect(pageUrl).to.equal('https://www.prebid.org/?key1=value1&key2=value2');
|
|
2254
|
+
});
|
|
2255
|
+
|
|
2256
|
+
it('should return the modified URL with first party data query parameters appended but not duplicated', () => {
|
|
2257
|
+
const bidderRequest = deepClone(DEFAULT_OPTION);
|
|
2258
|
+
bidderRequest.ortb2.site.page = 'https://www.prebid.org/?key1=value1'
|
|
2259
|
+
const requestWithIXFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
|
|
2260
|
+
const pageUrl = extractPayload(requestWithIXFirstPartyData).site.page;
|
|
2261
|
+
expect(pageUrl).to.equal('https://www.prebid.org/?key1=value1&key2=value2');
|
|
2262
|
+
});
|
|
2263
|
+
|
|
2264
|
+
it('should not overwrite existing query parameters with first party data', () => {
|
|
2265
|
+
config.setConfig({ ix: { firstPartyData: { key1: 'value1', key2: 'value2' } } });
|
|
2266
|
+
const bidderRequest = deepClone(DEFAULT_OPTION);
|
|
2267
|
+
bidderRequest.ortb2.site.page = 'https://www.prebid.org/?key1=existingValue1'
|
|
2268
|
+
const requestWithIXFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, bidderRequest)[0];
|
|
2269
|
+
const pageUrl = extractPayload(requestWithIXFirstPartyData).site.page;
|
|
2270
|
+
expect(pageUrl).to.equal('https://www.prebid.org/?key1=existingValue1&key2=value2');
|
|
2271
|
+
});
|
|
2272
|
+
|
|
2273
|
+
it('should return the original URL if no first party data is available', () => {
|
|
2274
|
+
config.setConfig({ ix: {} });
|
|
2275
|
+
const requestWithIXFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, DEFAULT_OPTION)[0];
|
|
2276
|
+
const pageUrl = extractPayload(requestWithIXFirstPartyData).site.page;
|
|
2277
|
+
expect(pageUrl).to.equal('https://www.prebid.org');
|
|
2278
|
+
});
|
|
2279
|
+
|
|
2280
|
+
it('should return the original URL referer page url if ortb2 does not exist', () => {
|
|
2281
|
+
config.setConfig({ ix: {} });
|
|
2282
|
+
const bidderRequest = deepClone(DEFAULT_OPTION);
|
|
2283
|
+
delete bidderRequest.ortb2;
|
|
2284
|
+
bidderRequest.refererInfo.page = 'https://example.com';
|
|
2285
|
+
const requestWithIXFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, bidderRequest)[0];
|
|
2286
|
+
const pageUrl = extractPayload(requestWithIXFirstPartyData).site.page;
|
|
2287
|
+
expect(pageUrl).to.equal('https://example.com');
|
|
2288
|
+
});
|
|
2289
|
+
|
|
2290
|
+
it('should use referer URL if the provided ortb2.site.page URL is not valid', () => {
|
|
2291
|
+
config.setConfig({ ix: { firstPartyData: { key1: 'value1', key2: 'value2' } } });
|
|
2292
|
+
const bidderRequest = deepClone(DEFAULT_OPTION);
|
|
2293
|
+
bidderRequest.ortb2.site.page = 'www.invalid-url*&?.com';
|
|
2294
|
+
bidderRequest.refererInfo.page = 'https://www.prebid.org';
|
|
2295
|
+
const requestWithIXFirstPartyData = spec.buildRequests(DEFAULT_BANNER_VALID_BID, bidderRequest)[0];
|
|
2296
|
+
const pageUrl = extractPayload(requestWithIXFirstPartyData).site.page;
|
|
2297
|
+
expect(pageUrl).to.equal('https://www.prebid.org/?key1=value1&key2=value2');
|
|
2298
|
+
});
|
|
2299
|
+
});
|
|
2300
|
+
|
|
2236
2301
|
describe('request should contain both banner and video requests', function () {
|
|
2237
2302
|
const request = spec.buildRequests([DEFAULT_BANNER_VALID_BID[0], DEFAULT_VIDEO_VALID_BID[0]], {});
|
|
2238
2303
|
it('should have banner request', () => {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {expect} from 'chai';
|
|
2
2
|
import {
|
|
3
3
|
spec as adapter,
|
|
4
|
-
SUPPORTED_ID_SYSTEMS,
|
|
5
4
|
createDomain,
|
|
6
5
|
hashCode,
|
|
7
6
|
extractPID,
|
|
@@ -18,6 +17,8 @@ import {useFakeTimers} from 'sinon';
|
|
|
18
17
|
import {BANNER, VIDEO} from '../../../src/mediaTypes';
|
|
19
18
|
import {config} from '../../../src/config';
|
|
20
19
|
|
|
20
|
+
export const TEST_ID_SYSTEMS = ['britepoolid', 'criteoId', 'id5id', 'idl_env', 'lipb', 'netId', 'parrableId', 'pubcid', 'tdid', 'pubProvidedId'];
|
|
21
|
+
|
|
21
22
|
const SUB_DOMAIN = 'exchange';
|
|
22
23
|
|
|
23
24
|
const BID = {
|
|
@@ -498,7 +499,7 @@ describe('KueezRtbBidAdapter', function () {
|
|
|
498
499
|
});
|
|
499
500
|
|
|
500
501
|
describe('user id system', function () {
|
|
501
|
-
|
|
502
|
+
TEST_ID_SYSTEMS.forEach((idSystemProvider) => {
|
|
502
503
|
const id = Date.now().toString();
|
|
503
504
|
const bid = utils.deepClone(BID);
|
|
504
505
|
|
|
@@ -824,19 +824,19 @@ describe('Mgid bid adapter', function () {
|
|
|
824
824
|
const sync = spec.getUserSyncs({iframeEnabled: true})
|
|
825
825
|
expect(sync).to.have.length(1)
|
|
826
826
|
expect(sync[0]).to.have.property('type', 'iframe')
|
|
827
|
-
expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&
|
|
827
|
+
expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=&gdpr=0/)
|
|
828
828
|
});
|
|
829
829
|
it('should return frame object with gdpr consent', function () {
|
|
830
830
|
const sync = spec.getUserSyncs({iframeEnabled: true}, undefined, {consentString: 'consent', gdprApplies: true})
|
|
831
831
|
expect(sync).to.have.length(1)
|
|
832
832
|
expect(sync[0]).to.have.property('type', 'iframe')
|
|
833
|
-
expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&
|
|
833
|
+
expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent&gdpr=1/)
|
|
834
834
|
});
|
|
835
835
|
it('should return frame object with gdpr + usp', function () {
|
|
836
836
|
const sync = spec.getUserSyncs({iframeEnabled: true}, undefined, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
|
|
837
837
|
expect(sync).to.have.length(1)
|
|
838
838
|
expect(sync[0]).to.have.property('type', 'iframe')
|
|
839
|
-
expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&
|
|
839
|
+
expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
|
|
840
840
|
});
|
|
841
841
|
it('should return img object with gdpr + usp', function () {
|
|
842
842
|
config.setConfig({userSync: {syncsPerBidder: undefined}});
|
|
@@ -844,23 +844,23 @@ describe('Mgid bid adapter', function () {
|
|
|
844
844
|
expect(sync).to.have.length(USERSYNC_DEFAULT_CONFIG.syncsPerBidder)
|
|
845
845
|
for (let i = 0; i < USERSYNC_DEFAULT_CONFIG.syncsPerBidder; i++) {
|
|
846
846
|
expect(sync[i]).to.have.property('type', 'image')
|
|
847
|
-
expect(sync[i]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&
|
|
847
|
+
expect(sync[i]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
|
|
848
848
|
}
|
|
849
849
|
});
|
|
850
850
|
it('should return frame object with gdpr + usp', function () {
|
|
851
851
|
const sync = spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, undefined, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
|
|
852
852
|
expect(sync).to.have.length(1)
|
|
853
853
|
expect(sync[0]).to.have.property('type', 'iframe')
|
|
854
|
-
expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&
|
|
854
|
+
expect(sync[0]).to.have.property('url').match(/https:\/\/cm\.mgid\.com\/i\.html\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
|
|
855
855
|
});
|
|
856
856
|
it('should return img (pixels) objects with gdpr + usp', function () {
|
|
857
857
|
const response = [{body: {ext: {cm: ['http://cm.mgid.com/i.gif?cdsp=1111', 'http://cm.mgid.com/i.gif']}}}]
|
|
858
858
|
const sync = spec.getUserSyncs({iframeEnabled: false, pixelEnabled: true}, response, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'})
|
|
859
859
|
expect(sync).to.have.length(2)
|
|
860
860
|
expect(sync[0]).to.have.property('type', 'image')
|
|
861
|
-
expect(sync[0]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cdsp=1111&cbuster=\d+&
|
|
861
|
+
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/)
|
|
862
862
|
expect(sync[1]).to.have.property('type', 'image')
|
|
863
|
-
expect(sync[1]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&
|
|
863
|
+
expect(sync[1]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2/)
|
|
864
864
|
});
|
|
865
865
|
});
|
|
866
866
|
|
|
@@ -874,9 +874,9 @@ describe('Mgid bid adapter', function () {
|
|
|
874
874
|
const sync = spec.getUserSyncs({iframeEnabled: false, pixelEnabled: true}, response, {consentString: 'consent1', gdprApplies: true}, {'consentString': 'consent2'}, {gppString: 'gpp'})
|
|
875
875
|
expect(sync).to.have.length(2)
|
|
876
876
|
expect(sync[0]).to.have.property('type', 'image')
|
|
877
|
-
expect(sync[0]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cdsp=1111&cbuster=\d+&
|
|
877
|
+
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&gppString=gpp&coppa=1/)
|
|
878
878
|
expect(sync[1]).to.have.property('type', 'image')
|
|
879
|
-
expect(sync[1]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&
|
|
879
|
+
expect(sync[1]).to.have.property('url').match(/http:\/\/cm\.mgid\.com\/i\.gif\?cbuster=\d+&gdpr_consent=consent1&gdpr=1&us_privacy=consent2&gppString=gpp&coppa=1/)
|
|
880
880
|
});
|
|
881
881
|
});
|
|
882
882
|
|
|
@@ -293,6 +293,24 @@ describe('minutemediaAdapter', function () {
|
|
|
293
293
|
expect(request.data.bids[0]).to.be.an('object');
|
|
294
294
|
expect(request.data.bids[0]).to.have.property('floorPrice', 1.5);
|
|
295
295
|
});
|
|
296
|
+
|
|
297
|
+
describe('COPPA Param', function() {
|
|
298
|
+
it('should set coppa equal 0 in bid request if coppa is set to false', function() {
|
|
299
|
+
const request = spec.buildRequests(bidRequests, bidderRequest);
|
|
300
|
+
expect(request.data.bids[0].coppa).to.be.equal(0);
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it('should set coppa equal 1 in bid request if coppa is set to true', function() {
|
|
304
|
+
const bid = utils.deepClone(bidRequests[0]);
|
|
305
|
+
bid.ortb2 = {
|
|
306
|
+
'regs': {
|
|
307
|
+
'coppa': true,
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
const request = spec.buildRequests([bid], bidderRequest);
|
|
311
|
+
expect(request.data.bids[0].coppa).to.be.equal(1);
|
|
312
|
+
});
|
|
313
|
+
});
|
|
296
314
|
});
|
|
297
315
|
|
|
298
316
|
describe('interpretResponse', function () {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {expect} from 'chai';
|
|
2
2
|
import {
|
|
3
3
|
spec as adapter,
|
|
4
|
-
SUPPORTED_ID_SYSTEMS,
|
|
5
4
|
createDomain,
|
|
6
5
|
hashCode,
|
|
7
6
|
extractPID,
|
|
@@ -18,6 +17,8 @@ import {useFakeTimers} from 'sinon';
|
|
|
18
17
|
import {BANNER, VIDEO} from '../../../src/mediaTypes';
|
|
19
18
|
import {config} from '../../../src/config';
|
|
20
19
|
|
|
20
|
+
export const TEST_ID_SYSTEMS = ['britepoolid', 'criteoId', 'id5id', 'idl_env', 'lipb', 'netId', 'parrableId', 'pubcid', 'tdid', 'pubProvidedId'];
|
|
21
|
+
|
|
21
22
|
const SUB_DOMAIN = 'exchange';
|
|
22
23
|
|
|
23
24
|
const BID = {
|
|
@@ -498,7 +499,7 @@ describe('MinuteMediaPlus Bid Adapter', function () {
|
|
|
498
499
|
});
|
|
499
500
|
|
|
500
501
|
describe('user id system', function () {
|
|
501
|
-
|
|
502
|
+
TEST_ID_SYSTEMS.forEach((idSystemProvider) => {
|
|
502
503
|
const id = Date.now().toString();
|
|
503
504
|
const bid = utils.deepClone(BID);
|
|
504
505
|
|
|
@@ -2463,7 +2463,7 @@ describe('S2S Adapter', function () {
|
|
|
2463
2463
|
};
|
|
2464
2464
|
const bcat = ['IAB25', 'IAB7-39'];
|
|
2465
2465
|
const badv = ['blockedAdv-1.com', 'blockedAdv-2.com'];
|
|
2466
|
-
const allowedBidders = ['
|
|
2466
|
+
const allowedBidders = ['appnexus'];
|
|
2467
2467
|
|
|
2468
2468
|
const expected = allowedBidders.map(bidder => ({
|
|
2469
2469
|
bidders: [bidder],
|
|
@@ -2516,6 +2516,101 @@ describe('S2S Adapter', function () {
|
|
|
2516
2516
|
expect(parsedRequestBody.bcat).to.deep.equal(bcat);
|
|
2517
2517
|
});
|
|
2518
2518
|
|
|
2519
|
+
it('passes first party data in request for unknown when allowUnknownBidderCodes is true', () => {
|
|
2520
|
+
const cfg = { ...CONFIG, allowUnknownBidderCodes: true };
|
|
2521
|
+
config.setConfig({ s2sConfig: cfg });
|
|
2522
|
+
|
|
2523
|
+
const clonedReq = {...REQUEST, s2sConfig: cfg}
|
|
2524
|
+
const s2sBidRequest = utils.deepClone(clonedReq);
|
|
2525
|
+
const bidRequests = utils.deepClone(BID_REQUESTS);
|
|
2526
|
+
|
|
2527
|
+
const commonSite = {
|
|
2528
|
+
keywords: ['power tools'],
|
|
2529
|
+
search: 'drill'
|
|
2530
|
+
};
|
|
2531
|
+
const commonUser = {
|
|
2532
|
+
keywords: ['a', 'b'],
|
|
2533
|
+
gender: 'M'
|
|
2534
|
+
};
|
|
2535
|
+
|
|
2536
|
+
const site = {
|
|
2537
|
+
content: {userrating: 4},
|
|
2538
|
+
ext: {
|
|
2539
|
+
data: {
|
|
2540
|
+
pageType: 'article',
|
|
2541
|
+
category: 'tools'
|
|
2542
|
+
}
|
|
2543
|
+
}
|
|
2544
|
+
};
|
|
2545
|
+
const user = {
|
|
2546
|
+
yob: '1984',
|
|
2547
|
+
geo: { country: 'ca' },
|
|
2548
|
+
ext: {
|
|
2549
|
+
data: {
|
|
2550
|
+
registered: true,
|
|
2551
|
+
interests: ['cars']
|
|
2552
|
+
}
|
|
2553
|
+
}
|
|
2554
|
+
};
|
|
2555
|
+
const bcat = ['IAB25', 'IAB7-39'];
|
|
2556
|
+
const badv = ['blockedAdv-1.com', 'blockedAdv-2.com'];
|
|
2557
|
+
const allowedBidders = ['appnexus', 'unknown'];
|
|
2558
|
+
|
|
2559
|
+
const expected = allowedBidders.map(bidder => ({
|
|
2560
|
+
bidders: [bidder],
|
|
2561
|
+
config: {
|
|
2562
|
+
ortb2: {
|
|
2563
|
+
site: {
|
|
2564
|
+
content: { userrating: 4 },
|
|
2565
|
+
ext: {
|
|
2566
|
+
data: {
|
|
2567
|
+
pageType: 'article',
|
|
2568
|
+
category: 'tools'
|
|
2569
|
+
}
|
|
2570
|
+
}
|
|
2571
|
+
},
|
|
2572
|
+
user: {
|
|
2573
|
+
yob: '1984',
|
|
2574
|
+
geo: { country: 'ca' },
|
|
2575
|
+
ext: {
|
|
2576
|
+
data: {
|
|
2577
|
+
registered: true,
|
|
2578
|
+
interests: ['cars']
|
|
2579
|
+
}
|
|
2580
|
+
}
|
|
2581
|
+
},
|
|
2582
|
+
bcat: ['IAB25', 'IAB7-39'],
|
|
2583
|
+
badv: ['blockedAdv-1.com', 'blockedAdv-2.com']
|
|
2584
|
+
}
|
|
2585
|
+
}
|
|
2586
|
+
}));
|
|
2587
|
+
const commonContextExpected = utils.mergeDeep({
|
|
2588
|
+
'page': 'http://mytestpage.com',
|
|
2589
|
+
'domain': 'mytestpage.com',
|
|
2590
|
+
'publisher': {
|
|
2591
|
+
'id': '1',
|
|
2592
|
+
'domain': 'mytestpage.com'
|
|
2593
|
+
}
|
|
2594
|
+
}, commonSite);
|
|
2595
|
+
|
|
2596
|
+
const ortb2Fragments = {
|
|
2597
|
+
global: {site: commonSite, user: commonUser, badv, bcat},
|
|
2598
|
+
bidder: Object.fromEntries(allowedBidders.map(bidder => [bidder, {site, user, bcat, badv}]))
|
|
2599
|
+
};
|
|
2600
|
+
|
|
2601
|
+
// adapter.callBids({ ...REQUEST, s2sConfig: cfg }, BID_REQUESTS, addBidResponse, done, ajax);
|
|
2602
|
+
|
|
2603
|
+
adapter.callBids(addFpdEnrichmentsToS2SRequest({...s2sBidRequest, ortb2Fragments}, bidRequests, cfg), bidRequests, addBidResponse, done, ajax);
|
|
2604
|
+
const parsedRequestBody = JSON.parse(server.requests[0].requestBody);
|
|
2605
|
+
// eslint-disable-next-line no-console
|
|
2606
|
+
console.log(parsedRequestBody);
|
|
2607
|
+
expect(parsedRequestBody.ext.prebid.bidderconfig).to.deep.equal(expected);
|
|
2608
|
+
expect(parsedRequestBody.site).to.deep.equal(commonContextExpected);
|
|
2609
|
+
expect(parsedRequestBody.user).to.deep.equal(commonUser);
|
|
2610
|
+
expect(parsedRequestBody.badv).to.deep.equal(badv);
|
|
2611
|
+
expect(parsedRequestBody.bcat).to.deep.equal(bcat);
|
|
2612
|
+
});
|
|
2613
|
+
|
|
2519
2614
|
describe('pbAdSlot config', function () {
|
|
2520
2615
|
it('should not send \"imp.ext.data.pbadslot\" if \"ortb2Imp.ext\" is undefined', function () {
|
|
2521
2616
|
const consentConfig = { s2sConfig: CONFIG };
|