diff --git a/modules/yieldlabBidAdapter.js b/modules/yieldlabBidAdapter.js
index 6e4f6644140..cadeb9c1300 100644
--- a/modules/yieldlabBidAdapter.js
+++ b/modules/yieldlabBidAdapter.js
@@ -1,17 +1,17 @@
-import { _each, deepAccess, isArray, isFn, isPlainObject, timestamp } from '../src/utils.js'
-import { registerBidder } from '../src/adapters/bidderFactory.js'
-import { find } from '../src/polyfill.js'
-import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js'
-import { Renderer } from '../src/Renderer.js'
+import { _each, deepAccess, isArray, isFn, isPlainObject, timestamp } from '../src/utils.js';
+import { registerBidder } from '../src/adapters/bidderFactory.js';
+import { find } from '../src/polyfill.js';
+import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
+import { Renderer } from '../src/Renderer.js';
import { convertOrtbRequestToProprietaryNative } from '../src/native.js';
-const ENDPOINT = 'https://ad.yieldlab.net'
-const BIDDER_CODE = 'yieldlab'
-const BID_RESPONSE_TTL_SEC = 300
-const CURRENCY_CODE = 'EUR'
-const OUTSTREAMPLAYER_URL = 'https://ad.adition.com/dynamic.ad?a=o193092&ma_loadEvent=ma-start-event'
-const GVLID = 70
-const DIMENSION_SIGN = 'x'
+const ENDPOINT = 'https://ad.yieldlab.net';
+const BIDDER_CODE = 'yieldlab';
+const BID_RESPONSE_TTL_SEC = 300;
+const CURRENCY_CODE = 'EUR';
+const OUTSTREAMPLAYER_URL = 'https://ad.adition.com/dynamic.ad?a=o193092&ma_loadEvent=ma-start-event';
+const GVLID = 70;
+const DIMENSION_SIGN = 'x';
export const spec = {
code: BIDDER_CODE,
@@ -22,11 +22,11 @@ export const spec = {
* @param {object} bid
* @returns {boolean}
*/
- isBidRequestValid: function (bid) {
+ isBidRequestValid(bid) {
if (bid && bid.params && bid.params.adslotId && bid.params.supplyId) {
- return true
+ return true;
}
- return false
+ return false;
},
/**
@@ -35,85 +35,85 @@ export const spec = {
* @param [bidderRequest]
* @returns {ServerRequest|ServerRequest[]}
*/
- buildRequests: function (validBidRequests, bidderRequest) {
+ buildRequests(validBidRequests, bidderRequest) {
// convert Native ORTB definition to old-style prebid native definition
validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests);
- const adslotIds = []
+ const adslotIds = [];
const adslotSizes = [];
const adslotFloors = [];
- const timestamp = Date.now()
+ const timestamp = Date.now();
const query = {
ts: timestamp,
- json: true
- }
+ json: true,
+ };
_each(validBidRequests, function (bid) {
- adslotIds.push(bid.params.adslotId)
- const sizes = extractSizes(bid)
+ adslotIds.push(bid.params.adslotId);
+ const sizes = extractSizes(bid);
if (sizes.length > 0) {
- adslotSizes.push(bid.params.adslotId + ':' + sizes.join('|'))
+ adslotSizes.push(bid.params.adslotId + ':' + sizes.join('|'));
}
if (bid.params.extId) {
query.id = bid.params.extId;
}
if (bid.params.targeting) {
- query.t = createTargetingString(bid.params.targeting)
+ query.t = createTargetingString(bid.params.targeting);
}
if (bid.userIdAsEids && Array.isArray(bid.userIdAsEids)) {
- query.ids = createUserIdString(bid.userIdAsEids)
- query.atypes = createUserIdAtypesString(bid.userIdAsEids)
+ query.ids = createUserIdString(bid.userIdAsEids);
+ query.atypes = createUserIdAtypesString(bid.userIdAsEids);
}
if (bid.params.customParams && isPlainObject(bid.params.customParams)) {
for (const prop in bid.params.customParams) {
- query[prop] = bid.params.customParams[prop]
+ query[prop] = bid.params.customParams[prop];
}
}
if (bid.schain && isPlainObject(bid.schain) && Array.isArray(bid.schain.nodes)) {
- query.schain = createSchainString(bid.schain)
+ query.schain = createSchainString(bid.schain);
}
- const iabContent = getContentObject(bid)
+ const iabContent = getContentObject(bid);
if (iabContent) {
- query.iab_content = createIabContentString(iabContent)
+ query.iab_content = createIabContentString(iabContent);
}
- const floor = getBidFloor(bid, sizes)
+ const floor = getBidFloor(bid, sizes);
if (floor) {
adslotFloors.push(bid.params.adslotId + ':' + floor);
}
- })
+ });
if (bidderRequest) {
if (bidderRequest.refererInfo && bidderRequest.refererInfo.page) {
// TODO: is 'page' the right value here?
- query.pubref = bidderRequest.refererInfo.page
+ query.pubref = bidderRequest.refererInfo.page;
}
if (bidderRequest.gdprConsent) {
- query.gdpr = (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') ? bidderRequest.gdprConsent.gdprApplies : true
+ query.gdpr = (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') ? bidderRequest.gdprConsent.gdprApplies : true;
if (query.gdpr) {
- query.consent = bidderRequest.gdprConsent.consentString
+ query.consent = bidderRequest.gdprConsent.consentString;
}
}
}
- const adslots = adslotIds.join(',')
+ const adslots = adslotIds.join(',');
if (adslotSizes.length > 0) {
- query.sizes = adslotSizes.join(',')
+ query.sizes = adslotSizes.join(',');
}
if (adslotFloors.length > 0) {
- query.floor = adslotFloors.join(',')
+ query.floor = adslotFloors.join(',');
}
- const queryString = createQueryString(query)
+ const queryString = createQueryString(query);
return {
method: 'GET',
url: `${ENDPOINT}/yp/${adslots}?${queryString}`,
validBidRequests: validBidRequests,
- queryParams: query
- }
+ queryParams: query,
+ };
},
/**
@@ -122,29 +122,29 @@ export const spec = {
* @param {BidRequest} originalBidRequest
* @returns {Bid[]}
*/
- interpretResponse: function (serverResponse, originalBidRequest) {
- const bidResponses = []
- const timestamp = Date.now()
- const reqParams = originalBidRequest.queryParams
+ interpretResponse(serverResponse, originalBidRequest) {
+ const bidResponses = [];
+ const timestamp = Date.now();
+ const reqParams = originalBidRequest.queryParams;
originalBidRequest.validBidRequests.forEach(function (bidRequest) {
if (!serverResponse.body) {
- return
+ return;
}
const matchedBid = find(serverResponse.body, function (bidResponse) {
- return bidRequest.params.adslotId == bidResponse.id
- })
+ return bidRequest.params.adslotId == bidResponse.id;
+ });
if (matchedBid) {
- const adUnitSize = bidRequest.sizes.length === 2 && !isArray(bidRequest.sizes[0]) ? bidRequest.sizes : bidRequest.sizes[0]
- const adSize = bidRequest.params.adSize !== undefined ? parseSize(bidRequest.params.adSize) : (matchedBid.adsize !== undefined) ? parseSize(matchedBid.adsize) : adUnitSize
- const extId = bidRequest.params.extId !== undefined ? '&id=' + bidRequest.params.extId : ''
- const adType = matchedBid.adtype !== undefined ? matchedBid.adtype : ''
- const gdprApplies = reqParams.gdpr ? '&gdpr=' + reqParams.gdpr : ''
- const gdprConsent = reqParams.consent ? '&consent=' + reqParams.consent : ''
- const pvId = matchedBid.pvid !== undefined ? '&pvid=' + matchedBid.pvid : ''
- const iabContent = reqParams.iab_content ? '&iab_content=' + reqParams.iab_content : ''
+ const adUnitSize = bidRequest.sizes.length === 2 && !isArray(bidRequest.sizes[0]) ? bidRequest.sizes : bidRequest.sizes[0];
+ const adSize = bidRequest.params.adSize !== undefined ? parseSize(bidRequest.params.adSize) : (matchedBid.adsize !== undefined) ? parseSize(matchedBid.adsize) : adUnitSize;
+ const extId = bidRequest.params.extId !== undefined ? '&id=' + bidRequest.params.extId : '';
+ const adType = matchedBid.adtype !== undefined ? matchedBid.adtype : '';
+ const gdprApplies = reqParams.gdpr ? '&gdpr=' + reqParams.gdpr : '';
+ const gdprConsent = reqParams.consent ? '&consent=' + reqParams.consent : '';
+ const pvId = matchedBid.pvid !== undefined ? '&pvid=' + matchedBid.pvid : '';
+ const iabContent = reqParams.iab_content ? '&iab_content=' + reqParams.iab_content : '';
const bidResponse = {
requestId: bidRequest.bidId,
@@ -159,38 +159,38 @@ export const spec = {
referrer: '',
ad: ``,
meta: {
- advertiserDomains: (matchedBid.advertiser) ? matchedBid.advertiser : 'n/a'
- }
- }
+ advertiserDomains: (matchedBid.advertiser) ? matchedBid.advertiser : 'n/a',
+ },
+ };
if (isVideo(bidRequest, adType)) {
- const playersize = getPlayerSize(bidRequest)
+ const playersize = getPlayerSize(bidRequest);
if (playersize) {
- bidResponse.width = playersize[0]
- bidResponse.height = playersize[1]
+ bidResponse.width = playersize[0];
+ bidResponse.height = playersize[1];
}
- bidResponse.mediaType = VIDEO
- bidResponse.vastUrl = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}${iabContent}`
+ bidResponse.mediaType = VIDEO;
+ bidResponse.vastUrl = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}${iabContent}`;
if (isOutstream(bidRequest)) {
const renderer = Renderer.install({
id: bidRequest.bidId,
url: OUTSTREAMPLAYER_URL,
- loaded: false
- })
- renderer.setRender(outstreamRender)
- bidResponse.renderer = renderer
+ loaded: false,
+ });
+ renderer.setRender(outstreamRender);
+ bidResponse.renderer = renderer;
}
}
if (isNative(bidRequest, adType)) {
// there may be publishers still rely on it
- const url = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}`
- bidResponse.adUrl = url
- bidResponse.mediaType = NATIVE
- const nativeImageAssetObj = find(matchedBid.native.assets, e => e.id === 2)
+ const url = `${ENDPOINT}/d/${matchedBid.id}/${bidRequest.params.supplyId}/?ts=${timestamp}${extId}${gdprApplies}${gdprConsent}${pvId}`;
+ bidResponse.adUrl = url;
+ bidResponse.mediaType = NATIVE;
+ const nativeImageAssetObj = find(matchedBid.native.assets, e => e.id === 2);
const nativeImageAsset = nativeImageAssetObj ? nativeImageAssetObj.img : { url: '', w: 0, h: 0 };
- const nativeTitleAsset = find(matchedBid.native.assets, e => e.id === 1)
- const nativeBodyAsset = find(matchedBid.native.assets, e => e.id === 3)
+ const nativeTitleAsset = find(matchedBid.native.assets, e => e.id === 1);
+ const nativeBodyAsset = find(matchedBid.native.assets, e => e.id === 3);
bidResponse.native = {
title: nativeTitleAsset ? nativeTitleAsset.title.text : '',
body: nativeBodyAsset ? nativeBodyAsset.data.value : '',
@@ -204,10 +204,10 @@ export const spec = {
};
}
- bidResponses.push(bidResponse)
+ bidResponses.push(bidResponse);
}
- })
- return bidResponses
+ });
+ return bidResponses;
},
/**
@@ -219,13 +219,13 @@ export const spec = {
* @param {string} uspConsent Is the US Privacy Consent string.
* @return {UserSync[]} The user syncs which should be dropped.
*/
- getUserSyncs: function (syncOptions, serverResponses, gdprConsent, uspConsent) {
+ getUserSyncs(syncOptions, serverResponses, gdprConsent, uspConsent) {
const syncs = [];
if (syncOptions.iframeEnabled) {
const params = [];
params.push(`ts=${timestamp()}`);
- params.push(`type=h`)
+ params.push(`type=h`);
if (gdprConsent && (typeof gdprConsent.gdprApplies === 'boolean')) {
params.push(`gdpr=${Number(gdprConsent.gdprApplies)}`);
}
@@ -234,12 +234,12 @@ export const spec = {
}
syncs.push({
type: 'iframe',
- url: `${ENDPOINT}/d/6846326/766/2x2?${params.join('&')}`
+ url: `${ENDPOINT}/d/6846326/766/2x2?${params.join('&')}`,
});
}
return syncs;
- }
+ },
};
/**
@@ -249,7 +249,7 @@ export const spec = {
* @returns {Boolean}
*/
function isVideo(format, adtype) {
- return deepAccess(format, 'mediaTypes.video') && adtype.toLowerCase() === 'video'
+ return deepAccess(format, 'mediaTypes.video') && adtype.toLowerCase() === 'video';
}
/**
@@ -259,7 +259,7 @@ function isVideo(format, adtype) {
* @returns {Boolean}
*/
function isNative(format, adtype) {
- return deepAccess(format, 'mediaTypes.native') && adtype.toLowerCase() === 'native'
+ return deepAccess(format, 'mediaTypes.native') && adtype.toLowerCase() === 'native';
}
/**
@@ -268,8 +268,8 @@ function isNative(format, adtype) {
* @returns {Boolean}
*/
function isOutstream(format) {
- const context = deepAccess(format, 'mediaTypes.video.context')
- return (context === 'outstream')
+ const context = deepAccess(format, 'mediaTypes.video.context');
+ return (context === 'outstream');
}
/**
@@ -278,30 +278,30 @@ function isOutstream(format) {
* @returns {Array}
*/
function getPlayerSize(format) {
- const playerSize = deepAccess(format, 'mediaTypes.video.playerSize')
- return (playerSize && isArray(playerSize[0])) ? playerSize[0] : playerSize
+ const playerSize = deepAccess(format, 'mediaTypes.video.playerSize');
+ return (playerSize && isArray(playerSize[0])) ? playerSize[0] : playerSize;
}
/**
- * Expands a 'WxH' string as a 2-element [W, H] array
+ * Expands a 'WxH' string to a 2-element [W, H] array
* @param {String} size
* @returns {Array}
*/
function parseSize(size) {
- return size.split(DIMENSION_SIGN).map(Number)
+ return size.split(DIMENSION_SIGN).map(Number);
}
/**
* Creates a string out of an array of eids with source and uid
- * @param {Array} eids
+ * @param {Array.<{source: String, uids: Array.<{id: String, atype: Number, ext: Object}>}>} eids
* @returns {String}
*/
function createUserIdString(eids) {
- const str = []
+ const str = [];
for (let i = 0; i < eids.length; i++) {
- str.push(eids[i].source + ':' + eids[i].uids[0].id)
+ str.push(eids[i].source + ':' + eids[i].uids[0].id);
}
- return str.join(',')
+ return str.join(',');
}
/**
@@ -325,18 +325,18 @@ function createUserIdAtypesString(eids) {
* @returns {String}
*/
function createQueryString(obj) {
- const str = []
+ const str = [];
for (const p in obj) {
if (obj.hasOwnProperty(p)) {
- const val = obj[p]
+ const val = obj[p];
if (p !== 'schain' && p !== 'iab_content') {
- str.push(encodeURIComponent(p) + '=' + encodeURIComponent(val))
+ str.push(encodeURIComponent(p) + '=' + encodeURIComponent(val));
} else {
- str.push(p + '=' + val)
+ str.push(p + '=' + val);
}
}
}
- return str.join('&')
+ return str.join('&');
}
/**
@@ -345,15 +345,15 @@ function createQueryString(obj) {
* @returns {String}
*/
function createTargetingString(obj) {
- const str = []
+ const str = [];
for (const p in obj) {
if (obj.hasOwnProperty(p)) {
- const key = p
- const val = obj[p]
- str.push(key + '=' + val)
+ const key = p;
+ const val = obj[p];
+ str.push(key + '=' + val);
}
}
- return str.join('&')
+ return str.join('&');
}
/**
@@ -362,13 +362,13 @@ function createTargetingString(obj) {
* @returns {String}
*/
function createSchainString(schain) {
- const ver = schain.ver || ''
- const complete = (schain.complete === 1 || schain.complete === 0) ? schain.complete : ''
- const keys = ['asi', 'sid', 'hp', 'rid', 'name', 'domain', 'ext']
+ const ver = schain.ver || '';
+ const complete = (schain.complete === 1 || schain.complete === 0) ? schain.complete : '';
+ const keys = ['asi', 'sid', 'hp', 'rid', 'name', 'domain', 'ext'];
const nodesString = schain.nodes.reduce((acc, node) => {
- return acc += `!${keys.map(key => node[key] ? encodeURIComponentWithBangIncluded(node[key]) : '').join(',')}`
- }, '')
- return `${ver},${complete}${nodesString}`
+ return acc += `!${keys.map(key => node[key] ? encodeURIComponentWithBangIncluded(node[key]) : '').join(',')}`;
+ }, '');
+ return `${ver},${complete}${nodesString}`;
}
/**
@@ -380,15 +380,15 @@ function createSchainString(schain) {
*/
function getContentObject(bid) {
if (bid.params.iabContent && isPlainObject(bid.params.iabContent)) {
- return bid.params.iabContent
+ return bid.params.iabContent;
}
const globalContent = deepAccess(bid, 'ortb2.site') ? deepAccess(bid, 'ortb2.site.content')
- : deepAccess(bid, 'ortb2.app.content')
+ : deepAccess(bid, 'ortb2.app.content');
if (globalContent && isPlainObject(globalContent)) {
- return globalContent
+ return globalContent;
}
- return undefined
+ return undefined;
}
/**
@@ -401,15 +401,15 @@ function getContentObject(bid) {
* @returns {String}
*/
function createIabContentString(iabContent) {
- const arrKeys = ['keywords', 'cat']
- const str = []
+ const arrKeys = ['keywords', 'cat'];
+ const str = [];
const transformObjToParam = (obj = {}, extraKey = '') => {
for (const key in obj) {
if ((arrKeys.indexOf(key) !== -1 && Array.isArray(obj[key]))) {
// Array of defined keyword which have to be joined into one value from "key: [value1, value2, value3]" to "key:value1|value2|value3"
- str.push(''.concat(key, ':', obj[key].map(node => encodeURIComponent(node)).join('|')))
+ str.push(''.concat(key, ':', obj[key].map(node => encodeURIComponent(node)).join('|')));
} else if (typeof obj[key] !== 'object') {
- str.push(''.concat(extraKey + key, ':', encodeURIComponent(obj[key])))
+ str.push(''.concat(extraKey + key, ':', encodeURIComponent(obj[key])));
} else {
// Object has to be further flattened
transformObjToParam(obj[key], ''.concat(extraKey, key, '.'));
@@ -417,7 +417,7 @@ function createIabContentString(iabContent) {
}
return str.join(',');
};
- return encodeURIComponent(transformObjToParam(iabContent))
+ return encodeURIComponent(transformObjToParam(iabContent));
}
/**
@@ -426,7 +426,7 @@ function createIabContentString(iabContent) {
* @returns {String}
*/
function encodeURIComponentWithBangIncluded(str) {
- return encodeURIComponent(str).replace(/!/g, '%21')
+ return encodeURIComponent(str).replace(/!/g, '%21');
}
/**
@@ -435,11 +435,11 @@ function encodeURIComponentWithBangIncluded(str) {
*/
function outstreamRender(bid) {
bid.renderer.push(() => {
- window.ma_width = bid.width
- window.ma_height = bid.height
- window.ma_vastUrl = bid.vastUrl
- window.ma_container = bid.adUnitCode
- window.document.dispatchEvent(new Event('ma-start-event'))
+ window.ma_width = bid.width;
+ window.ma_height = bid.height;
+ window.ma_vastUrl = bid.vastUrl;
+ window.ma_container = bid.adUnitCode;
+ window.document.dispatchEvent(new Event('ma-start-event'));
});
}
@@ -450,33 +450,33 @@ function outstreamRender(bid) {
* @returns {string[]}
*/
function extractSizes(bid) {
- const { mediaTypes } = bid // see https://docs.prebid.org/dev-docs/adunit-reference.html#examples
- const sizes = []
+ const { mediaTypes } = bid; // see https://docs.prebid.org/dev-docs/adunit-reference.html#examples
+ const sizes = [];
if (isPlainObject(mediaTypes)) {
- const { [BANNER]: bannerType } = mediaTypes
+ const { [BANNER]: bannerType } = mediaTypes;
// only applies for multi size Adslots -> BANNER
if (bannerType && isArray(bannerType.sizes)) {
if (isArray(bannerType.sizes[0])) { // multiple sizes given
- sizes.push(bannerType.sizes)
+ sizes.push(bannerType.sizes);
} else { // just one size provided as array -> wrap to uniformly flatten later
- sizes.push([bannerType.sizes])
+ sizes.push([bannerType.sizes]);
}
}
// The bid top level field `sizes` is deprecated and should not be used anymore. Keeping it for compatibility.
} else if (isArray(bid.sizes)) {
if (isArray(bid.sizes[0])) {
- sizes.push(bid.sizes)
+ sizes.push(bid.sizes);
} else {
- sizes.push([bid.sizes])
+ sizes.push([bid.sizes]);
}
}
/** @type {Set} */
- const deduplicatedSizeStrings = new Set(sizes.flat().map(([width, height]) => width + DIMENSION_SIGN + height))
+ const deduplicatedSizeStrings = new Set(sizes.flat().map(([width, height]) => width + DIMENSION_SIGN + height));
- return Array.from(deduplicatedSizeStrings)
+ return Array.from(deduplicatedSizeStrings);
}
/**
@@ -497,7 +497,7 @@ function getBidFloor(bid, sizes) {
const floor = bid.getFloor({
currency: CURRENCY_CODE,
mediaType: mediaType !== undefined && spec.supportedMediaTypes.includes(mediaType) ? mediaType : '*',
- size: sizes.length !== 1 ? '*' : sizes[0].split(DIMENSION_SIGN)
+ size: sizes.length !== 1 ? '*' : sizes[0].split(DIMENSION_SIGN),
});
if (floor.currency === CURRENCY_CODE) {
return (floor.floor * 100).toFixed(0);
@@ -505,4 +505,4 @@ function getBidFloor(bid, sizes) {
return undefined;
}
-registerBidder(spec)
+registerBidder(spec);
diff --git a/test/spec/modules/yieldlabBidAdapter_spec.js b/test/spec/modules/yieldlabBidAdapter_spec.js
index 07d42df1319..e5151cf789c 100644
--- a/test/spec/modules/yieldlabBidAdapter_spec.js
+++ b/test/spec/modules/yieldlabBidAdapter_spec.js
@@ -1,7 +1,7 @@
import { config } from 'src/config.js';
-import { expect } from 'chai'
-import { spec } from 'modules/yieldlabBidAdapter.js'
-import { newBidder } from 'src/adapters/bidderFactory.js'
+import { expect } from 'chai';
+import { spec } from 'modules/yieldlabBidAdapter.js';
+import { newBidder } from 'src/adapters/bidderFactory.js';
const DEFAULT_REQUEST = () => ({
bidder: 'yieldlab',
@@ -11,11 +11,11 @@ const DEFAULT_REQUEST = () => ({
targeting: {
key1: 'value1',
key2: 'value2',
- notDoubleEncoded: 'value3,value4'
+ notDoubleEncoded: 'value3,value4',
},
customParams: {
extraParam: true,
- foo: 'bar'
+ foo: 'bar',
},
extId: 'abc',
iabContent: {
@@ -31,8 +31,8 @@ const DEFAULT_REQUEST = () => ({
cat: ['cat1', 'cat2,ppp', 'cat3|||//'],
context: '7',
keywords: ['k1,', 'k2..'],
- live: '0'
- }
+ live: '0',
+ },
},
bidderRequestId: '143346cf0f1731',
auctionId: '2e41f65424c87c',
@@ -43,14 +43,14 @@ const DEFAULT_REQUEST = () => ({
source: 'netid.de',
uids: [{
id: 'fH5A3n2O8_CZZyPoJVD-eabc6ECb7jhxCicsds7qSg',
- atype: 1
- }]
+ atype: 1,
+ }],
}, {
source: 'digitrust.de',
uids: [{
id: 'd8aa10fa-d86c-451d-aad8-5f16162a9e64',
- atype: 2
- }]
+ atype: 2,
+ }],
}],
schain: {
ver: '1.0',
@@ -59,32 +59,32 @@ const DEFAULT_REQUEST = () => ({
{
asi: 'indirectseller.com',
sid: '1',
- hp: 1
+ hp: 1,
},
{
asi: 'indirectseller2.com',
name: 'indirectseller2 name with comma , and bang !',
sid: '2',
- hp: 1
- }
- ]
- }
-})
+ hp: 1,
+ },
+ ],
+ },
+});
const VIDEO_REQUEST = () => Object.assign(DEFAULT_REQUEST(), {
mediaTypes: {
video: {
playerSize: [[640, 480]],
- context: 'instream'
- }
- }
-})
+ context: 'instream',
+ },
+ },
+});
const NATIVE_REQUEST = () => Object.assign(DEFAULT_REQUEST(), {
mediaTypes: {
- native: {}
- }
-})
+ native: {},
+ },
+});
const IAB_REQUEST = () => Object.assign(DEFAULT_REQUEST(), {
params: {
@@ -119,7 +119,7 @@ const IAB_REQUEST = () => Object.assign(DEFAULT_REQUEST(), {
name: 'bar',
cattax: 532,
cat: [1, 'foo', true],
- domain: 'producer.test'
+ domain: 'producer.test',
},
data: {
id: 'foo',
@@ -129,8 +129,8 @@ const IAB_REQUEST = () => Object.assign(DEFAULT_REQUEST(), {
value: 'bar',
ext: {
foo: {
- bar: 'bar'
- }
+ bar: 'bar',
+ },
},
}, {
name: 'foo2',
@@ -139,27 +139,27 @@ const IAB_REQUEST = () => Object.assign(DEFAULT_REQUEST(), {
test: {
nums: {
int: 123,
- float: 123.123
+ float: 123.123,
},
bool: true,
- string: 'foo2'
- }
- }
+ string: 'foo2',
+ },
+ },
}],
},
network: {
id: 'foo',
name: 'bar',
- domain: 'network.test'
+ domain: 'network.test',
},
channel: {
id: 'bar',
name: 'foo',
- domain: 'channel.test'
- }
- }
- }
-})
+ domain: 'channel.test',
+ },
+ },
+ },
+});
const RESPONSE = {
advertiser: 'yieldlab',
@@ -169,173 +169,173 @@ const RESPONSE = {
price: 1,
pid: 2222,
adsize: '728x90',
- adtype: 'BANNER'
-}
+ adtype: 'BANNER',
+};
const NATIVE_RESPONSE = Object.assign({}, RESPONSE, {
adtype: 'NATIVE',
native: {
link: {
- url: 'https://www.yieldlab.de'
+ url: 'https://www.yieldlab.de',
},
assets: [
{
id: 1,
title: {
- text: 'This is a great headline'
- }
+ text: 'This is a great headline',
+ },
},
{
id: 2,
img: {
url: 'https://localhost:8080/yl-logo100x100.jpg',
w: 100,
- h: 100
- }
+ h: 100,
+ },
},
{
id: 3,
data: {
- value: 'Native body value'
- }
- }
+ value: 'Native body value',
+ },
+ },
],
imptrackers: [
'http://localhost:8080/ve?d=ODE9ZSY2MTI1MjAzNjMzMzYxPXN0JjA0NWUwZDk0NTY5Yi05M2FiLWUwZTQtOWFjNy1hYWY0MzFiZj1kaXQmMj12',
'http://localhost:8080/md/1111/9efa4e76-2030-4f04-bb9f-322541f8d611?mdata=false&pvid=false&ids=x:1',
- 'http://localhost:8080/imp?s=13216&d=2171514&a=12548955&ts=1633363025216&tid=fb134faa-7ca9-4e0e-ba39-b96549d0e540&l=0'
- ]
- }
-})
+ 'http://localhost:8080/imp?s=13216&d=2171514&a=12548955&ts=1633363025216&tid=fb134faa-7ca9-4e0e-ba39-b96549d0e540&l=0',
+ ],
+ },
+});
const VIDEO_RESPONSE = Object.assign({}, RESPONSE, {
- adtype: 'VIDEO'
-})
+ adtype: 'VIDEO',
+});
const PVID_RESPONSE = Object.assign({}, VIDEO_RESPONSE, {
- pvid: '43513f11-55a0-4a83-94e5-0ebc08f54a2c'
-})
+ pvid: '43513f11-55a0-4a83-94e5-0ebc08f54a2c',
+});
const REQPARAMS = {
json: true,
- ts: 1234567890
-}
+ ts: 1234567890,
+};
const REQPARAMS_GDPR = Object.assign({}, REQPARAMS, {
gdpr: true,
- consent: 'BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA'
-})
+ consent: 'BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA',
+});
const REQPARAMS_IAB_CONTENT = Object.assign({}, REQPARAMS, {
- iab_content: 'id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0'
-})
+ iab_content: 'id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0',
+});
describe('yieldlabBidAdapter', () => {
describe('instantiation from spec', () => {
it('is working properly', () => {
- const yieldlabBidAdapter = newBidder(spec)
- expect(yieldlabBidAdapter.callBids).to.exist.and.to.be.a('function')
- })
- })
+ const yieldlabBidAdapter = newBidder(spec);
+ expect(yieldlabBidAdapter.callBids).to.exist.and.to.be.a('function');
+ });
+ });
describe('isBidRequestValid', () => {
it('should return true when all required parameters are found', () => {
const request = {
params: {
adslotId: '1111',
- supplyId: '2222'
- }
- }
- expect(spec.isBidRequestValid(request)).to.equal(true)
- })
+ supplyId: '2222',
+ },
+ };
+ expect(spec.isBidRequestValid(request)).to.equal(true);
+ });
it('should return false when required parameters are missing', () => {
- expect(spec.isBidRequestValid({})).to.equal(false)
- })
- })
+ expect(spec.isBidRequestValid({})).to.equal(false);
+ });
+ });
describe('buildRequests', () => {
- const bidRequests = [DEFAULT_REQUEST()]
+ const bidRequests = [DEFAULT_REQUEST()];
describe('default functionality', () => {
- let request
+ let request;
before(() => {
- request = spec.buildRequests(bidRequests)
- })
+ request = spec.buildRequests(bidRequests);
+ });
it('sends bid request to ENDPOINT via GET', () => {
- expect(request.method).to.equal('GET')
- })
+ expect(request.method).to.equal('GET');
+ });
it('returns a list of valid requests', () => {
- expect(request.validBidRequests).to.eql(bidRequests)
- })
+ expect(request.validBidRequests).to.eql(bidRequests);
+ });
it('passes single-encoded targeting to bid request', () => {
- expect(request.url).to.include('t=key1%3Dvalue1%26key2%3Dvalue2%26notDoubleEncoded%3Dvalue3%2Cvalue4')
- })
+ expect(request.url).to.include('t=key1%3Dvalue1%26key2%3Dvalue2%26notDoubleEncoded%3Dvalue3%2Cvalue4');
+ });
it('passes userids to bid request', () => {
- expect(request.url).to.include('ids=netid.de%3AfH5A3n2O8_CZZyPoJVD-eabc6ECb7jhxCicsds7qSg%2Cdigitrust.de%3Ad8aa10fa-d86c-451d-aad8-5f16162a9e64')
- })
+ expect(request.url).to.include('ids=netid.de%3AfH5A3n2O8_CZZyPoJVD-eabc6ECb7jhxCicsds7qSg%2Cdigitrust.de%3Ad8aa10fa-d86c-451d-aad8-5f16162a9e64');
+ });
it('passes atype to bid request', () => {
- expect(request.url).to.include('atypes=netid.de%3A1%2Cdigitrust.de%3A2')
- })
+ expect(request.url).to.include('atypes=netid.de%3A1%2Cdigitrust.de%3A2');
+ });
it('passes extra params to bid request', () => {
- expect(request.url).to.include('extraParam=true&foo=bar')
- })
+ expect(request.url).to.include('extraParam=true&foo=bar');
+ });
it('passes unencoded schain string to bid request', () => {
- expect(request.url).to.include('schain=1.0,1!indirectseller.com,1,1,,,,!indirectseller2.com,2,1,,indirectseller2%20name%20with%20comma%20%2C%20and%20bang%20%21,,')
- })
+ expect(request.url).to.include('schain=1.0,1!indirectseller.com,1,1,,,,!indirectseller2.com,2,1,,indirectseller2%20name%20with%20comma%20%2C%20and%20bang%20%21,,');
+ });
it('passes iab_content string to bid request', () => {
- expect(request.url).to.include('iab_content=id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0')
- })
+ expect(request.url).to.include('iab_content=id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0');
+ });
it('passes correct size to bid request', () => {
- expect(request.url).to.include('728x90')
- })
+ expect(request.url).to.include('728x90');
+ });
it('passes external id to bid request', () => {
- expect(request.url).to.include('id=abc')
- })
- })
+ expect(request.url).to.include('id=abc');
+ });
+ });
describe('iab_content handling', () => {
const siteConfig = {
ortb2: {
site: {
content: {
- id: 'id_from_config'
- }
- }
- }
- }
+ id: 'id_from_config',
+ },
+ },
+ },
+ };
beforeEach(() => {
- config.setConfig(siteConfig)
- })
+ config.setConfig(siteConfig);
+ });
afterEach(() => {
- config.resetConfig()
- })
+ config.resetConfig();
+ });
it('generates iab_content string from bidder params', () => {
- const request = spec.buildRequests(bidRequests)
- expect(request.url).to.include('iab_content=id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0')
- })
+ const request = spec.buildRequests(bidRequests);
+ expect(request.url).to.include('iab_content=id%3Afoo_id%2Cepisode%3A99%2Ctitle%3Afoo_title%252Cbar_title%2Cseries%3Afoo_series%2Cseason%3As1%2Cartist%3Afoo%2520bar%2Cgenre%3Abaz%2Cisrc%3ACC-XXX-YY-NNNNN%2Curl%3Ahttp%253A%252F%252Ffoo_url.de%2Ccat%3Acat1%7Ccat2%252Cppp%7Ccat3%257C%257C%257C%252F%252F%2Ccontext%3A7%2Ckeywords%3Ak1%252C%7Ck2..%2Clive%3A0');
+ });
it('generates iab_content string from first party data if not provided in bidder params', () => {
- const requestWithoutIabContent = DEFAULT_REQUEST()
- delete requestWithoutIabContent.params.iabContent
+ const requestWithoutIabContent = DEFAULT_REQUEST();
+ delete requestWithoutIabContent.params.iabContent;
- const request = spec.buildRequests([{...requestWithoutIabContent, ...siteConfig}])
- expect(request.url).to.include('iab_content=id%3Aid_from_config')
- })
+ const request = spec.buildRequests([{...requestWithoutIabContent, ...siteConfig}]);
+ expect(request.url).to.include('iab_content=id%3Aid_from_config');
+ });
it('flattens the iabContent, encodes the values, joins the keywords into one value, and than encodes the iab_content request param ', () => {
const expectedIabContentValue = encodeURIComponent(
@@ -382,18 +382,18 @@ describe('yieldlabBidAdapter', () => {
'channel.id:bar,' +
'channel.name:foo,' +
'channel.domain:channel.test'
- )
- const request = spec.buildRequests([IAB_REQUEST()], REQPARAMS)
- expect(request.url).to.include('iab_content=' + expectedIabContentValue)
- })
- })
+ );
+ const request = spec.buildRequests([IAB_REQUEST()], REQPARAMS);
+ expect(request.url).to.include('iab_content=' + expectedIabContentValue);
+ });
+ });
it('passes unencoded schain string to bid request when complete == 0', () => {
- const schainRequest = DEFAULT_REQUEST()
+ const schainRequest = DEFAULT_REQUEST();
schainRequest.schain.complete = 0; //
- const request = spec.buildRequests([schainRequest])
- expect(request.url).to.include('schain=1.0,0!indirectseller.com,1,1,,,,!indirectseller2.com,2,1,,indirectseller2%20name%20with%20comma%20%2C%20and%20bang%20%21,,')
- })
+ const request = spec.buildRequests([schainRequest]);
+ expect(request.url).to.include('schain=1.0,0!indirectseller.com,1,1,,,,!indirectseller2.com,2,1,,indirectseller2%20name%20with%20comma%20%2C%20and%20bang%20%21,,');
+ });
it('passes encoded referer to bid request', () => {
const refererRequest = spec.buildRequests(bidRequests, {
@@ -402,123 +402,123 @@ describe('yieldlabBidAdapter', () => {
numIframes: 0,
reachedTop: true,
page: 'https://www.yieldlab.de/test?with=querystring',
- stack: ['https://www.yieldlab.de/test?with=querystring']
- }
- })
+ stack: ['https://www.yieldlab.de/test?with=querystring'],
+ },
+ });
- expect(refererRequest.url).to.include('pubref=https%3A%2F%2Fwww.yieldlab.de%2Ftest%3Fwith%3Dquerystring')
- })
+ expect(refererRequest.url).to.include('pubref=https%3A%2F%2Fwww.yieldlab.de%2Ftest%3Fwith%3Dquerystring');
+ });
it('passes gdpr flag and consent if present', () => {
const gdprRequest = spec.buildRequests(bidRequests, {
gdprConsent: {
consentString: 'BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA',
- gdprApplies: true
- }
- })
+ gdprApplies: true,
+ },
+ });
- expect(gdprRequest.url).to.include('consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA')
- expect(gdprRequest.url).to.include('gdpr=true')
- })
+ expect(gdprRequest.url).to.include('consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA');
+ expect(gdprRequest.url).to.include('gdpr=true');
+ });
describe('sizes handling', () => {
it('passes correct size to bid request for mediaType banner', () => {
const bannerRequest = DEFAULT_REQUEST();
bannerRequest.mediaTypes = {
banner: {
- sizes: [[123, 456]]
- }
- }
+ sizes: [[123, 456]],
+ },
+ };
// when mediaTypes is present it has precedence over the sizes field (728, 90)
- let request = spec.buildRequests([bannerRequest], REQPARAMS)
- expect(request.url).to.include('sizes')
- expect(request.url).to.include('123x456')
-
- bannerRequest.mediaTypes.banner.sizes = [123, 456]
- request = spec.buildRequests([bannerRequest], REQPARAMS)
- expect(request.url).to.include('123x456')
-
- bannerRequest.mediaTypes.banner.sizes = [[123, 456], [320, 240]]
- request = spec.buildRequests([bannerRequest], REQPARAMS)
- expect(request.url).to.include('123x456')
- expect(request.url).to.include('320x240')
- })
+ let request = spec.buildRequests([bannerRequest], REQPARAMS);
+ expect(request.url).to.include('sizes');
+ expect(request.url).to.include('123x456');
+
+ bannerRequest.mediaTypes.banner.sizes = [123, 456];
+ request = spec.buildRequests([bannerRequest], REQPARAMS);
+ expect(request.url).to.include('123x456');
+
+ bannerRequest.mediaTypes.banner.sizes = [[123, 456], [320, 240]];
+ request = spec.buildRequests([bannerRequest], REQPARAMS);
+ expect(request.url).to.include('123x456');
+ expect(request.url).to.include('320x240');
+ });
it('passes correct sizes to bid request when mediaType is not present', () => {
// information is taken from the top level sizes field
const sizesRequest = DEFAULT_REQUEST();
- let request = spec.buildRequests([sizesRequest], REQPARAMS)
- expect(request.url).to.include('sizes')
- expect(request.url).to.include('728x90')
+ let request = spec.buildRequests([sizesRequest], REQPARAMS);
+ expect(request.url).to.include('sizes');
+ expect(request.url).to.include('728x90');
- sizesRequest.sizes = [[728, 90]]
- request = spec.buildRequests([sizesRequest], REQPARAMS)
- expect(request.url).to.include('728x90')
+ sizesRequest.sizes = [[728, 90]];
+ request = spec.buildRequests([sizesRequest], REQPARAMS);
+ expect(request.url).to.include('728x90');
- sizesRequest.sizes = [[728, 90], [320, 240]]
- request = spec.buildRequests([sizesRequest], REQPARAMS)
- expect(request.url).to.include('728x90')
- })
+ sizesRequest.sizes = [[728, 90], [320, 240]];
+ request = spec.buildRequests([sizesRequest], REQPARAMS);
+ expect(request.url).to.include('728x90');
+ });
it('does not pass the sizes parameter for mediaType video', () => {
const videoRequest = VIDEO_REQUEST();
- let request = spec.buildRequests([videoRequest], REQPARAMS)
- expect(request.url).to.not.include('sizes')
- })
+ let request = spec.buildRequests([videoRequest], REQPARAMS);
+ expect(request.url).to.not.include('sizes');
+ });
it('does not pass the sizes parameter for mediaType native', () => {
const nativeRequest = NATIVE_REQUEST();
- let request = spec.buildRequests([nativeRequest], REQPARAMS)
- expect(request.url).to.not.include('sizes')
- })
- })
- })
+ let request = spec.buildRequests([nativeRequest], REQPARAMS);
+ expect(request.url).to.not.include('sizes');
+ });
+ });
+ });
describe('interpretResponse', () => {
- let bidRequest
+ let bidRequest;
before(() => {
- bidRequest = DEFAULT_REQUEST()
- })
+ bidRequest = DEFAULT_REQUEST();
+ });
it('handles nobid responses', () => {
- expect(spec.interpretResponse({body: {}}, {validBidRequests: []}).length).to.equal(0)
- expect(spec.interpretResponse({body: []}, {validBidRequests: []}).length).to.equal(0)
- })
+ expect(spec.interpretResponse({body: {}}, {validBidRequests: []}).length).to.equal(0);
+ expect(spec.interpretResponse({body: []}, {validBidRequests: []}).length).to.equal(0);
+ });
it('should get correct bid response', () => {
- const result = spec.interpretResponse({body: [RESPONSE]}, {validBidRequests: [bidRequest], queryParams: REQPARAMS})
-
- expect(result[0].requestId).to.equal('2d925f27f5079f')
- expect(result[0].cpm).to.equal(0.01)
- expect(result[0].width).to.equal(728)
- expect(result[0].height).to.equal(90)
- expect(result[0].creativeId).to.equal('1111')
- expect(result[0].dealId).to.equal(2222)
- expect(result[0].currency).to.equal('EUR')
- expect(result[0].netRevenue).to.equal(false)
- expect(result[0].ttl).to.equal(300)
- expect(result[0].referrer).to.equal('')
- expect(result[0].meta.advertiserDomains).to.equal('yieldlab')
- expect(result[0].ad).to.include('