diff --git a/libraries/ortb2Utils/currency.js b/libraries/ortb2Utils/currency.js new file mode 100644 index 00000000000..5c2c6b7956d --- /dev/null +++ b/libraries/ortb2Utils/currency.js @@ -0,0 +1,3 @@ +export function getCurrencyFromBidderRequest(bidderRequest) { + return bidderRequest?.ortb2?.ext?.prebid?.adServerCurrency; +} diff --git a/modules/adfBidAdapter.js b/modules/adfBidAdapter.js index b74c3efc628..dc2cab498ea 100644 --- a/modules/adfBidAdapter.js +++ b/modules/adfBidAdapter.js @@ -6,6 +6,7 @@ import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js'; import {deepAccess, deepClone, deepSetValue, mergeDeep, parseSizesInput, setOnAny} from '../src/utils.js'; import {config} from '../src/config.js'; import {Renderer} from '../src/Renderer.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; const { getConfig } = config; @@ -60,7 +61,7 @@ export const spec = { const pt = setOnAny(validBidRequests, 'params.pt') || setOnAny(validBidRequests, 'params.priceType') || 'net'; const tid = bidderRequest.ortb2?.source?.tid; const test = setOnAny(validBidRequests, 'params.test'); - const currency = getConfig('currency.adServerCurrency'); + const currency = getCurrencyFromBidderRequest(bidderRequest); const cur = currency && [ currency ]; const eids = setOnAny(validBidRequests, 'userIdAsEids'); const schain = setOnAny(validBidRequests, 'schain'); diff --git a/modules/adgenerationBidAdapter.js b/modules/adgenerationBidAdapter.js index 16375d92194..3ef9e495ea2 100644 --- a/modules/adgenerationBidAdapter.js +++ b/modules/adgenerationBidAdapter.js @@ -1,10 +1,10 @@ -import {deepAccess, getBidIdParameter} from '../src/utils.js'; -import {registerBidder} from '../src/adapters/bidderFactory.js'; -import {BANNER, NATIVE} from '../src/mediaTypes.js'; -import {config} from '../src/config.js'; -import {convertOrtbRequestToProprietaryNative} from '../src/native.js'; -import {tryAppendQueryString} from '../libraries/urlUtils/urlUtils.js'; -import {escapeUnsafeChars} from '../libraries/htmlEscape/htmlEscape.js'; +import { escapeUnsafeChars } from '../libraries/htmlEscape/htmlEscape.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; +import { tryAppendQueryString } from '../libraries/urlUtils/urlUtils.js'; +import { registerBidder } from '../src/adapters/bidderFactory.js'; +import { BANNER, NATIVE } from '../src/mediaTypes.js'; +import { convertOrtbRequestToProprietaryNative } from '../src/native.js'; +import { deepAccess, getBidIdParameter } from '../src/utils.js'; /** * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest @@ -61,7 +61,7 @@ export const spec = { data = tryAppendQueryString(data, 't', 'json3'); data = tryAppendQueryString(data, 'transactionid', validReq.ortb2Imp?.ext?.tid); data = tryAppendQueryString(data, 'sizes', getSizes(validReq)); - data = tryAppendQueryString(data, 'currency', getCurrencyType()); + data = tryAppendQueryString(data, 'currency', getCurrencyType(bidderRequest)); data = tryAppendQueryString(data, 'pbver', '$prebid.version$'); data = tryAppendQueryString(data, 'sdkname', 'prebidjs'); data = tryAppendQueryString(data, 'adapterver', ADGENE_PREBID_VERSION); @@ -94,7 +94,8 @@ export const spec = { method: 'GET', url: url, data: data, - bidRequest: validBidRequests[i] + bidRequest: validBidRequests[i], + bidderRequest }); } return serverRequests; @@ -119,7 +120,7 @@ export const spec = { height: body.h ? body.h : 1, creativeId: body.creativeid || '', dealId: body.dealid || '', - currency: getCurrencyType(), + currency: getCurrencyFromBidderRequest(bidRequests.bidderRequest), netRevenue: true, ttl: body.ttl || 10, }; @@ -304,9 +305,9 @@ function getSizes(validReq) { /** * @return {?string} USD or JPY */ -function getCurrencyType() { - if (config.getConfig('currency.adServerCurrency') && config.getConfig('currency.adServerCurrency').toUpperCase() === 'USD') return 'USD'; - return 'JPY'; +function getCurrencyType(bidderRequest) { + const adServerCurrency = getCurrencyFromBidderRequest(bidderRequest) || '' + return adServerCurrency.toUpperCase() === 'USD' ? 'USD' : 'JPY' } /** diff --git a/modules/admaticBidAdapter.js b/modules/admaticBidAdapter.js index ed38cc975e8..2a3ec5499e6 100644 --- a/modules/admaticBidAdapter.js +++ b/modules/admaticBidAdapter.js @@ -1,8 +1,8 @@ -import {getValue, formatQS, logError, deepAccess, isArray, getBidIdParameter} from '../src/utils.js'; -import { registerBidder } from '../src/adapters/bidderFactory.js'; -import { config } from '../src/config.js'; -import { BANNER, VIDEO, NATIVE } from '../src/mediaTypes.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; import { Renderer } from '../src/Renderer.js'; +import { registerBidder } from '../src/adapters/bidderFactory.js'; +import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js'; +import { deepAccess, formatQS, getBidIdParameter, getValue, isArray, logError } from '../src/utils.js'; import {getUserSyncParams} from '../libraries/userSyncUtils/userSyncUtils.js'; import { interpretNativeAd } from '../libraries/precisoUtils/bidNativeUtils.js'; @@ -56,6 +56,7 @@ export const spec = { const ortb = bidderRequest.ortb2; const networkId = getValue(validBidRequests[0].params, 'networkId'); let host = getValue(validBidRequests[0].params, 'host'); + const currency = getCurrencyFromBidderRequest(bidderRequest) || 'TRY'; const bidderName = validBidRequests[0].bidder; const payload = { @@ -84,10 +85,7 @@ export const spec = { tmax: parseInt(tmax) }; - if (config.getConfig('currency.adServerCurrency')) { - payload.ext.cur = config.getConfig('currency.adServerCurrency'); - } - + payload.ext.cur = currency; if (bidderRequest && bidderRequest.gdprConsent && bidderRequest.gdprConsent.gdprApplies) { const consentStr = (bidderRequest.gdprConsent.consentString) ? bidderRequest.gdprConsent.consentString.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '') : ''; diff --git a/modules/adotBidAdapter.js b/modules/adotBidAdapter.js index 18c7e9265bf..3924537061c 100644 --- a/modules/adotBidAdapter.js +++ b/modules/adotBidAdapter.js @@ -1,11 +1,12 @@ -import {Renderer} from '../src/Renderer.js'; -import {registerBidder} from '../src/adapters/bidderFactory.js'; -import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js'; -import {isArray, isBoolean, isFn, isPlainObject, isStr, logError, replaceAuctionPrice} from '../src/utils.js'; -import {find} from '../src/polyfill.js'; -import {config} from '../src/config.js'; -import {OUTSTREAM} from '../src/video.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; +import { Renderer } from '../src/Renderer.js'; +import { registerBidder } from '../src/adapters/bidderFactory.js'; +import { config } from '../src/config.js'; +import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js'; import { convertOrtbRequestToProprietaryNative } from '../src/native.js'; +import { find } from '../src/polyfill.js'; +import { isArray, isBoolean, isFn, isPlainObject, isStr, logError, replaceAuctionPrice } from '../src/utils.js'; +import { OUTSTREAM } from '../src/video.js'; import { NATIVE_ASSETS_IDS as NATIVE_ID_MAPPING, NATIVE_ASSETS as NATIVE_PLACEMENTS } from '../libraries/braveUtils/nativeAssets.js'; /** @@ -310,7 +311,7 @@ function buildImpFromAdUnit(adUnit, bidderRequest) { if (!mediaType) return null; const media = IMP_BUILDER[mediaType](mediaTypes[mediaType], bidderRequest, adUnit) - const currency = config.getConfig('currency.adServerCurrency') || DEFAULT_CURRENCY; + const currency = getCurrencyFromBidderRequest(bidderRequest) || DEFAULT_CURRENCY; const bidfloor = getMainFloor(adUnit, media.format, mediaType, currency); return { diff --git a/modules/audiencerunBidAdapter.js b/modules/audiencerunBidAdapter.js index 2e3125e8aa0..df3bbda6a53 100644 --- a/modules/audiencerunBidAdapter.js +++ b/modules/audiencerunBidAdapter.js @@ -1,3 +1,7 @@ +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; +import { registerBidder } from '../src/adapters/bidderFactory.js'; +import { config } from '../src/config.js'; +import { BANNER } from '../src/mediaTypes.js'; import { _each, deepAccess, @@ -8,9 +12,6 @@ import { logError, triggerPixel, } from '../src/utils.js'; -import {config} from '../src/config.js'; -import {registerBidder} from '../src/adapters/bidderFactory.js'; -import {BANNER} from '../src/mediaTypes.js'; /** * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest @@ -136,7 +137,7 @@ export const spec = { referer: deepAccess(bidderRequest, 'refererInfo.topmostLocation'), // TODO: please do not send internal data structures over the network refererInfo: deepAccess(bidderRequest, 'refererInfo.legacy'), - currencyCode: config.getConfig('currency.adServerCurrency'), + currencyCode: getCurrencyFromBidderRequest(bidderRequest), timeout: config.getConfig('bidderTimeout'), bids, }; diff --git a/modules/beopBidAdapter.js b/modules/beopBidAdapter.js index 5b9e57628c6..a24579af9a9 100644 --- a/modules/beopBidAdapter.js +++ b/modules/beopBidAdapter.js @@ -1,3 +1,7 @@ +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; +import { getAllOrtbKeywords } from '../libraries/keywords/keywords.js'; +import { registerBidder } from '../src/adapters/bidderFactory.js'; +import { getRefererInfo } from '../src/refererDetection.js'; import { buildUrl, deepAccess, generateUUID, getBidIdParameter, @@ -8,11 +12,7 @@ import { logWarn, triggerPixel } from '../src/utils.js'; -import {getRefererInfo} from '../src/refererDetection.js'; -import {registerBidder} from '../src/adapters/bidderFactory.js'; import { getStorageManager } from '../src/storageManager.js'; -import {config} from '../src/config.js'; -import {getAllOrtbKeywords} from '../libraries/keywords/keywords.js'; /** * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid @@ -56,7 +56,7 @@ export const spec = { * @return ServerRequest Info describing the request to the BeOp's server */ buildRequests: function(validBidRequests, bidderRequest) { - const slots = validBidRequests.map(beOpRequestSlotsMaker); + const slots = validBidRequests.map((bid) => beOpRequestSlotsMaker(bid, bidderRequest)); const firstPartyData = bidderRequest.ortb2 || {}; const psegs = firstPartyData.user?.ext?.permutive || firstPartyData.user?.ext?.data?.permutive || []; const userBpSegs = firstPartyData.user?.ext?.bpsegs || firstPartyData.user?.ext?.data?.bpsegs || []; @@ -159,9 +159,9 @@ function buildTrackingParams(data, info, value) { }; } -function beOpRequestSlotsMaker(bid) { +function beOpRequestSlotsMaker(bid, bidderRequest) { const bannerSizes = deepAccess(bid, 'mediaTypes.banner.sizes'); - const publisherCurrency = config.getConfig('currency.adServerCurrency') || getValue(bid.params, 'currency') || 'EUR'; + const publisherCurrency = getCurrencyFromBidderRequest(bidderRequest) || getValue(bid.params, 'currency') || 'EUR'; let floor; if (typeof bid.getFloor === 'function') { const floorInfo = bid.getFloor({currency: publisherCurrency, mediaType: 'banner', size: [1, 1]}); diff --git a/modules/carodaBidAdapter.js b/modules/carodaBidAdapter.js index a2370a13942..ebe4686630f 100644 --- a/modules/carodaBidAdapter.js +++ b/modules/carodaBidAdapter.js @@ -1,7 +1,9 @@ // jshint esversion: 6, es3: false, node: true 'use strict' +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; +import { config } from '../src/config.js'; import { BANNER, VIDEO } from '../src/mediaTypes.js'; import { deepAccess, @@ -11,7 +13,6 @@ import { sizeTupleToRtbSize, sizesToSizeTuples } from '../src/utils.js'; -import { config } from '../src/config.js'; const { getConfig } = config; @@ -45,7 +46,7 @@ export const spec = { getFirstWithKey(validBidRequests, 'params.priceType') || 'net'; const test = getFirstWithKey(validBidRequests, 'params.test'); - const currency = getConfig('currency.adServerCurrency'); + const currency = getCurrencyFromBidderRequest(bidderRequest); const eids = getFirstWithKey(validBidRequests, 'userIdAsEids'); const schain = getFirstWithKey(validBidRequests, 'schain'); const request = { diff --git a/modules/cointrafficBidAdapter.js b/modules/cointrafficBidAdapter.js index 3b90529b6cc..c626d1f56aa 100644 --- a/modules/cointrafficBidAdapter.js +++ b/modules/cointrafficBidAdapter.js @@ -2,6 +2,7 @@ import { parseSizesInput, logError, isEmpty } from '../src/utils.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; import { BANNER } from '../src/mediaTypes.js' import { config } from '../src/config.js' +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; /** * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest @@ -45,7 +46,7 @@ export const spec = { const sizes = parseSizesInput(bidRequest.params.size || bidRequest.sizes); const currency = config.getConfig(`currency.bidderCurrencyDefault.${BIDDER_CODE}`) || - config.getConfig('currency.adServerCurrency') || + getCurrencyFromBidderRequest(bidderRequest) || DEFAULT_CURRENCY; if (ALLOWED_CURRENCIES.indexOf(currency) === -1) { diff --git a/modules/currency.js b/modules/currency.js index d040dc2cf49..b149a1934c3 100644 --- a/modules/currency.js +++ b/modules/currency.js @@ -1,4 +1,4 @@ -import {logError, logInfo, logMessage, logWarn} from '../src/utils.js'; +import {deepSetValue, logError, logInfo, logMessage, logWarn} from '../src/utils.js'; import {getGlobal} from '../src/prebidGlobal.js'; import { EVENTS, REJECTION_REASON } from '../src/constants.js'; import {ajax} from '../src/ajax.js'; @@ -8,6 +8,7 @@ import {defer} from '../src/utils/promise.js'; import {registerOrtbProcessor, REQUEST} from '../src/pbjsORTB.js'; import {timedAuctionHook, timedBidResponseHook} from '../src/utils/perfMetrics.js'; import {on as onEvent, off as offEvent} from '../src/events.js'; +import { enrichFPD } from '../src/fpd/enrichment.js'; import { timeoutQueue } from '../libraries/timeoutQueue/timeoutQueue.js'; const DEFAULT_CURRENCY_RATE_URL = 'https://cdn.jsdelivr.net/gh/prebid/currency-file@1/latest.json?date=$$TODAY$$'; @@ -171,6 +172,7 @@ function initCurrency() { getGlobal().convertCurrency = (cpm, fromCurrency, toCurrency) => parseFloat(cpm) * getCurrencyConversion(fromCurrency, toCurrency); getHook('addBidResponse').before(addBidResponseHook, 100); getHook('responsesReady').before(responsesReadyHook); + enrichFPD.before(enrichFPDHook); getHook('requestBids').before(requestBidsHook, 50); onEvent(EVENTS.AUCTION_TIMEOUT, rejectOnAuctionTimeout); onEvent(EVENTS.AUCTION_INIT, loadRates); @@ -178,10 +180,11 @@ function initCurrency() { } } -function resetCurrency() { +export function resetCurrency() { if (currencySupportEnabled) { getHook('addBidResponse').getHooks({hook: addBidResponseHook}).remove(); getHook('responsesReady').getHooks({hook: responsesReadyHook}).remove(); + enrichFPD.getHooks({hook: enrichFPDHook}).remove(); getHook('requestBids').getHooks({hook: requestBidsHook}).remove(); offEvent(EVENTS.AUCTION_TIMEOUT, rejectOnAuctionTimeout); offEvent(EVENTS.AUCTION_INIT, loadRates); @@ -347,6 +350,13 @@ export function setOrtbCurrency(ortbRequest, bidderRequest, context) { registerOrtbProcessor({type: REQUEST, name: 'currency', fn: setOrtbCurrency}); +function enrichFPDHook(next, fpd) { + return next(fpd.then(ortb2 => { + deepSetValue(ortb2, 'ext.prebid.adServerCurrency', adServerCurrency); + return ortb2; + })) +} + export const requestBidsHook = timedAuctionHook('currency', function requestBidsHook(fn, reqBidsConfigObj) { const continueAuction = ((that) => () => fn.call(that, reqBidsConfigObj))(this); diff --git a/modules/deltaprojectsBidAdapter.js b/modules/deltaprojectsBidAdapter.js index bf5489322c9..2111643b344 100644 --- a/modules/deltaprojectsBidAdapter.js +++ b/modules/deltaprojectsBidAdapter.js @@ -1,5 +1,6 @@ -import {registerBidder} from '../src/adapters/bidderFactory.js'; -import {BANNER} from '../src/mediaTypes.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; +import { registerBidder } from '../src/adapters/bidderFactory.js'; +import { BANNER } from '../src/mediaTypes.js'; import { _each, _map, @@ -11,7 +12,6 @@ import { logWarn, setOnAny } from '../src/utils.js'; -import {config} from '../src/config.js'; export const BIDDER_CODE = 'deltaprojects'; export const BIDDER_ENDPOINT_URL = 'https://d5p.de17a.com/dogfight/prebid'; @@ -74,7 +74,7 @@ function buildRequests(validBidRequests, bidderRequest) { // build bid specific return validBidRequests.map(validBidRequest => { - const openRTBRequest = buildOpenRTBRequest(validBidRequest, id, site, device, user, tmax, regs); + const openRTBRequest = buildOpenRTBRequest(validBidRequest, bidderRequest, id, site, device, user, tmax, regs); return { method: 'POST', url: BIDDER_ENDPOINT_URL, @@ -85,9 +85,9 @@ function buildRequests(validBidRequests, bidderRequest) { }); } -function buildOpenRTBRequest(validBidRequest, id, site, device, user, tmax, regs) { +function buildOpenRTBRequest(validBidRequest, bidderRequest, id, site, device, user, tmax, regs) { // build cur - const currency = config.getConfig('currency.adServerCurrency') || deepAccess(validBidRequest, 'params.currency'); + const currency = getCurrencyFromBidderRequest(bidderRequest) || deepAccess(validBidRequest, 'params.currency'); const cur = currency && [currency]; // build impression diff --git a/modules/dianomiBidAdapter.js b/modules/dianomiBidAdapter.js index 777878b5207..3e90a76cf9e 100644 --- a/modules/dianomiBidAdapter.js +++ b/modules/dianomiBidAdapter.js @@ -15,6 +15,7 @@ import { import { config } from '../src/config.js'; import { Renderer } from '../src/Renderer.js'; import { convertOrtbRequestToProprietaryNative } from '../src/native.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; import {getUserSyncParams} from '../libraries/userSyncUtils/userSyncUtils.js'; const { getConfig } = config; @@ -115,7 +116,7 @@ export const spec = { setOnAny(validBidRequests, 'params.priceType') || 'net'; const tid = bidderRequest.ortb2?.source?.tid; - const currency = getConfig('currency.adServerCurrency'); + const currency = getCurrencyFromBidderRequest(bidderRequest); const cur = currency && [currency]; const eids = setOnAny(validBidRequests, 'userIdAsEids'); const schain = setOnAny(validBidRequests, 'schain'); diff --git a/modules/dsp_genieeBidAdapter.js b/modules/dsp_genieeBidAdapter.js index 57aafd47fc8..f97c13379f3 100644 --- a/modules/dsp_genieeBidAdapter.js +++ b/modules/dsp_genieeBidAdapter.js @@ -3,6 +3,7 @@ import { BANNER } from '../src/mediaTypes.js'; import { ortbConverter } from '../libraries/ortbConverter/converter.js'; import { deepAccess, deepSetValue } from '../src/utils.js'; import { config } from '../src/config.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; /** * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest @@ -71,7 +72,7 @@ export const spec = { if (deepAccess(bidderRequest, 'gdprConsent.gdprApplies') || // gdpr USPConsent(bidderRequest.uspConsent) || // usp config.getConfig('coppa') || // coppa - invalidCurrency(config.getConfig('currency.adServerCurrency')) // currency validation + invalidCurrency(getCurrencyFromBidderRequest(bidderRequest)) // currency validation ) { return { method: 'GET', diff --git a/modules/finativeBidAdapter.js b/modules/finativeBidAdapter.js index e7613bf9cce..0cdcae15e61 100644 --- a/modules/finativeBidAdapter.js +++ b/modules/finativeBidAdapter.js @@ -4,8 +4,8 @@ import {registerBidder} from '../src/adapters/bidderFactory.js'; import {NATIVE} from '../src/mediaTypes.js'; import {_map, deepSetValue, isEmpty, setOnAny} from '../src/utils.js'; -import {config} from '../src/config.js'; import {convertOrtbRequestToProprietaryNative} from '../src/native.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; const BIDDER_CODE = 'finative'; const DEFAULT_CUR = 'EUR'; @@ -64,7 +64,7 @@ export const spec = { validBidRequests = convertOrtbRequestToProprietaryNative(validBidRequests); const pt = setOnAny(validBidRequests, 'params.pt') || setOnAny(validBidRequests, 'params.priceType') || 'net'; const tid = bidderRequest.ortb2?.source?.tid; - const cur = [config.getConfig('currency.adServerCurrency') || DEFAULT_CUR]; + const cur = [getCurrencyFromBidderRequest(bidderRequest) || DEFAULT_CUR]; let url = bidderRequest.refererInfo.referer; const imp = validBidRequests.map((bid, id) => { diff --git a/modules/gmosspBidAdapter.js b/modules/gmosspBidAdapter.js index d7af51f7312..e0a5861f40c 100644 --- a/modules/gmosspBidAdapter.js +++ b/modules/gmosspBidAdapter.js @@ -1,3 +1,7 @@ +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; +import { tryAppendQueryString } from '../libraries/urlUtils/urlUtils.js'; +import { registerBidder } from '../src/adapters/bidderFactory.js'; +import { BANNER } from '../src/mediaTypes.js'; import { createTrackPixelHtml, deepAccess, @@ -7,10 +11,6 @@ import { isEmpty, logError } from '../src/utils.js'; -import {registerBidder} from '../src/adapters/bidderFactory.js'; -import {config} from '../src/config.js'; -import {BANNER} from '../src/mediaTypes.js'; -import {tryAppendQueryString} from '../libraries/urlUtils/urlUtils.js'; /** * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest @@ -50,7 +50,7 @@ export const spec = { const bidRequests = []; const urlInfo = getUrlInfo(bidderRequest.refererInfo); - const cur = getCurrencyType(); + const cur = getCurrencyType(bidderRequest); const dnt = getDNT() ? '1' : '0'; for (let i = 0; i < validBidRequests.length; i++) { @@ -156,11 +156,8 @@ export const spec = { }; -function getCurrencyType() { - if (config.getConfig('currency.adServerCurrency')) { - return config.getConfig('currency.adServerCurrency'); - } - return 'JPY'; +function getCurrencyType(bidderRequest) { + return getCurrencyFromBidderRequest(bidderRequest) || 'JPY'; } function getUrlInfo(refererInfo) { diff --git a/modules/koblerBidAdapter.js b/modules/koblerBidAdapter.js index 54e70686fcc..9cde2e96d4e 100644 --- a/modules/koblerBidAdapter.js +++ b/modules/koblerBidAdapter.js @@ -7,10 +7,22 @@ import { replaceAuctionPrice, triggerPixel } from '../src/utils.js'; -import {config} from '../src/config.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import {BANNER} from '../src/mediaTypes.js'; import {getRefererInfo} from '../src/refererDetection.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; + +const additionalData = new WeakMap(); + +export function setAdditionalData(obj, key, value) { + const prevValue = additionalData.get(obj) || {}; + additionalData.set(obj, { ...prevValue, [key]: value }); +} + +export function getAdditionalData(obj, key) { + const data = additionalData.get(obj) || {}; + return data[key]; +} const BIDDER_CODE = 'kobler'; const BIDDER_ENDPOINT = 'https://bid.essrtb.com/bid/prebid_rtb_call'; @@ -36,17 +48,18 @@ export const buildRequests = function (validBidRequests, bidderRequest) { data: buildOpenRtbBidRequestPayload(validBidRequests, bidderRequest), options: { contentType: 'application/json' - } + }, + bidderRequest }; }; -export const interpretResponse = function (serverResponse) { +export const interpretResponse = function (serverResponse, request) { const res = serverResponse.body; const bids = [] if (res) { res.seatbid.forEach(sb => { sb.bid.forEach(b => { - bids.push({ + const bid = { requestId: b.impid, cpm: b.price, currency: res.cur, @@ -61,20 +74,24 @@ export const interpretResponse = function (serverResponse) { meta: { advertiserDomains: b.adomain } - }) + } + setAdditionalData(bid, 'adServerCurrency', getCurrencyFromBidderRequest(request.bidderRequest)); + bids.push(bid); }) }); } + return bids; }; export const onBidWon = function (bid) { + const adServerCurrency = getAdditionalData(bid, 'adServerCurrency'); // We intentionally use the price set by the publisher to replace the ${AUCTION_PRICE} macro // instead of the `originalCpm` here. This notification is not used for billing, only for extra logging. const publisherPrice = bid.cpm || 0; - const publisherCurrency = bid.currency || config.getConfig('currency.adServerCurrency') || SUPPORTED_CURRENCY; + const publisherCurrency = bid.currency || adServerCurrency || SUPPORTED_CURRENCY; const adServerPrice = deepAccess(bid, 'adserverTargeting.hb_pb', 0); - const adServerPriceCurrency = config.getConfig('currency.adServerCurrency') || SUPPORTED_CURRENCY; + const adServerPriceCurrency = adServerCurrency || SUPPORTED_CURRENCY; if (isStr(bid.nurl) && bid.nurl !== '') { const winNotificationUrl = replaceAuctionPrice(bid.nurl, publisherPrice) .replace(/\${AUCTION_PRICE_CURRENCY}/g, publisherCurrency) diff --git a/modules/livewrappedBidAdapter.js b/modules/livewrappedBidAdapter.js index cfbd2b5b3b5..203996c9fb5 100644 --- a/modules/livewrappedBidAdapter.js +++ b/modules/livewrappedBidAdapter.js @@ -4,6 +4,7 @@ import {config} from '../src/config.js'; import {find} from '../src/polyfill.js'; import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js'; import {getStorageManager} from '../src/storageManager.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; /** * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest @@ -69,7 +70,7 @@ export const spec = { bidUrl = bidUrl ? bidUrl.params.bidUrl : URL; url = url ? url.params.url : (getAppDomain() || getTopWindowLocation(bidderRequest)); test = test ? test.params.test : undefined; - const currency = config.getConfig('currency.adServerCurrency') || 'USD'; + const currency = getCurrencyFromBidderRequest(bidderRequest) || 'USD'; var adRequests = bidRequests.map(b => bidToAdRequest(b, currency)); const adRequestsContainFloors = adRequests.some(r => r.flr !== undefined); diff --git a/modules/mgidBidAdapter.js b/modules/mgidBidAdapter.js index a384b9d676c..9e2ea06df69 100644 --- a/modules/mgidBidAdapter.js +++ b/modules/mgidBidAdapter.js @@ -22,6 +22,7 @@ import {config} from '../src/config.js'; import { getStorageManager } from '../src/storageManager.js'; import { convertOrtbRequestToProprietaryNative } from '../src/native.js'; import { getUserSyncs } from '../libraries/mgidUtils/mgidUtils.js' +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js' /** * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest @@ -158,7 +159,7 @@ export const spec = { if (isStr(muid) && muid.length > 0) { url += '?muid=' + muid; } - const cur = setOnAny(validBidRequests, 'params.currency') || setOnAny(validBidRequests, 'params.cur') || config.getConfig('currency.adServerCurrency') || DEFAULT_CUR; + const cur = setOnAny(validBidRequests, 'params.currency') || setOnAny(validBidRequests, 'params.cur') || getCurrencyFromBidderRequest(bidderRequest) || DEFAULT_CUR; const secure = window.location.protocol === 'https:' ? 1 : 0; let imp = []; validBidRequests.forEach(bid => { diff --git a/modules/missenaBidAdapter.js b/modules/missenaBidAdapter.js index e621e478ce7..ac69fcc9965 100644 --- a/modules/missenaBidAdapter.js +++ b/modules/missenaBidAdapter.js @@ -7,10 +7,10 @@ import { safeJSONParse, triggerPixel, } from '../src/utils.js'; -import { config } from '../src/config.js'; import { BANNER } from '../src/mediaTypes.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; import { getStorageManager } from '../src/storageManager.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; import { isAutoplayEnabled } from '../libraries/autoplayDetection/autoplay.js'; /** @@ -82,7 +82,7 @@ function toPayload(bidRequest, bidderRequest) { const bidFloor = getFloor(bidRequest); payload.floor = bidFloor?.floor; payload.floor_currency = bidFloor?.currency; - payload.currency = config.getConfig('currency.adServerCurrency'); + payload.currency = getCurrencyFromBidderRequest(bidderRequest); payload.schain = bidRequest.schain; payload.coppa = bidderRequest?.ortb2?.regs?.coppa ? 1 : 0; payload.autoplay = isAutoplayEnabled() === true ? 1 : 0; diff --git a/modules/nexx360BidAdapter.js b/modules/nexx360BidAdapter.js index 9a76b24f223..933c0378f03 100644 --- a/modules/nexx360BidAdapter.js +++ b/modules/nexx360BidAdapter.js @@ -1,4 +1,3 @@ -import {config} from '../src/config.js'; import { deepAccess, deepSetValue, generateUUID, logError, logInfo } from '../src/utils.js'; import {Renderer} from '../src/Renderer.js'; import {getStorageManager} from '../src/storageManager.js'; @@ -7,6 +6,7 @@ import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js'; import {getGlobal} from '../src/prebidGlobal.js'; import {ortbConverter} from '../libraries/ortbConverter/converter.js' import { INSTREAM, OUTSTREAM } from '../src/video.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; /** * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest @@ -132,7 +132,7 @@ const converter = ortbConverter({ deepSetValue(request, 'ext.source', 'prebid.js'); deepSetValue(request, 'ext.pageViewId', PAGE_VIEW_ID); deepSetValue(request, 'ext.bidderVersion', BIDDER_VERSION); - deepSetValue(request, 'cur', [config.getConfig('currency.adServerCurrency') || 'USD']); + deepSetValue(request, 'cur', [getCurrencyFromBidderRequest(bidderRequest) || 'USD']); if (!request.user) request.user = {}; if (getAmxId()) { if (!request.user.ext) request.user.ext = {}; diff --git a/modules/richaudienceBidAdapter.js b/modules/richaudienceBidAdapter.js index cfb0f97fafd..135d2e94b65 100644 --- a/modules/richaudienceBidAdapter.js +++ b/modules/richaudienceBidAdapter.js @@ -3,6 +3,7 @@ import {registerBidder} from '../src/adapters/bidderFactory.js'; import {config} from '../src/config.js'; import {BANNER, VIDEO} from '../src/mediaTypes.js'; import {Renderer} from '../src/Renderer.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; const BIDDER_CODE = 'richaudience'; let REFERER = ''; @@ -35,7 +36,7 @@ export const spec = { ifa: bid.params.ifa, pid: bid.params.pid, supplyType: bid.params.supplyType, - currencyCode: config.getConfig('currency.adServerCurrency'), + currencyCode: getCurrencyFromBidderRequest(bidderRequest), auctionId: bid.auctionId, bidId: bid.bidId, BidRequestsCount: bid.bidRequestsCount, diff --git a/modules/silverpushBidAdapter.js b/modules/silverpushBidAdapter.js index 593e613d603..70c0e475cc4 100644 --- a/modules/silverpushBidAdapter.js +++ b/modules/silverpushBidAdapter.js @@ -1,4 +1,3 @@ -import { config } from '../src/config.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; import * as utils from '../src/utils.js'; import { mergeDeep } from '../src/utils.js'; @@ -6,6 +5,7 @@ import { BANNER, VIDEO } from '../src/mediaTypes.js'; import { ortbConverter } from '../libraries/ortbConverter/converter.js'; import { Renderer } from '../src/Renderer.js'; import { ajax } from '../src/ajax.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; const BIDDER_CODE = 'silverpush'; const bidderConfig = 'sp_pb_ortb'; @@ -65,7 +65,7 @@ export const CONVERTER = ortbConverter({ imp = buildBannerImp(bidRequest, imp); } - const bidFloor = getBidFloor(bidRequest); + const bidFloor = getBidFloor(bidRequest, bidRequest.bidderRequest); utils.deepSetValue(imp, 'bidfloor', bidFloor); @@ -216,7 +216,8 @@ function createRequest(bidRequests, bidderRequest, mediaType) { return { method: 'POST', url: REQUEST_URL, - data: CONVERTER.toORTB({ bidRequests, bidderRequest, context: { mediaType } }) + data: CONVERTER.toORTB({ bidRequests, bidderRequest, context: { mediaType } }), + bidderRequest } } @@ -247,8 +248,8 @@ function buildVideoOutstreamResponse(bidResponse, context) { return {...bidResponse}; } -function getBidFloor(bid) { - const currency = config.getConfig('currency.adServerCurrency') || DEFAULT_CURRENCY; +function getBidFloor(bid, bidderRequest) { + const currency = getCurrencyFromBidderRequest(bidderRequest) || DEFAULT_CURRENCY; if (typeof bid.getFloor !== 'function') { return utils.deepAccess(bid, 'params.bidFloor', 0.05); diff --git a/modules/smartadserverBidAdapter.js b/modules/smartadserverBidAdapter.js index e0ddf0a66e6..e3cdb3dc5bf 100644 --- a/modules/smartadserverBidAdapter.js +++ b/modules/smartadserverBidAdapter.js @@ -11,6 +11,7 @@ import { BANNER, VIDEO } from '../src/mediaTypes.js'; import { config } from '../src/config.js'; import { getBidFloor } from '../libraries/equativUtils/equativUtils.js' import { registerBidder } from '../src/adapters/bidderFactory.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; /** * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest @@ -180,7 +181,7 @@ export const spec = { */ buildRequests: function (validBidRequests, bidderRequest) { // use bidderRequest.bids[] to get bidder-dependent request info - const adServerCurrency = config.getConfig('currency.adServerCurrency'); + const adServerCurrency = getCurrencyFromBidderRequest(bidderRequest); const sellerDefinedAudience = deepAccess(bidderRequest, 'ortb2.user.data', config.getAnyConfig('ortb2.user.data')); const sellerDefinedContext = deepAccess(bidderRequest, 'ortb2.site.content.data', config.getAnyConfig('ortb2.site.content.data')); diff --git a/modules/smilewantedBidAdapter.js b/modules/smilewantedBidAdapter.js index 7f83dc025cb..a78c60f8308 100644 --- a/modules/smilewantedBidAdapter.js +++ b/modules/smilewantedBidAdapter.js @@ -1,11 +1,11 @@ import {deepAccess, deepClone, isArray, isFn, isPlainObject, logError, logWarn} from '../src/utils.js'; import {Renderer} from '../src/Renderer.js'; -import {config} from '../src/config.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import {BANNER, NATIVE, VIDEO} from '../src/mediaTypes.js'; import {INSTREAM, OUTSTREAM} from '../src/video.js'; import {serializeSupplyChain} from '../libraries/schainSerializer/schainSerializer.js' import {convertOrtbRequestToProprietaryNative, toOrtbNativeRequest, toLegacyResponse} from '../src/native.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; const BIDDER_CODE = 'smilewanted'; @@ -66,7 +66,7 @@ export const spec = { return validBidRequests.map(bid => { const payload = { zoneId: bid.params.zoneId, - currencyCode: config.getConfig('currency.adServerCurrency') || 'EUR', + currencyCode: getCurrencyFromBidderRequest(bidderRequest) || 'EUR', tagId: bid.adUnitCode, sizes: bid.sizes.map(size => ({ w: size[0], diff --git a/modules/sspBCBidAdapter.js b/modules/sspBCBidAdapter.js index ba9af3314b0..1227b6fdc76 100644 --- a/modules/sspBCBidAdapter.js +++ b/modules/sspBCBidAdapter.js @@ -1,10 +1,10 @@ import { deepAccess, getWindowTop, isArray, logInfo, logWarn } from '../src/utils.js'; import { ajax } from '../src/ajax.js'; -import { config } from '../src/config.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js'; import { includes as strIncludes } from '../src/polyfill.js'; import { convertOrtbRequestToProprietaryNative } from '../src/native.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; const BIDDER_CODE = 'sspBC'; const BIDDER_URL = 'https://ssp.wp.pl/bidder/'; @@ -284,7 +284,7 @@ const getHighestFloor = (slot) => { * Get currency (either default or adserver) * @returns {string} currency name */ -const getCurrency = () => config.getConfig('currency.adServerCurrency') || DEFAULT_CURRENCY; +const getCurrency = (bidderRequest) => getCurrencyFromBidderRequest(bidderRequest) || DEFAULT_CURRENCY; /** * Get value for first occurence of key within the collection @@ -617,7 +617,7 @@ const spec = { content: { language: getContentLanguage() }, }, imp: validBidRequests.map(slot => mapImpression(slot)), - cur: [getCurrency()], + cur: [getCurrency(bidderRequest)], tmax, user: {}, regs, diff --git a/modules/sublimeBidAdapter.js b/modules/sublimeBidAdapter.js index a29265ce9cd..eaae877ba0e 100644 --- a/modules/sublimeBidAdapter.js +++ b/modules/sublimeBidAdapter.js @@ -1,6 +1,7 @@ import { logInfo, generateUUID, formatQS, triggerPixel, deepAccess } from '../src/utils.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; import { config } from '../src/config.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; /** * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest @@ -152,7 +153,7 @@ function buildRequests(validBidRequests, bidderRequest) { pbav: SUBLIME_VERSION, // Current Prebid params prebidVersion: '$prebid.version$', - currencyCode: config.getConfig('currency.adServerCurrency') || DEFAULT_CURRENCY, + currencyCode: getCurrencyFromBidderRequest(bidderRequest) || DEFAULT_CURRENCY, timeout: (typeof bidderRequest === 'object' && !!bidderRequest) ? bidderRequest.timeout : config.getConfig('bidderTimeout'), }; diff --git a/modules/visxBidAdapter.js b/modules/visxBidAdapter.js index 217cab48cee..510106845db 100644 --- a/modules/visxBidAdapter.js +++ b/modules/visxBidAdapter.js @@ -6,6 +6,7 @@ import {INSTREAM as VIDEO_INSTREAM} from '../src/video.js'; import {getStorageManager} from '../src/storageManager.js'; import {getGptSlotInfoForAdUnitCode} from '../libraries/gptUtils/gptUtils.js'; import { getBidFromResponse } from '../libraries/processResponse/index.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; const BIDDER_CODE = 'visx'; const GVLID = 154; @@ -57,9 +58,8 @@ export const spec = { const bids = validBidRequests || []; const currency = config.getConfig(`currency.bidderCurrencyDefault.${BIDDER_CODE}`) || - config.getConfig('currency.adServerCurrency') || + getCurrencyFromBidderRequest(bidderRequest) || DEFAULT_CUR; - let request; let reqId; let payloadSchain; diff --git a/modules/voxBidAdapter.js b/modules/voxBidAdapter.js index da72b975717..b0cfdabee9f 100644 --- a/modules/voxBidAdapter.js +++ b/modules/voxBidAdapter.js @@ -3,7 +3,7 @@ import {registerBidder} from '../src/adapters/bidderFactory.js'; import {BANNER, VIDEO} from '../src/mediaTypes.js'; import {find} from '../src/polyfill.js'; import {Renderer} from '../src/Renderer.js'; -import {config} from '../src/config.js'; +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; /** * @typedef {import('../src/adapters/bidderFactory.js').BidRequest} BidRequest @@ -12,17 +12,15 @@ import {config} from '../src/config.js'; * @typedef {import('../src/adapters/bidderFactory.js').validBidRequests} validBidRequests */ -const { getConfig } = config; - const BIDDER_CODE = 'vox'; const SSP_ENDPOINT = 'https://ssp.hybrid.ai/auction/prebid'; const VIDEO_RENDERER_URL = 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js'; const TTL = 60; const GVLID = 206; -function buildBidRequests(validBidRequests) { +function buildBidRequests(validBidRequests, bidderRequest) { return _map(validBidRequests, function(bid) { - const currency = getConfig('currency.adServerCurrency'); + const currency = getCurrencyFromBidderRequest(bidderRequest); const floorInfo = bid.getFloor ? bid.getFloor({ currency: currency || 'USD' }) : {}; @@ -218,7 +216,7 @@ export const spec = { // TODO: is 'page' the right value here? url: bidderRequest.refererInfo.page, cmp: !!bidderRequest.gdprConsent, - bidRequests: buildBidRequests(validBidRequests) + bidRequests: buildBidRequests(validBidRequests, bidderRequest) }; if (payload.cmp) { diff --git a/modules/yandexBidAdapter.js b/modules/yandexBidAdapter.js index 97bd793d633..eed0902e9dc 100644 --- a/modules/yandexBidAdapter.js +++ b/modules/yandexBidAdapter.js @@ -1,5 +1,5 @@ +import { getCurrencyFromBidderRequest } from '../libraries/ortb2Utils/currency.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; -import { config } from '../src/config.js'; import { BANNER, NATIVE } from '../src/mediaTypes.js'; import { convertOrtbRequestToProprietaryNative } from '../src/native.js'; import { _each, _map, deepAccess, deepSetValue, formatQS, triggerPixel, logInfo } from '../src/utils.js'; @@ -128,7 +128,7 @@ export const spec = { timeout = bidderRequest.timeout; } - const adServerCurrency = config.getConfig('currency.adServerCurrency'); + const adServerCurrency = getCurrencyFromBidderRequest(bidderRequest); return validBidRequests.map((bidRequest) => { const { params } = bidRequest; diff --git a/test/spec/modules/adfBidAdapter_spec.js b/test/spec/modules/adfBidAdapter_spec.js index 6f4395d548f..14abb33ba68 100644 --- a/test/spec/modules/adfBidAdapter_spec.js +++ b/test/spec/modules/adfBidAdapter_spec.js @@ -3,7 +3,8 @@ import { assert } from 'chai'; import { spec } from 'modules/adfBidAdapter.js'; import { config } from 'src/config.js'; -import { createEidsArray } from 'modules/userId/eids.js'; +import { addFPDToBidderRequest } from '../../helpers/fpd'; +import { setConfig as setCurrencyConfig } from '../../../modules/currency'; describe('Adf adapter', function () { let bids = []; @@ -332,12 +333,15 @@ describe('Adf adapter', function () { }); it('should send currency if defined', function () { - config.setConfig({ currency: { adServerCurrency: 'EUR' } }); let validBidRequests = [{ params: {} }]; let refererInfo = { page: 'page' }; - let request = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo }).data); - - assert.deepEqual(request.cur, [ 'EUR' ]); + const bidderRequest = { refererInfo }; + setCurrencyConfig({ adServerCurrency: 'EUR' }) + return addFPDToBidderRequest(bidderRequest).then(res => { + let request = JSON.parse(spec.buildRequests(validBidRequests, res).data); + assert.deepEqual(request.cur, [ 'EUR' ]); + setCurrencyConfig({}); + }); }); it('should pass supply chain object', function () { @@ -480,12 +484,14 @@ describe('Adf adapter', function () { }); it('should request floor price in adserver currency', function () { - config.setConfig({ currency: { adServerCurrency: 'DKK' } }); + setCurrencyConfig({ adServerCurrency: 'DKK' }) const validBidRequests = [ getBidWithFloor() ]; - let imp = getRequestImps(validBidRequests)[0]; - - assert.equal(imp.bidfloor, undefined); - assert.equal(imp.bidfloorcur, 'DKK'); + return addFPDToBidderRequest(validBidRequests[0]).then(res => { + const imp = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' }, ...res }).data).imp[0]; + assert.equal(imp.bidfloor, undefined); + assert.equal(imp.bidfloorcur, 'DKK'); + setCurrencyConfig({}); + }); }); it('should add correct floor values', function () { @@ -505,30 +511,29 @@ describe('Adf adapter', function () { playerSize: [ 100, 200 ] } }; const expectedFloors = [ 1, 1.3, 0.5 ]; - config.setConfig({ currency: { adServerCurrency: 'DKK' } }); + setCurrencyConfig({ adServerCurrency: 'DKK' }); let validBidRequests = expectedFloors.map(getBidWithFloorTest); - getRequestImps(validBidRequests); - assert.deepEqual(result, { currency: 'DKK', size: '*', mediaType: '*' }); + return addFPDToBidderRequest(validBidRequests[0]).then(res => { + getRequestImps(validBidRequests, res); + assert.deepEqual(result, { currency: 'DKK', size: '*', mediaType: '*' }) + mediaTypes = { banner: { + sizes: [ [100, 200], [300, 400] ] + }}; + getRequestImps(validBidRequests, res); - mediaTypes = { banner: { - sizes: [ [100, 200], [300, 400] ] - }}; - validBidRequests = expectedFloors.map(getBidWithFloorTest); - getRequestImps(validBidRequests); + assert.deepEqual(result, { currency: 'DKK', size: '*', mediaType: '*' }); - assert.deepEqual(result, { currency: 'DKK', size: '*', mediaType: '*' }); + mediaTypes = { native: {} }; + getRequestImps(validBidRequests, res); - mediaTypes = { native: {} }; - validBidRequests = expectedFloors.map(getBidWithFloorTest); - getRequestImps(validBidRequests); + assert.deepEqual(result, { currency: 'DKK', size: '*', mediaType: '*' }); - assert.deepEqual(result, { currency: 'DKK', size: '*', mediaType: '*' }); + mediaTypes = {}; + getRequestImps(validBidRequests, res); - mediaTypes = {}; - validBidRequests = expectedFloors.map(getBidWithFloorTest); - getRequestImps(validBidRequests); - - assert.deepEqual(result, { currency: 'DKK', size: '*', mediaType: '*' }); + assert.deepEqual(result, { currency: 'DKK', size: '*', mediaType: '*' }); + setCurrencyConfig({}); + }); function getBidWithFloorTest(floor) { return { @@ -913,8 +918,8 @@ describe('Adf adapter', function () { }); }); - function getRequestImps(validBidRequests) { - return JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } }).data).imp; + function getRequestImps(validBidRequests, enriched = {}) { + return JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' }, ...enriched }).data).imp; } }); diff --git a/test/spec/modules/adgenerationBidAdapter_spec.js b/test/spec/modules/adgenerationBidAdapter_spec.js index 7a95d4272fb..c0bb40a1bf2 100644 --- a/test/spec/modules/adgenerationBidAdapter_spec.js +++ b/test/spec/modules/adgenerationBidAdapter_spec.js @@ -4,6 +4,8 @@ import {newBidder} from 'src/adapters/bidderFactory.js'; import {NATIVE} from 'src/mediaTypes.js'; import {config} from 'src/config.js'; import prebid from '../../../package.json'; +import { setConfig as setCurrencyConfig } from '../../../modules/currency'; +import { addFPDToBidderRequest } from '../../helpers/fpd'; describe('AdgenerationAdapter', function () { const adapter = newBidder(spec); @@ -248,19 +250,20 @@ describe('AdgenerationAdapter', function () { config.resetConfig(); }); it('allows setConfig to set bidder currency for USD', function () { - config.setConfig({ - currency: { - adServerCurrency: 'USD' - } + setCurrencyConfig({ adServerCurrency: 'USD' }); + return addFPDToBidderRequest(bidderRequest).then(res => { + const bidRequest = spec.buildRequests(bidRequests, res)[0]; + expect(bidRequest.data).to.equal(data.bannerUSD); + setCurrencyConfig({}); }); - const request = spec.buildRequests(bidRequests, bidderRequest)[0]; - expect(request.data).to.equal(data.bannerUSD); - config.resetConfig(); }); }); describe('interpretResponse', function () { const bidRequests = { banner: { + bidderRequest: { + ortb2: {ext: {prebid: {adServerCurrency: 'JPY'}}} + }, bidRequest: { bidder: 'adg', params: { @@ -275,6 +278,9 @@ describe('AdgenerationAdapter', function () { }, }, native: { + bidderRequest: { + ortb2: {ext: {prebid: {adServerCurrency: 'JPY'}}} + }, bidRequest: { bidder: 'adg', params: { @@ -312,6 +318,9 @@ describe('AdgenerationAdapter', function () { }, }, upperBillboard: { + bidderRequest: { + ortb2: {ext: {prebid: {adServerCurrency: 'JPY'}}} + }, bidRequest: { bidder: 'adg', params: { @@ -916,21 +925,26 @@ describe('AdgenerationAdapter', function () { }); it('handles ADGBrowserM responses', function () { - config.setConfig({ - currency: { - adServerCurrency: 'JPY' + setCurrencyConfig({ adServerCurrency: 'JPY' }); + const bidderRequest = { + refererInfo: { + page: 'https://example.com' } + }; + return addFPDToBidderRequest(bidderRequest).then(res => { + spec.buildRequests(bidRequests, res)[0]; + const result = spec.interpretResponse({body: serverResponse.normal.upperBillboard}, { ...bidRequests.upperBillboard, bidderRequest: res })[0]; + expect(result.requestId).to.equal(bidResponses.normal.upperBillboard.requestId); + expect(result.width).to.equal(bidResponses.normal.upperBillboard.width); + expect(result.height).to.equal(bidResponses.normal.upperBillboard.height); + expect(result.creativeId).to.equal(bidResponses.normal.upperBillboard.creativeId); + expect(result.dealId).to.equal(bidResponses.normal.upperBillboard.dealId); + expect(result.currency).to.equal(bidResponses.normal.upperBillboard.currency); + expect(result.netRevenue).to.equal(bidResponses.normal.upperBillboard.netRevenue); + expect(result.ttl).to.equal(bidResponses.normal.upperBillboard.ttl); + expect(result.ad).to.equal(bidResponses.normal.upperBillboard.ad); + setCurrencyConfig({}); }); - const result = spec.interpretResponse({body: serverResponse.normal.upperBillboard}, bidRequests.upperBillboard)[0]; - expect(result.requestId).to.equal(bidResponses.normal.upperBillboard.requestId); - expect(result.width).to.equal(bidResponses.normal.upperBillboard.width); - expect(result.height).to.equal(bidResponses.normal.upperBillboard.height); - expect(result.creativeId).to.equal(bidResponses.normal.upperBillboard.creativeId); - expect(result.dealId).to.equal(bidResponses.normal.upperBillboard.dealId); - expect(result.currency).to.equal(bidResponses.normal.upperBillboard.currency); - expect(result.netRevenue).to.equal(bidResponses.normal.upperBillboard.netRevenue); - expect(result.ttl).to.equal(bidResponses.normal.upperBillboard.ttl); - expect(result.ad).to.equal(bidResponses.normal.upperBillboard.ad); }); it('handles banner responses for empty adomain', function () { diff --git a/test/spec/modules/beopBidAdapter_spec.js b/test/spec/modules/beopBidAdapter_spec.js index 0a752761531..3f06cd04910 100644 --- a/test/spec/modules/beopBidAdapter_spec.js +++ b/test/spec/modules/beopBidAdapter_spec.js @@ -2,6 +2,8 @@ import { expect } from 'chai'; import { spec } from 'modules/beopBidAdapter.js'; import { newBidder } from 'src/adapters/bidderFactory.js'; import { config } from 'src/config.js'; +import { setConfig as setCurrencyConfig } from '../../../modules/currency'; +import { addFPDToBidderRequest } from '../../helpers/fpd'; const utils = require('src/utils'); const ENDPOINT = 'https://hb.beop.io/bid'; @@ -92,18 +94,27 @@ describe('BeOp Bid Adapter tests', () => { bidRequests.push(validBid); it('should build the request', function () { - config.setConfig({'currency': {'adServerCurrency': 'USD'}}); - const request = spec.buildRequests(bidRequests, {}); - const payload = JSON.parse(request.data); - const url = request.url; - expect(url).to.equal(ENDPOINT); - expect(payload.pid).to.exist; - expect(payload.pid).to.equal('5a8af500c9e77c00017e4cad'); - expect(payload.gdpr_applies).to.exist; - expect(payload.gdpr_applies).to.equals(false); - expect(payload.slts[0].name).to.exist; - expect(payload.slts[0].name).to.equal('bellow-article'); - expect(payload.slts[0].flr).to.equal(10); + const bidderRequest = { + refererInfo: { + page: 'https://example.com' + } + }; + setCurrencyConfig({ adServerCurrency: 'USD' }) + + return addFPDToBidderRequest(bidderRequest).then(res => { + const request = spec.buildRequests(bidRequests, res); + const payload = JSON.parse(request.data); + const url = request.url; + expect(url).to.equal(ENDPOINT); + expect(payload.pid).to.exist; + expect(payload.pid).to.equal('5a8af500c9e77c00017e4cad'); + expect(payload.gdpr_applies).to.exist; + expect(payload.gdpr_applies).to.equals(false); + expect(payload.slts[0].name).to.exist; + expect(payload.slts[0].name).to.equal('bellow-article'); + expect(payload.slts[0].flr).to.equal(10); + setCurrencyConfig({}); + }); }); it('should call the endpoint with GDPR consent and pageURL info if found', function () { diff --git a/test/spec/modules/carodaBidAdapter_spec.js b/test/spec/modules/carodaBidAdapter_spec.js index bf4557d7a8a..780c81ebe9f 100644 --- a/test/spec/modules/carodaBidAdapter_spec.js +++ b/test/spec/modules/carodaBidAdapter_spec.js @@ -3,6 +3,8 @@ import { assert } from 'chai'; import { spec } from 'modules/carodaBidAdapter.js'; import { config } from 'src/config.js'; import { createEidsArray } from 'modules/userId/eids.js'; +import { setConfig as setCurrencyConfig } from '../../../modules/currency'; +import { addFPDToBidderRequest } from '../../helpers/fpd'; describe('Caroda adapter', function () { let bids = []; @@ -185,12 +187,14 @@ describe('Caroda adapter', function () { }); it('should send currency if defined', function () { - config.setConfig({ currency: { adServerCurrency: 'EUR' } }); + setCurrencyConfig({ adServerCurrency: 'EUR' }); let validBidRequests = [{ params: {} }]; - let refererInfo = { page: 'page' }; - let request = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo })[0].data); - - assert.deepEqual(request.currency, 'EUR'); + const bidderRequest = { refererInfo: { page: 'page' } }; + return addFPDToBidderRequest(bidderRequest).then(res => { + let request = JSON.parse(spec.buildRequests(validBidRequests, res)[0].data); + assert.deepEqual(request.currency, 'EUR'); + setCurrencyConfig({}); + }); }); it('should pass extended ids', function () { @@ -301,11 +305,15 @@ describe('Caroda adapter', function () { }); it('should request floor price in adserver currency', function () { - config.setConfig({ currency: { adServerCurrency: 'DKK' } }); const validBidRequests = [ getBidWithFloor() ]; - const imp = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo: { page: 'page' } })[0].data); - assert.equal(imp.bidfloor, undefined); - assert.equal(imp.bidfloorcur, 'DKK'); + setCurrencyConfig({ adServerCurrency: 'DKK' }); + const bidderRequest = { refererInfo: { page: 'page' } }; + return addFPDToBidderRequest(bidderRequest).then(res => { + const imp = JSON.parse(spec.buildRequests(validBidRequests, res)[0].data); + assert.equal(imp.bidfloor, undefined); + assert.equal(imp.bidfloorcur, 'DKK'); + setCurrencyConfig({}); + }); }); it('should add correct floor values', function () { diff --git a/test/spec/modules/currency_spec.js b/test/spec/modules/currency_spec.js index 149a4380036..8685bc1266f 100644 --- a/test/spec/modules/currency_spec.js +++ b/test/spec/modules/currency_spec.js @@ -17,6 +17,7 @@ import * as utils from 'src/utils.js'; import {EVENTS, STATUS, REJECTION_REASON} from '../../../src/constants.js'; import {server} from '../../mocks/xhr.js'; import * as events from 'src/events.js'; +import { enrichFPD } from '../../../src/fpd/enrichment.js'; import {requestBidsHook} from '../../../modules/currency.js'; var assert = require('chai').assert; @@ -525,6 +526,19 @@ describe('currency', function () { }); }); + describe('enrichFpd', function() { + function fpd(ortb2 = {}) { + return enrichFPD(Promise.resolve(ortb2)); + } + it('should set adServerCurrency on ortb', function () { + fakeCurrencyFileServer.respondWith(JSON.stringify(getCurrencyRates())); + setConfig({ adServerCurrency: 'EUR' }); + return fpd({}).then((ortb) => { + expect(ortb.ext.prebid.adServerCurrency).to.eql('EUR') + }) + }) + }); + describe('auctionDelay param', () => { const continueAuction = sinon.stub(); let logWarnSpy; diff --git a/test/spec/modules/dianomiBidAdapter_spec.js b/test/spec/modules/dianomiBidAdapter_spec.js index b1ba5f60540..ef9283d3dad 100644 --- a/test/spec/modules/dianomiBidAdapter_spec.js +++ b/test/spec/modules/dianomiBidAdapter_spec.js @@ -3,6 +3,8 @@ import { assert } from 'chai'; import { spec } from 'modules/dianomiBidAdapter.js'; import { config } from 'src/config.js'; import { createEidsArray } from 'modules/userId/eids.js'; +import { setConfig as setCurrencyConfig } from '../../../modules/currency'; +import { addFPDToBidderRequest } from '../../helpers/fpd'; describe('Dianomi adapter', () => { let bids = []; @@ -267,12 +269,14 @@ describe('Dianomi adapter', () => { }); it('should send currency if defined', () => { - config.setConfig({ currency: { adServerCurrency: 'EUR' } }); + setCurrencyConfig({ adServerCurrency: 'EUR' }) let validBidRequests = [{ params: { smartadId: 1234 } }]; let refererInfo = { page: 'page' }; - let request = JSON.parse(spec.buildRequests(validBidRequests, { refererInfo }).data); - - assert.deepEqual(request.cur, ['EUR']); + return addFPDToBidderRequest({ refererInfo }).then(res => { + let request = JSON.parse(spec.buildRequests(validBidRequests, res).data); + assert.deepEqual(request.cur, ['EUR']); + setCurrencyConfig({}); + }); }); it('should pass supply chain object', () => { @@ -394,12 +398,18 @@ describe('Dianomi adapter', () => { }); it('should request floor price in adserver currency', () => { - config.setConfig({ currency: { adServerCurrency: 'GBP' } }); - const validBidRequests = [getBidWithFloor()]; - let imp = getRequestImps(validBidRequests)[0]; - - assert.equal(imp.bidfloor, undefined); - assert.equal(imp.bidfloorcur, 'GBP'); + setCurrencyConfig({ adServerCurrency: 'GBP' }) + let validBidRequests = [getBidWithFloor()]; + let refererInfo = { page: 'page' }; + return addFPDToBidderRequest({ refererInfo }).then(res => { + let imp = JSON.parse( + spec.buildRequests(validBidRequests, res).data + ).imp[0]; + + assert.equal(imp.bidfloor, undefined); + assert.equal(imp.bidfloorcur, 'GBP'); + setCurrencyConfig({}); + }); }); it('should add correct floor values', () => { diff --git a/test/spec/modules/dsp_genieeBidAdapter_spec.js b/test/spec/modules/dsp_genieeBidAdapter_spec.js index 576fd9e404b..b708acffc0b 100644 --- a/test/spec/modules/dsp_genieeBidAdapter_spec.js +++ b/test/spec/modules/dsp_genieeBidAdapter_spec.js @@ -1,6 +1,8 @@ import { expect } from 'chai'; import { spec } from 'modules/dsp_genieeBidAdapter.js'; import { config } from 'src/config'; +import { setConfig as setCurrencyConfig } from '../../../modules/currency'; +import { addFPDToBidderRequest } from '../../helpers/fpd'; describe('Geniee adapter tests', () => { const validBidderRequest = { @@ -74,13 +76,16 @@ describe('Geniee adapter tests', () => { config.resetConfig(); }); it('uncomfortable (currency)', () => { - config.setConfig({ currency: { adServerCurrency: 'TWD' } }); - const request = spec.buildRequests(validBidderRequest.bids, validBidderRequest); - expect(request).deep.equal({ - method: 'GET', - url: 'https://rt.gsspat.jp/prebid_uncomfortable', + setCurrencyConfig({ adServerCurrency: 'TWD' }); + return addFPDToBidderRequest(validBidderRequest).then(res => { + const request = spec.buildRequests(validBidderRequest.bids, res); + expect(request).deep.equal({ + method: 'GET', + url: 'https://rt.gsspat.jp/prebid_uncomfortable', + }); + setCurrencyConfig({}); + config.resetConfig(); }); - config.resetConfig(); }); }); describe('interpretResponse function test', () => { diff --git a/test/spec/modules/koblerBidAdapter_spec.js b/test/spec/modules/koblerBidAdapter_spec.js index 74c0a1f5967..47b89bb5956 100644 --- a/test/spec/modules/koblerBidAdapter_spec.js +++ b/test/spec/modules/koblerBidAdapter_spec.js @@ -4,6 +4,8 @@ import {newBidder} from 'src/adapters/bidderFactory.js'; import {config} from 'src/config.js'; import * as utils from 'src/utils.js'; import {getRefererInfo} from 'src/refererDetection.js'; +import { setConfig as setCurrencyConfig } from '../../../modules/currency'; +import { addFPDToBidderRequest } from '../../helpers/fpd'; function createBidderRequest(auctionId, timeout, pageUrl, addGdprConsent) { const gdprConsent = addGdprConsent ? { @@ -598,7 +600,7 @@ describe('KoblerAdapter', function () { cur: 'USD' } }; - const bids = spec.interpretResponse(responseWithTwoBids) + const bids = spec.interpretResponse(responseWithTwoBids, {}) const expectedBids = [ { @@ -665,25 +667,30 @@ describe('KoblerAdapter', function () { }); it('Should trigger pixel with replaced nurl if nurl is not empty', function () { - config.setConfig({ - 'currency': { - 'adServerCurrency': 'NOK' - } - }); - spec.onBidWon({ - originalCpm: 1.532, - cpm: 8.341, - currency: 'NOK', - nurl: 'https://atag.essrtb.com/serve/prebid_win_notification?payload=sdhfusdaobfadslf234324&sp=${AUCTION_PRICE}&sp_cur=${AUCTION_PRICE_CURRENCY}&asp=${AD_SERVER_PRICE}&asp_cur=${AD_SERVER_PRICE_CURRENCY}', - adserverTargeting: { + setCurrencyConfig({ adServerCurrency: 'NOK' }); + let validBidRequests = [{ params: {} }]; + let refererInfo = { page: 'page' }; + const bidderRequest = { refererInfo }; + return addFPDToBidderRequest(bidderRequest).then(res => { + JSON.parse(spec.buildRequests(validBidRequests, res).data); + const bids = spec.interpretResponse({ body: { seatbid: [{ bid: [{ + originalCpm: 1.532, + price: 8.341, + currency: 'NOK', + nurl: 'https://atag.essrtb.com/serve/prebid_win_notification?payload=sdhfusdaobfadslf234324&sp=${AUCTION_PRICE}&sp_cur=${AUCTION_PRICE_CURRENCY}&asp=${AD_SERVER_PRICE}&asp_cur=${AD_SERVER_PRICE_CURRENCY}', + }]}]}}, { bidderRequest: res }); + const bidToWon = bids[0]; + bidToWon.adserverTargeting = { hb_pb: 8 } - }); + spec.onBidWon(bidToWon); - expect(utils.triggerPixel.callCount).to.be.equal(1); - expect(utils.triggerPixel.firstCall.args[0]).to.be.equal( - 'https://atag.essrtb.com/serve/prebid_win_notification?payload=sdhfusdaobfadslf234324&sp=8.341&sp_cur=NOK&asp=8&asp_cur=NOK' - ); + expect(utils.triggerPixel.callCount).to.be.equal(1); + expect(utils.triggerPixel.firstCall.args[0]).to.be.equal( + 'https://atag.essrtb.com/serve/prebid_win_notification?payload=sdhfusdaobfadslf234324&sp=8.341&sp_cur=NOK&asp=8&asp_cur=NOK' + ); + setCurrencyConfig({}); + }); }); }); diff --git a/test/spec/modules/livewrappedBidAdapter_spec.js b/test/spec/modules/livewrappedBidAdapter_spec.js index 5ab00859d81..7a3cd26dbe7 100644 --- a/test/spec/modules/livewrappedBidAdapter_spec.js +++ b/test/spec/modules/livewrappedBidAdapter_spec.js @@ -3,6 +3,8 @@ import {spec, storage} from 'modules/livewrappedBidAdapter.js'; import {config} from 'src/config.js'; import * as utils from 'src/utils.js'; import { NATIVE, VIDEO } from 'src/mediaTypes.js'; +import { setConfig as setCurrencyConfig } from '../../../modules/currency'; +import { addFPDToBidderRequest } from '../../helpers/fpd'; describe('Livewrapped adapter tests', function () { let sandbox, @@ -1178,50 +1180,21 @@ 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 === 'currency.adServerCurrency') { - return 'EUR'; - } - return origGetConfig.apply(config, arguments); - }); - + setCurrencyConfig({ adServerCurrency: 'EUR' }); let testbidRequest = clone(bidderRequest); let bids = testbidRequest.bids.map(b => { b.getFloor = function () { return { floor: 10, currency: 'EUR' }; } return b; }); - let result = spec.buildRequests(bids, testbidRequest); - let data = JSON.parse(result.data); - - expect(result.url).to.equal('https://lwadm.com/ad'); - - let expectedQuery = { - auctionId: 'F7557995-65F5-4682-8782-7D5D34D82A8C', - publisherId: '26947112-2289-405D-88C1-A7340C57E63E', - userId: 'user id', - url: 'https://www.domain.com', - seats: {'dsp': ['seat 1']}, - version: '1.4', - width: 100, - height: 100, - cookieSupport: true, - flrCur: 'EUR', - adRequests: [{ - adUnitId: '9E153CED-61BC-479E-98DF-24DC0D01BA37', - callerAdUnitId: 'panorama_d_1', - bidId: '2ffb201a808da7', - rtbData: { - ext: { - tid: '3D1C8CF7-D288-4D7F-8ADD-97C553056C3D' - }, - }, - formats: [{width: 980, height: 240}, {width: 980, height: 120}], - flr: 10 - }] - }; - expect(data).to.deep.equal(expectedQuery); + return addFPDToBidderRequest(testbidRequest).then(res => { + let result = spec.buildRequests(bids, res); + let data = JSON.parse(result.data); + expect(result.url).to.equal('https://lwadm.com/ad'); + expect(data.adRequests[0].flr).to.eql(10) + expect(data.flrCur).to.eql('EUR') + setCurrencyConfig({}); + }); }); it('getFloor returns valid floor - default currency', function() { diff --git a/test/spec/modules/smartadserverBidAdapter_spec.js b/test/spec/modules/smartadserverBidAdapter_spec.js index 0935b6c8404..f6993b433ad 100644 --- a/test/spec/modules/smartadserverBidAdapter_spec.js +++ b/test/spec/modules/smartadserverBidAdapter_spec.js @@ -4,6 +4,8 @@ import { config } from 'src/config.js'; import { deepClone } from 'src/utils.js'; import { getBidFloor } from 'libraries/equativUtils/equativUtils.js' import { spec } from 'modules/smartadserverBidAdapter.js'; +import { setConfig as setCurrencyConfig } from '../../../modules/currency'; +import { addFPDToBidderRequest } from '../../helpers/fpd'; // Default params with optional ones describe('Smart bid adapter tests', function () { @@ -249,10 +251,8 @@ describe('Smart bid adapter tests', function () { ]; it('Verify build request', function () { + setCurrencyConfig({ adServerCurrency: 'EUR' }); config.setConfig({ - 'currency': { - 'adServerCurrency': 'EUR' - }, ortb2: { 'user': { 'data': sellerDefinedAudience @@ -265,30 +265,32 @@ describe('Smart bid adapter tests', function () { } }); - const request = spec.buildRequests(DEFAULT_PARAMS); - expect(request[0]).to.have.property('url').and.to.equal('https://prg.smartadserver.com/prebid/v1'); - expect(request[0]).to.have.property('method').and.to.equal('POST'); - const requestContent = JSON.parse(request[0].data); - - expect(requestContent).to.have.property('siteid').and.to.equal('1234'); - expect(requestContent).to.have.property('pageid').and.to.equal('5678'); - expect(requestContent).to.have.property('formatid').and.to.equal('90'); - expect(requestContent).to.have.property('currencyCode').and.to.equal('EUR'); - expect(requestContent).to.have.property('bidfloor').and.to.equal(0.42); - expect(requestContent).to.have.property('targeting').and.to.equal('test=prebid'); - expect(requestContent).to.have.property('tagId').and.to.equal('sas_42'); - expect(requestContent).to.have.property('sizes'); - expect(requestContent.sizes[0]).to.have.property('w').and.to.equal(300); - expect(requestContent.sizes[0]).to.have.property('h').and.to.equal(250); - expect(requestContent.sizes[1]).to.have.property('w').and.to.equal(300); - expect(requestContent.sizes[1]).to.have.property('h').and.to.equal(200); - expect(requestContent).to.not.have.property('pageDomain'); - expect(requestContent).to.have.property('transactionId').and.to.not.equal(null).and.to.not.be.undefined; - expect(requestContent).to.have.property('buid').and.to.equal('7569'); - expect(requestContent).to.have.property('appname').and.to.equal('Mozilla'); - expect(requestContent).to.have.property('ckid').and.to.equal(42); - expect(requestContent).to.have.property('sda').and.to.deep.equal(sellerDefinedAudience); - expect(requestContent).to.have.property('sdc').and.to.deep.equal(sellerDefinedContext); + return addFPDToBidderRequest(DEFAULT_PARAMS[0]).then(res => { + const request = spec.buildRequests(DEFAULT_PARAMS, res); + expect(request[0]).to.have.property('url').and.to.equal('https://prg.smartadserver.com/prebid/v1'); + expect(request[0]).to.have.property('method').and.to.equal('POST'); + const requestContent = JSON.parse(request[0].data); + expect(requestContent).to.have.property('siteid').and.to.equal('1234'); + expect(requestContent).to.have.property('pageid').and.to.equal('5678'); + expect(requestContent).to.have.property('formatid').and.to.equal('90'); + expect(requestContent).to.have.property('currencyCode').and.to.equal('EUR'); + expect(requestContent).to.have.property('bidfloor').and.to.equal(0.42); + expect(requestContent).to.have.property('targeting').and.to.equal('test=prebid'); + expect(requestContent).to.have.property('tagId').and.to.equal('sas_42'); + expect(requestContent).to.have.property('sizes'); + expect(requestContent.sizes[0]).to.have.property('w').and.to.equal(300); + expect(requestContent.sizes[0]).to.have.property('h').and.to.equal(250); + expect(requestContent.sizes[1]).to.have.property('w').and.to.equal(300); + expect(requestContent.sizes[1]).to.have.property('h').and.to.equal(200); + expect(requestContent).to.not.have.property('pageDomain'); + expect(requestContent).to.have.property('transactionId').and.to.not.equal(null).and.to.not.be.undefined; + expect(requestContent).to.have.property('buid').and.to.equal('7569'); + expect(requestContent).to.have.property('appname').and.to.equal('Mozilla'); + expect(requestContent).to.have.property('ckid').and.to.equal(42); + expect(requestContent).to.have.property('sda').and.to.deep.equal(sellerDefinedAudience); + expect(requestContent).to.have.property('sdc').and.to.deep.equal(sellerDefinedContext); + setCurrencyConfig({}); + }); }); it('Verify parse response with no ad', function () { @@ -648,10 +650,8 @@ describe('Smart bid adapter tests', function () { }; it('Verify instream video build request', function () { + setCurrencyConfig({ adServerCurrency: 'EUR' }); config.setConfig({ - 'currency': { - 'adServerCurrency': 'EUR' - }, ortb2: { 'user': { 'data': sellerDefinedAudience @@ -663,29 +663,33 @@ describe('Smart bid adapter tests', function () { } } }); - const request = spec.buildRequests(INSTREAM_DEFAULT_PARAMS); - expect(request[0]).to.have.property('url').and.to.equal('https://prg.smartadserver.com/prebid/v1'); - expect(request[0]).to.have.property('method').and.to.equal('POST'); - const requestContent = JSON.parse(request[0].data); - expect(requestContent).to.have.property('siteid').and.to.equal('1234'); - expect(requestContent).to.have.property('pageid').and.to.equal('5678'); - expect(requestContent).to.have.property('formatid').and.to.equal('90'); - expect(requestContent).to.have.property('currencyCode').and.to.equal('EUR'); - expect(requestContent).to.have.property('bidfloor').and.to.equal(0.42); - expect(requestContent).to.have.property('targeting').and.to.equal('test=prebid'); - expect(requestContent).to.have.property('tagId').and.to.equal('sas_42'); - expect(requestContent).to.not.have.property('pageDomain'); - expect(requestContent).to.have.property('transactionId').and.to.not.equal(null).and.to.not.be.undefined; - expect(requestContent).to.have.property('buid').and.to.equal('7569'); - expect(requestContent).to.have.property('appname').and.to.equal('Mozilla'); - expect(requestContent).to.have.property('ckid').and.to.equal(42); - expect(requestContent).to.have.property('sda').and.to.deep.equal(sellerDefinedAudience); - expect(requestContent).to.have.property('sdc').and.to.deep.equal(sellerDefinedContext); - expect(requestContent).to.have.property('isVideo').and.to.equal(true); - expect(requestContent).to.have.property('videoData'); - expect(requestContent.videoData).to.have.property('videoProtocol').and.to.equal(6); - expect(requestContent.videoData).to.have.property('playerWidth').and.to.equal(640); - expect(requestContent.videoData).to.have.property('playerHeight').and.to.equal(480); + + return addFPDToBidderRequest(INSTREAM_DEFAULT_PARAMS[0]).then(res => { + const request = spec.buildRequests(INSTREAM_DEFAULT_PARAMS, res); + expect(request[0]).to.have.property('url').and.to.equal('https://prg.smartadserver.com/prebid/v1'); + expect(request[0]).to.have.property('method').and.to.equal('POST'); + const requestContent = JSON.parse(request[0].data); + expect(requestContent).to.have.property('siteid').and.to.equal('1234'); + expect(requestContent).to.have.property('pageid').and.to.equal('5678'); + expect(requestContent).to.have.property('formatid').and.to.equal('90'); + expect(requestContent).to.have.property('currencyCode').and.to.equal('EUR'); + expect(requestContent).to.have.property('bidfloor').and.to.equal(0.42); + expect(requestContent).to.have.property('targeting').and.to.equal('test=prebid'); + expect(requestContent).to.have.property('tagId').and.to.equal('sas_42'); + expect(requestContent).to.not.have.property('pageDomain'); + expect(requestContent).to.have.property('transactionId').and.to.not.equal(null).and.to.not.be.undefined; + expect(requestContent).to.have.property('buid').and.to.equal('7569'); + expect(requestContent).to.have.property('appname').and.to.equal('Mozilla'); + expect(requestContent).to.have.property('ckid').and.to.equal(42); + expect(requestContent).to.have.property('sda').and.to.deep.equal(sellerDefinedAudience); + expect(requestContent).to.have.property('sdc').and.to.deep.equal(sellerDefinedContext); + expect(requestContent).to.have.property('isVideo').and.to.equal(true); + expect(requestContent).to.have.property('videoData'); + expect(requestContent.videoData).to.have.property('videoProtocol').and.to.equal(6); + expect(requestContent.videoData).to.have.property('playerWidth').and.to.equal(640); + expect(requestContent.videoData).to.have.property('playerHeight').and.to.equal(480); + setCurrencyConfig({}); + }); }); it('Verify instream parse response', function () { @@ -989,10 +993,8 @@ describe('Smart bid adapter tests', function () { }; it('Verify outstream video build request', function () { + setCurrencyConfig({ adServerCurrency: 'EUR' }); config.setConfig({ - 'currency': { - 'adServerCurrency': 'EUR' - }, ortb2: { 'user': { 'data': sellerDefinedAudience @@ -1004,29 +1006,33 @@ describe('Smart bid adapter tests', function () { } } }); - const request = spec.buildRequests(OUTSTREAM_DEFAULT_PARAMS); - expect(request[0]).to.have.property('url').and.to.equal('https://prg.smartadserver.com/prebid/v1'); - expect(request[0]).to.have.property('method').and.to.equal('POST'); - const requestContent = JSON.parse(request[0].data); - expect(requestContent).to.have.property('siteid').and.to.equal('1234'); - expect(requestContent).to.have.property('pageid').and.to.equal('5678'); - expect(requestContent).to.have.property('formatid').and.to.equal('91'); - expect(requestContent).to.have.property('currencyCode').and.to.equal('EUR'); - expect(requestContent).to.have.property('bidfloor').and.to.equal(0.43); - expect(requestContent).to.have.property('targeting').and.to.equal('test=prebid-outstream'); - expect(requestContent).to.have.property('tagId').and.to.equal('sas_43'); - expect(requestContent).to.not.have.property('pageDomain'); - expect(requestContent).to.have.property('transactionId').and.to.not.equal(null).and.to.not.be.undefined; - expect(requestContent).to.have.property('buid').and.to.equal('7579'); - expect(requestContent).to.have.property('appname').and.to.equal('Mozilla'); - expect(requestContent).to.have.property('ckid').and.to.equal(43); - expect(requestContent).to.have.property('sda').and.to.deep.equal(sellerDefinedAudience); - expect(requestContent).to.have.property('sdc').and.to.deep.equal(sellerDefinedContext); - expect(requestContent).to.have.property('isVideo').and.to.equal(false); - expect(requestContent).to.have.property('videoData'); - expect(requestContent.videoData).to.have.property('videoProtocol').and.to.equal(7); - expect(requestContent.videoData).to.have.property('playerWidth').and.to.equal(800); - expect(requestContent.videoData).to.have.property('playerHeight').and.to.equal(600); + + return addFPDToBidderRequest(OUTSTREAM_DEFAULT_PARAMS[0]).then(res => { + const request = spec.buildRequests(OUTSTREAM_DEFAULT_PARAMS, res); + expect(request[0]).to.have.property('url').and.to.equal('https://prg.smartadserver.com/prebid/v1'); + expect(request[0]).to.have.property('method').and.to.equal('POST'); + const requestContent = JSON.parse(request[0].data); + expect(requestContent).to.have.property('siteid').and.to.equal('1234'); + expect(requestContent).to.have.property('pageid').and.to.equal('5678'); + expect(requestContent).to.have.property('formatid').and.to.equal('91'); + expect(requestContent).to.have.property('currencyCode').and.to.equal('EUR'); + expect(requestContent).to.have.property('bidfloor').and.to.equal(0.43); + expect(requestContent).to.have.property('targeting').and.to.equal('test=prebid-outstream'); + expect(requestContent).to.have.property('tagId').and.to.equal('sas_43'); + expect(requestContent).to.not.have.property('pageDomain'); + expect(requestContent).to.have.property('transactionId').and.to.not.equal(null).and.to.not.be.undefined; + expect(requestContent).to.have.property('buid').and.to.equal('7579'); + expect(requestContent).to.have.property('appname').and.to.equal('Mozilla'); + expect(requestContent).to.have.property('ckid').and.to.equal(43); + expect(requestContent).to.have.property('sda').and.to.deep.equal(sellerDefinedAudience); + expect(requestContent).to.have.property('sdc').and.to.deep.equal(sellerDefinedContext); + expect(requestContent).to.have.property('isVideo').and.to.equal(false); + expect(requestContent).to.have.property('videoData'); + expect(requestContent.videoData).to.have.property('videoProtocol').and.to.equal(7); + expect(requestContent.videoData).to.have.property('playerWidth').and.to.equal(800); + expect(requestContent.videoData).to.have.property('playerHeight').and.to.equal(600); + setCurrencyConfig({}); + }); }); it('Verify outstream parse response', function () { diff --git a/test/spec/modules/visxBidAdapter_spec.js b/test/spec/modules/visxBidAdapter_spec.js index db928e4d802..923ff7e86b2 100755 --- a/test/spec/modules/visxBidAdapter_spec.js +++ b/test/spec/modules/visxBidAdapter_spec.js @@ -5,6 +5,8 @@ import { newBidder } from 'src/adapters/bidderFactory.js'; import * as utils from 'src/utils.js'; import { makeSlot } from '../integration/faker/googletag.js'; import { mergeDeep } from '../../../src/utils.js'; +import { setConfig as setCurrencyConfig } from '../../../modules/currency.js'; +import { addFPDToBidderRequest } from '../../helpers/fpd.js'; describe('VisxAdapter', function () { const adapter = newBidder(spec); @@ -355,8 +357,7 @@ describe('VisxAdapter', function () { }); it('should add currency from currency.bidderCurrencyDefault', function () { - const getConfigStub = sinon.stub(config, 'getConfig').callsFake( - arg => arg === 'currency.bidderCurrencyDefault.visx' ? 'GBP' : 'USD'); + config.setConfig({currency: {bidderCurrencyDefault: {visx: 'GBP'}}}) const request = spec.buildRequests(bidRequests, bidderRequest); const payload = parseRequest(request.url); expect(payload).to.be.an('object'); @@ -410,66 +411,22 @@ describe('VisxAdapter', function () { } }); - getConfigStub.restore(); + config.resetConfig(); }); it('should add currency from currency.adServerCurrency', function () { - const getConfigStub = sinon.stub(config, 'getConfig').callsFake( - arg => arg === 'currency.bidderCurrencyDefault.visx' ? '' : 'USD'); - const request = spec.buildRequests(bidRequests, bidderRequest); - const payload = parseRequest(request.url); - expect(payload).to.be.an('object'); - expect(payload).to.have.property('auids', '903535,903535,903536,903537'); - - const postData = request.data; - expect(postData).to.be.an('object'); - expect(postData).to.deep.equal({ - 'id': '22edbae2733bf6', - 'imp': expectedFullImps, - 'tmax': 3000, - 'cur': ['USD'], - 'source': {'ext': {'wrapperType': 'Prebid_js', 'wrapperVersion': '$prebid.version$'}}, - 'site': { - 'domain': 'localhost:9999', - 'publisher': { - 'domain': 'localhost:9999' - }, - 'page': 'http://localhost:9999/integrationExamples/gpt/hello_world.html' - }, - 'device': { - 'w': 1259, - 'h': 934, - 'dnt': 0, - 'ua': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36', - 'language': 'tr', - 'sua': { - 'source': 1, - 'platform': { - 'brand': 'macOS' - }, - 'browsers': [ - { - 'brand': 'Chromium', - 'version': [ '124' ] - }, - { - 'brand': 'Google Chrome', - 'version': [ '124' ] - }, - { - 'brand': 'Not-A.Brand', - 'version': [ '99' ] - } - ], - 'mobile': 0 - }, - 'ext': { - 'cdep': 'treatment_1.1' - } - }, + setCurrencyConfig({ adServerCurrency: 'USD' }) + return addFPDToBidderRequest(bidderRequest).then(res => { + const request = spec.buildRequests(bidRequests, res); + const payload = parseRequest(request.url); + expect(payload).to.be.an('object'); + expect(payload).to.have.property('auids', '903535,903535,903536,903537'); + + const postData = request.data; + expect(postData).to.be.an('object'); + expect(postData.cur).to.deep.equal(['USD']); + setCurrencyConfig({}) }); - - getConfigStub.restore(); }); it('if gdprConsent is present payload must have gdpr params', function () { diff --git a/test/spec/modules/voxBidAdapter_spec.js b/test/spec/modules/voxBidAdapter_spec.js index 5f4ada06c65..65752837b23 100644 --- a/test/spec/modules/voxBidAdapter_spec.js +++ b/test/spec/modules/voxBidAdapter_spec.js @@ -1,6 +1,7 @@ import { expect } from 'chai' import { spec } from 'modules/voxBidAdapter.js' -import {config} from 'src/config.js' +import { setConfig as setCurrencyConfig } from '../../../modules/currency' +import { addFPDToBidderRequest } from '../../helpers/fpd' function getSlotConfigs(mediaTypes, params) { return { @@ -247,14 +248,17 @@ describe('VOX Adapter', function() { }) it('should request floor price in adserver currency', function () { - const configCurrency = 'DKK' - config.setConfig({ currency: { adServerCurrency: configCurrency } }) - const request = spec.buildRequests([ getBidWithFloor() ], bidderRequest) - const data = JSON.parse(request.data) - data.bidRequests.forEach(bid => { - expect(bid.floorInfo.currency).to.equal(configCurrency) - }) - }) + const configCurrency = 'DKK'; + setCurrencyConfig({ adServerCurrency: configCurrency }); + return addFPDToBidderRequest(bidderRequest).then(res => { + const request = spec.buildRequests([ getBidWithFloor() ], res) + const data = JSON.parse(request.data) + data.bidRequests.forEach(bid => { + expect(bid.floorInfo.currency).to.equal(configCurrency) + }) + setCurrencyConfig({}); + }); + }); function getBidWithFloor(floor) { return { diff --git a/test/spec/modules/yandexBidAdapter_spec.js b/test/spec/modules/yandexBidAdapter_spec.js index 140be4121ec..e6b2f5cc1f0 100644 --- a/test/spec/modules/yandexBidAdapter_spec.js +++ b/test/spec/modules/yandexBidAdapter_spec.js @@ -1,8 +1,9 @@ import { assert, expect } from 'chai'; import { NATIVE_ASSETS, spec } from 'modules/yandexBidAdapter.js'; import * as utils from 'src/utils.js'; -import { config } from '../../../src/config'; +import { setConfig as setCurrencyConfig } from '../../../modules/currency'; import { BANNER, NATIVE } from '../../../src/mediaTypes'; +import { addFPDToBidderRequest } from '../../helpers/fpd'; describe('Yandex adapter', function () { describe('isBidRequestValid', function () { @@ -125,19 +126,21 @@ describe('Yandex adapter', function () { }); it('should send currency if defined', function () { - config.setConfig({ - currency: { - adServerCurrency: 'USD' - } + setCurrencyConfig({ + adServerCurrency: 'USD' }); const bannerRequest = getBidRequest(); - const requests = spec.buildRequests([bannerRequest], bidderRequest); - const { url } = requests[0]; - const parsedRequestUrl = utils.parseUrl(url); - const { search: query } = parsedRequestUrl - expect(query['ssp-cur']).to.equal('USD'); + return addFPDToBidderRequest(bidderRequest).then(res => { + const requests = spec.buildRequests([bannerRequest], res); + const { url } = requests[0]; + const parsedRequestUrl = utils.parseUrl(url); + const { search: query } = parsedRequestUrl + + expect(query['ssp-cur']).to.equal('USD'); + setCurrencyConfig({}); + }); }); it('should send eids and ortb2 user data if defined', function() {