diff --git a/modules/adagioBidAdapter.js b/modules/adagioBidAdapter.js index a24bc889411..7ab2f0c98b1 100644 --- a/modules/adagioBidAdapter.js +++ b/modules/adagioBidAdapter.js @@ -639,7 +639,7 @@ export function setExtraParam(bid, paramName) { } const adgGlobalConf = config.getConfig('adagio') || {}; - const ortb2Conf = config.getConfig('ortb2'); + const ortb2Conf = bid.ortb2; const detected = adgGlobalConf[paramName] || deepAccess(ortb2Conf, `site.ext.data.${paramName}`, null); if (detected) { diff --git a/modules/adfBidAdapter.js b/modules/adfBidAdapter.js index f0425a174ff..1797585efed 100644 --- a/modules/adfBidAdapter.js +++ b/modules/adfBidAdapter.js @@ -66,7 +66,7 @@ export const spec = { buildRequests: (validBidRequests, bidderRequest) => { let app, site; - const commonFpd = getConfig('ortb2') || {}; + const commonFpd = bidderRequest.ortb2 || {}; let { user } = commonFpd; if (typeof getConfig('app') === 'object') { diff --git a/modules/adkernelBidAdapter.js b/modules/adkernelBidAdapter.js index c2d6ca4d4dd..73464d46219 100644 --- a/modules/adkernelBidAdapter.js +++ b/modules/adkernelBidAdapter.js @@ -506,7 +506,7 @@ function makeSyncInfo(bidderRequest) { * @return {Object} Complete rtb request */ function buildRtbRequest(imps, bidderRequest, schain) { - let fpd = config.getConfig('ortb2') || {}; + let fpd = bidderRequest.ortb2 || {}; let req = mergeDeep( makeBaseRequest(bidderRequest, imps, fpd), diff --git a/modules/adlooxRtdProvider.js b/modules/adlooxRtdProvider.js index bb8334ec8fe..0a224eca0e5 100644 --- a/modules/adlooxRtdProvider.js +++ b/modules/adlooxRtdProvider.js @@ -12,7 +12,6 @@ /* eslint prebid/validate-imports: "off" */ import {command as analyticsCommand, COMMAND} from './adlooxAnalyticsAdapter.js'; -import {config as _config} from '../src/config.js'; import {submodule} from '../src/hook.js'; import {ajax} from '../src/ajax.js'; import {getGlobal} from '../src/prebidGlobal.js'; @@ -231,9 +230,9 @@ function getBidRequestData(reqBidsConfigObj, callback, config, userConsent) { return config.params.thresholds.filter(t => t <= v); } - const ortb2 = _config.getConfig('ortb2') || {}; - const dataSite = _config.getConfig('ortb2.site.ext.data') || {}; - const dataUser = _config.getConfig('ortb2.user.ext.data') || {}; + const ortb2 = reqBidsConfigObj.ortb2Fragments?.global || {}; + const dataSite = deepAccess(ortb2, 'site.ext.data') || {}; + const dataUser = deepAccess(ortb2, 'user.ext.data') || {}; _each(response, (v0, k0) => { if (k0 == '_') return; @@ -245,7 +244,7 @@ function getBidRequestData(reqBidsConfigObj, callback, config, userConsent) { deepSetValue(ortb2, 'site.ext.data', dataSite); deepSetValue(ortb2, 'user.ext.data', dataUser); - _config.setConfig({ ortb2 }); + deepSetValue(reqBidsConfigObj, 'ortb2Fragments.global', ortb2); adUnits.forEach((adUnit, i) => { _each(response['_'][i], (v0, k0) => { @@ -365,7 +364,7 @@ function getBidRequestData(reqBidsConfigObj, callback, config, userConsent) { }); } -function getTargetingData(adUnitArray, config, userConsent) { +function getTargetingData(adUnitArray, config, userConsent, auction) { function targetingNormalise(v) { if (isArray(v) && v.length == 0) return undefined; if (isBoolean(v)) v = ~~v; @@ -373,10 +372,11 @@ function getTargetingData(adUnitArray, config, userConsent) { return v; } - const dataSite = _config.getConfig(`ortb2.site.ext.data.${MODULE_NAME}_rtd`) || {}; + const ortb2 = auction.getFPD().global || {}; + const dataSite = deepAccess(ortb2, `site.ext.data.${MODULE_NAME}_rtd`) || {}; if (!dataSite.ok) return {}; - const dataUser = _config.getConfig(`ortb2.user.ext.data.${MODULE_NAME}_rtd`) || {}; + const dataUser = deepAccess(ortb2, `user.ext.data.${MODULE_NAME}_rtd`) || {}; return getGlobal().adUnits.filter(adUnit => includes(adUnitArray, adUnit.code)).reduce((a, adUnit) => { a[adUnit.code] = {}; diff --git a/modules/admixerBidAdapter.js b/modules/admixerBidAdapter.js index dfb76a03804..f6301fba56c 100644 --- a/modules/admixerBidAdapter.js +++ b/modules/admixerBidAdapter.js @@ -32,7 +32,7 @@ export const spec = { } while (w !== window.top); const payload = { imps: [], - ortb2: config.getConfig('ortb2'), + ortb2: bidderRequest.ortb2, docReferrer: docRef, }; let endpointUrl; diff --git a/modules/adnuntiusBidAdapter.js b/modules/adnuntiusBidAdapter.js index 9e05ea664d8..9c37d68d272 100644 --- a/modules/adnuntiusBidAdapter.js +++ b/modules/adnuntiusBidAdapter.js @@ -55,7 +55,7 @@ export const spec = { const bidRequests = {}; const requests = []; const request = []; - const ortb2 = config.getConfig('ortb2'); + const ortb2 = bidderRequest.ortb2 || {}; const bidderConfig = config.getConfig(); const adnMeta = handleMeta() diff --git a/modules/adrelevantisBidAdapter.js b/modules/adrelevantisBidAdapter.js index 3d4de7c7b9d..73077241c3b 100644 --- a/modules/adrelevantisBidAdapter.js +++ b/modules/adrelevantisBidAdapter.js @@ -135,7 +135,7 @@ export const spec = { payload.referrer_detection = refererinfo; } - let fpdcfg = config.getLegacyFpd(config.getConfig('ortb2')); + let fpdcfg = config.getLegacyFpd(bidderRequest.ortb2); if (fpdcfg && fpdcfg.context) { let fdata = { keywords: fpdcfg.context.keywords || '', diff --git a/modules/adxcgBidAdapter.js b/modules/adxcgBidAdapter.js index 81872100cd1..a4984840e01 100644 --- a/modules/adxcgBidAdapter.js +++ b/modules/adxcgBidAdapter.js @@ -67,7 +67,7 @@ export const spec = { buildRequests: (validBidRequests, bidderRequest) => { let app, site; - const commonFpd = getConfig('ortb2') || {}; + const commonFpd = bidderRequest.ortb2 || {}; let { user } = commonFpd; if (typeof getConfig('app') === 'object') { diff --git a/modules/airgridRtdProvider.js b/modules/airgridRtdProvider.js index b2e78a7df78..0d2eae9f1c3 100644 --- a/modules/airgridRtdProvider.js +++ b/modules/airgridRtdProvider.js @@ -5,9 +5,8 @@ * @module modules/airgridRtdProvider * @requires module:modules/realTimeData */ -import {config} from '../src/config.js'; import {submodule} from '../src/hook.js'; -import {mergeDeep, isPlainObject, deepSetValue, deepAccess} from '../src/utils.js'; +import {deepAccess, deepSetValue, mergeDeep} from '../src/utils.js'; import {getGlobal} from '../src/prebidGlobal.js'; import {getStorageManager} from '../src/storageManager.js'; @@ -76,25 +75,15 @@ function setAudiencesToAppNexusAdUnits(adUnits, audiences) { * Pass audience data to configured bidders, using ORTB2 * @param {Object} rtdConfig * @param {Array} audiences - * @return {void} + * @return {{}} a map from bidder code to ORTB2 config */ -export function setAudiencesUsingBidderOrtb2(rtdConfig, audiences) { +export function getAudiencesAsBidderOrtb2(rtdConfig, audiences) { const bidders = deepAccess(rtdConfig, 'params.bidders'); - if (!bidders || bidders.length === 0) return; - const allBiddersConfig = config.getBidderConfig(); + if (!bidders || bidders.length === 0) return {}; const agOrtb2 = {} deepSetValue(agOrtb2, 'ortb2.user.ext.data.airgrid', audiences || []); - bidders.forEach((bidder) => { - let bidderConfig = {}; - if (isPlainObject(allBiddersConfig[bidder])) { - bidderConfig = allBiddersConfig[bidder]; - } - config.setBidderConfig({ - bidders: [bidder], - config: mergeDeep(bidderConfig, agOrtb2) - }); - }); + return Object.fromEntries(bidders.map(bidder => [bidder, agOrtb2])); } /** @@ -120,7 +109,7 @@ export function passAudiencesToBidders(bidConfig, onDone, rtdConfig, userConsent const adUnits = bidConfig.adUnits || getGlobal().adUnits; const audiences = getMatchedAudiencesFromStorage(); if (audiences.length > 0) { - setAudiencesUsingBidderOrtb2(rtdConfig, audiences); + mergeDeep(bidConfig?.ortb2Fragments?.bidder, getAudiencesAsBidderOrtb2(rtdConfig, audiences)); if (adUnits) { setAudiencesToAppNexusAdUnits(adUnits, audiences); } diff --git a/modules/akamaiDapRtdProvider.js b/modules/akamaiDapRtdProvider.js index aca984d39c8..11ff1022e09 100644 --- a/modules/akamaiDapRtdProvider.js +++ b/modules/akamaiDapRtdProvider.js @@ -6,10 +6,9 @@ * @requires module:modules/realTimeData */ import {ajax} from '../src/ajax.js'; -import {config} from '../src/config.js'; import {getStorageManager} from '../src/storageManager.js'; import {submodule} from '../src/hook.js'; -import {isPlainObject, mergeDeep, logMessage, logInfo, logError} from '../src/utils.js'; +import {isPlainObject, logError, logInfo, logMessage, mergeDeep} from '../src/utils.js'; const MODULE_NAME = 'realTimeData'; const SUBMODULE_NAME = 'dap'; @@ -38,13 +37,12 @@ function mergeLazy(target, source) { * @param {Object} rtd * @param {Object} rtdConfig */ -export function addRealTimeData(rtd) { +export function addRealTimeData(ortb2, rtd) { logInfo('DEBUG(addRealTimeData) - ENTER'); if (isPlainObject(rtd.ortb2)) { - let ortb2 = config.getConfig('ortb2') || {}; logMessage('DEBUG(addRealTimeData): merging original: ', ortb2); logMessage('DEBUG(addRealTimeData): merging in: ', rtd.ortb2); - config.setConfig({ortb2: mergeLazy(ortb2, rtd.ortb2)}); + mergeLazy(ortb2, rtd.ortb2); } logInfo('DEBUG(addRealTimeData) - EXIT'); } @@ -64,7 +62,7 @@ export function getRealTimeData(bidConfig, onDone, rtdConfig, userConsent) { if (jsonData) { let data = JSON.parse(jsonData); if (data.rtd) { - addRealTimeData(data.rtd); + addRealTimeData(bidConfig.ortb2Fragments?.global, data.rtd); onDone(); logInfo('DEBUG(getRealTimeData) - 1'); // Don't return - ensure the data is always fresh. diff --git a/modules/amxBidAdapter.js b/modules/amxBidAdapter.js index d1754936d7f..901e2c508f0 100644 --- a/modules/amxBidAdapter.js +++ b/modules/amxBidAdapter.js @@ -251,7 +251,7 @@ export const spec = { d: '', m: createBidMap(bidRequests), cpp: config.getConfig('coppa') ? 1 : 0, - fpd2: config.getConfig('ortb2'), + fpd2: bidderRequest.ortb2, tmax: config.getConfig('bidderTimeout'), eids: values(bidRequests.reduce((all, bid) => { // we only want unique ones in here diff --git a/modules/beachfrontBidAdapter.js b/modules/beachfrontBidAdapter.js index 1c341e4dc51..a7b7589795d 100644 --- a/modules/beachfrontBidAdapter.js +++ b/modules/beachfrontBidAdapter.js @@ -369,7 +369,7 @@ function createVideoRequestData(bid, bidderRequest) { let tagid = getVideoBidParam(bid, 'tagid'); let topLocation = getTopWindowLocation(bidderRequest); let eids = getEids(bid); - let ortb2 = deepClone(config.getConfig('ortb2')); + let ortb2 = deepClone(bidderRequest.ortb2); let payload = { isPrebid: true, appId: appId, @@ -443,7 +443,7 @@ function createBannerRequestData(bids, bidderRequest) { sizes: getBannerSizes(bid) }; }); - let ortb2 = deepClone(config.getConfig('ortb2')); + let ortb2 = deepClone(bidderRequest.ortb2); let payload = { slots: slots, ortb2: ortb2, diff --git a/modules/beopBidAdapter.js b/modules/beopBidAdapter.js index 2e74170fcaf..1f84c160297 100644 --- a/modules/beopBidAdapter.js +++ b/modules/beopBidAdapter.js @@ -37,7 +37,7 @@ export const spec = { buildRequests: function(validBidRequests, bidderRequest) { const slots = validBidRequests.map(beOpRequestSlotsMaker); let pageUrl = deepAccess(window, 'location.href') || deepAccess(bidderRequest, 'refererInfo.canonicalUrl') || config.getConfig('pageUrl'); - let fpd = config.getLegacyFpd(config.getConfig('ortb2')); + let fpd = config.getLegacyFpd(bidderRequest.ortb2); let gdpr = bidderRequest.gdprConsent; let firstSlot = slots[0]; let payloadObject = { diff --git a/modules/brandmetricsRtdProvider.js b/modules/brandmetricsRtdProvider.js index 60d3c98f15e..53868eccc4c 100644 --- a/modules/brandmetricsRtdProvider.js +++ b/modules/brandmetricsRtdProvider.js @@ -5,10 +5,10 @@ * @module modules/brandmetricsRtdProvider * @requires module:modules/realTimeData */ -import { config } from '../src/config.js' -import { submodule } from '../src/hook.js' -import { deepSetValue, mergeDeep, logError, deepAccess } from '../src/utils.js' -import {loadExternalScript} from '../src/adloader.js' +import {submodule} from '../src/hook.js'; +import {deepAccess, deepSetValue, logError, mergeDeep} from '../src/utils.js'; +import {loadExternalScript} from '../src/adloader.js'; + const MODULE_NAME = 'brandmetrics' const MODULE_CODE = MODULE_NAME const RECEIVED_EVENTS = [] @@ -109,11 +109,8 @@ function processBrandmetricsEvents (reqBidsConfigObj, moduleConfig, callback) { function setBidderTargeting (reqBidsConfigObj, moduleConfig, key, val) { const bidders = deepAccess(moduleConfig, 'params.bidders') if (bidders && bidders.length > 0) { - const ortb2 = {} - deepSetValue(ortb2, 'ortb2.user.ext.data.' + key, val) - config.setBidderConfig({ - bidders: bidders, - config: ortb2 + bidders.forEach(bidder => { + deepSetValue(reqBidsConfigObj, `ortb2Fragments.bidder.${bidder}.user.ext.data.${key}`, val); }) } } diff --git a/modules/conversantBidAdapter.js b/modules/conversantBidAdapter.js index 7ee8b1b7681..d703504b228 100644 --- a/modules/conversantBidAdapter.js +++ b/modules/conversantBidAdapter.js @@ -2,7 +2,6 @@ import { logWarn, isStr, deepAccess, isArray, getBidIdParameter, deepSetValue, i import {registerBidder} from '../src/adapters/bidderFactory.js'; import {BANNER, VIDEO} from '../src/mediaTypes.js'; import {getStorageManager} from '../src/storageManager.js'; -import { config } from '../src/config.js'; const GVLID = 24; @@ -177,7 +176,7 @@ export const spec = { payload.user = {ext: userExt}; } - const firstPartyData = config.getConfig('ortb2') || {}; + const firstPartyData = bidderRequest.ortb2 || {}; mergeDeep(payload, firstPartyData); return { diff --git a/modules/criteoBidAdapter.js b/modules/criteoBidAdapter.js index 1ad693fcaab..711600a8003 100644 --- a/modules/criteoBidAdapter.js +++ b/modules/criteoBidAdapter.js @@ -65,7 +65,7 @@ export const spec = { buildRequests: (bidRequests, bidderRequest) => { let url; let data; - let fpd = config.getConfig('ortb2') || {}; + let fpd = bidderRequest.ortb2 || {}; Object.assign(bidderRequest, { publisherExt: fpd.site?.ext, diff --git a/modules/datablocksBidAdapter.js b/modules/datablocksBidAdapter.js index b240db1dd25..4959d413a53 100644 --- a/modules/datablocksBidAdapter.js +++ b/modules/datablocksBidAdapter.js @@ -383,7 +383,7 @@ export const spec = { gdpr: bidderRequest.gdprConsent || {}, usp: bidderRequest.uspConsent || {}, client_info: this.get_client_info(), - ortb2: config.getConfig('ortb2') || {} + ortb2: bidderRequest.ortb2 || {} } }; diff --git a/modules/dgkeywordRtdProvider.js b/modules/dgkeywordRtdProvider.js index 26a8257077a..171766ac4ce 100644 --- a/modules/dgkeywordRtdProvider.js +++ b/modules/dgkeywordRtdProvider.js @@ -7,7 +7,7 @@ * @requires module:modules/realTimeData */ -import { logMessage, deepSetValue, logError, logInfo } from '../src/utils.js'; +import {logMessage, deepSetValue, logError, logInfo, mergeDeep} from '../src/utils.js'; import { ajax } from '../src/ajax.js'; import { submodule } from '../src/hook.js'; import { getGlobal } from '../src/prebidGlobal.js'; @@ -62,8 +62,7 @@ export function getDgKeywordsAndSet(reqBidsConfigObj, callback, moduleConfig, us let addOrtb2 = {}; deepSetValue(addOrtb2, 'site.keywords', keywords); deepSetValue(addOrtb2, 'user.keywords', keywords); - const ortb2 = {ortb2: addOrtb2}; - reqBidsConfigObj.setBidderConfig({ bidders: Object.keys(targetBidKeys), config: ortb2 }); + mergeDeep(reqBidsConfigObj.ortb2Fragments.bidder, Object.fromEntries(Object.keys(targetBidKeys).map(bidder => [bidder, addOrtb2]))); } } } diff --git a/modules/distroscaleBidAdapter.js b/modules/distroscaleBidAdapter.js index 822bea3603a..b08f6755b00 100644 --- a/modules/distroscaleBidAdapter.js +++ b/modules/distroscaleBidAdapter.js @@ -197,7 +197,7 @@ export const spec = { } // First Party Data - const commonFpd = config.getConfig('ortb2') || {}; + const commonFpd = bidderRequest.ortb2 || {}; if (commonFpd.site) { mergeDeep(payload, {site: commonFpd.site}); } diff --git a/modules/enrichmentFpdModule.js b/modules/enrichmentFpdModule.js index 9268c81c033..76bae635fd3 100644 --- a/modules/enrichmentFpdModule.js +++ b/modules/enrichmentFpdModule.js @@ -151,17 +151,19 @@ function runEnrichments() { /** * Sets default values to ortb2 if exists and adds currency and ortb2 setConfig callbacks on init */ -export function initSubmodule(fpdConf, data) { +export function processFpd(fpdConf, {global}) { resetOrtb2(); - return (!fpdConf.skipEnrichments) ? mergeDeep(runEnrichments(), data) : data; + return { + global: (!fpdConf.skipEnrichments) ? mergeDeep(runEnrichments(), global) : global + }; } /** @type {firstPartyDataSubmodule} */ export const enrichmentsSubmodule = { name: 'enrichments', queue: 2, - init: initSubmodule + processFpd } submodule('firstPartyData', enrichmentsSubmodule) diff --git a/modules/etargetBidAdapter.js b/modules/etargetBidAdapter.js index f7d552b1b09..b290a62420c 100644 --- a/modules/etargetBidAdapter.js +++ b/modules/etargetBidAdapter.js @@ -1,5 +1,4 @@ import { deepSetValue, isFn, isPlainObject } from '../src/utils.js'; -import {config} from '../src/config.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import { BANNER, VIDEO } from '../src/mediaTypes.js'; @@ -91,7 +90,7 @@ export const spec = { mts['title'] = [(document.getElementsByTagName('title')[0] || []).innerHTML]; mts['base'] = [(document.getElementsByTagName('base')[0] || {}).href]; mts['referer'] = [document.location.href]; - mts['ortb2'] = (config.getConfig('ortb2') || {}); + mts['ortb2'] = (bidderRequest.ortb2 || {}); } catch (e) { mts.error = e; } diff --git a/modules/fpdModule/index.js b/modules/fpdModule/index.js index 427547a4e4d..aa658a5be4c 100644 --- a/modules/fpdModule/index.js +++ b/modules/fpdModule/index.js @@ -4,55 +4,38 @@ */ import { config } from '../../src/config.js'; import { module, getHook } from '../../src/hook.js'; -import { getGlobal } from '../../src/prebidGlobal.js'; -import { addBidderRequests } from '../../src/auction.js'; let submodules = []; /** * enable submodule in User ID - * @param {RtdSubmodule} submodule */ export function registerSubmodules(submodule) { submodules.push(submodule); } -export function init() { +export function processFpd({global = {}, bidder = {}} = {}) { let modConf = config.getConfig('firstPartyData') || {}; - let ortb2 = config.getConfig('ortb2') || {}; submodules.sort((a, b) => { return ((a.queue || 1) - (b.queue || 1)); }).forEach(submodule => { - ortb2 = submodule.init(modConf, ortb2); + ({global = global, bidder = bidder} = submodule.processFpd(modConf, {global, bidder})); }); - config.setConfig({ortb2}); + return {global, bidder}; } -/** - * BidderRequests hook to intiate module and reset modules ortb2 data object - */ -function addBidderRequestHook(fn, bidderRequests) { - init(); - fn.call(this, bidderRequests); - // Removes hook after run - addBidderRequests.getHooks({ hook: addBidderRequestHook }).remove(); +function startAuctionHook(fn, req) { + Object.assign(req, processFpd({global: req.ortb2, bidder: req.bidderOrtb2})); + fn.call(this, req); } -/** - * Sets bidderRequests hook - */ function setupHook() { - getHook('addBidderRequests').before(addBidderRequestHook); + getHook('startAuction').before(startAuctionHook, 10); } module('firstPartyData', registerSubmodules); // Runs setupHook on initial load setupHook(); - -/** - * Global function to reinitiate module - */ -(getGlobal()).refreshFpd = setupHook; diff --git a/modules/glimpseBidAdapter.js b/modules/glimpseBidAdapter.js index 35aaf56c604..3f414f32f4a 100644 --- a/modules/glimpseBidAdapter.js +++ b/modules/glimpseBidAdapter.js @@ -49,7 +49,7 @@ export const spec = { const auth = getVaultJwt(); const referer = getReferer(bidderRequest); const imp = validBidRequests.map(processBidRequest); - const fpd = getFirstPartyData(); + const fpd = getFirstPartyData(bidderRequest.ortb2); const data = { auth, @@ -160,8 +160,8 @@ function normalizeSizes(sizes) { return sizes; } -function getFirstPartyData() { - let fpd = config.getConfig('ortb2') || {}; +function getFirstPartyData(ortb2) { + let fpd = ortb2 || {}; optimizeObject(fpd); return fpd; } diff --git a/modules/gridBidAdapter.js b/modules/gridBidAdapter.js index e1090732071..b82241a15f2 100644 --- a/modules/gridBidAdapter.js +++ b/modules/gridBidAdapter.js @@ -176,7 +176,7 @@ export const spec = { }; } - const ortb2UserData = config.getConfig('ortb2.user.data'); + const ortb2UserData = deepAccess(bidderRequest, 'ortb2.user.data'); if (ortb2UserData && ortb2UserData.length) { if (!user) { user = { data: [] }; @@ -190,7 +190,7 @@ export const spec = { userExt = {consent: gdprConsent.consentString}; } - const ortb2UserExtDevice = config.getConfig('ortb2.user.ext.device'); + const ortb2UserExtDevice = deepAccess(bidderRequest, 'ortb2.user.ext.device'); if (ortb2UserExtDevice) { userExt = userExt || {}; userExt.device = { ...ortb2UserExtDevice }; @@ -217,8 +217,8 @@ export const spec = { request.user = user; } - const userKeywords = deepAccess(config.getConfig('ortb2.user'), 'keywords') || null; - const siteKeywords = deepAccess(config.getConfig('ortb2.site'), 'keywords') || null; + const userKeywords = deepAccess(bidderRequest, 'ortb2.user.keywords') || null; + const siteKeywords = deepAccess(bidderRequest, 'ortb2.site.keywords') || null; if (userKeywords) { pageKeywords = pageKeywords || {}; @@ -272,7 +272,7 @@ export const spec = { request.regs.coppa = 1; } - const site = config.getConfig('ortb2.site'); + const site = deepAccess(bidderRequest, 'ortb2.site'); if (site) { const pageCategory = [...(site.cat || []), ...(site.pagecat || [])].filter((category) => { return category && typeof category === 'string' diff --git a/modules/hadronRtdProvider.js b/modules/hadronRtdProvider.js index 0b1081f174a..2457e6defbc 100644 --- a/modules/hadronRtdProvider.js +++ b/modules/hadronRtdProvider.js @@ -114,27 +114,13 @@ export function addRealTimeData(bidConfig, rtd, rtdConfig) { if (rtdConfig.params && rtdConfig.params.handleRtd) { rtdConfig.params.handleRtd(bidConfig, rtd, rtdConfig, config); } else { + // TODO: this and haloRtdProvider are a copy-paste of each other if (isPlainObject(rtd.ortb2)) { - let ortb2 = config.getConfig('ortb2') || {}; - config.setConfig({ortb2: mergeLazy(ortb2, rtd.ortb2)}); + mergeLazy(bidConfig.ortb2Fragments?.global, rtd.ortb2); } if (isPlainObject(rtd.ortb2b)) { - let bidderConfig = config.getBidderConfig(); - - Object.keys(rtd.ortb2b).forEach(bidder => { - let rtdOptions = rtd.ortb2b[bidder] || {}; - - let bidderOptions = {}; - if (isPlainObject(bidderConfig[bidder])) { - bidderOptions = bidderConfig[bidder]; - } - - config.setBidderConfig({ - bidders: [bidder], - config: mergeLazy(bidderOptions, rtdOptions) - }); - }); + mergeLazy(bidConfig.ortb2Fragments?.bidder, Object.fromEntries(Object.entries(rtd.ortb2b).map(([_, cfg]) => [_, cfg.ortb2]))); } } } @@ -161,11 +147,13 @@ export function getRealTimeData(bidConfig, onDone, rtdConfig, userConsent) { } } - const userIds = (getGlobal()).getUserIds(); + const userIds = typeof getGlobal().getUserIds === 'function' ? (getGlobal()).getUserIds() : {}; let hadronId = storage.getDataFromLocalStorage(HALOID_LOCAL_NAME); if (isStr(hadronId)) { - (getGlobal()).refreshUserIds({submoduleNames: 'hadronId'}); + if (typeof getGlobal().refreshUserIds === 'function') { + (getGlobal()).refreshUserIds({submoduleNames: 'hadronId'}); + } userIds.hadronId = hadronId; getRealTimeDataAsync(bidConfig, onDone, rtdConfig, userConsent, userIds); } else { @@ -194,7 +182,7 @@ export function getRealTimeDataAsync(bidConfig, onDone, rtdConfig, userConsent, let reqParams = {}; if (isPlainObject(rtdConfig)) { - set(rtdConfig, 'params.requestParams.ortb2', config.getConfig('ortb2')); + set(rtdConfig, 'params.requestParams.ortb2', bidConfig.ortb2Fragments.global); reqParams = rtdConfig.params.requestParams; } diff --git a/modules/haloRtdProvider.js b/modules/haloRtdProvider.js index 1810bfb6f63..65d83b807ab 100644 --- a/modules/haloRtdProvider.js +++ b/modules/haloRtdProvider.js @@ -114,27 +114,12 @@ export function addRealTimeData(bidConfig, rtd, rtdConfig) { if (rtdConfig.params && rtdConfig.params.handleRtd) { rtdConfig.params.handleRtd(bidConfig, rtd, rtdConfig, config); } else { + // TODO: this and hadronRtdProvider are a copy-paste of each other if (isPlainObject(rtd.ortb2)) { - let ortb2 = config.getConfig('ortb2') || {}; - config.setConfig({ortb2: mergeLazy(ortb2, rtd.ortb2)}); + mergeLazy(bidConfig.ortb2Fragments?.global, rtd.ortb2); } - if (isPlainObject(rtd.ortb2b)) { - let bidderConfig = config.getBidderConfig(); - - Object.keys(rtd.ortb2b).forEach(bidder => { - let rtdOptions = rtd.ortb2b[bidder] || {}; - - let bidderOptions = {}; - if (isPlainObject(bidderConfig[bidder])) { - bidderOptions = bidderConfig[bidder]; - } - - config.setBidderConfig({ - bidders: [bidder], - config: mergeLazy(bidderOptions, rtdOptions) - }); - }); + mergeLazy(bidConfig.ortb2Fragments?.bidder, Object.fromEntries(Object.entries(rtd.ortb2b).map(([_, cfg]) => [_, cfg.ortb2]))); } } } @@ -161,11 +146,13 @@ export function getRealTimeData(bidConfig, onDone, rtdConfig, userConsent) { } } - const userIds = (getGlobal()).getUserIds(); + const userIds = typeof getGlobal().getUserIds === 'function' ? (getGlobal()).getUserIds() : {}; let haloId = storage.getDataFromLocalStorage(HALOID_LOCAL_NAME); if (isStr(haloId)) { - (getGlobal()).refreshUserIds({submoduleNames: 'haloId'}); + if (typeof getGlobal().refreshUserIds === 'function') { + (getGlobal()).refreshUserIds({submoduleNames: 'haloId'}); + } userIds.haloId = haloId; getRealTimeDataAsync(bidConfig, onDone, rtdConfig, userConsent, userIds); } else { @@ -194,7 +181,7 @@ export function getRealTimeDataAsync(bidConfig, onDone, rtdConfig, userConsent, let reqParams = {}; if (isPlainObject(rtdConfig)) { - set(rtdConfig, 'params.requestParams.ortb2', config.getConfig('ortb2')); + set(rtdConfig, 'params.requestParams.ortb2', bidConfig.ortb2Fragments?.global); reqParams = rtdConfig.params.requestParams; } diff --git a/modules/idWardRtdProvider.js b/modules/idWardRtdProvider.js index a130d3cc8d2..9678739672d 100644 --- a/modules/idWardRtdProvider.js +++ b/modules/idWardRtdProvider.js @@ -5,7 +5,6 @@ * @module modules/idWardRtdProvider * @requires module:modules/realTimeData */ -import {config} from '../src/config.js'; import {getStorageManager} from '../src/storageManager.js'; import {submodule} from '../src/hook.js'; import {isPlainObject, mergeDeep, logMessage, logError} from '../src/utils.js'; @@ -15,15 +14,15 @@ const SUBMODULE_NAME = 'idWard'; export const storage = getStorageManager({moduleName: SUBMODULE_NAME}); /** - * Add real-time data & merge segments. - * @param {Object} rtd - */ -function addRealTimeData(rtd) { + * Add real-time data & merge segments. + * @param ortb2 object to merge into + * @param {Object} rtd + */ +function addRealTimeData(ortb2, rtd) { if (isPlainObject(rtd.ortb2)) { - const ortb2 = config.getConfig('ortb2') || {}; logMessage('idWardRtdProvider: merging original: ', ortb2); logMessage('idWardRtdProvider: merging in: ', rtd.ortb2); - config.setConfig({ortb2: mergeDeep(ortb2, rtd.ortb2)}); + mergeDeep(ortb2, rtd.ortb2); } } @@ -78,7 +77,7 @@ export function getRealTimeData(reqBidsConfigObj, onDone, rtdConfig, userConsent } } }; - addRealTimeData(data.rtd); + addRealTimeData(reqBidsConfigObj.ortb2Fragments?.global, data.rtd); onDone(); } } diff --git a/modules/imRtdProvider.js b/modules/imRtdProvider.js index 6c582df3df3..b33e4407b13 100644 --- a/modules/imRtdProvider.js +++ b/modules/imRtdProvider.js @@ -96,9 +96,8 @@ export function setRealTimeData(bidConfig, moduleConfig, data) { const utils = {deepSetValue, deepAccess, logInfo, logError, mergeDeep}; if (data.im_segments) { - const ortb2 = config.getConfig('ortb2') || {}; + const ortb2 = bidConfig.ortb2Fragments?.global || {}; deepSetValue(ortb2, 'user.ext.data.im_segments', data.im_segments); - config.setConfig({ortb2: ortb2}); if (moduleConfig.params.setGptKeyValues || !moduleConfig.params.hasOwnProperty('setGptKeyValues')) { window.googletag = window.googletag || {cmd: []}; diff --git a/modules/improvedigitalBidAdapter.js b/modules/improvedigitalBidAdapter.js index d1c35f63f9a..f9957f8612c 100644 --- a/modules/improvedigitalBidAdapter.js +++ b/modules/improvedigitalBidAdapter.js @@ -417,7 +417,7 @@ const ID_REQUEST = { buildSiteOrApp(request, bidderRequest) { const app = {}; const configAppSettings = config.getConfig('app') || {}; - const fpdAppSettings = config.getConfig('ortb2.app') || {}; + const fpdAppSettings = bidderRequest.ortb2?.app || {}; mergeDeep(app, configAppSettings, fpdAppSettings); if (Object.keys(app).length !== 0) { @@ -430,7 +430,7 @@ const ID_REQUEST = { site.domain = parseUrl(url).hostname; } const configSiteSettings = config.getConfig('site') || {}; - const fpdSiteSettings = config.getConfig('ortb2.site') || {}; + const fpdSiteSettings = deepAccess(bidderRequest, 'ortb2.site') || {}; mergeDeep(site, configSiteSettings, fpdSiteSettings); request.site = site; } diff --git a/modules/inmarBidAdapter.js b/modules/inmarBidAdapter.js index 0e056551b35..3e1044a2d5c 100755 --- a/modules/inmarBidAdapter.js +++ b/modules/inmarBidAdapter.js @@ -40,7 +40,7 @@ export const spec = { uspConsent: bidderRequest.uspConsent, currencyCode: config.getConfig('currency.adServerCurrency'), coppa: config.getConfig('coppa'), - firstPartyData: config.getLegacyFpd(config.getConfig('ortb2')), + firstPartyData: config.getLegacyFpd(bidderRequest.ortb2), prebidVersion: '$prebid.version$' }; diff --git a/modules/ixBidAdapter.js b/modules/ixBidAdapter.js index 7cec6172ba4..3665813d907 100644 --- a/modules/ixBidAdapter.js +++ b/modules/ixBidAdapter.js @@ -734,7 +734,7 @@ function buildRequest(validBidRequests, bidderRequest, impressions, version) { currentRequestSize += currentImpressionSize; - const fpd = config.getConfig('ortb2') || {}; + const fpd = bidderRequest.ortb2 || {}; if (!isEmpty(fpd) && !isFpdAdded) { r.ext.ixdiag.fpd = true; diff --git a/modules/jwplayerRtdProvider.js b/modules/jwplayerRtdProvider.js index 814aed59d85..11337b2240f 100644 --- a/modules/jwplayerRtdProvider.js +++ b/modules/jwplayerRtdProvider.js @@ -12,7 +12,7 @@ import {submodule} from '../src/hook.js'; import {config} from '../src/config.js'; import {ajaxBuilder} from '../src/ajax.js'; -import {logError} from '../src/utils.js'; +import {deepAccess, logError} from '../src/utils.js'; import {find} from '../src/polyfill.js'; import {getGlobal} from '../src/prebidGlobal.js'; @@ -129,7 +129,7 @@ function onRequestCompleted(mediaID, success) { function enrichBidRequest(bidReqConfig, onDone) { activeRequestCount = 0; const adUnits = bidReqConfig.adUnits || getGlobal().adUnits; - enrichAdUnits(adUnits); + enrichAdUnits(adUnits, bidReqConfig.ortb2Fragments); if (activeRequestCount <= 0) { onDone(); } else { @@ -141,10 +141,10 @@ function enrichBidRequest(bidReqConfig, onDone) { * get targeting data and write to bids * @function * @param {adUnit[]} adUnits - * @param {function} onDone + * @param ortb2Fragments */ -export function enrichAdUnits(adUnits) { - const fpdFallback = config.getConfig('ortb2.site.ext.data.jwTargeting'); +export function enrichAdUnits(adUnits, ortb2Fragments = {}) { + const fpdFallback = deepAccess(ortb2Fragments.global, 'site.ext.data.jwTargeting'); adUnits.forEach(adUnit => { const jwTargeting = extractPublisherParams(adUnit, fpdFallback); if (!jwTargeting || !Object.keys(jwTargeting).length) { @@ -158,7 +158,7 @@ export function enrichAdUnits(adUnits) { const contentId = getContentId(vat.mediaID); const contentData = getContentData(vat.segments); const targeting = formatTargetingResponse(vat); - enrichBids(adUnit.bids, targeting, contentId, contentData); + enrichBids(ortb2Fragments.bidder || {}, adUnit.bids, targeting, contentId, contentData); }; loadVat(jwTargeting, onVatResponse); }); @@ -285,12 +285,12 @@ export function getContentData(segments) { }; } -export function addOrtbSiteContent(bid, contentId, contentData) { +export function addOrtbSiteContent(bidderOrtb2, bid, contentId, contentData) { if (!contentId && !contentData) { return; } - let ortb2 = bid.ortb2 || {}; + let ortb2 = bidderOrtb2[bid.bidder] || {}; let site = ortb2.site = ortb2.site || {}; let content = site.content = site.content || {}; @@ -303,17 +303,18 @@ export function addOrtbSiteContent(bid, contentId, contentData) { data.push(contentData); } - bid.ortb2 = ortb2; + bidderOrtb2[bid.bidder] = ortb2; } -function enrichBids(bids, targeting, contentId, contentData) { +function enrichBids(bidderOrtb2, bids, targeting, contentId, contentData) { + // TODO: this does not need to set bidder-level FPD, follow up when https://github.com/prebid/Prebid.js/pull/8354 gets through if (!bids) { return; } bids.forEach(bid => { addTargetingToBid(bid, targeting); - addOrtbSiteContent(bid, contentId, contentData); + addOrtbSiteContent(bidderOrtb2, bid, contentId, contentData); }); } diff --git a/modules/livewrappedBidAdapter.js b/modules/livewrappedBidAdapter.js index 32e09e4b28e..c9838301ec3 100644 --- a/modules/livewrappedBidAdapter.js +++ b/modules/livewrappedBidAdapter.js @@ -59,7 +59,7 @@ export const spec = { const bundle = find(bidRequests, hasBundleParam); const tid = find(bidRequests, hasTidParam); const schain = bidRequests[0].schain; - let ortb2 = config.getConfig('ortb2'); + let ortb2 = bidderRequest.ortb2; const eids = handleEids(bidRequests); bidUrl = bidUrl ? bidUrl.params.bidUrl : URL; url = url ? url.params.url : (getAppDomain() || getTopWindowLocation(bidderRequest)); diff --git a/modules/mediakeysBidAdapter.js b/modules/mediakeysBidAdapter.js index 5eb32a3f6e4..a2b5d8b8ecc 100644 --- a/modules/mediakeysBidAdapter.js +++ b/modules/mediakeysBidAdapter.js @@ -664,7 +664,7 @@ export const spec = { } // Handle First Party Data (need publisher fpd setup) - const fpd = config.getConfig('ortb2') || {}; + const fpd = bidderRequest.ortb2 || {}; if (fpd.site) { mergeDeep(payload, { site: fpd.site }); } diff --git a/modules/minutemediaBidAdapter.js b/modules/minutemediaBidAdapter.js index 1a9ccfdf824..3e849407ebf 100644 --- a/modules/minutemediaBidAdapter.js +++ b/modules/minutemediaBidAdapter.js @@ -286,7 +286,7 @@ function generateParameters(bid, bidderRequest) { requestParams.userIds = JSON.stringify(userIdsParam); } - const ortb2Metadata = config.getConfig('ortb2') || {}; + const ortb2Metadata = bidderRequest.ortb2 || {}; if (ortb2Metadata.site) { requestParams.site_metadata = JSON.stringify(ortb2Metadata.site); } diff --git a/modules/nobidBidAdapter.js b/modules/nobidBidAdapter.js index f788093f833..08119beafb4 100644 --- a/modules/nobidBidAdapter.js +++ b/modules/nobidBidAdapter.js @@ -152,7 +152,7 @@ function nobidBuildRequests(bids, bidderRequest) { if (cop) state['coppa'] = cop; const eids = getEIDs(deepAccess(bids, '0.userIdAsEids')); if (eids && eids.length > 0) state['eids'] = eids; - if (config && config.getConfig('ortb2')) state['ortb2'] = config.getConfig('ortb2'); + if (bidderRequest && bidderRequest.ortb2) state['ortb2'] = bidderRequest.ortb2; return state; } function newAdunit(adunitObject, adunits) { diff --git a/modules/openxBidAdapter.js b/modules/openxBidAdapter.js index 85dcfbb3b47..2c1649aea94 100644 --- a/modules/openxBidAdapter.js +++ b/modules/openxBidAdapter.js @@ -271,12 +271,12 @@ function buildCommonQueryParamsFromBids(bids, bidderRequest) { nocache: new Date().getTime() }; - const userDataSegments = buildFpdQueryParams('ortb2.user.data'); + const userDataSegments = buildFpdQueryParams('user.data', bidderRequest.ortb2); if (userDataSegments.length > 0) { defaultParams.sm = userDataSegments; } - const siteContentDataSegments = buildFpdQueryParams('ortb2.site.content.data'); + const siteContentDataSegments = buildFpdQueryParams('site.content.data', bidderRequest.ortb2); if (siteContentDataSegments.length > 0) { defaultParams.scsm = siteContentDataSegments; } @@ -319,8 +319,8 @@ function buildCommonQueryParamsFromBids(bids, bidderRequest) { return defaultParams; } -function buildFpdQueryParams(fpdPath) { - const firstPartyData = config.getConfig(fpdPath); +function buildFpdQueryParams(fpdPath, ortb2) { + const firstPartyData = deepAccess(ortb2, fpdPath); if (!Array.isArray(firstPartyData) || !firstPartyData.length) { return ''; } diff --git a/modules/optoutBidAdapter.js b/modules/optoutBidAdapter.js index d218a65bf90..1ee785182ed 100644 --- a/modules/optoutBidAdapter.js +++ b/modules/optoutBidAdapter.js @@ -36,7 +36,7 @@ export const spec = { return !!bid.params.publisher && !!bid.params.adslot; }, - buildRequests: function(validBidRequests) { + buildRequests: function(validBidRequests, bidderRequest) { return validBidRequests.map(bidRequest => { let endPoint = 'https://adscience-nocookie.nl/prebid/display'; let consentString = ''; @@ -57,7 +57,7 @@ export const spec = { adSlot: bidRequest.params.adslot, cur: getCurrency(), url: getDomain(bidRequest), - ortb2: config.getConfig('ortb2'), + ortb2: bidderRequest.ortb2, consent: consentString, gdpr: gdpr diff --git a/modules/ozoneBidAdapter.js b/modules/ozoneBidAdapter.js index 3b5147907eb..69fb3e840a1 100644 --- a/modules/ozoneBidAdapter.js +++ b/modules/ozoneBidAdapter.js @@ -191,7 +191,7 @@ export const spec = { let ozoneRequest = {}; // we only want to set specific properties on this, not validBidRequests[0].params delete ozoneRequest.test; // don't allow test to be set in the config - ONLY use $_GET['pbjs_debug'] - let fpd = config.getConfig('ortb2'); + let fpd = bidderRequest.ortb2; if (fpd && deepAccess(fpd, 'user')) { logInfo('added FPD user object'); ozoneRequest.user = fpd.user; diff --git a/modules/permutiveRtdProvider.js b/modules/permutiveRtdProvider.js index c4674132416..79c709f9bcc 100644 --- a/modules/permutiveRtdProvider.js +++ b/modules/permutiveRtdProvider.js @@ -9,7 +9,6 @@ import {getGlobal} from '../src/prebidGlobal.js'; import {submodule} from '../src/hook.js'; import {getStorageManager} from '../src/storageManager.js'; import {deepAccess, deepSetValue, isFn, logError, mergeDeep} from '../src/utils.js'; -import {config} from '../src/config.js'; import {includes} from '../src/polyfill.js'; const MODULE_NAME = 'permutive' @@ -62,11 +61,10 @@ function getModuleConfig (customModuleConfig) { /** * Sets ortb2 config for ac bidders - * @param {Object} auctionDetails + * @param {Object} bidderOrtb2 * @param {Object} customModuleConfig - Publisher config for module */ -export function setBidderRtb (auctionDetails, customModuleConfig) { - const bidderConfig = config.getBidderConfig() +export function setBidderRtb (bidderOrtb2, customModuleConfig) { const moduleConfig = getModuleConfig(customModuleConfig) const acBidders = deepAccess(moduleConfig, 'params.acBidders') const maxSegs = deepAccess(moduleConfig, 'params.maxSegs') @@ -74,13 +72,9 @@ export function setBidderRtb (auctionDetails, customModuleConfig) { const segmentData = getSegments(maxSegs) acBidders.forEach(function (bidder) { - const currConfig = bidderConfig[bidder] || {} + const currConfig = { ortb2: bidderOrtb2[bidder] || {} } const nextConfig = updateOrtbConfig(currConfig, segmentData.ac, transformationConfigs) // ORTB2 uses the `ac` segment IDs - - config.setBidderConfig({ - bidders: [bidder], - config: nextConfig - }) + bidderOrtb2[bidder] = nextConfig.ortb2; }) } @@ -306,12 +300,10 @@ export const permutiveSubmodule = { makeSafe(function () { // Legacy route with custom parameters initSegments(reqBidsConfigObj, callback, customModuleConfig) - }) - }, - onAuctionInitEvent: function (auctionDetails, customModuleConfig) { + }); makeSafe(function () { // Route for bidders supporting ORTB2 - setBidderRtb(auctionDetails, customModuleConfig) + setBidderRtb(reqBidsConfigObj.ortb2Fragments?.bidder, customModuleConfig) }) }, init: init diff --git a/modules/prebidServerBidAdapter/index.js b/modules/prebidServerBidAdapter/index.js index 62f550eb216..e5dc24d1812 100644 --- a/modules/prebidServerBidAdapter/index.js +++ b/modules/prebidServerBidAdapter/index.js @@ -389,18 +389,13 @@ function _appendSiteAppDevice(request, pageUrl, accountId) { } } -function addBidderFirstPartyDataToRequest(request) { - const bidderConfig = config.getBidderConfig(); - const fpdConfigs = Object.keys(bidderConfig).reduce((acc, bidder) => { - const currBidderConfig = bidderConfig[bidder]; - if (currBidderConfig.ortb2) { - const ortb2 = mergeDeep({}, currBidderConfig.ortb2); - - acc.push({ - bidders: [ bidder ], - config: { ortb2 } - }); - } +function addBidderFirstPartyDataToRequest(request, bidderFpd) { + const fpdConfigs = Object.entries(bidderFpd).reduce((acc, [bidder, bidderOrtb2]) => { + const ortb2 = mergeDeep({}, bidderOrtb2); + acc.push({ + bidders: [ bidder ], + config: { ortb2 } + }); return acc; }, []); @@ -940,10 +935,10 @@ Object.assign(ORTB2.prototype, { deepSetValue(request, 'regs.coppa', 1); } - const commonFpd = getConfig('ortb2') || {}; + const commonFpd = s2sBidRequest.ortb2Fragments?.global || {}; mergeDeep(request, commonFpd); - addBidderFirstPartyDataToRequest(request); + addBidderFirstPartyDataToRequest(request, s2sBidRequest.ortb2Fragments?.bidder || {}); request.imp.forEach((imp) => this.impRequested[imp.id] = imp); return request; diff --git a/modules/pubmaticBidAdapter.js b/modules/pubmaticBidAdapter.js index d64c6092afa..c790e8b0387 100644 --- a/modules/pubmaticBidAdapter.js +++ b/modules/pubmaticBidAdapter.js @@ -1208,7 +1208,7 @@ export const spec = { _handleFlocId(payload, validBidRequests); // First Party Data - const commonFpd = config.getConfig('ortb2') || {}; + const commonFpd = (bidderRequest && bidderRequest.ortb2) || {}; if (commonFpd.site) { mergeDeep(payload, {site: commonFpd.site}); } diff --git a/modules/riseBidAdapter.js b/modules/riseBidAdapter.js index a8ea023d46a..4e28a485074 100644 --- a/modules/riseBidAdapter.js +++ b/modules/riseBidAdapter.js @@ -390,7 +390,7 @@ function generateGeneralParams(generalObject, bidderRequest) { generalParams.userIds = JSON.stringify(userIdsParam); } - const ortb2Metadata = config.getConfig('ortb2') || {}; + const ortb2Metadata = bidderRequest.ortb2 || {}; if (ortb2Metadata.site) { generalParams.site_metadata = JSON.stringify(ortb2Metadata.site); } diff --git a/modules/rtdModule/index.js b/modules/rtdModule/index.js index 381059c68f7..eafbe7b472c 100644 --- a/modules/rtdModule/index.js +++ b/modules/rtdModule/index.js @@ -152,13 +152,12 @@ */ import {config} from '../../src/config.js'; -import {module} from '../../src/hook.js'; +import {getHook, module} from '../../src/hook.js'; import {logError, logInfo, logWarn} from '../../src/utils.js'; import * as events from '../../src/events.js'; import CONSTANTS from '../../src/constants.json'; import {gdprDataHandler, uspDataHandler} from '../../src/adapterManager.js'; import {find} from '../../src/polyfill.js'; -import {getGlobal} from '../../src/prebidGlobal.js'; /** @type {string} */ const MODULE_NAME = 'realTimeData'; @@ -229,7 +228,7 @@ export function init(config) { _moduleConfig = realTimeData; _dataProviders = realTimeData.dataProviders; setEventsListeners(); - getGlobal().requestBids.before(setBidRequestsData, 40); + getHook('startAuction').before(setBidRequestsData, 20); // RTD should run before FPD initSubModules(); }); } diff --git a/modules/rubiconBidAdapter.js b/modules/rubiconBidAdapter.js index afb95d56d69..06ecf62c3f3 100644 --- a/modules/rubiconBidAdapter.js +++ b/modules/rubiconBidAdapter.js @@ -1008,7 +1008,7 @@ function applyFPD(bidRequest, mediaType, data) { if (bidRequest.params.keywords) BID_FPD.site.keywords = (isArray(bidRequest.params.keywords)) ? bidRequest.params.keywords.join(',') : bidRequest.params.keywords; - let fpd = mergeDeep({}, config.getConfig('ortb2') || {}, BID_FPD); + let fpd = mergeDeep({}, bidRequest.ortb2 || {}, BID_FPD); let impData = deepAccess(bidRequest.ortb2Imp, 'ext.data') || {}; const gpid = deepAccess(bidRequest, 'ortb2Imp.ext.gpid'); diff --git a/modules/sharethroughBidAdapter.js b/modules/sharethroughBidAdapter.js index 1dd95812e12..a75aa32af5f 100644 --- a/modules/sharethroughBidAdapter.js +++ b/modules/sharethroughBidAdapter.js @@ -23,7 +23,7 @@ export const sharethroughAdapterSpec = { buildRequests: (bidRequests, bidderRequest) => { const timeout = config.getConfig('bidderTimeout'); - const firstPartyData = config.getConfig('ortb2') || {}; + const firstPartyData = bidderRequest.ortb2 || {}; const nonHttp = sharethroughInternal.getProtocol().indexOf('http') < 0; const secure = nonHttp || (sharethroughInternal.getProtocol().indexOf('https') > -1); diff --git a/modules/sirdataRtdProvider.js b/modules/sirdataRtdProvider.js index 182ff384fef..3e2ea610356 100644 --- a/modules/sirdataRtdProvider.js +++ b/modules/sirdataRtdProvider.js @@ -12,14 +12,12 @@ import {submodule} from '../src/hook.js'; import {ajax} from '../src/ajax.js'; import {findIndex} from '../src/polyfill.js'; import {getRefererInfo} from '../src/refererDetection.js'; -import {config} from '../src/config.js'; /** @type {string} */ const MODULE_NAME = 'realTimeData'; const SUBMODULE_NAME = 'SirdataRTDModule'; export function getSegmentsAndCategories(reqBidsConfigObj, onDone, moduleConfig, userConsent) { - const adUnits = reqBidsConfigObj.adUnits || getGlobal().adUnits; moduleConfig.params = moduleConfig.params || {}; var tcString = (userConsent && userConsent.gdpr && userConsent.gdpr.consentString ? userConsent.gdpr.consentString : ''); @@ -58,7 +56,7 @@ export function getSegmentsAndCategories(reqBidsConfigObj, onDone, moduleConfig, try { const data = JSON.parse(response); if (data && data.segments) { - addSegmentData(adUnits, data, moduleConfig, onDone); + addSegmentData(reqBidsConfigObj, data, moduleConfig, onDone); } else { onDone(); } @@ -85,10 +83,10 @@ export function getSegmentsAndCategories(reqBidsConfigObj, onDone, moduleConfig, }); } -export function setGlobalOrtb2(segments, categories) { +export function setGlobalOrtb2(ortb2, segments, categories) { try { let addOrtb2 = {}; - let testGlobal = getGlobal().getConfig('ortb2') || {}; + let testGlobal = ortb2 || {} if (!deepAccess(testGlobal, 'user.ext.data.sd_rtd') || !deepEqual(testGlobal.user.ext.data.sd_rtd, segments)) { deepSetValue(addOrtb2, 'user.ext.data.sd_rtd', segments || {}); } @@ -96,8 +94,7 @@ export function setGlobalOrtb2(segments, categories) { deepSetValue(addOrtb2, 'site.ext.data.sd_rtd', categories || {}); } if (!isEmpty(addOrtb2)) { - let ortb2 = {ortb2: mergeDeep({}, testGlobal, addOrtb2)}; - getGlobal().setConfig(ortb2); + mergeDeep(ortb2, addOrtb2); } } catch (e) { logError(e) @@ -106,10 +103,10 @@ export function setGlobalOrtb2(segments, categories) { return true; } -export function setBidderOrtb2(bidder, segments, categories) { +export function setBidderOrtb2(bidderOrtb2, bidder, segments, categories) { try { let addOrtb2 = {}; - let testBidder = deepAccess(config.getBidderConfig(), bidder + '.ortb2') || {}; + let testBidder = bidderOrtb2[bidder]; if (!deepAccess(testBidder, 'user.ext.data.sd_rtd') || !deepEqual(testBidder.user.ext.data.sd_rtd, segments)) { deepSetValue(addOrtb2, 'user.ext.data.sd_rtd', segments || {}); } @@ -117,8 +114,7 @@ export function setBidderOrtb2(bidder, segments, categories) { deepSetValue(addOrtb2, 'site.ext.data.sd_rtd', categories || {}); } if (!isEmpty(addOrtb2)) { - let ortb2 = {ortb2: mergeDeep({}, testBidder, addOrtb2)}; - getGlobal().setBidderConfig({ bidders: [bidder], config: ortb2 }); + mergeDeep(bidderOrtb2[bidder], addOrtb2) } } catch (e) { logError(e) @@ -159,7 +155,8 @@ export function getSegAndCatsArray(data, minScore) { return sirdataData; } -export function addSegmentData(adUnits, data, moduleConfig, onDone) { +export function addSegmentData(reqBids, data, moduleConfig, onDone) { + const adUnits = reqBids.adUnits; moduleConfig = moduleConfig || {}; moduleConfig.params = moduleConfig.params || {}; const globalMinScore = moduleConfig.params.hasOwnProperty('contextualMinRelevancyScore') ? moduleConfig.params.contextualMinRelevancyScore : 30; @@ -175,7 +172,7 @@ export function addSegmentData(adUnits, data, moduleConfig, onDone) { // Global ortb2 if (!biddersParamsExist) { - setGlobalOrtb2(sirdataData.segments, sirdataData.categories); + setGlobalOrtb2(reqBids.ortb2Fragments?.global, sirdataData.segments, sirdataData.categories); } // Google targeting @@ -272,7 +269,7 @@ export function addSegmentData(adUnits, data, moduleConfig, onDone) { if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) { loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataList.concat(curationData.segments).concat(curationData.categories), data, bid); } else { - setBidderOrtb2(bid.bidder, data.segments.concat(curationData.segments), sirdataList.concat(curationData.segments).concat(curationData.categories)); + setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, data.segments.concat(curationData.segments), sirdataList.concat(curationData.segments).concat(curationData.categories)); } break; @@ -326,7 +323,7 @@ export function addSegmentData(adUnits, data, moduleConfig, onDone) { if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) { loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataList.concat(curationData.segments).concat(curationData.categories), data, bid); } else { - setBidderOrtb2(bid.bidder, sirdataList.concat(curationData.segments).concat(curationData.categories), sirdataList.concat(curationData.segments).concat(curationData.categories)); + setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, sirdataList.concat(curationData.segments).concat(curationData.categories), sirdataList.concat(curationData.segments).concat(curationData.categories)); } break; @@ -339,7 +336,7 @@ export function addSegmentData(adUnits, data, moduleConfig, onDone) { if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) { loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataList.concat(curationData.segments).concat(curationData.categories), data, bid); } else { - setBidderOrtb2(bid.bidder, data.segments.concat(curationData.segments), sirdataList.concat(curationData.segments).concat(curationData.categories)); + setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, data.segments.concat(curationData.segments), sirdataList.concat(curationData.segments).concat(curationData.categories)); } break; @@ -353,7 +350,7 @@ export function addSegmentData(adUnits, data, moduleConfig, onDone) { if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) { loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataList.concat(curationData.segments).concat(curationData.categories), data, bid); } else { - setBidderOrtb2(bid.bidder, data.segments.concat(curationData.segments), sirdataList.concat(curationData.segments).concat(curationData.categories)); + setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, data.segments.concat(curationData.segments), sirdataList.concat(curationData.segments).concat(curationData.categories)); } break; @@ -366,7 +363,7 @@ export function addSegmentData(adUnits, data, moduleConfig, onDone) { if (indexFound && moduleConfig.params.bidders[bidderIndex].hasOwnProperty('customFunction')) { loadCustomFunction(moduleConfig.params.bidders[bidderIndex].customFunction, adUnit, sirdataList.concat(curationData.segments).concat(curationData.categories), data, bid); } else { - setBidderOrtb2(bid.bidder, data.segments.concat(curationData.segments), sirdataList.concat(curationData.segments).concat(curationData.categories)); + setBidderOrtb2(reqBids.ortb2Fragments?.bidder, bid.bidder, data.segments.concat(curationData.segments), sirdataList.concat(curationData.segments).concat(curationData.categories)); } break; diff --git a/modules/smaatoBidAdapter.js b/modules/smaatoBidAdapter.js index b792983534d..522d7ed8e12 100644 --- a/modules/smaatoBidAdapter.js +++ b/modules/smaatoBidAdapter.js @@ -44,7 +44,7 @@ const buildOpenRtbBidRequest = (bidRequest, bidderRequest) => { } }; - let ortb2 = config.getConfig('ortb2') || {}; + let ortb2 = bidderRequest.ortb2 || {}; Object.assign(requestTemplate.user, ortb2.user); Object.assign(requestTemplate.site, ortb2.site); diff --git a/modules/sonobiBidAdapter.js b/modules/sonobiBidAdapter.js index c5fc07320d8..8ea05ff52d6 100644 --- a/modules/sonobiBidAdapter.js +++ b/modules/sonobiBidAdapter.js @@ -86,7 +86,7 @@ export const spec = { }; - const fpd = config.getConfig('ortb2'); + const fpd = bidderRequest.ortb2; if (fpd) { payload.fpd = JSON.stringify(fpd); diff --git a/modules/sovrnBidAdapter.js b/modules/sovrnBidAdapter.js index 4ca8f03c6b4..6d9f3b40423 100644 --- a/modules/sovrnBidAdapter.js +++ b/modules/sovrnBidAdapter.js @@ -1,8 +1,7 @@ -import { _each, getBidIdParameter, isArray, deepClone, parseUrl, getUniqueIdentifierStr, deepSetValue, logError, deepAccess, isInteger, logWarn } from '../src/utils.js'; +import { _each, getBidIdParameter, isArray, parseUrl, getUniqueIdentifierStr, deepSetValue, logError, deepAccess, isInteger, logWarn } from '../src/utils.js'; import { registerBidder } from '../src/adapters/bidderFactory.js' import { ADPOD, BANNER, VIDEO } from '../src/mediaTypes.js' import { createEidsArray } from './userId/eids.js' -import {config} from '../src/config.js' const ORTB_VIDEO_PARAMS = { 'mimes': (value) => Array.isArray(value) && value.length > 0 && value.every(v => typeof v === 'string'), @@ -121,7 +120,7 @@ export const spec = { sovrnImps.push(imp) }) - const fpd = deepClone(config.getConfig('ortb2')) + const fpd = bidderRequest.ortb2 || {}; const site = fpd.site || {} site.page = bidderRequest.refererInfo.referer diff --git a/modules/tripleliftBidAdapter.js b/modules/tripleliftBidAdapter.js index 7e964661db6..309c23a2bb3 100644 --- a/modules/tripleliftBidAdapter.js +++ b/modules/tripleliftBidAdapter.js @@ -21,7 +21,7 @@ export const tripleliftAdapterSpec = { buildRequests: function(bidRequests, bidderRequest) { let tlCall = STR_ENDPOINT; - let data = _buildPostBody(bidRequests); + let data = _buildPostBody(bidRequests, bidderRequest); tlCall = tryAppendQueryString(tlCall, 'lib', 'prebid'); tlCall = tryAppendQueryString(tlCall, 'v', '$prebid.version$'); @@ -107,10 +107,10 @@ function _getSyncType(syncOptions) { if (syncOptions.pixelEnabled) return 'image'; } -function _buildPostBody(bidRequests) { +function _buildPostBody(bidRequests, bidderRequest) { let data = {}; let { schain } = bidRequests[0]; - const globalFpd = _getGlobalFpd(); + const globalFpd = _getGlobalFpd(bidderRequest); data.imp = bidRequests.map(function(bidRequest, index) { let imp = { @@ -192,11 +192,11 @@ function _getFloor (bid) { return floor !== null ? floor : bid.params.floor; } -function _getGlobalFpd() { +function _getGlobalFpd(bidderRequest) { const fpd = {}; const context = {} const user = {}; - const ortbData = config.getConfig('ortb2') || {}; + const ortbData = bidderRequest.ortb2 || {}; const fpdContext = Object.assign({}, ortbData.site); const fpdUser = Object.assign({}, ortbData.user); diff --git a/modules/trustxBidAdapter.js b/modules/trustxBidAdapter.js index 7d40a0b0452..4466fa402a8 100644 --- a/modules/trustxBidAdapter.js +++ b/modules/trustxBidAdapter.js @@ -183,7 +183,7 @@ export const spec = { }; } - const ortb2UserData = config.getConfig('ortb2.user.data'); + const ortb2UserData = deepAccess(bidderRequest, 'ortb2.user.data'); if (ortb2UserData && ortb2UserData.length) { if (!user) { user = { data: [] }; @@ -211,8 +211,8 @@ export const spec = { request.user = user; } - const userKeywords = deepAccess(config.getConfig('ortb2.user'), 'keywords') || null; - const siteKeywords = deepAccess(config.getConfig('ortb2.site'), 'keywords') || null; + const userKeywords = deepAccess(bidderRequest, 'ortb2.user.keywords') || null; + const siteKeywords = deepAccess(bidderRequest, 'ortb2.site.keywords') || null; if (userKeywords) { pageKeywords = pageKeywords || {}; diff --git a/modules/ttdBidAdapter.js b/modules/ttdBidAdapter.js index 4919442336f..4ec4971ee5c 100644 --- a/modules/ttdBidAdapter.js +++ b/modules/ttdBidAdapter.js @@ -373,7 +373,7 @@ export const spec = { * @return {ServerRequest} Info describing the request to the server. */ buildRequests: function (validBidRequests, bidderRequest) { - const firstPartyData = config.getConfig('ortb2') || {}; + const firstPartyData = bidderRequest.ortb2 || {}; let topLevel = { id: bidderRequest.auctionId, imp: validBidRequests.map(bidRequest => getImpression(bidRequest)), diff --git a/modules/validationFpdModule/index.js b/modules/validationFpdModule/index.js index 2db170c1bd1..8771e50b156 100644 --- a/modules/validationFpdModule/index.js +++ b/modules/validationFpdModule/index.js @@ -2,11 +2,10 @@ * This module sets default values and validates ortb2 first part data * @module modules/firstPartyData */ -import { config } from '../../src/config.js'; -import { isEmpty, isNumber, logWarn, deepAccess } from '../../src/utils.js'; -import { ORTB_MAP } from './config.js'; -import { submodule } from '../../src/hook.js'; -import { getStorageManager } from '../../src/storageManager.js'; +import {deepAccess, isEmpty, isNumber, logWarn} from '../../src/utils.js'; +import {ORTB_MAP} from './config.js'; +import {submodule} from '../../src/hook.js'; +import {getStorageManager} from '../../src/storageManager.js'; const STORAGE = getStorageManager(); let optout; @@ -192,29 +191,16 @@ export function validateFpd(fpd, path = '', parent = '') { * Run validation on global and bidder config data for ortb2 */ function runValidations(data) { - let conf = validateFpd(data); - - let bidderDuplicate = { ...config.getBidderConfig() }; - - Object.keys(bidderDuplicate).forEach(bidder => { - let modConf = Object.keys(bidderDuplicate[bidder]).reduce((res, key) => { - let valid = (key !== 'ortb2') ? bidderDuplicate[bidder][key] : validateFpd(bidderDuplicate[bidder][key]); - - if (valid) res[key] = valid; - - return res; - }, {}); - - if (Object.keys(modConf).length) config.setBidderConfig({ bidders: [bidder], config: modConf }); - }); - - return conf; + return { + global: validateFpd(data.global), + bidder: Object.fromEntries(Object.entries(data.bidder).map(([bidder, conf]) => [bidder, validateFpd(conf)])) + } } /** * Sets default values to ortb2 if exists and adds currency and ortb2 setConfig callbacks on init */ -export function initSubmodule(fpdConf, data) { +export function processFpd(fpdConf, data) { // Checks for existsnece of pubcid optout cookie/storage // if exists, filters user data out optout = (STORAGE.cookiesAreEnabled() && STORAGE.getCookie('_pubcid_optout')) || @@ -227,7 +213,7 @@ export function initSubmodule(fpdConf, data) { export const validationSubmodule = { name: 'validation', queue: 1, - init: initSubmodule + processFpd } submodule('firstPartyData', validationSubmodule) diff --git a/modules/weboramaRtdProvider.js b/modules/weboramaRtdProvider.js index 0885df02f05..90ea8d0e682 100644 --- a/modules/weboramaRtdProvider.js +++ b/modules/weboramaRtdProvider.js @@ -46,28 +46,19 @@ */ import { - getGlobal -} from '../src/prebidGlobal.js'; -import { - deepSetValue, deepAccess, + deepSetValue, isEmpty, - mergeDeep, + isFn, logError, - logWarn, - tryAppendQueryString, logMessage, - isFn + logWarn, + mergeDeep, + tryAppendQueryString } from '../src/utils.js'; -import { - submodule -} from '../src/hook.js'; -import { - ajax -} from '../src/ajax.js'; -import { - getStorageManager -} from '../src/storageManager.js'; +import {submodule} from '../src/hook.js'; +import {ajax} from '../src/ajax.js'; +import {getStorageManager} from '../src/storageManager.js'; const adapterManager = require('../src/adapterManager.js').default; @@ -285,10 +276,8 @@ export function getBidRequestData(reqBidsConfigObj, onDone, moduleConfig) { const moduleParams = moduleConfig.params || {}; const weboCtxConf = moduleParams.weboCtxConf || {}; - const adUnits = reqBidsConfigObj.adUnits || getGlobal().adUnits; - if (!_weboCtxInitialized) { - handleBidRequestData(adUnits, moduleParams); + handleBidRequestData(reqBidsConfigObj, moduleParams); onDone(); @@ -300,19 +289,13 @@ export function getBidRequestData(reqBidsConfigObj, onDone, moduleConfig) { setWeboContextualProfile(data); }, () => { - handleBidRequestData(adUnits, moduleParams); + handleBidRequestData(reqBidsConfigObj, moduleParams); onDone(); }); } -/** function that handles bid request data - * @param {Object[]} adUnits - * @param {ModuleParams} moduleParams - * @returns {void} - */ - -function handleBidRequestData(adUnits, moduleParams) { +function handleBidRequestData(reqBids, moduleParams) { const weboCtxConf = moduleParams.weboCtxConf || {}; const weboUserDataConf = moduleParams.weboUserDataConf || {}; const weboCtxConfTargeting = weboCtxConf.sendToBidders; @@ -321,14 +304,14 @@ function handleBidRequestData(adUnits, moduleParams) { if (weboCtxConfTargeting) { const contextualProfile = getContextualProfile(weboCtxConf); if (!isEmpty(contextualProfile)) { - setBidRequestProfile(adUnits, contextualProfile, true); + setBidRequestProfile(reqBids, contextualProfile, true); } } if (weboUserDataConfTargeting) { const weboUserDataProfile = getWeboUserDataProfile(weboUserDataConf); if (!isEmpty(weboUserDataProfile)) { - setBidRequestProfile(adUnits, weboUserDataProfile, false); + setBidRequestProfile(reqBids, weboUserDataProfile, false); } } @@ -363,18 +346,18 @@ function handleOnData(weboCtxConf, weboUserDataConf) { } /** function that set bid request data on each segment (site or user centric) - * @param {Object[]} adUnits + * @param {Object} reqBids * @param {Object} profile * @param {Boolean} site true if site centric, else it is user centric * @returns {void} */ -function setBidRequestProfile(adUnits, profile, site) { - setGlobalOrtb2(profile, site); +function setBidRequestProfile(reqBids, profile, site) { + setGlobalOrtb2(reqBids.ortb2Fragments?.global, profile, site); - adUnits.forEach(adUnit => { + reqBids.adUnits.forEach(adUnit => { if (adUnit.hasOwnProperty('bids')) { const adUnitCode = adUnit.code || 'no code'; - adUnit.bids.forEach(bid => handleBid(adUnitCode, profile, site, bid)); + adUnit.bids.forEach(bid => handleBid(adUnitCode, profile, site, bid, reqBids.ortb2Fragments?.bidder || {})); } }); } @@ -399,14 +382,16 @@ const bidderAliasRegistry = adapterManager.aliasRegistry || {}; * @param {Object} profile * @param {Boolean} site true if site centric, else it is user centric * @param {Object} bid + * @param bidderOrtb2 * @returns {void} */ -function handleBid(adUnitCode, profile, site, bid) { +function handleBid(adUnitCode, profile, site, bid, bidderOrtb2) { const bidder = bidderAliasRegistry[bid.bidder] || bid.bidder; logMessage(`handling on adunit '${adUnitCode}', bidder '${bidder}' and bid`, bid); switch (bidder) { + // TODO: these special cases should not be necessary - all adapters should look into FPD, not just their params case APPNEXUS: handleAppnexusBid(profile, bid); @@ -428,19 +413,20 @@ function handleBid(adUnitCode, profile, site, bid) { default: logMessage(`unsupported bidder '${bidder}', trying via bidder ortb2 fpd`); const section = ((site) ? 'site' : 'user'); - const base = `ortb2.${section}.ext.data`; + const base = `${bid.bidder}.${section}.ext.data`; - assignProfileToObject(bid, base, profile); + assignProfileToObject(bidderOrtb2, base, profile); } } /** * set ortb2 global data + * @param ortb2 global ortb2 config to modify * @param {Object} profile * @param {Boolean} site * @returns {void} */ -function setGlobalOrtb2(profile, site) { +function setGlobalOrtb2(ortb2, profile, site) { const section = ((site) ? 'site' : 'user'); const base = `${section}.ext.data`; const addOrtb2 = {}; @@ -448,11 +434,7 @@ function setGlobalOrtb2(profile, site) { assignProfileToObject(addOrtb2, base, profile); if (!isEmpty(addOrtb2)) { - const testGlobal = getGlobal().getConfig('ortb2') || {}; - const ortb2 = { - ortb2: mergeDeep({}, testGlobal, addOrtb2) - }; - getGlobal().setConfig(ortb2); + mergeDeep(ortb2, addOrtb2) } } diff --git a/modules/yahoosspBidAdapter.js b/modules/yahoosspBidAdapter.js index b14efc9bce7..a1fdb84774f 100644 --- a/modules/yahoosspBidAdapter.js +++ b/modules/yahoosspBidAdapter.js @@ -284,7 +284,7 @@ function generateOpenRtbObject(bidderRequest, bid) { outBoundBidRequest.site.id = bid.params.dcn; }; - if (config.getConfig('ortb2')) { + if (bidderRequest.ortb2) { outBoundBidRequest = appendFirstPartyData(outBoundBidRequest, bid); }; @@ -376,7 +376,7 @@ function appendImpObject(bid, openRtbObject) { }; function appendFirstPartyData(outBoundBidRequest, bid) { - const ortb2Object = config.getConfig('ortb2'); + const ortb2Object = bid.ortb2; const siteObject = deepAccess(ortb2Object, 'site') || undefined; const siteContentObject = deepAccess(siteObject, 'content') || undefined; const siteContentDataArray = deepAccess(siteObject, 'content.data') || undefined; diff --git a/modules/yieldlabBidAdapter.js b/modules/yieldlabBidAdapter.js index 9535461f4c7..bdbb36a9a6c 100644 --- a/modules/yieldlabBidAdapter.js +++ b/modules/yieldlabBidAdapter.js @@ -3,7 +3,6 @@ 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 { config } from '../src/config.js' const ENDPOINT = 'https://ad.yieldlab.net' const BIDDER_CODE = 'yieldlab' @@ -334,8 +333,8 @@ function getContentObject(bid) { return bid.params.iabContent } - const globalContent = config.getConfig('ortb2.site') ? config.getConfig('ortb2.site.content') - : config.getConfig('ortb2.app.content') + const globalContent = deepAccess(bid, 'ortb2.site') ? deepAccess(bid, 'ortb2.site.content') + : deepAccess(bid, 'ortb2.app.content') if (globalContent && isPlainObject(globalContent)) { return globalContent } diff --git a/modules/zeta_global_sspBidAdapter.js b/modules/zeta_global_sspBidAdapter.js index 87fdbe1396f..e5868e4dbce 100644 --- a/modules/zeta_global_sspBidAdapter.js +++ b/modules/zeta_global_sspBidAdapter.js @@ -89,7 +89,7 @@ export const spec = { if (!impData.banner && !impData.video) { impData.banner = buildBanner(request); } - const fpd = config.getLegacyFpd(config.getConfig('ortb2')) || {}; + const fpd = config.getLegacyFpd(bidderRequest.ortb2) || {}; let payload = { id: bidderRequest.auctionId, cur: [DEFAULT_CUR], diff --git a/src/adapterManager.js b/src/adapterManager.js index 93eeba51cde..3a74fcbf52c 100644 --- a/src/adapterManager.js +++ b/src/adapterManager.js @@ -17,7 +17,7 @@ import { logError, logInfo, logMessage, - logWarn, + logWarn, mergeDeep, shuffle, timestamp, } from './utils.js'; @@ -207,7 +207,7 @@ export function _partitionBidders (adUnits, s2sConfigs, {getS2SBidders = getS2SB export const partitionBidders = hook('sync', _partitionBidders, 'partitionBidders'); -adapterManager.makeBidRequests = hook('sync', function (adUnits, auctionStart, auctionId, cbTimeout, labels) { +adapterManager.makeBidRequests = hook('sync', function (adUnits, auctionStart, auctionId, cbTimeout, labels, ortb2Fragments = {}) { /** * emit and pass adunits for external modification * @see {@link https://github.com/prebid/Prebid.js/issues/4149|Issue} @@ -225,6 +225,16 @@ adapterManager.makeBidRequests = hook('sync', function (adUnits, auctionStart, a let bidRequests = []; + const ortb2 = ortb2Fragments.global || {}; + const bidderOrtb2 = ortb2Fragments.bidder || {}; + + function addOrtb2(bidderRequest) { + const fpd = Object.freeze(mergeDeep({}, ortb2, bidderOrtb2[bidderRequest.bidderCode])); + bidderRequest.ortb2 = fpd; + bidderRequest.bids.forEach((bid) => bid.ortb2 = fpd); + return bidderRequest; + } + _s2sConfigs.forEach(s2sConfig => { if (s2sConfig && s2sConfig.enabled) { let adUnitsS2SCopy = getAdUnitCopyForPrebidServer(adUnits, s2sConfig); @@ -233,7 +243,7 @@ adapterManager.makeBidRequests = hook('sync', function (adUnits, auctionStart, a let uniquePbsTid = generateUUID(); serverBidders.forEach(bidderCode => { const bidderRequestId = getUniqueIdentifierStr(); - const bidderRequest = { + const bidderRequest = addOrtb2({ bidderCode, auctionId, bidderRequestId, @@ -242,8 +252,8 @@ adapterManager.makeBidRequests = hook('sync', function (adUnits, auctionStart, a auctionStart: auctionStart, timeout: s2sConfig.timeout, src: CONSTANTS.S2S.SRC, - refererInfo - }; + refererInfo, + }); if (bidderRequest.bids.length !== 0) { bidRequests.push(bidderRequest); } @@ -270,15 +280,15 @@ adapterManager.makeBidRequests = hook('sync', function (adUnits, auctionStart, a let adUnitsClientCopy = getAdUnitCopyForClientAdapters(adUnits); clientBidders.forEach(bidderCode => { const bidderRequestId = getUniqueIdentifierStr(); - const bidderRequest = { + const bidderRequest = addOrtb2({ bidderCode, auctionId, bidderRequestId, bids: hookedGetBids({bidderCode, auctionId, bidderRequestId, 'adUnits': deepClone(adUnitsClientCopy), labels, src: 'client'}), auctionStart: auctionStart, timeout: cbTimeout, - refererInfo - }; + refererInfo, + }); const adapter = _bidderRegistry[bidderCode]; if (!adapter) { logError(`Trying to make a request for bidder that does not exist: ${bidderCode}`); @@ -303,7 +313,7 @@ adapterManager.makeBidRequests = hook('sync', function (adUnits, auctionStart, a return bidRequests; }, 'makeBidRequests'); -adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, requestCallbacks, requestBidsTimeout, onTimelyResponse) => { +adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, requestCallbacks, requestBidsTimeout, onTimelyResponse, ortb2Fragments = {}) => { if (!bidRequests.length) { logWarn('callBids executed with no bidRequests. Were they filtered by labels or sizing?'); return; @@ -347,7 +357,7 @@ adapterManager.callBids = (adUnits, bidRequests, addBidResponse, doneCb, request let uniqueServerRequests = serverBidRequests.filter(serverBidRequest => serverBidRequest.uniquePbsTid === uniquePbsTid); if (s2sAdapter) { - let s2sBidRequest = {tid: sourceTid, 'ad_units': adUnitsS2SCopy, s2sConfig}; + let s2sBidRequest = {tid: sourceTid, 'ad_units': adUnitsS2SCopy, s2sConfig, ortb2Fragments}; if (s2sBidRequest.ad_units.length) { let doneCbs = uniqueServerRequests.map(bidRequest => { bidRequest.start = timestamp(); diff --git a/src/auction.js b/src/auction.js index c55334bcd3d..d475bba1452 100644 --- a/src/auction.js +++ b/src/auction.js @@ -104,10 +104,11 @@ const queuedCalls = []; * @param {number} requestConfig.cbTimeout * @param {Array.} requestConfig.labels * @param {string} requestConfig.auctionId - * + * @param {{global: {}, bidder: {}}} ortb2Fragments first party data, separated into global + * (from getConfig('ortb2') + requestBids({ortb2})) and bidder (a map from bidderCode to ortb2) * @returns {Auction} auction instance */ -export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, auctionId}) { +export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, auctionId, ortb2Fragments}) { let _adUnits = adUnits; let _labels = labels; let _adUnitCodes = adUnitCodes; @@ -216,7 +217,7 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a _auctionStatus = AUCTION_STARTED; _auctionStart = Date.now(); - let bidRequests = adapterManager.makeBidRequests(_adUnits, _auctionStart, _auctionId, _timeout, _labels); + let bidRequests = adapterManager.makeBidRequests(_adUnits, _auctionStart, _auctionId, _timeout, _labels, ortb2Fragments); logInfo(`Bids Requested for Auction with id: ${_auctionId}`, bidRequests); if (bidRequests.length < 1) { @@ -273,7 +274,7 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a } } } - }, _timeout, onTimelyResponse); + }, _timeout, onTimelyResponse, ortb2Fragments); } }; @@ -349,7 +350,7 @@ export function newAuction({adUnits, adUnitCodes, callback, cbTimeout, labels, a getBidRequests: () => _bidderRequests, getBidsReceived: () => _bidsReceived, getNoBids: () => _noBids, - + getFPD: () => ortb2Fragments } } diff --git a/src/auctionManager.js b/src/auctionManager.js index 31f82bb0a89..75368aa283e 100644 --- a/src/auctionManager.js +++ b/src/auctionManager.js @@ -88,8 +88,8 @@ export function newAuctionManager() { .filter(uniques); }; - auctionManager.createAuction = function({ adUnits, adUnitCodes, callback, cbTimeout, labels, auctionId }) { - const auction = newAuction({ adUnits, adUnitCodes, callback, cbTimeout, labels, auctionId }); + auctionManager.createAuction = function(opts) { + const auction = newAuction(opts); _addAuction(auction); return auction; }; diff --git a/src/config.js b/src/config.js index 3fadebd9d07..960fa879059 100644 --- a/src/config.js +++ b/src/config.js @@ -314,42 +314,52 @@ export function newConfig() { return Object.assign({}, config); } - /* - * Returns the configuration object if called without parameters, - * or single configuration property if given a string matching a configuration - * property name. Allows deep access e.g. getConfig('currency.adServerCurrency') - * - * If called with callback parameter, or a string and a callback parameter, - * subscribes to configuration updates. See `subscribe` function for usage. - * - * The object returned is a deepClone of the `config` property. - */ - function readConfig(...args) { - if (args.length <= 1 && typeof args[0] !== 'function') { - const option = args[0]; - const configClone = deepClone(_getConfig()); - return option ? deepAccess(configClone, option) : configClone; - } - - return subscribe(...args); + function _getRestrictedConfig() { + // This causes reading 'ortb2' to throw an error; with prebid 7, that will almost + // always be the incorrect way to access FPD configuration (https://github.com/prebid/Prebid.js/issues/7651) + // code that needs the ortb2 config should explicitly use `getAnyConfig` + // TODO: this is meant as a temporary tripwire to catch inadvertent use of `getConfig('ortb')` as we transition. + // It should be removed once the risk of that happening is low enough. + const conf = _getConfig(); + Object.defineProperty(conf, 'ortb2', { + get: function () { + throw new Error('invalid access to \'orbt2\' config - use request parameters instead'); + } + }); + return conf; } - /* - * Returns configuration object if called without parameters, - * or single configuration property if given a string matching a configuration - * property name. Allows deep access e.g. getConfig('currency.adServerCurrency') - * - * If called with callback parameter, or a string and a callback parameter, - * subscribes to configuration updates. See `subscribe` function for usage. - */ - function getConfig(...args) { - if (args.length <= 1 && typeof args[0] !== 'function') { - const option = args[0]; - return option ? deepAccess(_getConfig(), option) : _getConfig(); - } + const [getAnyConfig, getConfig] = [_getConfig, _getRestrictedConfig].map(accessor => { + /* + * Returns configuration object if called without parameters, + * or single configuration property if given a string matching a configuration + * property name. Allows deep access e.g. getConfig('currency.adServerCurrency') + * + * If called with callback parameter, or a string and a callback parameter, + * subscribes to configuration updates. See `subscribe` function for usage. + */ + return function getConfig(...args) { + if (args.length <= 1 && typeof args[0] !== 'function') { + const option = args[0]; + return option ? deepAccess(accessor(), option) : _getConfig(); + } - return subscribe(...args); - } + return subscribe(...args); + } + }) + + const [readConfig, readAnyConfig] = [getConfig, getAnyConfig].map(wrapee => { + /* + * Like getConfig, except that it returns a deepClone of the result. + */ + return function readConfig(...args) { + let res = wrapee(...args); + if (res && typeof res === 'object') { + res = deepClone(res); + } + return res; + } + }) /** * Internal API for modules (such as prebid-server) that might need access to all bidder config @@ -670,7 +680,9 @@ export function newConfig() { getCurrentBidder, resetBidder, getConfig, + getAnyConfig, readConfig, + readAnyConfig, setConfig, mergeConfig, setDefaults, diff --git a/src/prebid.js b/src/prebid.js index 98655825e89..0dc7754bf1a 100644 --- a/src/prebid.js +++ b/src/prebid.js @@ -5,7 +5,7 @@ import { adUnitsFilter, flatten, getHighestCpm, isArrayOfNums, isGptPubadsDefined, uniques, logInfo, contains, logError, isArray, deepClone, deepAccess, isNumber, logWarn, logMessage, isFn, transformAdServerTargetingObj, bind, replaceAuctionPrice, replaceClickThrough, insertElement, - inIframe, callBurl, createInvisibleIframe, generateUUID, unsupportedBidderMessage, isEmpty + inIframe, callBurl, createInvisibleIframe, generateUUID, unsupportedBidderMessage, isEmpty, mergeDeep } from './utils.js'; import { listenMessagesFromCreative } from './secureCreatives.js'; import { userSync } from './userSync.js'; @@ -571,13 +571,19 @@ $$PREBID_GLOBAL$$.removeAdUnit = function (adUnitCode) { * @param {String} requestOptions.auctionId * @alias module:pbjs.requestBids */ -$$PREBID_GLOBAL$$.requestBids = hook('async', function ({ bidsBackHandler, timeout, adUnits, adUnitCodes, labels, auctionId } = {}) { +$$PREBID_GLOBAL$$.requestBids = hook('async', function ({ bidsBackHandler, timeout, adUnits, adUnitCodes, labels, auctionId, ortb2 } = {}) { events.emit(REQUEST_BIDS); const cbTimeout = timeout || config.getConfig('bidderTimeout'); adUnits = (adUnits && config.convertAdUnitFpd(isArray(adUnits) ? adUnits : [adUnits])) || $$PREBID_GLOBAL$$.adUnits; - logInfo('Invoking $$PREBID_GLOBAL$$.requestBids', arguments); + const ortb2Fragments = { + global: mergeDeep({}, config.getAnyConfig('ortb2') || {}, ortb2 || {}), + bidder: Object.fromEntries(Object.entries(config.getBidderConfig()).map(([bidder, cfg]) => [bidder, cfg.ortb2]).filter(([_, ortb2]) => ortb2 != null)) + } + return startAuction({bidsBackHandler, timeout: cbTimeout, adUnits, adUnitCodes, labels, auctionId, ortb2Fragments}); +}); +export const startAuction = hook('async', function ({ bidsBackHandler, timeout: cbTimeout, adUnits, adUnitCodes, labels, auctionId, ortb2Fragments } = {}) { let _s2sConfigs = []; const s2sBidders = []; config.getConfig('s2sConfig', config => { @@ -650,7 +656,15 @@ $$PREBID_GLOBAL$$.requestBids = hook('async', function ({ bidsBackHandler, timeo return; } - const auction = auctionManager.createAuction({ adUnits, adUnitCodes, callback: bidsBackHandler, cbTimeout, labels, auctionId }); + const auction = auctionManager.createAuction({ + adUnits, + adUnitCodes, + callback: bidsBackHandler, + cbTimeout, + labels, + auctionId, + ortb2Fragments + }); let adUnitsLen = adUnits.length; if (adUnitsLen > 15) { @@ -659,7 +673,7 @@ $$PREBID_GLOBAL$$.requestBids = hook('async', function ({ bidsBackHandler, timeo adUnitCodes.forEach(code => targeting.setLatestAuctionForAdUnit(code, auction.getAuctionId())); auction.callBids(); -}); +}, 'startAuction'); export function executeCallbacks(fn, reqBidsConfigObj) { runAll(storageCallbacks); @@ -924,8 +938,8 @@ $$PREBID_GLOBAL$$.markWinningBidAsUsed = function (markBidRequest) { * @param {Object} options * @alias module:pbjs.getConfig */ -$$PREBID_GLOBAL$$.getConfig = config.getConfig; -$$PREBID_GLOBAL$$.readConfig = config.readConfig; +$$PREBID_GLOBAL$$.getConfig = config.getAnyConfig; +$$PREBID_GLOBAL$$.readConfig = config.readAnyConfig; $$PREBID_GLOBAL$$.mergeConfig = config.mergeConfig; $$PREBID_GLOBAL$$.mergeBidderConfig = config.mergeBidderConfig; diff --git a/test/spec/auctionmanager_spec.js b/test/spec/auctionmanager_spec.js index b5a4789366a..01266fac49e 100644 --- a/test/spec/auctionmanager_spec.js +++ b/test/spec/auctionmanager_spec.js @@ -682,6 +682,46 @@ describe('auctionmanager.js', function () { }); }); + describe('createAuction', () => { + let adUnits, stubMakeBidRequests, stubCallAdapters + + beforeEach(() => { + stubMakeBidRequests = sinon.stub(adapterManager, 'makeBidRequests').returns([{ + bidderCode: BIDDER_CODE, + bids: [{ + bidder: BIDDER_CODE + }] + }]); + stubCallAdapters = sinon.stub(adapterManager, 'callBids').callsFake((au, reqs, addBid, done) => { + reqs.forEach(r => done.apply(r)); + }); + adUnits = [{ + code: ADUNIT_CODE, + transactionId: ADUNIT_CODE, + bids: [ + {bidder: BIDDER_CODE}, + ] + }]; + }); + + afterEach(() => { + stubMakeBidRequests.restore(); + stubCallAdapters.restore(); + }); + + it('passes global and bidder ortb2 to the auction', () => { + const ortb2Fragments = { + global: {}, + bidder: {} + } + const auction = auctionManager.createAuction({adUnits, ortb2Fragments}); + auction.callBids(); + const anyArgs = [...Array(7).keys()].map(() => sinon.match.any); + sinon.assert.calledWith(stubMakeBidRequests, ...anyArgs.slice(0, 5).concat([sinon.match.same(ortb2Fragments)])); + sinon.assert.calledWith(stubCallAdapters, ...anyArgs.slice(0, 7).concat([sinon.match.same(ortb2Fragments)])); + }); + }); + describe('addBidResponse #1', function () { let createAuctionStub; let adUnits; diff --git a/test/spec/config_spec.js b/test/spec/config_spec.js index 88d6e61c706..1376d50ff9b 100644 --- a/test/spec/config_spec.js +++ b/test/spec/config_spec.js @@ -20,9 +20,9 @@ describe('config API', function () { beforeEach(function () { config = newConfig(); - getConfig = config.getConfig; + getConfig = config.getAnyConfig; setConfig = config.setConfig; - readConfig = config.readConfig; + readConfig = config.readAnyConfig; mergeConfig = config.mergeConfig; getBidderConfig = config.getBidderConfig; setBidderConfig = config.setBidderConfig; diff --git a/test/spec/modules/adagioBidAdapter_spec.js b/test/spec/modules/adagioBidAdapter_spec.js index 945cd0565a7..45631251a4a 100644 --- a/test/spec/modules/adagioBidAdapter_spec.js +++ b/test/spec/modules/adagioBidAdapter_spec.js @@ -137,24 +137,24 @@ describe('Adagio bid adapter', () => { }); describe('get and set params at adUnit level from global Prebid configuration', function() { - it('should set params get from ortb2 config or bidderSettings. Priority to bidderSetting', function() { + it('should set params get from bid.ortb2', function() { const bid = new BidRequestBuilder().build(); + bid.ortb2 = { + site: { + ext: { + data: { + environment: 'desktop', + pagetype: 'abc' + } + } + } + }; sandbox.stub(config, 'getConfig').callsFake(key => { const config = { adagio: { pagetype: 'article' }, - ortb2: { - site: { - ext: { - data: { - environment: 'desktop', - pagetype: 'abc' - } - } - } - } }; return utils.deepAccess(config, key); }); diff --git a/test/spec/modules/adfBidAdapter_spec.js b/test/spec/modules/adfBidAdapter_spec.js index ed096e7189d..9db41b6934e 100644 --- a/test/spec/modules/adfBidAdapter_spec.js +++ b/test/spec/modules/adfBidAdapter_spec.js @@ -196,13 +196,14 @@ describe('Adf adapter', function () { it('should send app info', function () { config.setConfig({ app: { id: 'appid' }, - ortb2: { app: { name: 'appname' } } }); + const ortb2 = { app: { name: 'appname' } }; let validBidRequests = [{ bidId: 'bidId', - params: { mid: '1000' } + params: { mid: '1000' }, + ortb2 }]; - let request = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { referer: 'page' } }).data); + let request = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { referer: 'page' }, ortb2 }).data); assert.equal(request.app.id, 'appid'); assert.equal(request.app.name, 'appname'); @@ -217,20 +218,21 @@ describe('Adf adapter', function () { domain: 'publisher.domain.com' } }, - ortb2: { - site: { - publisher: { - name: 'publisher\'s name' - } + }); + const ortb2 = { + site: { + publisher: { + name: 'publisher\'s name' } } - }); + }; let validBidRequests = [{ bidId: 'bidId', - params: { mid: '1000' } + params: { mid: '1000' }, + ortb2 }]; let refererInfo = { referer: 'page' }; - let request = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo }).data); + let request = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo, ortb2 }).data); assert.deepEqual(request.site, { page: refererInfo.referer, diff --git a/test/spec/modules/adlooxRtdProvider_spec.js b/test/spec/modules/adlooxRtdProvider_spec.js index b576ffb9f3b..236e053e58c 100644 --- a/test/spec/modules/adlooxRtdProvider_spec.js +++ b/test/spec/modules/adlooxRtdProvider_spec.js @@ -171,6 +171,7 @@ describe('Adloox RTD Provider', function () { }); it('should fetch segments', function (done) { + const req = {}; const adUnitWithSegments = utils.deepClone(adUnit); const getGlobalStub = sinon.stub(prebidGlobal, 'getGlobal').returns({ adUnits: [ adUnitWithSegments ] @@ -180,10 +181,11 @@ describe('Adloox RTD Provider', function () { expect(ret).is.true; const callback = function () { - expect(__config.ortb2.site.ext.data.adloox_rtd.ok).is.true; - expect(__config.ortb2.site.ext.data.adloox_rtd.nope).is.undefined; - expect(__config.ortb2.user.ext.data.adloox_rtd.unused).is.false; - expect(__config.ortb2.user.ext.data.adloox_rtd.nope).is.undefined; + const ortb2 = req.ortb2Fragments.global; + expect(ortb2.site.ext.data.adloox_rtd.ok).is.true; + expect(ortb2.site.ext.data.adloox_rtd.nope).is.undefined; + expect(ortb2.user.ext.data.adloox_rtd.unused).is.false; + expect(ortb2.user.ext.data.adloox_rtd.nope).is.undefined; expect(adUnitWithSegments.ortb2Imp.ext.data.adloox_rtd.dis.length).is.equal(3); expect(adUnitWithSegments.ortb2Imp.ext.data.adloox_rtd.nope).is.undefined; @@ -191,7 +193,7 @@ describe('Adloox RTD Provider', function () { done(); }; - rtdProvider.getBidRequestData({}, callback, CONFIG, null); + rtdProvider.getBidRequestData(req, callback, CONFIG, null); const request = server.requests[0]; const response = { unused: false, _: [ { d: 77 } ] }; @@ -207,7 +209,11 @@ describe('Adloox RTD Provider', function () { adUnits: [ adUnitWithSegments ] }); - const targetingData = rtdProvider.getTargetingData([ adUnitWithSegments.code ], CONFIG); + const targetingData = rtdProvider.getTargetingData([ adUnitWithSegments.code ], CONFIG, null, { + getFPD: () => ({ + global: __config.ortb2 + }) + }); expect(Object.keys(targetingData).length).is.equal(1); expect(Object.keys(targetingData[adUnit.code]).length).is.equal(2); expect(targetingData[adUnit.code].adl_ok).is.equal(1); diff --git a/test/spec/modules/adnuntiusBidAdapter_spec.js b/test/spec/modules/adnuntiusBidAdapter_spec.js index 25b72216395..36ca567d4fd 100644 --- a/test/spec/modules/adnuntiusBidAdapter_spec.js +++ b/test/spec/modules/adnuntiusBidAdapter_spec.js @@ -122,7 +122,7 @@ describe('adnuntiusBidAdapter', function () { describe('buildRequests', function () { it('Test requests', function () { - const request = spec.buildRequests(bidRequests); + const request = spec.buildRequests(bidRequests, {}); expect(request.length).to.equal(1); expect(request[0]).to.have.property('bid'); const bid = request[0].bid[0] @@ -134,52 +134,42 @@ describe('adnuntiusBidAdapter', function () { }); it('should pass segments if available in config', function () { - config.setBidderConfig({ - bidders: ['adnuntius', 'other'], - config: { - ortb2: { - user: { - data: [{ - name: 'adnuntius', - segment: [{ id: 'segment1' }, { id: 'segment2' }] - }, - { - name: 'other', - segment: ['segment3'] - }], - } - } + const ortb2 = { + user: { + data: [{ + name: 'adnuntius', + segment: [{ id: 'segment1' }, { id: 'segment2' }] + }, + { + name: 'other', + segment: ['segment3'] + }], } - }); + }; - const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests)); + const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests, {ortb2})); expect(request.length).to.equal(1); expect(request[0]).to.have.property('url') expect(request[0].url).to.equal(ENDPOINT_URL_SEGMENTS); }); it('should skip segments in config if not either id or array of strings', function () { - config.setBidderConfig({ - bidders: ['adnuntius', 'other'], - config: { - ortb2: { - user: { - data: [{ - name: 'adnuntius', - segment: [{ id: 'segment1' }, { id: 'segment2' }, { id: 'segment3' }] - }, - { - name: 'other', - segment: [{ - notright: 'segment4' - }] - }], - } - } + const ortb2 = { + user: { + data: [{ + name: 'adnuntius', + segment: [{ id: 'segment1' }, { id: 'segment2' }, { id: 'segment3' }] + }, + { + name: 'other', + segment: [{ + notright: 'segment4' + }] + }], } - }); + }; - const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests)); + const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests, {ortb2})); expect(request.length).to.equal(1); expect(request[0]).to.have.property('url') expect(request[0].url).to.equal(ENDPOINT_URL_SEGMENTS); @@ -202,70 +192,55 @@ describe('adnuntiusBidAdapter', function () { }); it('should pass segments if available in config', function () { - config.setBidderConfig({ - bidders: ['adnuntius', 'other'], - config: { - ortb2: { - user: { - data: [{ - name: 'adnuntius', - segment: [{ id: 'segment1' }, { id: 'segment2' }] - }, - { - name: 'other', - segment: ['segment3'] - }], - } - } + const ortb2 = { + user: { + data: [{ + name: 'adnuntius', + segment: [{ id: 'segment1' }, { id: 'segment2' }] + }, + { + name: 'other', + segment: ['segment3'] + }], } - }); + } - const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests)); + const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests, {ortb2})); expect(request.length).to.equal(1); expect(request[0]).to.have.property('url') expect(request[0].url).to.equal(ENDPOINT_URL_SEGMENTS); }); it('should skip segments in config if not either id or array of strings', function () { - config.setBidderConfig({ - bidders: ['adnuntius', 'other'], - config: { - ortb2: { - user: { - data: [{ - name: 'adnuntius', - segment: [{ id: 'segment1' }, { id: 'segment2' }, { id: 'segment3' }] - }, - { - name: 'other', - segment: [{ - notright: 'segment4' - }] - }], - } - } + const ortb2 = { + user: { + data: [{ + name: 'adnuntius', + segment: [{ id: 'segment1' }, { id: 'segment2' }, { id: 'segment3' }] + }, + { + name: 'other', + segment: [{ + notright: 'segment4' + }] + }], } - }); + }; - const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests)); + const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests, {ortb2})); expect(request.length).to.equal(1); expect(request[0]).to.have.property('url') expect(request[0].url).to.equal(ENDPOINT_URL_SEGMENTS); }); it('should user user ID if present in ortb2.user.id field', function () { - config.setBidderConfig({ - bidders: ['adnuntius', 'other'], - config: { - ortb2: { - user: { - id: usi - } - } + const ortb2 = { + user: { + id: usi } - }); + }; - const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests)); + const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests, {ortb2})); expect(request.length).to.equal(1); expect(request[0]).to.have.property('url') expect(request[0].url).to.equal(ENDPOINT_URL); @@ -297,7 +272,7 @@ describe('adnuntiusBidAdapter', function () { } }); - const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests)); + const request = config.runWithBidder('adnuntius', () => spec.buildRequests(bidRequests, {})); expect(request.length).to.equal(1); expect(request[0]).to.have.property('url') expect(request[0].url).to.equal(ENDPOINT_URL_NOCOOKIE); diff --git a/test/spec/modules/adrelevantisBidAdapter_spec.js b/test/spec/modules/adrelevantisBidAdapter_spec.js index d25fdaf86d7..569cb0eba60 100644 --- a/test/spec/modules/adrelevantisBidAdapter_spec.js +++ b/test/spec/modules/adrelevantisBidAdapter_spec.js @@ -69,7 +69,7 @@ describe('AdrelevantisAdapter', function () { } ); - const request = spec.buildRequests([bidRequest]); + const request = spec.buildRequests([bidRequest], {}); const payload = JSON.parse(request.data); expect(payload.tags[0].private_sizes).to.exist; @@ -77,7 +77,7 @@ describe('AdrelevantisAdapter', function () { }); it('should add source and verison to the tag', function () { - const request = spec.buildRequests(bidRequests); + const request = spec.buildRequests(bidRequests, {}); const payload = JSON.parse(request.data); expect(payload.sdk).to.exist; expect(payload.sdk).to.deep.equal({ @@ -92,7 +92,7 @@ describe('AdrelevantisAdapter', function () { bidRequest.mediaTypes = {}; bidRequest.mediaTypes[type] = {}; - const request = spec.buildRequests([bidRequest]); + const request = spec.buildRequests([bidRequest], {}); const payload = JSON.parse(request.data); expect(payload.tags[0].ad_types).to.deep.equal([type]); @@ -104,14 +104,14 @@ describe('AdrelevantisAdapter', function () { bidRequest.mediaTypes = {}; bidRequest.mediaTypes.video = {context: 'outstream'}; - const request = spec.buildRequests([bidRequest]); + const request = spec.buildRequests([bidRequest], {}); const payload = JSON.parse(request.data); expect(payload.tags[0].ad_types).to.deep.equal(['video']); }); it('sends bid request to ENDPOINT via POST', function () { - const request = spec.buildRequests(bidRequests); + const request = spec.buildRequests(bidRequests, {}); expect(request.url).to.equal(ENDPOINT); expect(request.method).to.equal('POST'); }); @@ -131,7 +131,7 @@ describe('AdrelevantisAdapter', function () { } ); - const request = spec.buildRequests([bidRequest]); + const request = spec.buildRequests([bidRequest], {}); const payload = JSON.parse(request.data); expect(payload.tags[0].video).to.deep.equal({ id: 123, @@ -168,7 +168,7 @@ describe('AdrelevantisAdapter', function () { bidRequest2.adUnitCode = 'adUnit_code_2'; bidRequest2 = Object.assign({}, bidRequest2, videoData); - const request = spec.buildRequests([bidRequest1, bidRequest2]); + const request = spec.buildRequests([bidRequest1, bidRequest2], {}); const payload = JSON.parse(request.data); expect(payload.tags[0].video).to.deep.equal({ skippable: true, @@ -195,7 +195,7 @@ describe('AdrelevantisAdapter', function () { } ); - const request = spec.buildRequests([bidRequest]); + const request = spec.buildRequests([bidRequest], {}); const payload = JSON.parse(request.data); expect(payload.user).to.exist; @@ -215,32 +215,27 @@ describe('AdrelevantisAdapter', function () { } } ); - const request = spec.buildRequests([bidRequest]); + const request = spec.buildRequests([bidRequest], {}); const payload = JSON.parse(request.data); expect(payload.tags[0].hb_source).to.deep.equal(1); }); it('adds context data (category and keywords) to request when set', function() { let bidRequest = Object.assign({}, bidRequests[0]); - sinon - .stub(config, 'getConfig') - .withArgs('ortb2') - .returns({ - site: { - keywords: 'US Open', - ext: { - data: {category: 'sports/tennis'} - } + const ortb2 = { + site: { + keywords: 'US Open', + ext: { + data: {category: 'sports/tennis'} } - }); + } + }; - const request = spec.buildRequests([bidRequest]); + const request = spec.buildRequests([bidRequest], {ortb2}); const payload = JSON.parse(request.data); expect(payload.fpd.keywords).to.equal('US Open'); expect(payload.fpd.category).to.equal('sports/tennis'); - - config.getConfig.restore(); }); it('should attach native params to the request', function () { @@ -269,7 +264,7 @@ describe('AdrelevantisAdapter', function () { } ); - const request = spec.buildRequests([bidRequest]); + const request = spec.buildRequests([bidRequest], {}); const payload = JSON.parse(request.data); expect(payload.tags[0].native.layouts[0]).to.deep.equal({ @@ -306,13 +301,13 @@ describe('AdrelevantisAdapter', function () { ); bidRequest.sizes = [[150, 100], [300, 250]]; - let request = spec.buildRequests([bidRequest]); + let request = spec.buildRequests([bidRequest], {}); let payload = JSON.parse(request.data); expect(payload.tags[0].sizes).to.deep.equal([{width: 150, height: 100}, {width: 300, height: 250}]); delete bidRequest.sizes; - request = spec.buildRequests([bidRequest]); + request = spec.buildRequests([bidRequest], {}); payload = JSON.parse(request.data); expect(payload.tags[0].sizes).to.deep.equal([{width: 1, height: 1}]); @@ -338,7 +333,7 @@ describe('AdrelevantisAdapter', function () { } ); - const request = spec.buildRequests([bidRequest]); + const request = spec.buildRequests([bidRequest], {}); const payload = JSON.parse(request.data); expect(payload.tags[0].keywords).to.deep.equal([{ @@ -374,7 +369,7 @@ describe('AdrelevantisAdapter', function () { } ); - const request = spec.buildRequests([bidRequest]); + const request = spec.buildRequests([bidRequest], {}); const payload = JSON.parse(request.data); expect(payload.tags[0].use_pmt_rule).to.equal(true); @@ -425,7 +420,7 @@ describe('AdrelevantisAdapter', function () { } } ); - const request = spec.buildRequests([appRequest]); + const request = spec.buildRequests([appRequest], {}); const payload = JSON.parse(request.data); expect(payload.app).to.exist; expect(payload.app).to.deep.equal({ @@ -478,7 +473,7 @@ describe('AdrelevantisAdapter', function () { .withArgs('coppa') .returns(true); - const request = spec.buildRequests([bidRequest]); + const request = spec.buildRequests([bidRequest], {}); const payload = JSON.parse(request.data); expect(payload.user.coppa).to.equal(true); diff --git a/test/spec/modules/adxcgBidAdapter_spec.js b/test/spec/modules/adxcgBidAdapter_spec.js index 7721295572c..13afd3ea8e3 100644 --- a/test/spec/modules/adxcgBidAdapter_spec.js +++ b/test/spec/modules/adxcgBidAdapter_spec.js @@ -190,13 +190,14 @@ describe('Adxcg adapter', function () { it('should send app info', function () { config.setConfig({ app: {id: 'appid'}, - ortb2: {app: {name: 'appname'}} }); + const ortb2 = {app: {name: 'appname'}} let validBidRequests = [{ bidId: 'bidId', - params: {adzoneid: '1000'} + params: {adzoneid: '1000'}, + ortb2 }]; - let request = JSON.parse(spec.buildRequests(validBidRequests, {refererInfo: {referer: 'page'}}).data); + let request = JSON.parse(spec.buildRequests(validBidRequests, {refererInfo: {referer: 'page'}, ortb2}).data); assert.equal(request.app.id, 'appid'); assert.equal(request.app.name, 'appname'); @@ -211,21 +212,23 @@ describe('Adxcg adapter', function () { domain: 'publisher.domain.com' } }, - ortb2: { - site: { - publisher: { - id: 4441, - name: 'publisher\'s name' - } + }); + const ortb2 = { + site: { + publisher: { + id: 4441, + name: 'publisher\'s name' } } - }); + }; + let validBidRequests = [{ bidId: 'bidId', - params: {adzoneid: '1000'} + params: {adzoneid: '1000'}, + ortb2 }]; let refererInfo = {referer: 'page'}; - let request = JSON.parse(spec.buildRequests(validBidRequests, {refererInfo}).data); + let request = JSON.parse(spec.buildRequests(validBidRequests, {refererInfo, ortb2}).data); assert.deepEqual(request.site, { domain: 'localhost', diff --git a/test/spec/modules/airgridRtdProvider_spec.js b/test/spec/modules/airgridRtdProvider_spec.js index cc10dda4ad1..26dd0a6f52f 100644 --- a/test/spec/modules/airgridRtdProvider_spec.js +++ b/test/spec/modules/airgridRtdProvider_spec.js @@ -84,13 +84,12 @@ describe('airgrid RTD Submodule', function() { it('sets bidder specific ORTB2 config', function() { getDataFromLocalStorageStub.withArgs(agRTD.AG_AUDIENCE_IDS_KEY).returns(JSON.stringify(MATCHED_AUDIENCES)); const audiences = agRTD.getMatchedAudiencesFromStorage(); - agRTD.setAudiencesUsingBidderOrtb2(RTD_CONFIG.dataProviders[0], audiences); + const bidderOrtb2 = agRTD.getAudiencesAsBidderOrtb2(RTD_CONFIG.dataProviders[0], audiences); - const allBiddersConfig = config.getBidderConfig(); const bidders = RTD_CONFIG.dataProviders[0].params.bidders; - Object.keys(allBiddersConfig).forEach((bidder) => { + Object.keys(bidderOrtb2).forEach((bidder) => { if (bidders.indexOf(bidder) === -1) return; - expect(deepAccess(allBiddersConfig[bidder], 'ortb2.user.ext.data.airgrid')).to.eql(MATCHED_AUDIENCES); + expect(deepAccess(bidderOrtb2[bidder], 'ortb2.user.ext.data.airgrid')).to.eql(MATCHED_AUDIENCES); }); }); }); diff --git a/test/spec/modules/akamaiDapRtdProvider_spec.js b/test/spec/modules/akamaiDapRtdProvider_spec.js index b350c2bb529..34895318d12 100644 --- a/test/spec/modules/akamaiDapRtdProvider_spec.js +++ b/test/spec/modules/akamaiDapRtdProvider_spec.js @@ -1,7 +1,13 @@ import {config} from 'src/config.js'; -import {SEGMENTS_STORAGE_KEY, TOKEN_STORAGE_KEY, dapUtils, addRealTimeData, getRealTimeData, akamaiDapRtdSubmodule, storage} from 'modules/akamaiDapRtdProvider.js'; +import { + akamaiDapRtdSubmodule, + dapUtils, + getRealTimeData, + SEGMENTS_STORAGE_KEY, + storage +} from 'modules/akamaiDapRtdProvider.js'; import {server} from 'test/mocks/xhr.js'; -import logMessage from 'src/utils.js' + const responseHeader = {'Content-Type': 'application/json'}; describe('akamaiDapRtdProvider', function() { @@ -66,7 +72,7 @@ describe('akamaiDapRtdProvider', function() { } }; - const bidConfig = {}; + const bidConfig = {ortb2Fragments: {global: {}}}; const rtdUserObj1 = { name: 'www.dataprovider3.com', @@ -95,9 +101,8 @@ describe('akamaiDapRtdProvider', function() { getDataFromLocalStorageStub.withArgs(SEGMENTS_STORAGE_KEY).returns(JSON.stringify(cachedRtd)); - expect(config.getConfig().ortb2).to.be.undefined; getRealTimeData(bidConfig, () => {}, rtdConfig, {}); - expect(config.getConfig().ortb2.user.data).to.deep.include.members([rtdUserObj1]); + expect(bidConfig.ortb2Fragments.global.user.data).to.deep.include.members([rtdUserObj1]); }); it('should initalise and return with config', function () { diff --git a/test/spec/modules/amxBidAdapter_spec.js b/test/spec/modules/amxBidAdapter_spec.js index f502d631c17..48701ce1b60 100644 --- a/test/spec/modules/amxBidAdapter_spec.js +++ b/test/spec/modules/amxBidAdapter_spec.js @@ -31,15 +31,6 @@ const sampleFPD = { } }; -const stubConfig = (withStub) => { - const stub = sinon.stub(config, 'getConfig').callsFake( - (arg) => arg === 'ortb2' ? sampleFPD : null - ) - - withStub(); - stub.restore(); -}; - const sampleBidderRequest = { gdprConsent: { gdprApplies: true, @@ -51,7 +42,8 @@ const sampleBidderRequest = { refererInfo: { referer: 'https://www.prebid.org', canonicalUrl: 'https://www.prebid.org/the/link/to/the/page' - } + }, + ortb2: sampleFPD }; const sampleBidRequestBase = { @@ -293,10 +285,8 @@ describe('AmxBidAdapter', () => { expect(data.trc).to.equal(0) }); it('will forward first-party data', () => { - stubConfig(() => { - const { data } = spec.buildRequests([sampleBidRequestBase], sampleBidderRequest); - expect(data.fpd2).to.deep.equal(sampleFPD) - }); + const { data } = spec.buildRequests([sampleBidRequestBase], sampleBidderRequest); + expect(data.fpd2).to.deep.equal(sampleFPD) }); it('will collect & forward RTI user IDs', () => { diff --git a/test/spec/modules/beachfrontBidAdapter_spec.js b/test/spec/modules/beachfrontBidAdapter_spec.js index d9b8cac10b4..3ead712b725 100644 --- a/test/spec/modules/beachfrontBidAdapter_spec.js +++ b/test/spec/modules/beachfrontBidAdapter_spec.js @@ -129,7 +129,7 @@ describe('BeachfrontAdapter', function () { it('should attach the bid request object', function () { bidRequests[0].mediaTypes = { video: {} }; bidRequests[1].mediaTypes = { video: {} }; - const requests = spec.buildRequests(bidRequests); + const requests = spec.buildRequests(bidRequests, {}); expect(requests[0].bidRequest).to.equal(bidRequests[0]); expect(requests[1].bidRequest).to.equal(bidRequests[1]); }); @@ -137,7 +137,7 @@ describe('BeachfrontAdapter', function () { it('should create a POST request for each bid', function () { const bidRequest = bidRequests[0]; bidRequest.mediaTypes = { video: {} }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); expect(requests[0].method).to.equal('POST'); expect(requests[0].url).to.equal(VIDEO_ENDPOINT + bidRequest.params.appId); }); @@ -176,7 +176,7 @@ describe('BeachfrontAdapter', function () { const bidRequest = bidRequests[0]; bidRequest.mediaTypes = { video: {} }; bidRequest.getFloor = () => ({ currency: 'USD', floor: 1.16 }); - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.imp[0].bidfloor).to.equal(1.16); }); @@ -185,7 +185,7 @@ describe('BeachfrontAdapter', function () { const bidRequest = bidRequests[0]; bidRequest.mediaTypes = { video: {} }; bidRequest.getFloor = () => ({}); - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.imp[0].bidfloor).to.equal(bidRequest.params.bidfloor); }); @@ -199,7 +199,7 @@ describe('BeachfrontAdapter', function () { playerSize: [[ width, height ]] } }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.imp[0].video).to.deep.contain({ w: width, h: height }); }); @@ -213,7 +213,7 @@ describe('BeachfrontAdapter', function () { playerSize: `${width}x${height}` } }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.imp[0].video).to.deep.contain({ w: width, h: height }); }); @@ -225,7 +225,7 @@ describe('BeachfrontAdapter', function () { playerSize: [] } }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.imp[0].video).to.deep.contain({ w: undefined, h: undefined }); }); @@ -236,7 +236,7 @@ describe('BeachfrontAdapter', function () { const bidRequest = bidRequests[0]; bidRequest.sizes = [ width, height ]; bidRequest.mediaTypes = { video: {} }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.imp[0].video).to.deep.contain({ w: width, h: height }); }); @@ -251,7 +251,7 @@ describe('BeachfrontAdapter', function () { bidRequest.mediaTypes = { video: { mimes, playbackmethod, maxduration, placement, skip } }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.imp[0].video).to.deep.contain({ mimes, playbackmethod, maxduration, placement, skip }); }); @@ -265,7 +265,7 @@ describe('BeachfrontAdapter', function () { const skip = 1; bidRequest.mediaTypes = { video: { placement: 3, skip: 0 } }; bidRequest.params.video = { mimes, playbackmethod, maxduration, placement, skip }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.imp[0].video).to.deep.contain({ mimes, playbackmethod, maxduration, placement, skip }); }); @@ -312,7 +312,7 @@ describe('BeachfrontAdapter', function () { const bidRequest = bidRequests[0]; bidRequest.mediaTypes = { video: {} }; bidRequest.schain = schain; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.source.ext.schain).to.deep.equal(schain); }); @@ -327,7 +327,7 @@ describe('BeachfrontAdapter', function () { const bidRequest = bidRequests[0]; bidRequest.mediaTypes = { video: {} }; bidRequest.userId = userId; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.user.ext.eids).to.deep.equal([ { @@ -372,14 +372,14 @@ describe('BeachfrontAdapter', function () { it('should attach the bid requests array', function () { bidRequests[0].mediaTypes = { banner: {} }; bidRequests[1].mediaTypes = { banner: {} }; - const requests = spec.buildRequests(bidRequests); + const requests = spec.buildRequests(bidRequests, {}); expect(requests[0].bidRequest).to.deep.equal(bidRequests); }); it('should create a single POST request for all bids', function () { bidRequests[0].mediaTypes = { banner: {} }; bidRequests[1].mediaTypes = { banner: {} }; - const requests = spec.buildRequests(bidRequests); + const requests = spec.buildRequests(bidRequests, {}); expect(requests.length).to.equal(1); expect(requests[0].method).to.equal('POST'); expect(requests[0].url).to.equal(BANNER_ENDPOINT); @@ -422,7 +422,7 @@ describe('BeachfrontAdapter', function () { const bidRequest = bidRequests[0]; bidRequest.mediaTypes = { banner: {} }; bidRequest.getFloor = () => ({ currency: 'USD', floor: 1.16 }); - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.slots[0].bidfloor).to.equal(1.16); }); @@ -431,7 +431,7 @@ describe('BeachfrontAdapter', function () { const bidRequest = bidRequests[0]; bidRequest.mediaTypes = { banner: {} }; bidRequest.getFloor = () => ({}); - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.slots[0].bidfloor).to.equal(bidRequest.params.bidfloor); }); @@ -445,7 +445,7 @@ describe('BeachfrontAdapter', function () { sizes: [[ width, height ]] } }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.slots[0].sizes).to.deep.equal([ { w: width, h: height } @@ -461,7 +461,7 @@ describe('BeachfrontAdapter', function () { sizes: `${width}x${height}` } }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.slots[0].sizes).to.deep.equal([ { w: width, h: height } @@ -475,7 +475,7 @@ describe('BeachfrontAdapter', function () { sizes: [] } }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.slots[0].sizes).to.deep.equal([]); }); @@ -486,7 +486,7 @@ describe('BeachfrontAdapter', function () { const bidRequest = bidRequests[0]; bidRequest.sizes = [ width, height ]; bidRequest.mediaTypes = { banner: {} }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.slots[0].sizes).to.deep.contain({ w: width, h: height }); }); @@ -533,7 +533,7 @@ describe('BeachfrontAdapter', function () { const bidRequest = bidRequests[0]; bidRequest.mediaTypes = { banner: {} }; bidRequest.schain = schain; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.schain).to.deep.equal(schain); }); @@ -548,7 +548,7 @@ describe('BeachfrontAdapter', function () { const bidRequest = bidRequests[0]; bidRequest.mediaTypes = { banner: {} }; bidRequest.userId = userId; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); const data = requests[0].data; expect(data.tdid).to.equal(userId.tdid); expect(data.idl).to.equal(userId.idl_env); @@ -558,36 +558,23 @@ describe('BeachfrontAdapter', function () { }); describe('with first-party data', function () { - let sandbox - - beforeEach(function () { - sandbox = sinon.sandbox.create(); - }); - - afterEach(function () { - sandbox.restore(); - }); - it('must add first-party data to the video bid request', function () { - sandbox.stub(config, 'getConfig').callsFake(key => { - const cfg = { - ortb2: { - site: { - keywords: 'test keyword' - }, - user: { - data: 'some user data' - } - } - }; - return deepAccess(cfg, key); - }); + const ortb2 = { + site: { + keywords: 'test keyword' + }, + user: { + data: 'some user data' + } + }; + const bidRequest = bidRequests[0]; bidRequest.mediaTypes = { video: {} }; const bidderRequest = { refererInfo: { referer: 'http://example.com/page.html' - } + }, + ortb2 }; const requests = spec.buildRequests([ bidRequest ], bidderRequest); const data = requests[0].data; @@ -598,22 +585,17 @@ describe('BeachfrontAdapter', function () { }); it('must add first-party data to the banner bid request', function () { - sandbox.stub(config, 'getConfig').callsFake(key => { - const cfg = { - ortb2: { - site: { - keywords: 'test keyword' - }, - user: { - data: 'some user data' - } - } - }; - return deepAccess(cfg, key); - }); + const ortb2 = { + site: { + keywords: 'test keyword' + }, + user: { + data: 'some user data' + } + }; const bidRequest = bidRequests[0]; bidRequest.mediaTypes = { banner: {} }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {ortb2}); const data = requests[0].data; expect(data.ortb2.user.data).to.equal('some user data'); expect(data.ortb2.site.keywords).to.equal('test keyword'); @@ -643,7 +625,7 @@ describe('BeachfrontAdapter', function () { appId: '3b16770b-17af-4d22-daff-9606bdf2c9c3' } }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); expect(requests.length).to.equal(2); expect(requests[0].url).to.contain(VIDEO_ENDPOINT); expect(requests[1].url).to.contain(BANNER_ENDPOINT); @@ -669,7 +651,7 @@ describe('BeachfrontAdapter', function () { appId: '3b16770b-17af-4d22-daff-9606bdf2c9c3' } }; - const requests = spec.buildRequests([ bidRequest ]); + const requests = spec.buildRequests([ bidRequest ], {}); expect(requests[0].data.imp[0].video).to.deep.contain({ w: 640, h: 360 }); expect(requests[1].data.slots[0].sizes).to.deep.equal([{ w: 300, h: 250 }]); }); diff --git a/test/spec/modules/brandmetricsRtdProvider_spec.js b/test/spec/modules/brandmetricsRtdProvider_spec.js index 3cac5a3d559..879ec7e1c7a 100644 --- a/test/spec/modules/brandmetricsRtdProvider_spec.js +++ b/test/spec/modules/brandmetricsRtdProvider_spec.js @@ -124,12 +124,12 @@ describe('getBidRequestData', () => { }) it('should set targeting keys for specified bidders', () => { - brandmetricsRTD.brandmetricsSubmodule.getBidRequestData({}, () => { - const bidderConfig = config.getBidderConfig() + const bidderOrtb2 = {}; + brandmetricsRTD.brandmetricsSubmodule.getBidRequestData({ortb2Fragments: {bidder: bidderOrtb2}}, () => { const expected = VALID_CONFIG.params.bidders expected.forEach(exp => { - expect(bidderConfig[exp].ortb2.user.ext.data.mockTargetKey).to.equal('mockMeasurementId') + expect(bidderOrtb2[exp].user.ext.data.mockTargetKey).to.equal('mockMeasurementId') }) }, VALID_CONFIG); @@ -161,9 +161,9 @@ describe('getBidRequestData', () => { } }); - brandmetricsRTD.brandmetricsSubmodule.getBidRequestData({}, () => {}, VALID_CONFIG); - const bidderConfig = config.getBidderConfig() - expect(Object.keys(bidderConfig).length).to.equal(0) + const bidderOrtb2 = {}; + brandmetricsRTD.brandmetricsSubmodule.getBidRequestData({ortb2Fragments: {bidder: bidderOrtb2}}, () => {}, VALID_CONFIG); + expect(Object.keys(bidderOrtb2).length).to.equal(0) }); it('should use a default targeting key name if the brandmetrics- configuration does not include one', () => { @@ -179,13 +179,13 @@ describe('getBidRequestData', () => { } }); - brandmetricsRTD.brandmetricsSubmodule.getBidRequestData({}, () => {}, VALID_CONFIG); + const bidderOrtb2 = {}; + brandmetricsRTD.brandmetricsSubmodule.getBidRequestData({ortb2Fragments: {bidder: bidderOrtb2}}, () => {}, VALID_CONFIG); - const bidderConfig = config.getBidderConfig() const expected = VALID_CONFIG.params.bidders expected.forEach(exp => { - expect(bidderConfig[exp].ortb2.user.ext.data.brandmetrics_survey).to.equal('mockMeasurementId') + expect(bidderOrtb2[exp].user.ext.data.brandmetrics_survey).to.equal('mockMeasurementId') }) }); }); diff --git a/test/spec/modules/conversantBidAdapter_spec.js b/test/spec/modules/conversantBidAdapter_spec.js index 53169326d3b..74bc32f0ff7 100644 --- a/test/spec/modules/conversantBidAdapter_spec.js +++ b/test/spec/modules/conversantBidAdapter_spec.js @@ -361,9 +361,10 @@ describe('Conversant adapter tests', function() { }); it('Verify first party data', () => { - const bidderRequest = {refererInfo: {referer: 'http://test.com?a=b&c=123'}}; - const cfg = {ortb2: {site: {content: {series: 'MySeries', season: 'MySeason', episode: 3, title: 'MyTitle'}}}}; - config.setConfig(cfg); + const bidderRequest = { + refererInfo: {referer: 'http://test.com?a=b&c=123'}, + ortb2: {site: {content: {series: 'MySeries', season: 'MySeason', episode: 3, title: 'MyTitle'}}} + }; const request = spec.buildRequests(bidRequests, bidderRequest); const payload = request.data; expect(payload.site).to.have.property('content'); @@ -371,7 +372,6 @@ describe('Conversant adapter tests', function() { expect(payload.site.content).to.have.property('season'); expect(payload.site.content).to.have.property('episode'); expect(payload.site.content).to.have.property('title'); - config.resetConfig(); }); it('Verify supply chain data', () => { @@ -390,12 +390,12 @@ describe('Conversant adapter tests', function() { it('Verify override url', function() { const testUrl = 'https://someurl?name=value'; - const request = spec.buildRequests([{params: {white_label_url: testUrl}}]); + const request = spec.buildRequests([{params: {white_label_url: testUrl}}], {}); expect(request.url).to.equal(testUrl); }); it('Verify interpretResponse', function() { - const request = spec.buildRequests(bidRequests); + const request = spec.buildRequests(bidRequests, {}); const response = spec.interpretResponse(bidResponses, request); expect(response).to.be.an('array').with.lengthOf(4); @@ -458,7 +458,7 @@ describe('Conversant adapter tests', function() { Object.assign(unit, {crumbs: {pubcid: 12345}}); }); // construct http post payload - const payload = spec.buildRequests(requests).data; + const payload = spec.buildRequests(requests, {}).data; expect(payload).to.have.deep.nested.property('user.ext.fpc', 12345); expect(payload).to.not.have.nested.property('user.ext.eids'); }); @@ -473,7 +473,7 @@ describe('Conversant adapter tests', function() { Object.assign(unit, {userIdAsEids: createEidsArray(unit.userId)}); }); // construct http post payload - const payload = spec.buildRequests(requests).data; + const payload = spec.buildRequests(requests, {}).data; expect(payload).to.have.deep.nested.property('user.ext.fpc', 67890); expect(payload).to.not.have.nested.property('user.ext.eids'); }); @@ -548,7 +548,7 @@ describe('Conversant adapter tests', function() { Object.assign(unit, {userIdAsEids: createEidsArray(unit.userId)}); }); // construct http post payload - const payload = spec.buildRequests(requests).data; + const payload = spec.buildRequests(requests, {}).data; expect(payload).to.have.deep.nested.property('user.ext.eids', [ {source: 'adserver.org', uids: [{id: '223344', atype: 1, ext: {rtiPartner: 'TDID'}}]}, {source: 'liveramp.com', uids: [{id: '334455', atype: 3}]} @@ -585,7 +585,7 @@ describe('Conversant adapter tests', function() { storage.setCookie(ID_NAME, '12345', expStr(TIMEOUT)); // construct http post payload - const payload = spec.buildRequests(requests).data; + const payload = spec.buildRequests(requests, {}).data; expect(payload).to.have.deep.nested.property('user.ext.fpc', '12345'); }); @@ -598,7 +598,7 @@ describe('Conversant adapter tests', function() { storage.setCookie(CUSTOM_ID_NAME, '12345', expStr(TIMEOUT)); // construct http post payload - const payload = spec.buildRequests(requests).data; + const payload = spec.buildRequests(requests, {}).data; expect(payload).to.have.deep.nested.property('user.ext.fpc', '12345'); }); @@ -611,7 +611,7 @@ describe('Conversant adapter tests', function() { storage.setDataInLocalStorage(ID_NAME, 'abcde'); // construct http post payload - const payload = spec.buildRequests(requests).data; + const payload = spec.buildRequests(requests, {}).data; expect(payload).to.have.deep.nested.property('user.ext.fpc', 'abcde'); }); @@ -624,7 +624,7 @@ describe('Conversant adapter tests', function() { storage.setDataInLocalStorage(ID_NAME, 'fghijk'); // construct http post payload - const payload = spec.buildRequests(requests).data; + const payload = spec.buildRequests(requests, {}).data; expect(payload).to.have.deep.nested.property('user.ext.fpc', 'fghijk'); }); @@ -637,7 +637,7 @@ describe('Conversant adapter tests', function() { storage.setDataInLocalStorage(ID_NAME, 'lmnopq'); // construct http post payload - const payload = spec.buildRequests(requests).data; + const payload = spec.buildRequests(requests, {}).data; expect(payload).to.not.have.deep.nested.property('user.ext.fpc'); }); @@ -651,7 +651,7 @@ describe('Conversant adapter tests', function() { storage.setDataInLocalStorage(CUSTOM_ID_NAME, 'fghijk'); // construct http post payload - const payload = spec.buildRequests(requests).data; + const payload = spec.buildRequests(requests, {}).data; expect(payload).to.have.deep.nested.property('user.ext.fpc', 'fghijk'); }); }); @@ -671,7 +671,7 @@ describe('Conversant adapter tests', function() { }; }; - const payload = spec.buildRequests(bidRequest).data; + const payload = spec.buildRequests(bidRequest, {}).data; expect(payload.imp[0]).to.have.property('bidfloor', 3.21); }); @@ -684,7 +684,7 @@ describe('Conversant adapter tests', function() { }; bidRequest[0].params.bidfloor = 0.6; - const payload = spec.buildRequests(bidRequest).data; + const payload = spec.buildRequests(bidRequest, {}).data; expect(payload.imp[0]).to.have.property('bidfloor', 0.6); }); @@ -696,7 +696,7 @@ describe('Conversant adapter tests', function() { }; }; - const payload = spec.buildRequests(bidRequest).data; + const payload = spec.buildRequests(bidRequest, {}).data; expect(payload.imp[0]).to.have.property('bidfloor', 0); }); @@ -708,7 +708,7 @@ describe('Conversant adapter tests', function() { }; }; - const payload = spec.buildRequests(bidRequest).data; + const payload = spec.buildRequests(bidRequest, {}).data; expect(payload.imp[0]).to.have.property('bidfloor', 0); }); @@ -717,14 +717,14 @@ describe('Conversant adapter tests', function() { return {}; }; - const payload = spec.buildRequests(bidRequest).data; + const payload = spec.buildRequests(bidRequest, {}).data; expect(payload.imp[0]).to.have.property('bidfloor', 0); }); it('undefined floor result', function() { bidRequest[0].getFloor = () => {}; - const payload = spec.buildRequests(bidRequest).data; + const payload = spec.buildRequests(bidRequest, {}).data; expect(payload.imp[0]).to.have.property('bidfloor', 0); }); }); diff --git a/test/spec/modules/criteoBidAdapter_spec.js b/test/spec/modules/criteoBidAdapter_spec.js index 57276759a35..d14a1915ce9 100755 --- a/test/spec/modules/criteoBidAdapter_spec.js +++ b/test/spec/modules/criteoBidAdapter_spec.js @@ -925,19 +925,14 @@ describe('The Criteo bidding adapter', function () { }, ]; - sandbox.stub(config, 'getConfig').callsFake(key => { - const config = { - }; - return utils.deepAccess(config, key); - }); - - const request = spec.buildRequests(bidRequests, bidderRequest); + const request = spec.buildRequests(bidRequests, {...bidderRequest, ortb2: {}}); expect(request.data.publisher.ext).to.equal(undefined); expect(request.data.user.ext).to.equal(undefined); expect(request.data.slots[0].ext).to.equal(undefined); }); it('should properly build a request with criteo specific ad unit first party data', function () { + // TODO: this test does not do what it says const bidRequests = [ { bidder: 'criteo', @@ -957,13 +952,7 @@ describe('The Criteo bidding adapter', function () { }, ]; - sandbox.stub(config, 'getConfig').callsFake(key => { - const config = { - }; - return utils.deepAccess(config, key); - }); - - const request = spec.buildRequests(bidRequests, bidderRequest); + const request = spec.buildRequests(bidRequests, {...bidderRequest, ortb2: {}}); expect(request.data.slots[0].ext).to.deep.equal({ bidfloor: 0.75, }); @@ -1012,17 +1001,12 @@ describe('The Criteo bidding adapter', function () { }, ]; - sandbox.stub(config, 'getConfig').callsFake(key => { - const config = { - ortb2: { - site: siteData, - user: userData - } - }; - return utils.deepAccess(config, key); - }); + const ortb2 = { + site: siteData, + user: userData + }; - const request = spec.buildRequests(bidRequests, bidderRequest); + const request = spec.buildRequests(bidRequests, {...bidderRequest, ortb2}); expect(request.data.publisher.ext).to.deep.equal({ data: { pageType: 'article' } }); expect(request.data.user.ext).to.deep.equal({ data: { registered: true } }); expect(request.data.slots[0].ext).to.deep.equal({ diff --git a/test/spec/modules/enrichmentFpdModule_spec.js b/test/spec/modules/enrichmentFpdModule_spec.js index 3184349cdf7..41340372d4e 100644 --- a/test/spec/modules/enrichmentFpdModule_spec.js +++ b/test/spec/modules/enrichmentFpdModule_spec.js @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { getRefererInfo } from 'src/refererDetection.js'; -import { initSubmodule, coreStorage } from 'modules/enrichmentFpdModule.js'; +import { processFpd, coreStorage } from 'modules/enrichmentFpdModule.js'; describe('the first party data enrichment module', function() { let width; @@ -52,7 +52,7 @@ describe('the first party data enrichment module', function() { width = 800; height = 500; - let validated = initSubmodule({}, {}); + let validated = processFpd({}, {}).global; expect(validated.site.ref).to.equal(getRefererInfo().referer); expect(validated.site.page).to.be.undefined; @@ -66,7 +66,7 @@ describe('the first party data enrichment module', function() { height = 500; canonical.href = 'https://www.subdomain.domain.co.uk/path?query=12345'; - let validated = initSubmodule({}, {}); + let validated = processFpd({}, {}).global; expect(validated.site.ref).to.equal(getRefererInfo().referer); expect(validated.site.page).to.equal('https://www.subdomain.domain.co.uk/path?query=12345'); @@ -81,7 +81,7 @@ describe('the first party data enrichment module', function() { height = 500; keywords.content = 'value1,value2,value3'; - let validated = initSubmodule({}, {}); + let validated = processFpd({}, {}).global; expect(validated.site.ref).to.equal(getRefererInfo().referer); expect(validated.site.page).to.be.undefined; @@ -94,7 +94,7 @@ describe('the first party data enrichment module', function() { width = 800; height = 500; - let validated = initSubmodule({}, {device: {w: 1200, h: 700}, site: {ref: 'https://someUrl.com', page: 'test.com'}}); + let validated = processFpd({}, {global: {device: {w: 1200, h: 700}, site: {ref: 'https://someUrl.com', page: 'test.com'}}}).global; expect(validated.site.ref).to.equal('https://someUrl.com'); expect(validated.site.page).to.equal('test.com'); diff --git a/test/spec/modules/fpdModule_spec.js b/test/spec/modules/fpdModule_spec.js index c2a6c41835e..4c80a8bb692 100644 --- a/test/spec/modules/fpdModule_spec.js +++ b/test/spec/modules/fpdModule_spec.js @@ -1,78 +1,14 @@ import {expect} from 'chai'; -import * as utils from 'src/utils.js'; import {config} from 'src/config.js'; import {getRefererInfo} from 'src/refererDetection.js'; -import {init, registerSubmodules} from 'modules/fpdModule/index.js'; +import {processFpd, registerSubmodules} from 'modules/fpdModule/index.js'; import * as enrichmentModule from 'modules/enrichmentFpdModule.js'; import * as validationModule from 'modules/validationFpdModule/index.js'; -let enrichments = { - name: 'enrichments', - queue: 2, - init: enrichmentModule.initSubmodule -}; -let validations = { - name: 'validations', - queue: 1, - init: validationModule.initSubmodule -}; +let enrichments = {...enrichmentModule}; +let validations = {...validationModule}; describe('the first party data module', function () { - let ortb2 = { - device: { - h: 911, - w: 1733 - }, - user: { - data: [{ - segment: [{ - id: 'foo' - }], - name: 'bar', - ext: 'string' - }] - }, - site: { - content: { - data: [{ - segment: [{ - id: 'test' - }], - name: 'content', - ext: { - foo: 'bar' - } - }] - } - } - }; - - let conf = { - device: { - h: 500, - w: 750 - }, - user: { - keywords: 'test1, test2', - gender: 'f', - data: [{ - segment: [{ - id: 'test' - }], - name: 'alt' - }] - }, - site: { - ref: 'domain.com', - page: 'www.domain.com/test', - ext: { - data: { - inventory: ['first'] - } - } - } - }; - afterEach(function () { config.resetConfig(); }); @@ -124,9 +60,8 @@ describe('the first party data module', function () { width = 1120; height = 750; - init(); + ({global: validated} = processFpd()); - validated = config.getConfig('ortb2'); expect(validated.site.ref).to.equal(getRefererInfo().referer); expect(validated.site.page).to.be.undefined; expect(validated.site.domain).to.be.undefined; @@ -139,9 +74,7 @@ describe('the first party data module', function () { canonical.href = 'https://www.domain.com/path?query=12345'; - init(); - - validated = config.getConfig('ortb2'); + ({global: validated} = processFpd()); expect(validated.site.ref).to.equal(getRefererInfo().referer); expect(validated.site.page).to.equal('https://www.domain.com/path?query=12345'); expect(validated.site.domain).to.equal('domain.com'); @@ -154,9 +87,7 @@ describe('the first party data module', function () { keywords.content = 'value1,value2,value3'; - init(); - - validated = config.getConfig('ortb2'); + ({global: validated} = processFpd()); expect(validated.site.ref).to.equal(getRefererInfo().referer); expect(validated.site.page).to.be.undefined; expect(validated.site.domain).to.be.undefined; @@ -167,11 +98,9 @@ describe('the first party data module', function () { it('only sets values that do not exist in ortb2 config', function () { let validated; - config.setConfig({ortb2: {site: {ref: 'https://testpage.com', domain: 'newDomain.com'}}}); + const global = {site: {ref: 'https://testpage.com', domain: 'newDomain.com'}}; - init(); - - validated = config.getConfig('ortb2'); + ({global: validated} = processFpd({global})); expect(validated.site.ref).to.equal('https://testpage.com'); expect(validated.site.page).to.be.undefined; expect(validated.site.domain).to.equal('newDomain.com'); @@ -181,45 +110,40 @@ describe('the first party data module', function () { it('filters ortb2 data that is set', function () { let validated; - let conf = { - ortb2: { - user: { - data: {}, - gender: 'f', - age: 45 - }, - site: { - content: { - data: [{ - segment: { - test: 1 - }, - name: 'foo' + const global = { + user: { + data: {}, + gender: 'f', + age: 45 + }, + site: { + content: { + data: [{ + segment: { + test: 1 + }, + name: 'foo' + }, { + segment: [{ + id: 'test' }, { - segment: [{ - id: 'test' - }, { - id: 3 - }], - name: 'bar' - }] - } - }, - device: { - w: 1, - h: 1 + id: 3 + }], + name: 'bar' + }] } + }, + device: { + w: 1, + h: 1 } }; - config.setConfig(conf); canonical.href = 'https://www.domain.com/path?query=12345'; width = 1120; height = 750; - init(); - - validated = config.getConfig('ortb2'); + ({global: validated} = processFpd({global})); expect(validated.site.ref).to.equal(getRefererInfo().referer); expect(validated.site.page).to.equal('https://www.domain.com/path?query=12345'); expect(validated.site.domain).to.equal('domain.com'); @@ -231,43 +155,31 @@ describe('the first party data module', function () { it('should not overwrite existing data with default settings', function () { let validated; - let conf = { - ortb2: { - site: { - ref: 'https://referer.com' - } + const global = { + site: { + ref: 'https://referer.com' } }; - config.setConfig(conf); - - init(); - - validated = config.getConfig('ortb2'); + ({global: validated} = processFpd({global})); expect(validated.site.ref).to.equal('https://referer.com'); }); it('should allow overwrite default data with setConfig', function () { let validated; - let conf = { - ortb2: { - site: { - ref: 'https://referer.com' - } + const global = { + site: { + ref: 'https://referer.com' } }; - config.setConfig(conf); - - init(); - - validated = config.getConfig('ortb2'); + ({global: validated} = processFpd({global})); expect(validated.site.ref).to.equal('https://referer.com'); }); it('should filter all data', function () { let validated; - let conf = { + let global = { imp: [], site: { name: 123, @@ -300,17 +212,13 @@ describe('the first party data module', function () { config.setConfig({'firstPartyData': {skipEnrichments: true}}); - config.setConfig({ortb2: conf}); - - init(); - - validated = config.getConfig('ortb2'); + ({global: validated} = processFpd({global})); expect(validated).to.deep.equal({}); }); it('should add enrichments but not alter any arbitrary ortb2 data', function () { let validated; - let conf = { + let global = { site: { ext: { data: { @@ -328,11 +236,7 @@ describe('the first party data module', function () { cur: ['USD'] }; - config.setConfig({ortb2: conf}); - - init(); - - validated = config.getConfig('ortb2'); + ({global: validated} = processFpd({global})); expect(validated.site.ref).to.equal(getRefererInfo().referer); expect(validated.site.ext.data).to.deep.equal({inventory: ['value1']}); expect(validated.user.ext.data).to.deep.equal({visitor: ['value2']}); @@ -340,76 +244,61 @@ describe('the first party data module', function () { }); it('should filter bidderConfig data', function () { - let validated; - let conf = { - bidders: ['bidderA', 'bidderB'], - config: { - ortb2: { - site: { - keywords: 'other', - ref: 'https://domain.com' - }, - user: { - keywords: 'test', - data: [{ - segment: [{id: 4}], - name: 't' - }] - } + let bidder = { + bidderA: { + site: { + keywords: 'other', + ref: 'https://domain.com' + }, + user: { + keywords: 'test', + data: [{ + segment: [{id: 4}], + name: 't' + }] } } }; - config.setBidderConfig(conf); - - init(); - - validated = config.getBidderConfig(); - expect(validated.bidderA.ortb2).to.not.be.undefined; - expect(validated.bidderA.ortb2.user.data).to.be.undefined; - expect(validated.bidderA.ortb2.user.keywords).to.equal('test'); - expect(validated.bidderA.ortb2.site.keywords).to.equal('other'); - expect(validated.bidderA.ortb2.site.ref).to.equal('https://domain.com'); + const {bidder: validated} = processFpd({bidder}); + expect(validated.bidderA).to.not.be.undefined; + expect(validated.bidderA.user.data).to.be.undefined; + expect(validated.bidderA.user.keywords).to.equal('test'); + expect(validated.bidderA.site.keywords).to.equal('other'); + expect(validated.bidderA.site.ref).to.equal('https://domain.com'); }); it('should not filter bidderConfig data as it is valid', function () { - let validated; - let conf = { - bidders: ['bidderA', 'bidderB'], - config: { - ortb2: { - site: { - keywords: 'other', - ref: 'https://domain.com' - }, - user: { - keywords: 'test', - data: [{ - segment: [{id: 'data1_id'}], - name: 'data1' - }] - } + let bidder = { + bidderA: { + site: { + keywords: 'other', + ref: 'https://domain.com' + }, + user: { + keywords: 'test', + data: [{ + segment: [{id: 'data1_id'}], + name: 'data1' + }] } } }; - config.setBidderConfig(conf); - - init(); + const {bidder: validated} = processFpd({bidder}); - validated = config.getBidderConfig(); - expect(validated.bidderA.ortb2).to.not.be.undefined; - expect(validated.bidderA.ortb2.user.data).to.deep.equal([{segment: [{id: 'data1_id'}], name: 'data1'}]); - expect(validated.bidderA.ortb2.user.keywords).to.equal('test'); - expect(validated.bidderA.ortb2.site.keywords).to.equal('other'); - expect(validated.bidderA.ortb2.site.ref).to.equal('https://domain.com'); + expect(validated.bidderA).to.not.be.undefined; + expect(validated.bidderA.user.data).to.deep.equal([{segment: [{id: 'data1_id'}], name: 'data1'}]); + expect(validated.bidderA.user.keywords).to.equal('test'); + expect(validated.bidderA.site.keywords).to.equal('other'); + expect(validated.bidderA.site.ref).to.equal('https://domain.com'); }); it('should not set default values if skipEnrichments is turned on', function () { let validated; config.setConfig({'firstPartyData': {skipEnrichments: true}}); - let conf = { + let global = { site: { keywords: 'other' }, @@ -420,26 +309,20 @@ describe('the first party data module', function () { name: 'data1' }] } - } - ; - - config.setConfig({ortb2: conf}); - - init(); + }; - validated = config.getConfig(); - expect(validated.ortb2).to.not.be.undefined; - expect(validated.ortb2.device).to.be.undefined; - expect(validated.ortb2.site.ref).to.be.undefined; - expect(validated.ortb2.site.page).to.be.undefined; - expect(validated.ortb2.site.domain).to.be.undefined; + ({global: validated} = processFpd({global})); + expect(validated.device).to.be.undefined; + expect(validated.site.ref).to.be.undefined; + expect(validated.site.page).to.be.undefined; + expect(validated.site.domain).to.be.undefined; }); it('should not validate ortb2 data if skipValidations is turned on', function () { let validated; config.setConfig({'firstPartyData': {skipValidations: true}}); - let conf = { + let global = { site: { keywords: 'other' }, @@ -449,16 +332,10 @@ describe('the first party data module', function () { segment: [{id: 'nonfiltered'}] }] } - } - ; - - config.setConfig({ortb2: conf}); - - init(); + }; - validated = config.getConfig(); - expect(validated.ortb2).to.not.be.undefined; - expect(validated.ortb2.user.data).to.deep.equal([{segment: [{id: 'nonfiltered'}]}]); + ({global: validated} = processFpd({global})); + expect(validated.user.data).to.deep.equal([{segment: [{id: 'nonfiltered'}]}]); }); }); }); diff --git a/test/spec/modules/glimpseBidAdapter_spec.js b/test/spec/modules/glimpseBidAdapter_spec.js index 7104493792f..72d9d230e9e 100644 --- a/test/spec/modules/glimpseBidAdapter_spec.js +++ b/test/spec/modules/glimpseBidAdapter_spec.js @@ -273,16 +273,11 @@ describe('GlimpseProtocolAdapter', () => { }, }; - afterEach(() => { - config.getConfig.restore(); - }); - it('should keep all non-empty fields', () => { const fpdMock = fpdMockBase; - sinon.stub(config, 'getConfig').withArgs('ortb2').returns(fpdMock); const expected = fpdMockBase; - const request = spec.buildRequests(bidRequests, bidderRequest); + const request = spec.buildRequests(bidRequests, {...bidderRequest, ortb2: fpdMock}); const payload = JSON.parse(request.data); const fpd = payload.data.fpd; @@ -293,7 +288,6 @@ describe('GlimpseProtocolAdapter', () => { const fpdMock = getDeepCopy(fpdMockBase); fpdMock.site.ext.data.fpdProvider.dataObject = {}; fpdMock.user.ext.data.fpdProvider = {}; - sinon.stub(config, 'getConfig').withArgs('ortb2').returns(fpdMock); const expected = { site: { @@ -312,7 +306,7 @@ describe('GlimpseProtocolAdapter', () => { }, }; - const request = spec.buildRequests(bidRequests, bidderRequest); + const request = spec.buildRequests(bidRequests, {...bidderRequest, ortb2: fpdMock}); const payload = JSON.parse(request.data); const fpd = payload.data.fpd; @@ -323,7 +317,6 @@ describe('GlimpseProtocolAdapter', () => { const fpdMock = getDeepCopy(fpdMockBase); fpdMock.site.ext.data.fpdProvider.dataArray = []; fpdMock.user.ext.data.fpdProvider.dataArray = []; - sinon.stub(config, 'getConfig').withArgs('ortb2').returns(fpdMock); const expected = { site: { @@ -356,7 +349,7 @@ describe('GlimpseProtocolAdapter', () => { }, }; - const request = spec.buildRequests(bidRequests, bidderRequest); + const request = spec.buildRequests(bidRequests, {...bidderRequest, ortb2: fpdMock}); const payload = JSON.parse(request.data); const fpd = payload.data.fpd; @@ -369,7 +362,6 @@ describe('GlimpseProtocolAdapter', () => { fpdMock.site.ext.data.fpdProvider.dataString = ''; fpdMock.user.keywords = ''; fpdMock.user.ext.data.fpdProvider.dataString = ''; - sinon.stub(config, 'getConfig').withArgs('ortb2').returns(fpdMock); const expected = { site: { @@ -400,7 +392,7 @@ describe('GlimpseProtocolAdapter', () => { }, }; - const request = spec.buildRequests(bidRequests, bidderRequest); + const request = spec.buildRequests(bidRequests, {...bidderRequest, ortb2: fpdMock}); const payload = JSON.parse(request.data); const fpd = payload.data.fpd; @@ -417,11 +409,10 @@ describe('GlimpseProtocolAdapter', () => { fpdMock.user.ext.data.fpdProvider.dataArray = []; fpdMock.user.ext.data.fpdProvider.dataObject = {}; fpdMock.user.ext.data.fpdProvider.dataString = ''; - sinon.stub(config, 'getConfig').withArgs('ortb2').returns(fpdMock); const expected = {}; - const request = spec.buildRequests(bidRequests, bidderRequest); + const request = spec.buildRequests(bidRequests, {...bidderRequest, ortb2: fpdMock}); const payload = JSON.parse(request.data); const fpd = payload.data.fpd; diff --git a/test/spec/modules/gridBidAdapter_spec.js b/test/spec/modules/gridBidAdapter_spec.js index 9e393a5823d..625056ad29a 100644 --- a/test/spec/modules/gridBidAdapter_spec.js +++ b/test/spec/modules/gridBidAdapter_spec.js @@ -126,14 +126,10 @@ describe('TheMediaGrid Adapter', function () { genre: 'Adventure' } }; - - const getConfigStub = sinon.stub(config, 'getConfig').callsFake( - arg => arg === 'ortb2.site' ? site : null); - const request = spec.buildRequests([bidRequests[0]], bidderRequest); + const request = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2: {site}}); const payload = parseRequest(request.data); expect(payload.site.cat).to.deep.equal([...site.cat, ...site.pagecat]); expect(payload.site.content.genre).to.deep.equal(site.content.genre); - getConfigStub.restore(); }); it('should attach valid params to the tag', function () { @@ -405,16 +401,14 @@ describe('TheMediaGrid Adapter', function () { screenHeight: 800, language: 'ru' }; - const getConfigStub = sinon.stub(config, 'getConfig').callsFake( - arg => arg === 'ortb2.user.ext.device' ? ortb2UserExtDevice : null); + const ortb2 = {user: {ext: {device: ortb2UserExtDevice}}}; - const request = spec.buildRequests(bidRequests, bidderRequest); + const request = spec.buildRequests(bidRequests, {...bidderRequest, ortb2}); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload).to.have.property('user'); expect(payload.user).to.have.property('ext'); expect(payload.user.ext.device).to.deep.equal(ortb2UserExtDevice); - getConfigStub.restore(); }); it('if schain is present payload must have source.ext.schain param', function () { @@ -473,8 +467,10 @@ describe('TheMediaGrid Adapter', function () { }); it('should contain the keyword values if it present in ortb2.(site/user)', function () { - const getConfigStub = sinon.stub(config, 'getConfig').callsFake( - arg => arg === 'ortb2.user' ? {'keywords': 'foo,any'} : (arg === 'ortb2.site' ? {'keywords': 'bar'} : null)); + const ortb2 = { + user: {'keywords': 'foo,any'}, + site: {'keywords': 'bar'} + }; const keywords = { 'site': { 'somePublisher': [ @@ -498,7 +494,7 @@ describe('TheMediaGrid Adapter', function () { } }; const bidRequestWithKW = { ...bidRequests[0], params: { ...bidRequests[0].params, keywords } } - const request = spec.buildRequests([bidRequestWithKW], bidderRequest); + const request = spec.buildRequests([bidRequestWithKW], {...bidderRequest, ortb2}); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload.ext.keywords).to.deep.equal({ @@ -543,7 +539,6 @@ describe('TheMediaGrid Adapter', function () { ] } }); - getConfigStub.restore(); }); it('should have user.data filled from config ortb2.user.data', function () { @@ -560,13 +555,10 @@ describe('TheMediaGrid Adapter', function () { someKey: 'another data' } ]; - - const getConfigStub = sinon.stub(config, 'getConfig').callsFake( - arg => arg === 'ortb2.user.data' ? userData : null); - const request = spec.buildRequests([bidRequests[0]], bidderRequest); + const ortb2 = {user: {data: userData}}; + const request = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2}); const payload = parseRequest(request.data); expect(payload.user.data).to.deep.equal(userData); - getConfigStub.restore(); }); it('should have right value in user.data when jwpsegments are present', function () { @@ -583,8 +575,7 @@ describe('TheMediaGrid Adapter', function () { someKey: 'another data' } ]; - const getConfigStub = sinon.stub(config, 'getConfig').callsFake( - arg => arg === 'ortb2.user.data' ? userData : null); + const ortb2 = {user: {data: userData}}; const jsContent = {id: 'test_jw_content_id'}; const jsSegments = ['test_seg_1', 'test_seg_2']; @@ -598,7 +589,7 @@ describe('TheMediaGrid Adapter', function () { } } }); - const request = spec.buildRequests([bidRequestsWithJwTargeting], bidderRequest); + const request = spec.buildRequests([bidRequestsWithJwTargeting], {...bidderRequest, ortb2}); const payload = parseRequest(request.data); expect(payload.user.data).to.deep.equal([{ name: 'iow_labs_pub_data', @@ -607,7 +598,6 @@ describe('TheMediaGrid Adapter', function () { {name: 'jwpseg', value: jsSegments[1]} ] }, ...userData]); - getConfigStub.restore(); }); it('should be right tmax when timeout in config is less then timeout in bidderRequest', function() { diff --git a/test/spec/modules/hadronRtdProvider_spec.js b/test/spec/modules/hadronRtdProvider_spec.js index 30e4947566f..b9e07c97f84 100644 --- a/test/spec/modules/hadronRtdProvider_spec.js +++ b/test/spec/modules/hadronRtdProvider_spec.js @@ -1,3 +1,5 @@ +// TODO: this and hadronRtdProvider_spec are a copy-paste of each other + import {config} from 'src/config.js'; import {HALOID_LOCAL_NAME, RTD_LOCAL_NAME, addRealTimeData, getRealTimeData, hadronSubmodule, storage} from 'modules/hadronRtdProvider.js'; import {server} from 'test/mocks/xhr.js'; @@ -25,7 +27,6 @@ describe('hadronRtdProvider', function() { describe('Add Real-Time Data', function() { it('merges ortb2 data', function() { let rtdConfig = {}; - let bidConfig = {}; const setConfigUserObj1 = { name: 'www.dataprovider1.com', @@ -58,18 +59,20 @@ describe('hadronRtdProvider', function() { ] } - config.setConfig({ - ortb2: { - user: { - data: [setConfigUserObj1, setConfigUserObj2] - }, - site: { - content: { - data: [setConfigSiteObj1] + let bidConfig = { + ortb2Fragments: { + global: { + user: { + data: [setConfigUserObj1, setConfigUserObj2] + }, + site: { + content: { + data: [setConfigSiteObj1] + } } } } - }); + }; const rtdUserObj1 = { name: 'www.dataprovider4.com', @@ -116,7 +119,7 @@ describe('hadronRtdProvider', function() { addRealTimeData(bidConfig, rtd, rtdConfig); - let ortb2Config = config.getConfig().ortb2; + let ortb2Config = bidConfig.ortb2Fragments.global; expect(ortb2Config.user.data).to.deep.include.members([setConfigUserObj1, setConfigUserObj2, rtdUserObj1]); expect(ortb2Config.site.content.data).to.deep.include.members([setConfigSiteObj1, rtdSiteObj1]); @@ -124,7 +127,6 @@ describe('hadronRtdProvider', function() { it('merges ortb2 data without duplication', function() { let rtdConfig = {}; - let bidConfig = {}; const userObj1 = { name: 'www.dataprovider1.com', @@ -157,18 +159,20 @@ describe('hadronRtdProvider', function() { ] } - config.setConfig({ - ortb2: { - user: { - data: [userObj1, userObj2] - }, - site: { - content: { - data: [siteObj1] + let bidConfig = { + ortb2Fragments: { + global: { + user: { + data: [userObj1, userObj2] + }, + site: { + content: { + data: [siteObj1] + } } } } - }); + }; const rtd = { ortb2: { @@ -185,7 +189,7 @@ describe('hadronRtdProvider', function() { addRealTimeData(bidConfig, rtd, rtdConfig); - let ortb2Config = config.getConfig().ortb2; + let ortb2Config = bidConfig.ortb2Fragments.global; expect(ortb2Config.user.data).to.deep.include.members([userObj1, userObj2]); expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1]); @@ -195,7 +199,6 @@ describe('hadronRtdProvider', function() { it('merges bidder-specific ortb2 data', function() { let rtdConfig = {}; - let bidConfig = {}; const configUserObj1 = { name: 'www.dataprovider1.com', @@ -248,37 +251,32 @@ describe('hadronRtdProvider', function() { ] }; - config.setBidderConfig({ - bidders: ['adbuzz'], - config: { - ortb2: { - user: { - data: [configUserObj1, configUserObj2] - }, - site: { - content: { - data: [configSiteObj1] + let bidConfig = { + ortb2Fragments: { + bidder: { + adbuzz: { + user: { + data: [configUserObj1, configUserObj2] + }, + site: { + content: { + data: [configSiteObj1] + } } - } - } - } - }); - - config.setBidderConfig({ - bidders: ['pubvisage'], - config: { - ortb2: { - user: { - data: [configUserObj3] }, - site: { - content: { - data: [configSiteObj2] + pubvisage: { + user: { + data: [configUserObj3] + }, + site: { + content: { + data: [configSiteObj2] + } } } } } - }); + }; const rtdUserObj1 = { name: 'www.dataprovider4.com', @@ -365,12 +363,12 @@ describe('hadronRtdProvider', function() { addRealTimeData(bidConfig, rtd, rtdConfig); - let ortb2Config = config.getBidderConfig().adbuzz.ortb2; + let ortb2Config = bidConfig.ortb2Fragments.bidder.adbuzz; expect(ortb2Config.user.data).to.deep.include.members([configUserObj1, configUserObj2, rtdUserObj1]); expect(ortb2Config.site.content.data).to.deep.include.members([configSiteObj1, rtdSiteObj1]); - ortb2Config = config.getBidderConfig().pubvisage.ortb2; + ortb2Config = bidConfig.ortb2Fragments.bidder.pubvisage; expect(ortb2Config.user.data).to.deep.include.members([configUserObj3, rtdUserObj2]); expect(ortb2Config.site.content.data).to.deep.include.members([configSiteObj2, rtdSiteObj2]); @@ -378,7 +376,6 @@ describe('hadronRtdProvider', function() { it('merges bidder-specific ortb2 data without duplication', function() { let rtdConfig = {}; - let bidConfig = {}; const userObj1 = { name: 'www.dataprovider1.com', @@ -431,37 +428,32 @@ describe('hadronRtdProvider', function() { ] }; - config.setBidderConfig({ - bidders: ['adbuzz'], - config: { - ortb2: { - user: { - data: [userObj1, userObj2] - }, - site: { - content: { - data: [siteObj1] + let bidConfig = { + ortb2Fragments: { + bidder: { + adbuzz: { + user: { + data: [userObj1, userObj2] + }, + site: { + content: { + data: [siteObj1] + } } - } - } - } - }); - - config.setBidderConfig({ - bidders: ['pubvisage'], - config: { - ortb2: { - user: { - data: [userObj3] }, - site: { - content: { - data: [siteObj2] + pubvisage: { + user: { + data: [userObj3] + }, + site: { + content: { + data: [siteObj2] + } } } } } - }); + }; const rtd = { ortb2b: { @@ -494,7 +486,7 @@ describe('hadronRtdProvider', function() { addRealTimeData(bidConfig, rtd, rtdConfig); - let ortb2Config = config.getBidderConfig().adbuzz.ortb2; + let ortb2Config = bidConfig.ortb2Fragments.bidder.adbuzz; expect(ortb2Config.user.data).to.deep.include.members([userObj1]); expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1]); @@ -502,7 +494,7 @@ describe('hadronRtdProvider', function() { expect(ortb2Config.user.data).to.have.lengthOf(2); expect(ortb2Config.site.content.data).to.have.lengthOf(1); - ortb2Config = config.getBidderConfig().pubvisage.ortb2; + ortb2Config = bidConfig.ortb2Fragments.bidder.pubvisage; expect(ortb2Config.user.data).to.deep.include.members([userObj3, userObj3]); expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1, siteObj2]); @@ -647,7 +639,7 @@ describe('hadronRtdProvider', function() { } }; - const bidConfig = {}; + const bidConfig = {ortb2Fragments: {global: {}}}; const rtdUserObj1 = { name: 'www.dataprovider3.com', @@ -676,9 +668,8 @@ describe('hadronRtdProvider', function() { getDataFromLocalStorageStub.withArgs(RTD_LOCAL_NAME).returns(JSON.stringify(cachedRtd)); - expect(config.getConfig().ortb2).to.be.undefined; getRealTimeData(bidConfig, () => {}, rtdConfig, {}); - expect(config.getConfig().ortb2.user.data).to.deep.include.members([rtdUserObj1]); + expect(bidConfig.ortb2Fragments.global.user.data).to.deep.include.members([rtdUserObj1]); }); it('gets real-time data via async request', function() { @@ -698,16 +689,6 @@ describe('hadronRtdProvider', function() { ] } - config.setConfig({ - ortb2: { - site: { - content: { - data: [setConfigSiteObj1] - } - } - } - }); - const rtdConfig = { params: { segmentCache: false, @@ -718,7 +699,17 @@ describe('hadronRtdProvider', function() { } }; - let bidConfig = {}; + let bidConfig = { + ortb2Fragments: { + global: { + site: { + content: { + data: [setConfigSiteObj1] + } + } + } + } + }; const rtdUserObj1 = { name: 'www.audigent.com', @@ -756,7 +747,7 @@ describe('hadronRtdProvider', function() { request.respond(200, responseHeader, JSON.stringify(data)); - expect(config.getConfig().ortb2.user.data).to.deep.include.members([rtdUserObj1]); + expect(bidConfig.ortb2Fragments.global.user.data).to.deep.include.members([rtdUserObj1]); }); }); }); diff --git a/test/spec/modules/haloRtdProvider_spec.js b/test/spec/modules/haloRtdProvider_spec.js index 32c0338b87f..fe516e9661e 100644 --- a/test/spec/modules/haloRtdProvider_spec.js +++ b/test/spec/modules/haloRtdProvider_spec.js @@ -1,3 +1,5 @@ +// TODO: this and haloRtdProvider_spec are a copy-paste of each other + import {config} from 'src/config.js'; import {HALOID_LOCAL_NAME, RTD_LOCAL_NAME, addRealTimeData, getRealTimeData, haloSubmodule, storage} from 'modules/haloRtdProvider.js'; import {server} from 'test/mocks/xhr.js'; @@ -18,14 +20,13 @@ describe('haloRtdProvider', function() { describe('haloSubmodule', function() { it('successfully instantiates', function () { - expect(haloSubmodule.init()).to.equal(true); + expect(haloSubmodule.init()).to.equal(true); }); }); describe('Add Real-Time Data', function() { it('merges ortb2 data', function() { let rtdConfig = {}; - let bidConfig = {}; const setConfigUserObj1 = { name: 'www.dataprovider1.com', @@ -58,18 +59,20 @@ describe('haloRtdProvider', function() { ] } - config.setConfig({ - ortb2: { - user: { - data: [setConfigUserObj1, setConfigUserObj2] - }, - site: { - content: { - data: [setConfigSiteObj1] + let bidConfig = { + ortb2Fragments: { + global: { + user: { + data: [setConfigUserObj1, setConfigUserObj2] + }, + site: { + content: { + data: [setConfigSiteObj1] + } } } } - }); + }; const rtdUserObj1 = { name: 'www.dataprovider4.com', @@ -116,7 +119,7 @@ describe('haloRtdProvider', function() { addRealTimeData(bidConfig, rtd, rtdConfig); - let ortb2Config = config.getConfig().ortb2; + let ortb2Config = bidConfig.ortb2Fragments.global; expect(ortb2Config.user.data).to.deep.include.members([setConfigUserObj1, setConfigUserObj2, rtdUserObj1]); expect(ortb2Config.site.content.data).to.deep.include.members([setConfigSiteObj1, rtdSiteObj1]); @@ -124,7 +127,6 @@ describe('haloRtdProvider', function() { it('merges ortb2 data without duplication', function() { let rtdConfig = {}; - let bidConfig = {}; const userObj1 = { name: 'www.dataprovider1.com', @@ -157,18 +159,20 @@ describe('haloRtdProvider', function() { ] } - config.setConfig({ - ortb2: { - user: { - data: [userObj1, userObj2] - }, - site: { - content: { - data: [siteObj1] + let bidConfig = { + ortb2Fragments: { + global: { + user: { + data: [userObj1, userObj2] + }, + site: { + content: { + data: [siteObj1] + } } } } - }); + }; const rtd = { ortb2: { @@ -185,7 +189,7 @@ describe('haloRtdProvider', function() { addRealTimeData(bidConfig, rtd, rtdConfig); - let ortb2Config = config.getConfig().ortb2; + let ortb2Config = bidConfig.ortb2Fragments.global; expect(ortb2Config.user.data).to.deep.include.members([userObj1, userObj2]); expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1]); @@ -195,7 +199,6 @@ describe('haloRtdProvider', function() { it('merges bidder-specific ortb2 data', function() { let rtdConfig = {}; - let bidConfig = {}; const configUserObj1 = { name: 'www.dataprovider1.com', @@ -248,37 +251,32 @@ describe('haloRtdProvider', function() { ] }; - config.setBidderConfig({ - bidders: ['adbuzz'], - config: { - ortb2: { - user: { - data: [configUserObj1, configUserObj2] - }, - site: { - content: { - data: [configSiteObj1] + let bidConfig = { + ortb2Fragments: { + bidder: { + adbuzz: { + user: { + data: [configUserObj1, configUserObj2] + }, + site: { + content: { + data: [configSiteObj1] + } } - } - } - } - }); - - config.setBidderConfig({ - bidders: ['pubvisage'], - config: { - ortb2: { - user: { - data: [configUserObj3] }, - site: { - content: { - data: [configSiteObj2] + pubvisage: { + user: { + data: [configUserObj3] + }, + site: { + content: { + data: [configSiteObj2] + } } } } } - }); + }; const rtdUserObj1 = { name: 'www.dataprovider4.com', @@ -365,12 +363,12 @@ describe('haloRtdProvider', function() { addRealTimeData(bidConfig, rtd, rtdConfig); - let ortb2Config = config.getBidderConfig().adbuzz.ortb2; + let ortb2Config = bidConfig.ortb2Fragments.bidder.adbuzz; expect(ortb2Config.user.data).to.deep.include.members([configUserObj1, configUserObj2, rtdUserObj1]); expect(ortb2Config.site.content.data).to.deep.include.members([configSiteObj1, rtdSiteObj1]); - ortb2Config = config.getBidderConfig().pubvisage.ortb2; + ortb2Config = bidConfig.ortb2Fragments.bidder.pubvisage; expect(ortb2Config.user.data).to.deep.include.members([configUserObj3, rtdUserObj2]); expect(ortb2Config.site.content.data).to.deep.include.members([configSiteObj2, rtdSiteObj2]); @@ -378,7 +376,6 @@ describe('haloRtdProvider', function() { it('merges bidder-specific ortb2 data without duplication', function() { let rtdConfig = {}; - let bidConfig = {}; const userObj1 = { name: 'www.dataprovider1.com', @@ -431,37 +428,32 @@ describe('haloRtdProvider', function() { ] }; - config.setBidderConfig({ - bidders: ['adbuzz'], - config: { - ortb2: { - user: { - data: [userObj1, userObj2] - }, - site: { - content: { - data: [siteObj1] + let bidConfig = { + ortb2Fragments: { + bidder: { + adbuzz: { + user: { + data: [userObj1, userObj2] + }, + site: { + content: { + data: [siteObj1] + } } - } - } - } - }); - - config.setBidderConfig({ - bidders: ['pubvisage'], - config: { - ortb2: { - user: { - data: [userObj3] }, - site: { - content: { - data: [siteObj2] + pubvisage: { + user: { + data: [userObj3] + }, + site: { + content: { + data: [siteObj2] + } } } } } - }); + }; const rtd = { ortb2b: { @@ -494,7 +486,7 @@ describe('haloRtdProvider', function() { addRealTimeData(bidConfig, rtd, rtdConfig); - let ortb2Config = config.getBidderConfig().adbuzz.ortb2; + let ortb2Config = bidConfig.ortb2Fragments.bidder.adbuzz; expect(ortb2Config.user.data).to.deep.include.members([userObj1]); expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1]); @@ -502,7 +494,7 @@ describe('haloRtdProvider', function() { expect(ortb2Config.user.data).to.have.lengthOf(2); expect(ortb2Config.site.content.data).to.have.lengthOf(1); - ortb2Config = config.getBidderConfig().pubvisage.ortb2; + ortb2Config = bidConfig.ortb2Fragments.bidder.pubvisage; expect(ortb2Config.user.data).to.deep.include.members([userObj3, userObj3]); expect(ortb2Config.site.content.data).to.deep.include.members([siteObj1, siteObj2]); @@ -647,7 +639,7 @@ describe('haloRtdProvider', function() { } }; - const bidConfig = {}; + const bidConfig = {ortb2Fragments: {global: {}}}; const rtdUserObj1 = { name: 'www.dataprovider3.com', @@ -676,9 +668,8 @@ describe('haloRtdProvider', function() { getDataFromLocalStorageStub.withArgs(RTD_LOCAL_NAME).returns(JSON.stringify(cachedRtd)); - expect(config.getConfig().ortb2).to.be.undefined; getRealTimeData(bidConfig, () => {}, rtdConfig, {}); - expect(config.getConfig().ortb2.user.data).to.deep.include.members([rtdUserObj1]); + expect(bidConfig.ortb2Fragments.global.user.data).to.deep.include.members([rtdUserObj1]); }); it('gets real-time data via async request', function() { @@ -698,27 +689,27 @@ describe('haloRtdProvider', function() { ] } - config.setConfig({ - ortb2: { - site: { - content: { - data: [setConfigSiteObj1] - } - } - } - }); - const rtdConfig = { params: { segmentCache: false, - usePubHalo: true, + usePubhalo: true, requestParams: { publisherId: 'testPub1' } } }; - let bidConfig = {}; + let bidConfig = { + ortb2Fragments: { + global: { + site: { + content: { + data: [setConfigSiteObj1] + } + } + } + } + }; const rtdUserObj1 = { name: 'www.audigent.com', @@ -746,17 +737,17 @@ describe('haloRtdProvider', function() { } }; - getDataFromLocalStorageStub.withArgs(HALOID_LOCAL_NAME).returns('testHaloId1'); + getDataFromLocalStorageStub.withArgs(HALOID_LOCAL_NAME).returns('testhaloId1'); getRealTimeData(bidConfig, () => {}, rtdConfig, {}); let request = server.requests[0]; let postData = JSON.parse(request.requestBody); expect(postData.config).to.have.deep.property('publisherId', 'testPub1'); - expect(postData.userIds).to.have.deep.property('haloId', 'testHaloId1'); + expect(postData.userIds).to.have.deep.property('haloId', 'testhaloId1'); request.respond(200, responseHeader, JSON.stringify(data)); - expect(config.getConfig().ortb2.user.data).to.deep.include.members([rtdUserObj1]); + expect(bidConfig.ortb2Fragments.global.user.data).to.deep.include.members([rtdUserObj1]); }); }); }); diff --git a/test/spec/modules/idWardRtdProvider_spec.js b/test/spec/modules/idWardRtdProvider_spec.js index 949365baec6..924a3794c7b 100644 --- a/test/spec/modules/idWardRtdProvider_spec.js +++ b/test/spec/modules/idWardRtdProvider_spec.js @@ -45,7 +45,11 @@ describe('idWardRtdProvider', function() { } }; - const bidConfig = {}; + const bidConfig = { + ortb2Fragments: { + global: {} + } + }; const rtdUserObj1 = { name: 'id-ward.com', @@ -65,9 +69,8 @@ describe('idWardRtdProvider', function() { getDataFromLocalStorageStub.withArgs('cohort_ids') .returns(JSON.stringify(['TCZPQOWPEJG3MJOTUQUF793A', '93SUG3H540WBJMYNT03KX8N3'])); - expect(config.getConfig().ortb2).to.be.undefined; getRealTimeData(bidConfig, () => {}, rtdConfig, {}); - expect(config.getConfig().ortb2.user.data).to.deep.include.members([rtdUserObj1]); + expect(bidConfig.ortb2Fragments.global.user.data).to.deep.include.members([rtdUserObj1]); }); it('do not set rtd if local storage empty', function() { diff --git a/test/spec/modules/improvedigitalBidAdapter_spec.js b/test/spec/modules/improvedigitalBidAdapter_spec.js index d721c2d20bc..8338d869fde 100644 --- a/test/spec/modules/improvedigitalBidAdapter_spec.js +++ b/test/spec/modules/improvedigitalBidAdapter_spec.js @@ -400,7 +400,7 @@ describe('Improve Digital Adapter Tests', function () { skipafter: 30 } bidRequest.params.video = videoTest; - let request = spec.buildRequests([bidRequest])[0]; + let request = spec.buildRequests([bidRequest], {})[0]; let payload = JSON.parse(request.data); expect(payload.imp[0].video.skip).to.equal(1); expect(payload.imp[0].video.skipmin).to.equal(5); @@ -409,7 +409,7 @@ describe('Improve Digital Adapter Tests', function () { // 0 - leave out skipmin and skipafter videoTest.skip = 0; bidRequest.params.video = videoTest; - request = spec.buildRequests([bidRequest])[0]; + request = spec.buildRequests([bidRequest], {})[0]; payload = JSON.parse(request.data); expect(payload.imp[0].video.skip).to.equal(0); expect(payload.imp[0].video.skipmin).to.not.exist; @@ -418,7 +418,7 @@ describe('Improve Digital Adapter Tests', function () { // other videoTest.skip = 'blah'; bidRequest.params.video = videoTest; - request = spec.buildRequests([bidRequest])[0]; + request = spec.buildRequests([bidRequest], {})[0]; payload = JSON.parse(request.data); expect(payload.imp[0].video.skip).to.not.exist; expect(payload.imp[0].video.skipmin).to.not.exist; @@ -436,7 +436,7 @@ describe('Improve Digital Adapter Tests', function () { const videoTestInvParam = Object.assign({}, videoTest); videoTestInvParam.blah = 1; bidRequest.params.video = videoTestInvParam; - let request = spec.buildRequests([bidRequest])[0]; + let request = spec.buildRequests([bidRequest], {})[0]; let payload = JSON.parse(request.data); expect(payload.imp[0].video.blah).not.to.exist; }); @@ -444,7 +444,7 @@ describe('Improve Digital Adapter Tests', function () { it('should set video params for outstream', function() { const bidRequest = JSON.parse(JSON.stringify(outstreamBidRequest)); bidRequest.params.video = videoParams; - const request = spec.buildRequests([bidRequest])[0]; + const request = spec.buildRequests([bidRequest], {})[0]; const payload = JSON.parse(request.data); expect(payload.imp[0].video).to.deep.equal({...{ mimes: ['video/mp4'], @@ -458,7 +458,7 @@ describe('Improve Digital Adapter Tests', function () { it('should set video params for multi-format', function() { const bidRequest = JSON.parse(JSON.stringify(multiFormatBidRequest)); bidRequest.params.video = videoParams; - const request = spec.buildRequests([bidRequest])[0]; + const request = spec.buildRequests([bidRequest], {})[0]; const payload = JSON.parse(request.data); const testVideoParams = Object.assign({ placement: OUTSTREAM_TYPE, @@ -590,14 +590,12 @@ describe('Improve Digital Adapter Tests', function () { }); it('should not set site when app is defined in FPD', function () { - const getConfigStub = sinon.stub(config, 'getConfig'); - getConfigStub.withArgs('ortb2.app').returns({ content: 'XYZ' }); - let request = spec.buildRequests([simpleBidRequest], bidderRequest)[0]; + const ortb2 = {app: {content: 'XYZ'}}; + let request = spec.buildRequests([simpleBidRequest], {...bidderRequest, ortb2})[0]; let payload = JSON.parse(request.data); expect(payload.site).does.not.exist; expect(payload.app).does.exist; expect(payload.app.content).does.exist.and.equal('XYZ'); - getConfigStub.restore(); }); it('should not set site when app is defined in CONFIG', function () { @@ -631,10 +629,8 @@ describe('Improve Digital Adapter Tests', function () { expect(payload.site.page).does.exist.and.equal('https://blah.com/test.html'); expect(payload.site.domain).does.exist.and.equal('blah.com'); - getConfigStub.withArgs('ortb2.site').returns({ - content: 'ZZZ', - }); - request = spec.buildRequests([simpleBidRequest], bidderRequestReferrer)[0]; + const ortb2 = {site: {content: 'ZZZ'}}; + request = spec.buildRequests([simpleBidRequest], {...bidderRequestReferrer, ortb2})[0]; payload = JSON.parse(request.data); expect(payload.site.content).does.exist.and.equal('ZZZ'); expect(payload.site.page).does.exist.and.equal('https://blah.com/test.html'); diff --git a/test/spec/modules/ixBidAdapter_spec.js b/test/spec/modules/ixBidAdapter_spec.js index 0e1a854b67c..bd46eca3d88 100644 --- a/test/spec/modules/ixBidAdapter_spec.js +++ b/test/spec/modules/ixBidAdapter_spec.js @@ -1273,100 +1273,44 @@ describe('IndexexchangeAdapter', function () { }); describe('First party data', function () { - afterEach(function () { - config.setConfig({ - ortb2: {} - }); - }); - it('should not set ixdiag.fpd value if not defined', function () { - config.setConfig({ - ortb2: {} - }); - - const request = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0]; + const request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, {ortb2: {}})[0]; const r = JSON.parse(request.data.r); expect(r.ext.ixdiag.fpd).to.be.undefined; }); - it('should set ixdiag.fpd value if it exists using fpd', function () { - config.setConfig({ - fpd: { - site: { + it('should set ixdiag.fpd value if it exists using ortb2', function () { + const ortb2 = { + site: { + ext: { data: { pageType: 'article' } } } - }); - - const request = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0]; - const r = JSON.parse(request.data.r); - - expect(r.ext.ixdiag.fpd).to.exist; - }); - - it('should set ixdiag.fpd value if it exists using ortb2', function () { - config.setConfig({ - ortb2: { - site: { - ext: { - data: { - pageType: 'article' - } - } - } - } - }); + }; - const request = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0]; + const request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, {ortb2})[0]; const r = JSON.parse(request.data.r); expect(r.ext.ixdiag.fpd).to.exist; }); - it('should not send information that is not part of openRTB spec v2.5 using fpd', function () { - config.setConfig({ - fpd: { - site: { - keywords: 'power tools, drills', - search: 'drill', - testProperty: 'test_string' - }, - user: { - keywords: ['a'], - testProperty: 'test_string' - } - } - }); - - const request = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0]; - const r = JSON.parse(request.data.r); - - expect(r.site.keywords).to.exist; - expect(r.site.search).to.exist; - expect(r.site.testProperty).to.be.undefined; - expect(r.user.keywords).to.exist; - expect(r.user.testProperty).to.be.undefined; - }); - it('should not send information that is not part of openRTB spec v2.5 using ortb2', function () { - config.setConfig({ - ortb2: { - site: { - keywords: 'power tools, drills', - search: 'drill', - testProperty: 'test_string' - }, - user: { - keywords: ['a'], - testProperty: 'test_string' - } + const ortb2 = { + site: { + keywords: 'power tools, drills', + search: 'drill', + testProperty: 'test_string' + }, + user: { + keywords: ['a'], + testProperty: 'test_string' } - }); + }; - const request = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0]; + const request = spec.buildRequests(DEFAULT_BANNER_VALID_BID, {ortb2})[0]; const r = JSON.parse(request.data.r); expect(r.site.keywords).to.exist; @@ -1377,22 +1321,20 @@ describe('IndexexchangeAdapter', function () { }); it('should not add fpd data to r object if it exceeds maximum request', function () { - config.setConfig({ - ortb2: { - site: { - keywords: 'power tools, drills', - search: 'drill', - }, - user: { - keywords: Array(1000).join('#'), - } + const ortb2 = { + site: { + keywords: 'power tools, drills', + search: 'drill', + }, + user: { + keywords: Array(1000).join('#'), } - }); + }; const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]); bid.mediaTypes.banner.sizes = LARGE_SET_OF_SIZES; - const request = spec.buildRequests([bid])[0]; + const request = spec.buildRequests([bid], {ortb2})[0]; const r = JSON.parse(request.data.r); expect(r.site.ref).to.exist; @@ -1614,7 +1556,7 @@ describe('IndexexchangeAdapter', function () { const bid = utils.deepClone(ONE_VIDEO[0]); const expectedFloor = 3.25; bid.getFloor = () => ({ floor: expectedFloor, currency }); - const request = spec.buildRequests([bid])[0]; + const request = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(request.data.r).imp[0]; expect(impression.bidfloor).to.equal(expectedFloor); @@ -1626,7 +1568,7 @@ describe('IndexexchangeAdapter', function () { const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]) const expectedFloor = 3.25; bid.getFloor = () => ({ floor: expectedFloor, currency }); - const request = spec.buildRequests([bid])[0]; + const request = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(request.data.r).imp[0]; expect(impression.bidfloor).to.equal(expectedFloor); @@ -1638,7 +1580,7 @@ describe('IndexexchangeAdapter', function () { const bid = utils.deepClone(ONE_BANNER[0]); bid.params.bidFloor = highFloor; bid.params.bidFloorCur = 'USD' - const request = spec.buildRequests([bid])[0]; + const request = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(request.data.r).imp[0]; expect(impression.bidfloor).to.equal(highFloor); @@ -1652,7 +1594,7 @@ describe('IndexexchangeAdapter', function () { bid.params.bidFloorCur = 'USD'; const expectedFloor = highFloor; bid.getFloor = () => ({ floor: expectedFloor, currency }); - const requestBidFloor = spec.buildRequests([bid])[0]; + const requestBidFloor = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(requestBidFloor.data.r).imp[0]; expect(impression.bidfloor).to.equal(highFloor); @@ -1664,7 +1606,7 @@ describe('IndexexchangeAdapter', function () { const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]); bid.params.bidFloor = 50; bid.params.bidFloorCur = 'USD'; - const requestBidFloor = spec.buildRequests([bid])[0]; + const requestBidFloor = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(requestBidFloor.data.r).imp[0]; expect(impression.bidfloor).to.equal(bid.params.bidFloor); @@ -1681,7 +1623,7 @@ describe('IndexexchangeAdapter', function () { sinon.spy(bid, 'getFloor'); - const requestBidFloor = spec.buildRequests([bid])[0]; + const requestBidFloor = spec.buildRequests([bid], {})[0]; expect(bid.getFloor.getCall(0).args[0].mediaType).to.equal('banner'); expect(bid.getFloor.getCall(0).args[0].size[0]).to.equal(300); expect(bid.getFloor.getCall(0).args[0].size[1]).to.equal(250); @@ -1715,7 +1657,7 @@ describe('IndexexchangeAdapter', function () { sinon.spy(bid, 'getFloor'); - const requestBidFloor = spec.buildRequests([bid])[0]; + const requestBidFloor = spec.buildRequests([bid], {})[0]; expect(bid.getFloor.getCall(0).args[0].mediaType).to.equal('banner'); expect(bid.getFloor.getCall(0).args[0].size[0]).to.equal(300); expect(bid.getFloor.getCall(0).args[0].size[1]).to.equal(250); @@ -1729,7 +1671,7 @@ describe('IndexexchangeAdapter', function () { it('impression should have sid if id is configured as number', function () { const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]); bid.params.id = 50; - const requestBidFloor = spec.buildRequests([bid])[0]; + const requestBidFloor = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(requestBidFloor.data.r).imp[0]; expect(impression.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId); @@ -1743,7 +1685,7 @@ describe('IndexexchangeAdapter', function () { it('impression should have sid if id is configured as string', function () { const bid = utils.deepClone(DEFAULT_BANNER_VALID_BID[0]); bid.params.id = 'abc'; - const requestBidFloor = spec.buildRequests([bid])[0]; + const requestBidFloor = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(requestBidFloor.data.r).imp[0]; expect(impression.id).to.equal(DEFAULT_BANNER_VALID_BID[0].bidId); @@ -1816,7 +1758,7 @@ describe('IndexexchangeAdapter', function () { timeout: 500 } }); - const requestWithTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0]; + const requestWithTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID, {})[0]; expect(requestWithTimeout.data.t).to.equal(500); }); @@ -1827,14 +1769,14 @@ describe('IndexexchangeAdapter', function () { timeout: '500' } }); - const requestStringTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID)[0]; + const requestStringTimeout = spec.buildRequests(DEFAULT_BANNER_VALID_BID, {})[0]; expect(requestStringTimeout.data.t).to.be.undefined; }); }); describe('request should contain both banner and video requests', function () { - const request = spec.buildRequests([DEFAULT_BANNER_VALID_BID[0], DEFAULT_VIDEO_VALID_BID[0]]); + const request = spec.buildRequests([DEFAULT_BANNER_VALID_BID[0], DEFAULT_VIDEO_VALID_BID[0]], {}); it('should have banner request', () => { const bannerImpression = JSON.parse(request[0].data.r).imp[0]; @@ -2092,7 +2034,7 @@ describe('IndexexchangeAdapter', function () { const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]); bid.mediaTypes.video.context = 'outstream'; bid.mediaTypes.video.placement = 2; - const request = spec.buildRequests([bid])[0]; + const request = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(request.data.r).imp[0]; expect(impression.id).to.equal(DEFAULT_VIDEO_VALID_BID[0].bidId); @@ -2102,7 +2044,7 @@ describe('IndexexchangeAdapter', function () { it('should set correct default placement, if context is instream', function () { const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]); bid.mediaTypes.video.context = 'instream'; - const request = spec.buildRequests([bid])[0]; + const request = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(request.data.r).imp[0]; expect(impression.id).to.equal(DEFAULT_VIDEO_VALID_BID[0].bidId); @@ -2112,7 +2054,7 @@ describe('IndexexchangeAdapter', function () { it('should set correct default placement, if context is outstream', function () { const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]); bid.mediaTypes.video.context = 'outstream'; - const request = spec.buildRequests([bid])[0]; + const request = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(request.data.r).imp[0]; expect(impression.id).to.equal(DEFAULT_VIDEO_VALID_BID[0].bidId); @@ -2122,7 +2064,7 @@ describe('IndexexchangeAdapter', function () { it('should handle unexpected context', function () { const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]); bid.mediaTypes.video.context = 'not-valid'; - const request = spec.buildRequests([bid])[0]; + const request = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(request.data.r).imp[0]; expect(impression.video.placement).to.be.undefined; }); @@ -2132,7 +2074,7 @@ describe('IndexexchangeAdapter', function () { bid.mediaTypes.video.context = 'outstream'; bid.mediaTypes.video.protocols = [1]; bid.mediaTypes.video.mimes = ['video/override']; - const request = spec.buildRequests([bid])[0]; + const request = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(request.data.r).imp[0]; expect(impression.video.protocols[0]).to.equal(2); @@ -2143,7 +2085,7 @@ describe('IndexexchangeAdapter', function () { const bid = utils.deepClone(DEFAULT_VIDEO_VALID_BID[0]); bid.mediaTypes.video.context = 'outstream'; bid.mediaTypes.video.random = true; - const request = spec.buildRequests([bid])[0]; + const request = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(request.data.r).imp[0]; expect(impression.video.random).to.not.exist; @@ -2157,7 +2099,7 @@ describe('IndexexchangeAdapter', function () { bid.mediaTypes.video.protocols = [6]; bid.mediaTypes.video.mimes = ['video/mp4']; bid.mediaTypes.video.api = 2; - const request = spec.buildRequests([bid])[0]; + const request = spec.buildRequests([bid], {})[0]; const impression = JSON.parse(request.data.r).imp[0]; expect(impression.video.protocols[0]).to.equal(6); @@ -2181,7 +2123,7 @@ describe('IndexexchangeAdapter', function () { describe('buildRequestMultiFormat', function () { it('only banner bidder params set', function () { - const request = spec.buildRequests(DEFAULT_MULTIFORMAT_BANNER_VALID_BID) + const request = spec.buildRequests(DEFAULT_MULTIFORMAT_BANNER_VALID_BID, {}) const bannerImpression = JSON.parse(request[0].data.r).imp[0]; expect(JSON.parse(request[0].data.r).imp).to.have.lengthOf(1); expect(JSON.parse(request[0].data.v)).to.equal(BANNER_ENDPOINT_VERSION); @@ -2192,7 +2134,7 @@ describe('IndexexchangeAdapter', function () { describe('only video bidder params set', function () { it('should generate video impression', function () { - const request = spec.buildRequests(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID); + const request = spec.buildRequests(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID, {}); const videoImp = JSON.parse(request[1].data.r).imp[0]; expect(JSON.parse(request[1].data.r).imp).to.have.lengthOf(1); expect(JSON.parse(request[1].data.v)).to.equal(VIDEO_ENDPOINT_VERSION); @@ -2204,7 +2146,7 @@ describe('IndexexchangeAdapter', function () { it('should get missing sizes count 0 when params.size not used', function () { const bid = utils.deepClone(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]); delete bid.params.size; - const request = spec.buildRequests([bid]); + const request = spec.buildRequests([bid], {}); const diagObj = JSON.parse(request[0].data.r).ext.ixdiag; expect(diagObj.msd).to.equal(0); expect(diagObj.msi).to.equal(0); @@ -2213,7 +2155,7 @@ describe('IndexexchangeAdapter', function () { describe('both banner and video bidder params set', function () { const bids = [DEFAULT_MULTIFORMAT_BANNER_VALID_BID[0], DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]]; - const request = spec.buildRequests(bids); + const request = spec.buildRequests(bids, {}); it('should return valid banner requests', function () { const impressions = JSON.parse(request[0].data.r).imp; @@ -2799,7 +2741,7 @@ describe('IndexexchangeAdapter', function () { }); expect(spec.isBidRequestValid(bid)).to.be.true; - spec.buildRequests([bid]); + spec.buildRequests([bid], {}); expect(JSON.parse(localStorageValues[key])).to.deep.equal({ [TODAY]: { [ERROR_CODES.IX_FPD_EXCEEDS_MAX_SIZE]: 2 } }); }); @@ -2808,25 +2750,24 @@ describe('IndexexchangeAdapter', function () { bid.bidderRequestId = Array(8000).join('#'); expect(spec.isBidRequestValid(bid)).to.be.true; - spec.buildRequests([bid]); + spec.buildRequests([bid], {}); expect(JSON.parse(localStorageValues[key])).to.deep.equal({ [TODAY]: { [ERROR_CODES.EXCEEDS_MAX_SIZE]: 2 } }); }); it('should log ERROR_CODES.PB_FPD_EXCEEDS_MAX_SIZE in LocalStorage when there is logError called.', () => { const bid = utils.deepClone(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]); - - config.setConfig({ - fpd: { - site: { + const ortb2 = { + site: { + ext: { data: { pageType: Array(5700).join('#') } } } - }); + }; expect(spec.isBidRequestValid(bid)).to.be.true; - spec.buildRequests([bid]); + spec.buildRequests([bid], {ortb2}); expect(JSON.parse(localStorageValues[key])).to.deep.equal({ [TODAY]: { [ERROR_CODES.PB_FPD_EXCEEDS_MAX_SIZE]: 2 } }); }); @@ -2836,7 +2777,7 @@ describe('IndexexchangeAdapter', function () { bid.params.video.maxduration = 0; expect(spec.isBidRequestValid(bid)).to.be.true; - spec.buildRequests([bid]); + spec.buildRequests([bid], {}); expect(JSON.parse(localStorageValues[key])).to.deep.equal({ [TODAY]: { [ERROR_CODES.VIDEO_DURATION_INVALID]: 2 } }); }); diff --git a/test/spec/modules/jwplayerRtdProvider_spec.js b/test/spec/modules/jwplayerRtdProvider_spec.js index db17d18864b..5ffd43668a6 100644 --- a/test/spec/modules/jwplayerRtdProvider_spec.js +++ b/test/spec/modules/jwplayerRtdProvider_spec.js @@ -523,8 +523,8 @@ describe('jwplayerRtdProvider', function() { describe(' Add Ortb Site Content', function () { it('should maintain object structure when id and data params are empty', function () { - const bid = { - ortb2: { + const bidderOrtb2 = { + mockBidder: { site: { content: { id: 'randomId' @@ -539,26 +539,27 @@ describe('jwplayerRtdProvider', function() { } } } - }; - addOrtbSiteContent(bid); - expect(bid).to.have.nested.property('ortb2.site.content.id', 'randomId'); - expect(bid).to.have.nested.property('ortb2.site.random.random_sub', 'randomSub'); - expect(bid).to.have.nested.property('ortb2.app.content.id', 'appId'); + } + addOrtbSiteContent(bidderOrtb2, {bidder: 'mockBidder'}); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.content.id', 'randomId'); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.random.random_sub', 'randomSub'); + expect(bidderOrtb2.mockBidder).to.have.nested.property('app.content.id', 'appId'); }); it('should create a structure compliant with the oRTB 2 spec', function() { - const bid = {}; + const bidderOrtb2 = {} + const bid = {bidder: 'mockBidder'}; const expectedId = 'expectedId'; const expectedData = { datum: 'datum' }; - addOrtbSiteContent(bid, expectedId, expectedData); - expect(bid).to.have.nested.property('ortb2.site.content.id', expectedId); - expect(bid).to.have.nested.property('ortb2.site.content.data'); - expect(bid.ortb2.site.content.data[0]).to.be.deep.equal(expectedData); + addOrtbSiteContent(bidderOrtb2, bid, expectedId, expectedData); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.content.id', expectedId); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.content.data'); + expect(bidderOrtb2.mockBidder.site.content.data[0]).to.be.deep.equal(expectedData); }); it('should respect existing structure when adding adding fields', function () { - const bid = { - ortb2: { + const bidderOrtb2 = { + mockBidder: { site: { content: { id: 'oldId' @@ -577,24 +578,25 @@ describe('jwplayerRtdProvider', function() { const expectedId = 'expectedId'; const expectedData = { datum: 'datum' }; - addOrtbSiteContent(bid, expectedId, expectedData); - expect(bid).to.have.nested.property('ortb2.site.random.random_sub', 'randomSub'); - expect(bid).to.have.nested.property('ortb2.app.content.id', 'appId'); - expect(bid).to.have.nested.property('ortb2.site.content.id', expectedId); - expect(bid).to.have.nested.property('ortb2.site.content.data'); - expect(bid.ortb2.site.content.data[0]).to.be.deep.equal(expectedData); + addOrtbSiteContent(bidderOrtb2, {bidder: 'mockBidder'}, expectedId, expectedData); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.random.random_sub', 'randomSub'); + expect(bidderOrtb2.mockBidder).to.have.nested.property('app.content.id', 'appId'); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.content.id', expectedId); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.content.data'); + expect(bidderOrtb2.mockBidder.site.content.data[0]).to.be.deep.equal(expectedData); }); it('should set content id', function () { - const bid = {}; + const bidderOrtb2 = {}; + const bid = {bidder: 'mockBidder'}; const expectedId = 'expectedId'; - addOrtbSiteContent(bid, expectedId); - expect(bid).to.have.nested.property('ortb2.site.content.id', expectedId); + addOrtbSiteContent(bidderOrtb2, bid, expectedId); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.content.id', expectedId); }); it('should override content id', function () { - const bid = { - ortb2: { + const bidderOrtb2 = { + mockBidder: { site: { content: { id: 'oldId' @@ -604,14 +606,14 @@ describe('jwplayerRtdProvider', function() { }; const expectedId = 'expectedId'; - addOrtbSiteContent(bid, expectedId); - expect(bid).to.have.nested.property('ortb2.site.content.id', expectedId); + addOrtbSiteContent(bidderOrtb2, {bidder: 'mockBidder'}, expectedId); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.content.id', expectedId); }); it('should keep previous content id when not set', function () { const previousId = 'oldId'; - const bid = { - ortb2: { + const bidderOrtb2 = { + mockBidder: { site: { content: { id: previousId, @@ -621,22 +623,22 @@ describe('jwplayerRtdProvider', function() { } }; - addOrtbSiteContent(bid, null, { datum: 'new_datum' }); - expect(bid).to.have.nested.property('ortb2.site.content.id', previousId); + addOrtbSiteContent(bidderOrtb2, {bidder: 'mockBidder'}, null, { datum: 'new_datum' }); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.content.id', previousId); }); it('should set content data', function () { - const bid = {}; + const bidderOrtb2 = {}; const expectedData = { datum: 'datum' }; - addOrtbSiteContent(bid, null, expectedData); - expect(bid).to.have.nested.property('ortb2.site.content.data'); - expect(bid.ortb2.site.content.data).to.have.length(1); - expect(bid.ortb2.site.content.data[0]).to.be.deep.equal(expectedData); + addOrtbSiteContent(bidderOrtb2, {bidder: 'mockBidder'}, null, expectedData); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.content.data'); + expect(bidderOrtb2.mockBidder.site.content.data).to.have.length(1); + expect(bidderOrtb2.mockBidder.site.content.data[0]).to.be.deep.equal(expectedData); }); it('should append content data', function () { - const bid = { - ortb2: { + const bidderOrtb2 = { + mockBidder: { site: { content: { data: [{ datum: 'first_datum' }] @@ -646,17 +648,17 @@ describe('jwplayerRtdProvider', function() { }; const expectedData = { datum: 'datum' }; - addOrtbSiteContent(bid, null, expectedData); - expect(bid).to.have.nested.property('ortb2.site.content.data'); - expect(bid.ortb2.site.content.data).to.have.length(2); - expect(bid.ortb2.site.content.data.pop()).to.be.deep.equal(expectedData); + addOrtbSiteContent(bidderOrtb2, {bidder: 'mockBidder'}, null, expectedData); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.content.data'); + expect(bidderOrtb2.mockBidder.site.content.data).to.have.length(2); + expect(bidderOrtb2.mockBidder.site.content.data.pop()).to.be.deep.equal(expectedData); }); it('should keep previous data when not set', function () { const expectedId = 'expectedId'; const expectedData = { datum: 'first_datum' }; - const bid = { - ortb2: { + const bidderOrtb2 = { + mockBidder: { site: { content: { data: [expectedData] @@ -665,11 +667,11 @@ describe('jwplayerRtdProvider', function() { } }; - addOrtbSiteContent(bid, expectedId); - expect(bid).to.have.nested.property('ortb2.site.content.data'); - expect(bid.ortb2.site.content.data).to.have.length(1); - expect(bid.ortb2.site.content.data[0]).to.be.deep.equal(expectedData); - expect(bid).to.have.nested.property('ortb2.site.content.id', expectedId); + addOrtbSiteContent(bidderOrtb2, {bidder: 'mockBidder'}, expectedId); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.content.data'); + expect(bidderOrtb2.mockBidder.site.content.data).to.have.length(1); + expect(bidderOrtb2.mockBidder.site.content.data[0]).to.be.deep.equal(expectedData); + expect(bidderOrtb2.mockBidder).to.have.nested.property('site.content.id', expectedId); }); }); diff --git a/test/spec/modules/livewrappedBidAdapter_spec.js b/test/spec/modules/livewrappedBidAdapter_spec.js index fac1ae1d6a0..9592386e538 100644 --- a/test/spec/modules/livewrappedBidAdapter_spec.js +++ b/test/spec/modules/livewrappedBidAdapter_spec.js @@ -2,7 +2,7 @@ import {expect} from 'chai'; import {spec, storage} from 'modules/livewrappedBidAdapter.js'; import {config} from 'src/config.js'; import * as utils from 'src/utils.js'; -import { BANNER, NATIVE, VIDEO } from 'src/mediaTypes.js'; +import { NATIVE, VIDEO } from 'src/mediaTypes.js'; describe('Livewrapped adapter tests', function () { let sandbox, @@ -889,15 +889,9 @@ describe('Livewrapped adapter tests', function () { sandbox.stub(utils, 'isSafariBrowser').callsFake(() => false); sandbox.stub(storage, 'cookiesAreEnabled').callsFake(() => true); - let origGetConfig = config.getConfig; - sandbox.stub(config, 'getConfig').callsFake(function (key) { - if (key === 'ortb2') { - return {user: {ext: {prop: 'value'}}}; - } - return origGetConfig.apply(config, arguments); - }); + const ortb2 = {user: {ext: {prop: 'value'}}}; - let testbidRequest = clone(bidderRequest); + let testbidRequest = {...clone(bidderRequest), ortb2}; delete testbidRequest.bids[0].params.userId; testbidRequest.bids[0].userIdAsEids = [ { diff --git a/test/spec/modules/mediakeysBidAdapter_spec.js b/test/spec/modules/mediakeysBidAdapter_spec.js index 38f2a3f9de3..47ac54d49df 100644 --- a/test/spec/modules/mediakeysBidAdapter_spec.js +++ b/test/spec/modules/mediakeysBidAdapter_spec.js @@ -561,38 +561,33 @@ describe('mediakeysBidAdapter', function () { }); it('should set properties at payload level from FPD', function() { - sandbox.stub(config, 'getConfig').callsFake(key => { - const config = { - ortb2: { - site: { - domain: 'domain.example', - cat: ['IAB12'], - ext: { - data: { - category: 'sport', - } - } - }, - user: { - yob: 1985, - gender: 'm', - geo: { - country: 'FR', - city: 'Marseille' - }, - ext: { - data: { - registered: true - } - } + const ortb2 = { + site: { + domain: 'domain.example', + cat: ['IAB12'], + ext: { + data: { + category: 'sport', } } - }; - return utils.deepAccess(config, key); - }); + }, + user: { + yob: 1985, + gender: 'm', + geo: { + country: 'FR', + city: 'Marseille' + }, + ext: { + data: { + registered: true + } + } + } + }; const bidRequests = [utils.deepClone(bid)]; - const request = spec.buildRequests(bidRequests, bidderRequest); + const request = spec.buildRequests(bidRequests, {...bidderRequest, ortb2}); const data = request.data; expect(data.site.domain).to.equal('domain.example'); expect(data.site.cat[0]).to.equal('IAB12'); diff --git a/test/spec/modules/nobidBidAdapter_spec.js b/test/spec/modules/nobidBidAdapter_spec.js index eccf0e84031..6af803c66f3 100644 --- a/test/spec/modules/nobidBidAdapter_spec.js +++ b/test/spec/modules/nobidBidAdapter_spec.js @@ -84,22 +84,20 @@ describe('Nobid Adapter', function () { const sitePageCat = 'IAB2-12'; it('ortb2 should exist', function () { - config.setConfig({ - ortb2: { - site: { - name: siteName, - domain: siteDomain, - cat: [ siteCat ], - sectioncat: [ siteSectionCat ], - pagecat: [ sitePageCat ], - page: sitePage, - ref: siteRef, - keywords: siteKeywords, - search: siteSearch - } + const ortb2 = { + site: { + name: siteName, + domain: siteDomain, + cat: [ siteCat ], + sectioncat: [ siteSectionCat ], + pagecat: [ sitePageCat ], + page: sitePage, + ref: siteRef, + keywords: siteKeywords, + search: siteSearch } - }); - const request = spec.buildRequests(bidRequests, bidderRequest); + }; + const request = spec.buildRequests(bidRequests, {...bidderRequest, ortb2}); let payload = JSON.parse(request.data); payload = JSON.parse(JSON.stringify(payload)); expect(payload.sid).to.equal(SITE_ID); diff --git a/test/spec/modules/openxBidAdapter_spec.js b/test/spec/modules/openxBidAdapter_spec.js index 3bc53e30eb8..3555f5c5dc5 100644 --- a/test/spec/modules/openxBidAdapter_spec.js +++ b/test/spec/modules/openxBidAdapter_spec.js @@ -1713,21 +1713,10 @@ describe('OpenxAdapter', function () { context('in ortb2.user.data', function () { let bidRequests; beforeEach(function () { - let fpdConfig = t.config - sinon - .stub(config, 'getConfig') - .withArgs(sinon.match(/^ortb2\.user\.data$|^ortb2\.site\.content\.data$/)) - .callsFake((key) => { - return utils.deepAccess(fpdConfig, key); - }); bidRequests = [{...bidRequest, ...t.request}]; }); - afterEach(function () { - config.getConfig.restore(); - }); - - const mockBidderRequest = {refererInfo: {}}; + const mockBidderRequest = {refererInfo: {}, ortb2: t.config.ortb2}; it(`${t.name} for type ${name}`, function () { const request = spec.buildRequests(bidRequests, mockBidderRequest) expect(request.length).to.equal(1); diff --git a/test/spec/modules/optoutBidAdapter_spec.js b/test/spec/modules/optoutBidAdapter_spec.js index 4d7c25d12bc..a31becdc394 100644 --- a/test/spec/modules/optoutBidAdapter_spec.js +++ b/test/spec/modules/optoutBidAdapter_spec.js @@ -72,21 +72,21 @@ describe('optoutAdapterTest', function () { }]; it('bidRequest HTTP method', function () { - const requests = spec.buildRequests(bidRequests); + const requests = spec.buildRequests(bidRequests, {}); requests.forEach(function(requestItem) { expect(requestItem.method).to.equal('POST'); }); }); it('bidRequest url without consent', function () { - const requests = spec.buildRequests(bidRequests); + const requests = spec.buildRequests(bidRequests, {}); requests.forEach(function(requestItem) { expect(requestItem.url).to.match(new RegExp('adscience-nocookie\\.nl/prebid/display')); }); }); it('bidRequest id', function () { - const requests = spec.buildRequests(bidRequests); + const requests = spec.buildRequests(bidRequests, {}); expect(requests[0].data.requestId).to.equal('9304jr394ddfj'); expect(requests[1].data.requestId).to.equal('893j4f94e8jei'); }); @@ -99,7 +99,7 @@ describe('optoutAdapterTest', function () { } }) - const requests = spec.buildRequests(bidRequests); + const requests = spec.buildRequests(bidRequests, {}); expect(requests[0].data.cur.adServerCurrency).to.equal('USD'); expect(requests[1].data.cur.adServerCurrency).to.equal('USD'); }); @@ -107,7 +107,7 @@ describe('optoutAdapterTest', function () { it('bidRequest without config for currency', function () { config.resetConfig(); - const requests = spec.buildRequests(bidRequests); + const requests = spec.buildRequests(bidRequests, {}); expect(requests[0].data.cur.adServerCurrency).to.equal('EUR'); expect(requests[1].data.cur.adServerCurrency).to.equal('EUR'); }); diff --git a/test/spec/modules/ozoneBidAdapter_spec.js b/test/spec/modules/ozoneBidAdapter_spec.js index 658af310ea5..b29494e0b54 100644 --- a/test/spec/modules/ozoneBidAdapter_spec.js +++ b/test/spec/modules/ozoneBidAdapter_spec.js @@ -2294,7 +2294,7 @@ describe('ozone Adapter', function () { expect(payload.ext.ozone.oz_kvp_rw).to.equal(0); }); it('should handle ortb2 site data', function () { - config.setConfig({'ortb2': { + const ortb2 = { 'site': { 'name': 'example_ortb2_name', 'domain': 'page.example.com', @@ -2306,15 +2306,15 @@ describe('ozone Adapter', function () { 'keywords': 'power tools, drills', 'search': 'drill' } - }}); - const request = spec.buildRequests(validBidRequests, validBidderRequest.bidderRequest); + }; + const request = spec.buildRequests(validBidRequests, {...validBidderRequest.bidderRequest, ortb2}); const payload = JSON.parse(request.data); expect(payload.imp[0].ext.ozone.customData[0].targeting.name).to.equal('example_ortb2_name'); expect(payload.user.ext).to.not.have.property('gender'); config.resetConfig(); }); it('should add ortb2 site data when there is no customData already created', function () { - config.setConfig({'ortb2': { + const ortb2 = { 'site': { 'name': 'example_ortb2_name', 'domain': 'page.example.com', @@ -2326,34 +2326,34 @@ describe('ozone Adapter', function () { 'keywords': 'power tools, drills', 'search': 'drill' } - }}); - const request = spec.buildRequests(validBidRequestsNoCustomData, validBidderRequest.bidderRequest); + }; + const request = spec.buildRequests(validBidRequestsNoCustomData, {...validBidderRequest.bidderRequest, ortb2}); const payload = JSON.parse(request.data); expect(payload.imp[0].ext.ozone.customData[0].targeting.name).to.equal('example_ortb2_name'); expect(payload.imp[0].ext.ozone.customData[0].targeting).to.not.have.property('gender') config.resetConfig(); }); it('should add ortb2 user data to the user object', function () { - config.setConfig({'ortb2': { + const ortb2 = { 'user': { 'gender': 'who knows these days' } - }}); - const request = spec.buildRequests(validBidRequests, validBidderRequest.bidderRequest); + }; + const request = spec.buildRequests(validBidRequests, {...validBidderRequest.bidderRequest, ortb2}); const payload = JSON.parse(request.data); expect(payload.user.gender).to.equal('who knows these days'); config.resetConfig(); }); it('should not override the user.ext.consent string even if this is set in config ortb2', function () { - config.setConfig({'ortb2': { + const ortb2 = { 'user': { 'ext': { 'consent': 'this is the consent override that shouldnt work', 'consent2': 'this should be set' } } - }}); - const request = spec.buildRequests(validBidRequests, bidderRequestWithFullGdpr.bidderRequest); + }; + const request = spec.buildRequests(validBidRequests, {...bidderRequestWithFullGdpr.bidderRequest, ortb2}); const payload = JSON.parse(request.data); expect(payload.user.ext.consent2).to.equal('this should be set'); expect(payload.user.ext.consent).to.equal('BOh7mtYOh7mtYAcABBENCU-AAAAncgPIXJiiAoao0PxBFkgCAC8ACIAAQAQQAAIAAAIAAAhBGAAAQAQAEQgAAAAAAABAAAAAAAAAAAAAAACAAAAAAAACgAAAAABAAAAQAAAAAAA'); diff --git a/test/spec/modules/permutiveRtdProvider_spec.js b/test/spec/modules/permutiveRtdProvider_spec.js index 6b44ec2b065..4e59cd35741 100644 --- a/test/spec/modules/permutiveRtdProvider_spec.js +++ b/test/spec/modules/permutiveRtdProvider_spec.js @@ -36,16 +36,16 @@ describe('permutiveRtdProvider', function () { it('should add ortb2 config', function () { const moduleConfig = getConfig() - const bidderConfig = config.getBidderConfig() + const bidderConfig = {}; const acBidders = moduleConfig.params.acBidders const expectedTargetingData = transformedTargeting().ac.map(seg => { return { id: seg } }) - setBidderRtb({}, moduleConfig) + setBidderRtb(bidderConfig, moduleConfig) acBidders.forEach(bidder => { - expect(bidderConfig[bidder].ortb2.user.data).to.deep.include.members([{ + expect(bidderConfig[bidder].user.data).to.deep.include.members([{ name: 'permutive.com', segment: expectedTargetingData }]) @@ -53,7 +53,7 @@ describe('permutiveRtdProvider', function () { }) it('should include ortb2 user data transformation for IAB audience taxonomy', function() { const moduleConfig = getConfig() - const bidderConfig = config.getBidderConfig() + const bidderConfig = {} const acBidders = moduleConfig.params.acBidders const expectedTargetingData = transformedTargeting().ac.map(seg => { return { id: seg } @@ -75,10 +75,10 @@ describe('permutiveRtdProvider', function () { } ) - setBidderRtb({}, moduleConfig) + setBidderRtb(bidderConfig, moduleConfig) acBidders.forEach(bidder => { - expect(bidderConfig[bidder].ortb2.user.data).to.deep.include.members([ + expect(bidderConfig[bidder].user.data).to.deep.include.members([ { name: 'permutive.com', segment: expectedTargetingData @@ -93,30 +93,24 @@ describe('permutiveRtdProvider', function () { }) it('should not overwrite ortb2 config', function () { const moduleConfig = getConfig() - const bidderConfig = config.getBidderConfig() const acBidders = moduleConfig.params.acBidders const sampleOrtbConfig = { - ortb2: { - site: { - name: 'example' - }, - user: { - keywords: 'a,b', - data: [ - { - name: 'www.dataprovider1.com', - ext: { taxonomyname: 'iab_audience_taxonomy' }, - segment: [{ id: '687' }, { id: '123' }] - } - ] - } + site: { + name: 'example' + }, + user: { + keywords: 'a,b', + data: [ + { + name: 'www.dataprovider1.com', + ext: { taxonomyname: 'iab_audience_taxonomy' }, + segment: [{ id: '687' }, { id: '123' }] + } + ] } } - config.setBidderConfig({ - bidders: acBidders, - config: sampleOrtbConfig - }) + const bidderConfig = Object.fromEntries(acBidders.map(bidder => [bidder, sampleOrtbConfig])) const transformedUserData = { name: 'transformation', @@ -124,14 +118,15 @@ describe('permutiveRtdProvider', function () { segment: [1, 2, 3] } - setBidderRtb({}, moduleConfig, { + setBidderRtb(bidderConfig, moduleConfig, { + // TODO: this argument is unused, is the test still valid / needed? testTransformation: userData => transformedUserData }) acBidders.forEach(bidder => { - expect(bidderConfig[bidder].ortb2.site.name).to.equal(sampleOrtbConfig.ortb2.site.name) - expect(bidderConfig[bidder].ortb2.user.keywords).to.equal(sampleOrtbConfig.ortb2.user.keywords) - expect(bidderConfig[bidder].ortb2.user.data).to.deep.include.members([sampleOrtbConfig.ortb2.user.data[0]]) + expect(bidderConfig[bidder].site.name).to.equal(sampleOrtbConfig.site.name) + expect(bidderConfig[bidder].user.keywords).to.equal(sampleOrtbConfig.user.keywords) + expect(bidderConfig[bidder].user.data).to.deep.include.members([sampleOrtbConfig.user.data[0]]) }) }) }) diff --git a/test/spec/modules/prebidServerBidAdapter_spec.js b/test/spec/modules/prebidServerBidAdapter_spec.js index 895099a4748..5204df9dd49 100644 --- a/test/spec/modules/prebidServerBidAdapter_spec.js +++ b/test/spec/modules/prebidServerBidAdapter_spec.js @@ -1979,7 +1979,7 @@ describe('S2S Adapter', function () { const s2sBidRequest = utils.deepClone(REQUEST); const bidRequests = utils.deepClone(BID_REQUESTS); - const commonContext = { + const commonSite = { keywords: ['power tools'], search: 'drill' }; @@ -1988,19 +1988,23 @@ describe('S2S Adapter', function () { gender: 'M' }; - const context = { - content: { userrating: 4 }, - data: { - pageType: 'article', - category: 'tools' + const site = { + content: {userrating: 4}, + ext: { + data: { + pageType: 'article', + category: 'tools' + } } }; const user = { yob: '1984', geo: { country: 'ca' }, - data: { - registered: true, - interests: ['cars'] + ext: { + data: { + registered: true, + interests: ['cars'] + } } }; const bcat = ['IAB25', 'IAB7-39']; @@ -2038,11 +2042,14 @@ describe('S2S Adapter', function () { const commonContextExpected = utils.mergeDeep({ 'page': 'http://mytestpage.com', 'publisher': { 'id': '1' } - }, commonContext); + }, commonSite); - config.setConfig({ fpd: { context: commonContext, user: commonUser, badv, bcat } }); - config.setBidderConfig({ bidders: allowedBidders, config: { fpd: { context, user, bcat, badv } } }); - adapter.callBids(s2sBidRequest, bidRequests, addBidResponse, done, ajax); + const ortb2Fragments = { + global: {site: commonSite, user: commonUser, badv, bcat}, + bidder: Object.fromEntries(allowedBidders.map(bidder => [bidder, {site, user, bcat, badv}])) + }; + + adapter.callBids({...s2sBidRequest, ortb2Fragments}, bidRequests, addBidResponse, done, ajax); const parsedRequestBody = JSON.parse(server.requests[0].requestBody); expect(parsedRequestBody.ext.prebid.bidderconfig).to.deep.equal(expected); expect(parsedRequestBody.site).to.deep.equal(commonContextExpected); diff --git a/test/spec/modules/pubmaticBidAdapter_spec.js b/test/spec/modules/pubmaticBidAdapter_spec.js index 7679b3cdf5a..9028ad42ea6 100644 --- a/test/spec/modules/pubmaticBidAdapter_spec.js +++ b/test/spec/modules/pubmaticBidAdapter_spec.js @@ -1632,43 +1632,29 @@ describe('PubMatic adapter', function () { let newRequest; it('ortb2.site should be merged in the request', function() { - let sandbox = sinon.sandbox.create(); - sandbox.stub(config, 'getConfig').callsFake(key => { - const config = { - 'ortb2': { - site: { - domain: 'page.example.com', - cat: ['IAB2'], - sectioncat: ['IAB2-2'] - } - } - }; - return config[key]; - }); - const request = spec.buildRequests(bidRequests, {}); + const ortb2 = { + site: { + domain: 'page.example.com', + cat: ['IAB2'], + sectioncat: ['IAB2-2'] + } + }; + const request = spec.buildRequests(bidRequests, {ortb2}); let data = JSON.parse(request.data); expect(data.site.domain).to.equal('page.example.com'); expect(data.site.cat).to.deep.equal(['IAB2']); expect(data.site.sectioncat).to.deep.equal(['IAB2-2']); - sandbox.restore(); }); it('ortb2.user should be merged in the request', function() { - let sandbox = sinon.sandbox.create(); - sandbox.stub(config, 'getConfig').callsFake(key => { - const config = { - 'ortb2': { - user: { - yob: 1985 - } - } - }; - return config[key]; - }); - const request = spec.buildRequests(bidRequests, {}); + const ortb2 = { + user: { + yob: 1985 + } + }; + const request = spec.buildRequests(bidRequests, {ortb2}); let data = JSON.parse(request.data); expect(data.user.yob).to.equal(1985); - sandbox.restore(); }); describe('ortb2Imp', function() { @@ -3212,30 +3198,24 @@ describe('PubMatic adapter', function () { expect(data.ext.acat).to.exist.and.to.deep.equal(['IAB1', 'IAB2', 'IAB3']); }); it('ortb2.ext.prebid.bidderparams.pubmatic.acat should be passed in request payload', function() { - let sandbox = sinon.sandbox.create(); - sandbox.stub(config, 'getConfig').callsFake(key => { - const config = { - 'ortb2': { - ext: { - prebid: { - bidderparams: { - pubmatic: { - acat: ['IAB1', 'IAB2', 'IAB1', 'IAB2', 'IAB1', 'IAB2'] - } - } + const ortb2 = { + ext: { + prebid: { + bidderparams: { + pubmatic: { + acat: ['IAB1', 'IAB2', 'IAB1', 'IAB2', 'IAB1', 'IAB2'] } } } - }; - return config[key]; - }); + } + }; const request = spec.buildRequests(bidRequests, { auctionId: 'new-auction-id', - bidderCode: 'pubmatic' + bidderCode: 'pubmatic', + ortb2 }); let data = JSON.parse(request.data); expect(data.ext.acat).to.deep.equal(['IAB1', 'IAB2']); - sandbox.restore(); }); }); @@ -3344,22 +3324,16 @@ describe('PubMatic adapter', function () { it('ortb2.bcat should merged with slot level bcat param', function() { multipleBidRequests[0].params.bcat = ['IAB-1', 'IAB-2']; - let sandbox = sinon.sandbox.create(); - sandbox.stub(config, 'getConfig').callsFake(key => { - const config = { - 'ortb2': { - bcat: ['IAB-3', 'IAB-4'] - } - }; - return config[key]; - }); + const ortb2 = { + bcat: ['IAB-3', 'IAB-4'] + }; const request = spec.buildRequests(multipleBidRequests, { auctionId: 'new-auction-id', - bidderCode: 'pubmatic' + bidderCode: 'pubmatic', + ortb2 }); let data = JSON.parse(request.data); expect(data.bcat).to.deep.equal(['IAB-1', 'IAB-2', 'IAB-3', 'IAB-4']); - sandbox.restore(); }); }); diff --git a/test/spec/modules/rubiconBidAdapter_spec.js b/test/spec/modules/rubiconBidAdapter_spec.js index c281c195dd2..753ad4df8dd 100644 --- a/test/spec/modules/rubiconBidAdapter_spec.js +++ b/test/spec/modules/rubiconBidAdapter_spec.js @@ -927,15 +927,10 @@ describe('the rubicon adapter', function () { } }; - sandbox.stub(config, 'getConfig').callsFake(key => { - const config = { - ortb2: { - site, - user - } - }; - return utils.deepAccess(config, key); - }); + const ortb2 = { + site, + user + } const expectedQuery = { 'kw': 'a,b,c,d', @@ -953,7 +948,7 @@ describe('the rubicon adapter', function () { }; // get the built request - let [request] = spec.buildRequests(bidderRequest.bids, bidderRequest); + let [request] = spec.buildRequests(bidderRequest.bids.map((b) => ({...b, ortb2})), bidderRequest); let data = parseQuery(request.data); // make sure that tg_v, tg_i, and kw values are correct @@ -2056,17 +2051,12 @@ describe('the rubicon adapter', function () { data: [{foo: 'bar'}] }; - sandbox.stub(config, 'getConfig').callsFake(key => { - const config = { - ortb2: { - site, - user - } - }; - return utils.deepAccess(config, key); - }); + const ortb2 = { + site, + user + }; - const [request] = spec.buildRequests(bidderRequest.bids, bidderRequest); + const [request] = spec.buildRequests(bidderRequest.bids.map((b) => ({...b, ortb2})), bidderRequest); const expected = { site: Object.assign({}, site, {keywords: bidderRequest.bids[0].params.keywords.join(',')}), diff --git a/test/spec/modules/sharethroughBidAdapter_spec.js b/test/spec/modules/sharethroughBidAdapter_spec.js index 39238cc877f..9ec8da4f72f 100644 --- a/test/spec/modules/sharethroughBidAdapter_spec.js +++ b/test/spec/modules/sharethroughBidAdapter_spec.js @@ -487,19 +487,8 @@ describe('sharethrough adapter spec', function () { }, }; - let configStub; - - beforeEach(() => { - configStub = sinon.stub(config, 'getConfig'); - configStub.withArgs('ortb2').returns(firstPartyData); - }); - - afterEach(() => { - configStub.restore(); - }); - it('should include first party data in open rtb request, site section', () => { - const openRtbReq = spec.buildRequests(bidRequests, bidderRequest)[0].data; + const openRtbReq = spec.buildRequests(bidRequests, {...bidderRequest, ortb2: firstPartyData})[0].data; expect(openRtbReq.site.name).to.equal(firstPartyData.site.name); expect(openRtbReq.site.keywords).to.equal(firstPartyData.site.keywords); @@ -509,7 +498,7 @@ describe('sharethrough adapter spec', function () { }); it('should include first party data in open rtb request, user section', () => { - const openRtbReq = spec.buildRequests(bidRequests, bidderRequest)[0].data; + const openRtbReq = spec.buildRequests(bidRequests, {...bidderRequest, ortb2: firstPartyData})[0].data; expect(openRtbReq.user.yob).to.equal(firstPartyData.user.yob); expect(openRtbReq.user.gender).to.equal(firstPartyData.user.gender); diff --git a/test/spec/modules/sirdataRtdProvider_spec.js b/test/spec/modules/sirdataRtdProvider_spec.js index a16359c50cb..9cf392ebd62 100644 --- a/test/spec/modules/sirdataRtdProvider_spec.js +++ b/test/spec/modules/sirdataRtdProvider_spec.js @@ -42,7 +42,7 @@ describe('sirdataRtdProvider', function() { contextual_categories: {'333333': 100} }; - addSegmentData(adUnits, data, config, () => {}); + addSegmentData({adUnits}, data, config, () => {}); expect(adUnits[0].bids[0].params.keywords).to.have.deep.property('sd_rtd', ['111111', '222222', '333333']); expect(adUnits[0].bids[1].ortb2.site.ext.data).to.have.deep.property('sd_rtd', ['333333']); expect(adUnits[0].bids[1].ortb2.user.ext.data).to.have.deep.property('sd_rtd', ['111111', '222222']); diff --git a/test/spec/modules/smaatoBidAdapter_spec.js b/test/spec/modules/smaatoBidAdapter_spec.js index 38df03652b1..f9bff4d0d0d 100644 --- a/test/spec/modules/smaatoBidAdapter_spec.js +++ b/test/spec/modules/smaatoBidAdapter_spec.js @@ -328,27 +328,22 @@ describe('smaatoBidAdapterTest', () => { }); it('sends first party data', () => { - sandbox.stub(config, 'getConfig').callsFake(key => { - const config = { - ortb2: { - site: { - keywords: 'power tools,drills', - publisher: { - id: 'otherpublisherid', - name: 'publishername' - } - }, - user: { - keywords: 'a,b', - gender: 'M', - yob: 1984 - } + const ortb2 = { + site: { + keywords: 'power tools,drills', + publisher: { + id: 'otherpublisherid', + name: 'publishername' } - }; - return utils.deepAccess(config, key); - }); + }, + user: { + keywords: 'a,b', + gender: 'M', + yob: 1984 + } + }; - const reqs = spec.buildRequests([singleBannerBidRequest], defaultBidderRequest); + const reqs = spec.buildRequests([singleBannerBidRequest], {...defaultBidderRequest, ortb2}); const req = extractPayloadOfFirstAndOnlyRequest(reqs); expect(req.user.gender).to.equal('M'); diff --git a/test/spec/modules/sonobiBidAdapter_spec.js b/test/spec/modules/sonobiBidAdapter_spec.js index f56f4e0c12b..62a6d32d8ae 100644 --- a/test/spec/modules/sonobiBidAdapter_spec.js +++ b/test/spec/modules/sonobiBidAdapter_spec.js @@ -355,14 +355,7 @@ describe('SonobiBidAdapter', function () { } } }; - - sandbox.stub(config, 'getConfig').callsFake(key => { - const config = { - ortb2: ortb2 - }; - return utils.deepAccess(config, key); - }); - const bidRequests = spec.buildRequests(bidRequest, bidderRequests); + const bidRequests = spec.buildRequests(bidRequest, {...bidderRequests, ortb2}); expect(bidRequests.data.fpd).to.equal(JSON.stringify(ortb2)); }); diff --git a/test/spec/modules/sovrnBidAdapter_spec.js b/test/spec/modules/sovrnBidAdapter_spec.js index 09a61c82b6c..67608764f8c 100644 --- a/test/spec/modules/sovrnBidAdapter_spec.js +++ b/test/spec/modules/sovrnBidAdapter_spec.js @@ -304,30 +304,17 @@ describe('sovrnBidAdapter', function() { expect(impression.bidfloor).to.equal(2.00) }) describe('First Party Data', function () { - let sandbox - - beforeEach(function() { - sandbox = sinon.sandbox.create() - }) - afterEach(function() { - sandbox.restore() - }) it('should provide first party data if provided', function() { - sandbox.stub(config, 'getConfig').callsFake(key => { - const cfg = { - ortb2: { - site: { - keywords: 'test keyword' - }, - user: { - data: 'some user data' - } - } + const ortb2 = { + site: { + keywords: 'test keyword' + }, + user: { + data: 'some user data' } - return utils.deepAccess(cfg, key) - }) + }; - const request = spec.buildRequests([baseBidRequest], baseBidderRequest) + const request = spec.buildRequests([baseBidRequest], {...baseBidderRequest, ortb2}) const { user, site } = JSON.parse(request.data) expect(user.data).to.equal('some user data') diff --git a/test/spec/modules/tripleliftBidAdapter_spec.js b/test/spec/modules/tripleliftBidAdapter_spec.js index fc33a7cd676..f4a07f536e1 100644 --- a/test/spec/modules/tripleliftBidAdapter_spec.js +++ b/test/spec/modules/tripleliftBidAdapter_spec.js @@ -814,13 +814,7 @@ describe('triplelift adapter', function () { sens: sens, } } - sandbox.stub(config, 'getConfig').callsFake(key => { - const config = { - ortb2 - }; - return utils.deepAccess(config, key); - }); - const request = tripleliftAdapterSpec.buildRequests(bidRequests, bidderRequest); + const request = tripleliftAdapterSpec.buildRequests(bidRequests, {...bidderRequest, ortb2}); const { data: payload } = request; expect(payload.ext.fpd.user).to.not.exist; expect(payload.ext.fpd.context.ext.data).to.haveOwnProperty('category'); diff --git a/test/spec/modules/trustxBidAdapter_spec.js b/test/spec/modules/trustxBidAdapter_spec.js index b34813948fc..1e520f0e9d8 100644 --- a/test/spec/modules/trustxBidAdapter_spec.js +++ b/test/spec/modules/trustxBidAdapter_spec.js @@ -415,13 +415,11 @@ describe('TrustXAdapter', function () { someKey: 'another data' } ]; + const ortb2 = {user: {data: userData}}; - const getConfigStub = sinon.stub(config, 'getConfig').callsFake( - arg => arg === 'ortb2.user.data' ? userData : null); - const request = spec.buildRequests([bidRequests[0]], bidderRequest); + const request = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2}); const payload = parseRequest(request.data); expect(payload.user.data).to.deep.equal(userData); - getConfigStub.restore(); }); it('should have right value in user.data when jwpsegments are present', function () { @@ -438,8 +436,7 @@ describe('TrustXAdapter', function () { someKey: 'another data' } ]; - const getConfigStub = sinon.stub(config, 'getConfig').callsFake( - arg => arg === 'ortb2.user.data' ? userData : null); + const ortb2 = {user: {data: userData}}; const jsContent = {id: 'test_jw_content_id'}; const jsSegments = ['test_seg_1', 'test_seg_2']; @@ -453,7 +450,7 @@ describe('TrustXAdapter', function () { } } }); - const request = spec.buildRequests([bidRequestsWithJwTargeting], bidderRequest); + const request = spec.buildRequests([bidRequestsWithJwTargeting], {...bidderRequest, ortb2}); const payload = parseRequest(request.data); expect(payload.user.data).to.deep.equal([{ name: 'iow_labs_pub_data', @@ -462,12 +459,13 @@ describe('TrustXAdapter', function () { {name: 'jwpseg', value: jsSegments[1]} ] }, ...userData]); - getConfigStub.restore(); }); it('should contain the keyword values if it present in ortb2.(site/user)', function () { - const getConfigStub = sinon.stub(config, 'getConfig').callsFake( - arg => arg === 'ortb2.user' ? {'keywords': 'foo,any'} : (arg === 'ortb2.site' ? {'keywords': 'bar'} : null)); + const ortb2 = { + user: {'keywords': 'foo,any'}, + site: {'keywords': 'bar'} + }; const keywords = { 'site': { 'somePublisher': [ @@ -491,7 +489,7 @@ describe('TrustXAdapter', function () { } }; const bidRequestWithKW = { ...bidRequests[0], params: { ...bidRequests[0].params, keywords } } - const request = spec.buildRequests([bidRequestWithKW], bidderRequest); + const request = spec.buildRequests([bidRequestWithKW], {...bidderRequest, ortb2}); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload.ext.keywords).to.deep.equal({ @@ -536,7 +534,6 @@ describe('TrustXAdapter', function () { ] } }); - getConfigStub.restore(); }); it('should be right tmax when timeout in config is less then timeout in bidderRequest', function() { diff --git a/test/spec/modules/ttdBidAdapter_spec.js b/test/spec/modules/ttdBidAdapter_spec.js index 099e5e56c33..b99bb03f270 100644 --- a/test/spec/modules/ttdBidAdapter_spec.js +++ b/test/spec/modules/ttdBidAdapter_spec.js @@ -285,12 +285,12 @@ describe('ttdBidAdapter', function () { it('sets keywords properly if sent', function () { let clonedBannerRequests = deepClone(baseBannerBidRequests); - config.setConfig({ortb2: { + const ortb2 = { site: { keywords: 'highViewability, clothing, holiday shopping' } - }}); - const requestBody = testBuildRequests(clonedBannerRequests, baseBidderRequest).data; + }; + const requestBody = testBuildRequests(clonedBannerRequests, {...baseBidderRequest, ortb2}).data; config.resetConfig(); expect(requestBody.ext.ttdprebid.keywords).to.deep.equal(['highViewability', 'clothing', 'holiday shopping']); }); @@ -404,9 +404,7 @@ describe('ttdBidAdapter', function () { }); it('adds first party site data to the request', function () { - let clonedBidderRequest = deepClone(baseBidderRequest); - - config.setConfig({ortb2: { + const ortb2 = { site: { name: 'example', domain: 'page.example.com', @@ -417,9 +415,9 @@ describe('ttdBidAdapter', function () { ref: 'https://ref.example.com', keywords: 'power tools, drills' } - }}); + }; + let clonedBidderRequest = {...deepClone(baseBidderRequest), ortb2}; const requestBody = testBuildRequests(baseBannerBidRequests, clonedBidderRequest).data; - config.resetConfig(); expect(requestBody.site.name).to.equal('example'); expect(requestBody.site.domain).to.equal('page.example.com'); expect(requestBody.site.cat[0]).to.equal('IAB2'); diff --git a/test/spec/modules/weboramaRtdProvider_spec.js b/test/spec/modules/weboramaRtdProvider_spec.js index 0f0af4efe2f..a0fdbf1f49e 100644 --- a/test/spec/modules/weboramaRtdProvider_spec.js +++ b/test/spec/modules/weboramaRtdProvider_spec.js @@ -8,12 +8,6 @@ import { storage, DEFAULT_LOCAL_STORAGE_USER_PROFILE_KEY } from '../../../modules/weboramaRtdProvider.js'; -import { - config -} from 'src/config.js'; -import { - getGlobal -} from 'src/prebidGlobal.js'; import 'src/prebid.js'; const responseHeader = { @@ -61,10 +55,6 @@ describe('weboramaRtdProvider', function () { sandbox = sinon.sandbox.create(); storage.removeDataFromLocalStorage('webo_wam2gam_entry'); - - getGlobal().setConfig({ - ortb2: undefined - }); }); afterEach(function () { @@ -94,6 +84,10 @@ describe('weboramaRtdProvider', function () { }; const adUnitsCodes = ['adunit1', 'adunit2']; const reqBidsConfigObj = { + ortb2Fragments: { + global: {}, + bidder: {} + }, adUnits: [{ bids: [{ bidder: 'smartadserver' @@ -138,14 +132,14 @@ describe('weboramaRtdProvider', function () { expect(reqBidsConfigObj.adUnits[0].bids[3].params).to.deep.equal({ inventory: data }); - expect(reqBidsConfigObj.adUnits[0].bids[4].ortb2).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.bidder.other).to.deep.equal({ site: { ext: { data: data }, } }); - expect(getGlobal().getConfig('ortb2')).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.global).to.deep.equal({ site: { ext: { data: data @@ -175,6 +169,10 @@ describe('weboramaRtdProvider', function () { }; const adUnitsCodes = ['adunit1', 'adunit2']; const reqBidsConfigObj = { + ortb2Fragments: { + global: {}, + bidder: {} + }, adUnits: [{ bids: [{ bidder: 'smartadserver', @@ -244,8 +242,8 @@ describe('weboramaRtdProvider', function () { baz: 'bam', } }); - expect(reqBidsConfigObj.adUnits[0].bids[4].ortb2).to.be.undefined; - expect(getGlobal().getConfig('ortb2')).to.be.undefined; + expect(reqBidsConfigObj.ortb2Fragments.bidder.other).to.be.undefined; + expect(reqBidsConfigObj.ortb2Fragments.global).to.eql({}); }); it('should set gam targeting but not send to bidders with (submodule override) setPrebidTargeting=true/(global) sendToBidders=false', function () { @@ -273,6 +271,9 @@ describe('weboramaRtdProvider', function () { }; const adUnitsCodes = ['adunit1', 'adunit2']; const reqBidsConfigObj = { + ortb2Fragments: { + global: {} + }, adUnits: [{ bids: [{ bidder: 'smartadserver', @@ -305,7 +306,7 @@ describe('weboramaRtdProvider', function () { }); expect(reqBidsConfigObj.adUnits[0].bids.length).to.equal(1); - expect(getGlobal().getConfig('ortb2')).to.be.undefined; + expect(reqBidsConfigObj.ortb2Fragments.global).to.eql({}); expect(onDataResponse).to.deep.equal({ data: data, @@ -329,6 +330,10 @@ describe('weboramaRtdProvider', function () { }; const adUnitsCodes = ['adunit1', 'adunit2']; const reqBidsConfigObj = { + ortb2Fragments: { + global: {}, + bidder: {} + }, adUnits: [{ bids: [{ bidder: 'smartadserver', @@ -399,14 +404,14 @@ describe('weboramaRtdProvider', function () { baz: 'bam', } }); - expect(reqBidsConfigObj.adUnits[0].bids[4].ortb2).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.bidder.other).to.eql({ site: { ext: { data: data }, } }); - expect(getGlobal().getConfig('ortb2')).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.global).to.deep.equal({ site: { ext: { data: data @@ -439,6 +444,10 @@ describe('weboramaRtdProvider', function () { const adUnitsCodes = ['adunit1', 'adunit2']; const reqBidsConfigObj = { + ortb2Fragments: { + global: {}, + bidder: {} + }, adUnits: [{ bids: [{ bidder: 'smartadserver' @@ -482,14 +491,14 @@ describe('weboramaRtdProvider', function () { expect(reqBidsConfigObj.adUnits[0].bids[3].params).to.deep.equal({ inventory: defaultProfile }); - expect(reqBidsConfigObj.adUnits[0].bids[4].ortb2).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.bidder.other).to.eql({ site: { ext: { data: defaultProfile }, } }); - expect(getGlobal().getConfig('ortb2')).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.global).to.deep.equal({ site: { ext: { data: defaultProfile @@ -535,6 +544,10 @@ describe('weboramaRtdProvider', function () { const adUnitsCodes = ['adunit1', 'adunit2']; const reqBidsConfigObj = { + ortb2Fragments: { + global: {}, + bidder: {} + }, adUnits: [{ bids: [{ bidder: 'smartadserver' @@ -570,14 +583,14 @@ describe('weboramaRtdProvider', function () { expect(reqBidsConfigObj.adUnits[0].bids[3].params).to.deep.equal({ visitor: data }); - expect(reqBidsConfigObj.adUnits[0].bids[4].ortb2).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.bidder.other).to.eql({ user: { ext: { data: data }, } }); - expect(getGlobal().getConfig('ortb2')).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.global).to.deep.equal({ user: { ext: { data: data @@ -615,6 +628,10 @@ describe('weboramaRtdProvider', function () { const adUnitsCodes = ['adunit1', 'adunit2']; const reqBidsConfigObj = { + ortb2Fragments: { + global: {}, + bidder: {} + }, adUnits: [{ bids: [{ bidder: 'smartadserver', @@ -676,8 +693,8 @@ describe('weboramaRtdProvider', function () { baz: 'bam' } }); - expect(reqBidsConfigObj.adUnits[0].bids[4].ortb2).to.be.undefined; - expect(getGlobal().getConfig('ortb2')).to.be.undefined; + expect(reqBidsConfigObj.ortb2Fragments.bidder.other).to.be.undefined; + expect(reqBidsConfigObj.ortb2Fragments.global).to.eql({}); }); it('should set gam targeting but not send to bidders with (submodule override) setPrebidTargeting=true/(global) sendToBidders=false', function () { @@ -713,6 +730,9 @@ describe('weboramaRtdProvider', function () { const adUnitsCodes = ['adunit1', 'adunit2']; const reqBidsConfigObj = { + ortb2Fragments: { + global: {}, + }, adUnits: [{ bids: [{ bidder: 'smartadserver', @@ -738,7 +758,7 @@ describe('weboramaRtdProvider', function () { expect(reqBidsConfigObj.adUnits[0].bids.length).to.equal(1); expect(reqBidsConfigObj.adUnits[0].bids[0].params.target).to.equal('foo=bar'); - expect(getGlobal().getConfig('ortb2')).to.be.undefined; + expect(reqBidsConfigObj.ortb2Fragments.global).to.eql({}); expect(onDataResponse).to.deep.equal({ data: data, site: false, @@ -769,6 +789,10 @@ describe('weboramaRtdProvider', function () { const adUnitsCodes = ['adunit1', 'adunit2']; const reqBidsConfigObj = { + ortb2Fragments: { + global: {}, + bidder: {} + }, adUnits: [{ bids: [{ bidder: 'smartadserver', @@ -831,14 +855,14 @@ describe('weboramaRtdProvider', function () { webo_audiences: ['baz'], } }); - expect(reqBidsConfigObj.adUnits[0].bids[4].ortb2).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.bidder.other).to.deep.equal({ user: { ext: { data: data }, } }); - expect(getGlobal().getConfig('ortb2')).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.global).to.deep.equal({ user: { ext: { data: data @@ -864,6 +888,10 @@ describe('weboramaRtdProvider', function () { const adUnitsCodes = ['adunit1', 'adunit2']; const reqBidsConfigObj = { + ortb2Fragments: { + global: {}, + bidder: {} + }, adUnits: [{ bids: [{ bidder: 'smartadserver' @@ -899,14 +927,14 @@ describe('weboramaRtdProvider', function () { expect(reqBidsConfigObj.adUnits[0].bids[3].params).to.deep.equal({ visitor: defaultProfile }); - expect(reqBidsConfigObj.adUnits[0].bids[4].ortb2).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.bidder.other).to.deep.equal({ user: { ext: { data: defaultProfile }, } }); - expect(getGlobal().getConfig('ortb2')).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.global).to.deep.equal({ user: { ext: { data: defaultProfile @@ -939,6 +967,10 @@ describe('weboramaRtdProvider', function () { const adUnitsCodes = ['adunit1', 'adunit2']; const reqBidsConfigObj = { + ortb2Fragments: { + global: {}, + bidder: {} + }, adUnits: [{ bids: [{ bidder: 'smartadserver' @@ -974,14 +1006,14 @@ describe('weboramaRtdProvider', function () { expect(reqBidsConfigObj.adUnits[0].bids[3].params).to.deep.equal({ visitor: defaultProfile }); - expect(reqBidsConfigObj.adUnits[0].bids[4].ortb2).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.bidder.other).to.deep.equal({ user: { ext: { data: defaultProfile }, } }); - expect(getGlobal().getConfig('ortb2')).to.deep.equal({ + expect(reqBidsConfigObj.ortb2Fragments.global).to.deep.equal({ user: { ext: { data: defaultProfile diff --git a/test/spec/modules/yahoosspBidAdapter_spec.js b/test/spec/modules/yahoosspBidAdapter_spec.js index e301218741c..4b157865c06 100644 --- a/test/spec/modules/yahoosspBidAdapter_spec.js +++ b/test/spec/modules/yahoosspBidAdapter_spec.js @@ -16,7 +16,7 @@ const PREBID_VERSION = '$prebid.version$'; const INTEGRATION_METHOD = 'prebid.js'; // Utility functions -const generateBidRequest = ({bidId, pos, adUnitCode, adUnitType, bidOverrideObject, videoContext, pubIdMode}) => { +const generateBidRequest = ({bidId, pos, adUnitCode, adUnitType, bidOverrideObject, videoContext, pubIdMode, ortb2}) => { const bidRequest = { adUnitCode, auctionId: 'b06c5141-fe8f-4cdf-9d7d-54415490a917', @@ -30,7 +30,8 @@ const generateBidRequest = ({bidId, pos, adUnitCode, adUnitType, bidOverrideObje bidOverride: bidOverrideObject }, src: 'client', - transactionId: '5b17b67d-7704-4732-8cc9-5b1723e9bcf9' + transactionId: '5b17b67d-7704-4732-8cc9-5b1723e9bcf9', + ortb2 }; const bannerObj = { @@ -71,7 +72,7 @@ const generateBidRequest = ({bidId, pos, adUnitCode, adUnitType, bidOverrideObje return bidRequest; } -let generateBidderRequest = (bidRequestArray, adUnitCode) => { +let generateBidderRequest = (bidRequestArray, adUnitCode, ortb2 = {}) => { const bidderRequest = { adUnitCode: adUnitCode || 'default-adUnitCode', auctionId: 'd4c83a3b-18e4-4208-b98b-63848449c7aa', @@ -93,12 +94,13 @@ let generateBidderRequest = (bidRequestArray, adUnitCode) => { }, start: new Date().getTime(), timeout: 1000, + ortb2 }; return bidderRequest; }; -const generateBuildRequestMock = ({bidId, pos, adUnitCode, adUnitType, bidOverrideObject, videoContext, pubIdMode}) => { +const generateBuildRequestMock = ({bidId, pos, adUnitCode, adUnitType, bidOverrideObject, videoContext, pubIdMode, ortb2}) => { const bidRequestConfig = { bidId: bidId || DEFAULT_BID_ID, pos: pos || DEFAULT_BID_POS, @@ -106,11 +108,12 @@ const generateBuildRequestMock = ({bidId, pos, adUnitCode, adUnitType, bidOverri adUnitType: adUnitType || DEFAULT_AD_UNIT_TYPE, bidOverrideObject: bidOverrideObject || DEFAULT_PARAMS_BID_OVERRIDE, videoContext: videoContext || DEFAULT_VIDEO_CONTEXT, - pubIdMode: pubIdMode || false + pubIdMode: pubIdMode || false, + ortb2: ortb2 || {} }; const bidRequest = generateBidRequest(bidRequestConfig); const validBidRequests = [bidRequest]; - const bidderRequest = generateBidderRequest(validBidRequests, adUnitCode); + const bidderRequest = generateBidderRequest(validBidRequests, adUnitCode, ortb2); return { bidRequest, validBidRequests, bidderRequest } }; @@ -355,10 +358,9 @@ describe('YahooSSP Bid Adapter:', () => { // Should not allow invalid "site" data types const INVALID_ORTB2_TYPES = [ null, [], 123, 'unsupportedKeyName', true, false, undefined ]; INVALID_ORTB2_TYPES.forEach(param => { - const ortb2 = { site: param } - config.setConfig({ortb2}); it(`should not allow invalid site types to be added to bid-request: ${JSON.stringify(param)}`, () => { - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const ortb2 = { site: param } + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.site[param]).to.be.undefined; }); @@ -375,8 +377,7 @@ describe('YahooSSP Bid Adapter:', () => { [param]: 'something' } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.site[param]).to.exist; expect(data.site[param]).to.be.a('string'); @@ -391,8 +392,7 @@ describe('YahooSSP Bid Adapter:', () => { [param]: ['something'] } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.site[param]).to.exist; expect(data.site[param]).to.be.a('array'); @@ -408,8 +408,7 @@ describe('YahooSSP Bid Adapter:', () => { content: param } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.site.content).to.be.undefined; }); @@ -426,8 +425,7 @@ describe('YahooSSP Bid Adapter:', () => { } } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.site.content).to.be.a('object'); }); @@ -443,8 +441,7 @@ describe('YahooSSP Bid Adapter:', () => { } } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.site.content[param]).to.exist; expect(data.site.content[param]).to.be.a('string'); @@ -462,8 +459,7 @@ describe('YahooSSP Bid Adapter:', () => { } } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.site.content[param]).to.be.a('number'); expect(data.site.content[param]).to.be.equal(ortb2.site.content[param]); @@ -480,8 +476,7 @@ describe('YahooSSP Bid Adapter:', () => { } } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.site.content[param]).to.be.a('array'); expect(data.site.content[param]).to.be.equal(ortb2.site.content[param]); @@ -498,8 +493,7 @@ describe('YahooSSP Bid Adapter:', () => { } } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.site.content[param]).to.be.a('object'); expect(data.site.content[param]).to.be.equal(ortb2.site.content[param]); @@ -513,10 +507,9 @@ describe('YahooSSP Bid Adapter:', () => { // Should not allow invalid "user" data types const INVALID_ORTB2_TYPES = [ null, [], 'unsupportedKeyName', true, false, undefined ]; INVALID_ORTB2_TYPES.forEach(param => { - const ortb2 = { user: param } - config.setConfig({ortb2}); it(`should not allow invalid site types to be added to bid-request: ${JSON.stringify(param)}`, () => { - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const ortb2 = { user: param } + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.user[param]).to.be.undefined; }); @@ -531,8 +524,7 @@ describe('YahooSSP Bid Adapter:', () => { [param]: 'something' } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.user[param]).to.exist; expect(data.user[param]).to.be.a('string'); @@ -548,8 +540,7 @@ describe('YahooSSP Bid Adapter:', () => { [param]: 1982 } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.user[param]).to.exist; expect(data.user[param]).to.be.a('number'); @@ -565,8 +556,7 @@ describe('YahooSSP Bid Adapter:', () => { [param]: ['something'] } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.user[param]).to.exist; expect(data.user[param]).to.be.a('array'); @@ -582,8 +572,7 @@ describe('YahooSSP Bid Adapter:', () => { [param]: {a: '123', b: '456'} } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.user[param]).to.be.a('object'); expect(data.user[param]).to.be.deep.include({[param]: {a: '123', b: '456'}}); @@ -605,8 +594,7 @@ describe('YahooSSP Bid Adapter:', () => { } } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.user.data[0][param]).to.exist; expect(data.user.data[0][param]).to.be.a('string'); @@ -625,8 +613,7 @@ describe('YahooSSP Bid Adapter:', () => { data: [{[param]: [{id: 1}]}] } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.user.data[0][param]).to.exist; expect(data.user.data[0][param]).to.be.a('array'); @@ -642,8 +629,7 @@ describe('YahooSSP Bid Adapter:', () => { data: [{[param]: {id: 'ext'}}] } }; - config.setConfig({ortb2}); - const { validBidRequests, bidderRequest } = generateBuildRequestMock({}); + const { validBidRequests, bidderRequest } = generateBuildRequestMock({ortb2}); const data = spec.buildRequests(validBidRequests, bidderRequest)[0].data; expect(data.user.data[0][param]).to.exist; expect(data.user.data[0][param]).to.be.a('object'); diff --git a/test/spec/modules/yieldlabBidAdapter_spec.js b/test/spec/modules/yieldlabBidAdapter_spec.js index e4d258ecdea..2811d6b1370 100644 --- a/test/spec/modules/yieldlabBidAdapter_spec.js +++ b/test/spec/modules/yieldlabBidAdapter_spec.js @@ -229,10 +229,8 @@ describe('yieldlabBidAdapter', function () { 'supplyId': '2222' } } - config.setConfig(siteConfig); - const request = spec.buildRequests([requestWithoutIabContent]) + const request = spec.buildRequests([{...requestWithoutIabContent, ...siteConfig}]) expect(request.url).to.include('iab_content=id%3Aid_from_config') - config.resetConfig(); }) const refererRequest = spec.buildRequests(bidRequests, { diff --git a/test/spec/unit/core/adapterManager_spec.js b/test/spec/unit/core/adapterManager_spec.js index 88beaa88a67..dcbc098305c 100644 --- a/test/spec/unit/core/adapterManager_spec.js +++ b/test/spec/unit/core/adapterManager_spec.js @@ -1711,6 +1711,83 @@ describe('adapterManager tests', function () { expect(sizes1).not.to.deep.equal(sizes2); }); + it('should make FPD available under `ortb2`', () => { + const global = { + k1: 'v1', + k2: { + k3: 'v3', + k4: 'v4' + } + }; + const bidder = { + 'appnexus': { + ka: 'va', + k2: { + k3: 'override', + k5: 'v5' + } + } + }; + const requests = Object.fromEntries( + adapterManager.makeBidRequests(adUnits, 123, 'auction-id', 123, [], {global, bidder}) + .map((r) => [r.bidderCode, r]) + ); + sinon.assert.match(requests, { + rubicon: { + ortb2: global + }, + appnexus: { + ortb2: { + k1: 'v1', + ka: 'va', + k2: { + k3: 'override', + k4: 'v4', + k5: 'v5', + } + } + } + }); + requests.rubicon.bids.forEach((bid) => expect(bid.ortb2).to.eql(requests.rubicon.ortb2)); + requests.appnexus.bids.forEach((bid) => expect(bid.ortb2).to.eql(requests.appnexus.ortb2)); + }); + + describe('when calling the s2s adapter', () => { + beforeEach(() => { + config.setConfig({ + s2sConfig: { + enabled: true, + adapter: 'mockS2S', + bidders: ['appnexus'] + } + }) + adapterManager.bidderRegistry.mockS2S = { + callBids: sinon.stub() + }; + }); + afterEach(() => { + config.resetConfig(); + delete adapterManager.bidderRegistry.mockS2S; + }) + + it('should pass FPD', () => { + const ortb2Fragments = {}; + const req = { + bidderCode: 'appnexus', + src: CONSTANTS.S2S.SRC, + adUnitsS2SCopy: adUnits, + bids: [{ + bidder: 'appnexus', + src: CONSTANTS.S2S.SRC + }] + }; + adapterManager.callBids(adUnits, [req], sinon.stub(), sinon.stub(), {request: sinon.stub(), done: sinon.stub()}, 1000, sinon.stub(), ortb2Fragments); + sinon.assert.calledWith(adapterManager.bidderRegistry.mockS2S.callBids, sinon.match({ + ortb2Fragments: sinon.match.same(ortb2Fragments) + })); + }); + }) + describe('setBidderSequence', function () { beforeEach(function () { sinon.spy(utils, 'shuffle'); diff --git a/test/spec/unit/pbjs_api_spec.js b/test/spec/unit/pbjs_api_spec.js index 6a7c79fe49d..4ec4f3b841c 100644 --- a/test/spec/unit/pbjs_api_spec.js +++ b/test/spec/unit/pbjs_api_spec.js @@ -17,8 +17,9 @@ import { registerBidder } from 'src/adapters/bidderFactory.js'; import { _sendAdToCreative } from 'src/secureCreatives.js'; import {find} from 'src/polyfill.js'; import {synchronizePromise} from '../../helpers/syncPromise.js'; -import 'src/prebid.js'; +import * as pbjsModule from 'src/prebid.js'; import {hook} from '../../../src/hook.js'; +import $$PREBID_GLOBAL$$ from 'src/prebid.js'; var assert = require('chai').assert; var expect = require('chai').expect; @@ -33,7 +34,6 @@ require('modules/appnexusBidAdapter'); var config = require('test/fixtures/config.json'); -$$PREBID_GLOBAL$$ = $$PREBID_GLOBAL$$ || {}; var adUnits = getAdUnits(); var adUnitCodes = getAdUnits().map(unit => unit.code); var bidsBackHandler = function() {}; @@ -1605,8 +1605,124 @@ describe('Unit: Prebid Module', function () { assert.ok(spyExecuteCallback.calledOnce, 'callback executed when bidRequests is empty'); }); }); + + describe('starts auction', () => { + let startAuctionStub; + function saHook(fn, ...args) { + return startAuctionStub(...args); + } + beforeEach(() => { + startAuctionStub = sinon.stub(); + pbjsModule.startAuction.before(saHook); + configObj.resetConfig(); + }); + afterEach(() => { + pbjsModule.startAuction.getHooks({hook: saHook}).remove(); + }) + after(() => { + configObj.resetConfig(); + }); + + it('passing global and auction-level FPD as ortb2Fragments.global', () => { + configObj.setConfig({ + ortb2: { + 'k1': 'v1', + 'k2': { + 'k3': 'v3', + 'k4': 'v4' + } + } + }); + $$PREBID_GLOBAL$$.requestBids({ + ortb2: { + 'k5': 'v5', + 'k2': { + 'k3': 'override', + 'k7': 'v7' + } + } + }); + sinon.assert.calledWith(startAuctionStub, sinon.match({ + ortb2Fragments: { + global: { + 'k1': 'v1', + 'k5': 'v5', + 'k2': { + 'k3': 'override', + 'k4': 'v4', + 'k7': 'v7' + } + } + } + })) + }); + it('passing bidder-specific FPD as ortb2Fragments.bidder', () => { + configObj.setBidderConfig({ + bidders: ['bidderA', 'bidderC'], + config: { + ortb2: { + k1: 'v1' + } + } + }); + configObj.setBidderConfig({ + bidders: ['bidderB'], + config: { + ortb2: { + k2: 'v2' + } + } + }); + $$PREBID_GLOBAL$$.requestBids({}); + sinon.assert.calledWith(startAuctionStub, sinon.match({ + ortb2Fragments: { + bidder: { + bidderA: { + k1: 'v1' + }, + bidderB: { + k2: 'v2' + }, + bidderC: { + k1: 'v1' + } + } + } + })); + }); + }); }); + describe('startAuction', () => { + let sandbox, newAuctionStub; + beforeEach(() => { + sandbox = sinon.createSandbox(); + newAuctionStub = sandbox.stub(auctionManager, 'createAuction').callsFake(() => ({ + getAuctionId: () => 'mockAuctionId', + callBids: sinon.stub() + })); + }); + + afterEach(() => { + sandbox.restore(); + }); + + it('passes ortb2 fragments to createAuction', () => { + const ortb2Fragments = {}; + pbjsModule.startAuction({ + adUnits: [{ + code: 'au', + mediaTypes: {banner: {sizes: [[300, 250]]}}, + bids: [{bidder: 'bd'}] + }], + ortb2Fragments + }); + sinon.assert.calledWith(newAuctionStub, sinon.match({ + ortb2Fragments: sinon.match.same(ortb2Fragments) + })); + }); + }) + describe('requestBids', function () { var adUnitsBackup; var auctionManagerStub;