From b4efa8015a85fd39403753559b6a5f6f2f511ce3 Mon Sep 17 00:00:00 2001 From: ourcraig Date: Thu, 31 Oct 2024 13:30:55 +1100 Subject: [PATCH] rubicon Bid Adapter : add support for twin ad units (#12328) * Add support for twin ad units * Remove impIdMap loop in favour of ternary operator --- modules/rubiconBidAdapter.js | 7 +++ test/spec/modules/rubiconBidAdapter_spec.js | 64 ++++++++++++++------- 2 files changed, 49 insertions(+), 22 deletions(-) diff --git a/modules/rubiconBidAdapter.js b/modules/rubiconBidAdapter.js index 0cd3b027ad3..c0e356b86e2 100644 --- a/modules/rubiconBidAdapter.js +++ b/modules/rubiconBidAdapter.js @@ -42,6 +42,8 @@ config.getConfig('rubicon', config => { const GVLID = 52; +let impIdMap = {}; + var sizeMap = { 1: '468x60', 2: '728x90', @@ -218,6 +220,9 @@ export const converter = ortbConverter({ setBidFloors(bidRequest, imp); + // ensure unique imp IDs for twin adunits + imp.id = impIdMap[imp.id] ? imp.id + impIdMap[imp.id]++ : (impIdMap[imp.id] = 2, imp.id); + return imp; }, bidResponse(buildBidResponse, bid, context) { @@ -308,6 +313,7 @@ export const spec = { if (filteredRequests && filteredRequests.length) { const data = converter.toORTB({bidRequests: filteredRequests, bidderRequest}); + resetImpIdMap(); filteredHttpRequest.push({ method: 'POST', @@ -1158,6 +1164,7 @@ function bidType(bid, log = false) { } export const resetRubiConf = () => rubiConf = {}; +export const resetImpIdMap = () => impIdMap = {}; export function masSizeOrdering(sizes) { const MAS_SIZE_PRIORITY = [15, 2, 9]; diff --git a/test/spec/modules/rubiconBidAdapter_spec.js b/test/spec/modules/rubiconBidAdapter_spec.js index 2ce16ab8101..1b91586dfb5 100644 --- a/test/spec/modules/rubiconBidAdapter_spec.js +++ b/test/spec/modules/rubiconBidAdapter_spec.js @@ -6,6 +6,7 @@ import { resetUserSync, classifiedAsVideo, resetRubiConf, + resetImpIdMap, converter } from 'modules/rubiconBidAdapter.js'; import {config} from 'src/config.js'; @@ -485,6 +486,7 @@ describe('the rubicon adapter', function () { utils.logError.restore(); config.resetConfig(); resetRubiConf(); + resetImpIdMap(); delete $$PREBID_GLOBAL$$.installedModules; }); @@ -3060,6 +3062,21 @@ describe('the rubicon adapter', function () { expect(other).to.be.empty; }); }); + + describe('with duplicate adUnitCodes', () => { + it('should increment PBS request imp[].id starting at 2', () => { + const nativeBidderRequest = addNativeToBidRequest(bidderRequest, {twin: true}); + const request = converter.toORTB({bidderRequest: nativeBidderRequest, bidRequests: nativeBidderRequest.bids}); + for (let i = 0; i < nativeBidderRequest.bids.length; i++) { + var adUnitCode = nativeBidderRequest.bids[i].adUnitCode; + if (i === 0) { + expect(request.imp[i].id).to.equal(adUnitCode); + } else { + expect(request.imp[i].id).to.equal(adUnitCode + (i + 1)); + } + } + }); + }); }); } }); @@ -3997,7 +4014,7 @@ describe('the rubicon adapter', function () { let bids = spec.interpretResponse({body: response}, {data: request}); expect(bids[0].width).to.equal(0); expect(bids[0].height).to.equal(0); - }) + }); }); } @@ -4545,7 +4562,7 @@ describe('the rubicon adapter', function () { }); }); -function addNativeToBidRequest(bidderRequest) { +function addNativeToBidRequest(bidderRequest, options = {twin: false}) { const nativeOrtbRequest = { assets: [{ id: 0, @@ -4574,27 +4591,30 @@ function addNativeToBidRequest(bidderRequest) { bidderRequest.refererInfo = { page: 'localhost' } - bidderRequest.bids[0] = { - bidder: 'rubicon', - params: { - accountId: '14062', - siteId: '70608', - zoneId: '335918', - }, - adUnitCode: '/19968336/header-bid-tag-0', - code: 'div-1', - bidId: '2ffb201a808da7', - bidderRequestId: '178e34bad3658f', - auctionId: 'c45dd708-a418-42ec-b8a7-b70a6c6fab0a', - transactionId: 'd45dd707-a418-42ec-b8a7-b70a6c6fab0b', - mediaTypes: { - native: { - ortb: { - ...nativeOrtbRequest + const numBids = !options.twin ? 1 : 2; + for (let i = 0; i < numBids; i++) { + bidderRequest.bids[i] = { + bidder: 'rubicon', + params: { + accountId: '14062', + siteId: '70608', + zoneId: '335918', + }, + adUnitCode: '/19968336/header-bid-tag-0', + code: 'div-1', + bidId: '2ffb201a808da7', + bidderRequestId: '178e34bad3658f', + auctionId: 'c45dd708-a418-42ec-b8a7-b70a6c6fab0a', + transactionId: 'd45dd707-a418-42ec-b8a7-b70a6c6fab0b', + mediaTypes: { + native: { + ortb: { + ...nativeOrtbRequest + } } - } - }, - nativeOrtbRequest + }, + nativeOrtbRequest + } } return bidderRequest; }