diff --git a/modules/targetVideoBidAdapter.js b/modules/targetVideoBidAdapter.js index 8473023154..723c9d77db 100644 --- a/modules/targetVideoBidAdapter.js +++ b/modules/targetVideoBidAdapter.js @@ -1,4 +1,4 @@ -import {_each, deepAccess, getDefinedParams, parseGPTSingleSizeArrayToRtbSize} from '../src/utils.js'; +import {_each, deepAccess, getDefinedParams, isFn, isPlainObject, parseGPTSingleSizeArrayToRtbSize} from '../src/utils.js'; import {BANNER, VIDEO} from '../src/mediaTypes.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import {formatRequest, getRtbBid, getSiteObj, getSyncResponse, videoBid, bannerBid, createVideoTag} from '../libraries/targetVideoUtils/bidderUtils.js'; @@ -9,6 +9,22 @@ import {SOURCE, GVLID, BIDDER_CODE, VIDEO_PARAMS, BANNER_ENDPOINT_URL, VIDEO_END * @typedef {import('../src/adapters/bidderFactory.js').Bid} Bid */ +function getBidFloor(bid) { + if (!isFn(bid.getFloor)) { + return (bid.params.floor) ? bid.params.floor : null; + } + + const floor = bid.getFloor({ + currency: 'EUR', + mediaType: '*', + size: '*' + }); + if (isPlainObject(floor) && !isNaN(floor.floor) && floor.currency === 'EUR') { + return floor.floor; + } + return null; +} + export const spec = { code: BIDDER_CODE, @@ -38,13 +54,15 @@ export const spec = { version: '$prebid.version$' }; - for (let {params, bidId, sizes, mediaTypes, ...bid} of bidRequests) { + for (let {bidId, sizes, mediaTypes, ...bid} of bidRequests) { for (const mediaType in mediaTypes) { switch (mediaType) { case VIDEO: { + const params = bid.params; const video = mediaTypes[VIDEO]; const placementId = params.placementId; const site = getSiteObj(); + const floor = getBidFloor(bid); if (sizes && !Array.isArray(sizes[0])) sizes = [sizes]; @@ -71,6 +89,12 @@ export const spec = { video: getDefinedParams(video, VIDEO_PARAMS) } + const bidFloor = typeof floor === 'string' ? Number(floor.trim()) + : typeof floor === 'number' ? floor + : NaN; + + if (Number.isFinite(bidFloor) && bidFloor > 0) imp.bidfloor = bidFloor; + if (video.playerSize) { imp.video = Object.assign( imp.video, parseGPTSingleSizeArrayToRtbSize(video.playerSize[0]) || {} diff --git a/modules/targetVideoBidAdapter.md b/modules/targetVideoBidAdapter.md index a34ad0aff2..9a204a8699 100644 --- a/modules/targetVideoBidAdapter.md +++ b/modules/targetVideoBidAdapter.md @@ -43,6 +43,7 @@ var adUnits = [ bidder: 'targetVideo', params: { placementId: 12345, + floor: 2, reserve: 0, } }] diff --git a/test/spec/modules/targetVideoBidAdapter_spec.js b/test/spec/modules/targetVideoBidAdapter_spec.js index 838fd50f76..9b91e71c7d 100644 --- a/test/spec/modules/targetVideoBidAdapter_spec.js +++ b/test/spec/modules/targetVideoBidAdapter_spec.js @@ -7,6 +7,13 @@ describe('TargetVideo Bid Adapter', function() { const params = { placementId: 12345, }; + const videoMediaTypes = { + video: { + playerSize: [[640, 360]], + context: 'instream', + playbackmethod: [1, 2, 3, 4] + } + } const defaultBidderRequest = { bidderRequestId: 'mock-uuid', @@ -25,13 +32,7 @@ describe('TargetVideo Bid Adapter', function() { const videoRequest = [{ bidder, params, - mediaTypes: { - video: { - playerSize: [[640, 360]], - context: 'instream', - playbackmethod: [1, 2, 3, 4] - } - } + mediaTypes: videoMediaTypes, }]; it('Test the bid validation function', function() { @@ -353,4 +354,43 @@ describe('TargetVideo Bid Adapter', function() { const userSyncs = spec.getUserSyncs({iframeEnabled: false}); expect(userSyncs).to.have.lengthOf(0); }); + + it('Test the VIDEO request floor param', function() { + const requests = [ + { + bidder, + params: { + ...params, + floor: 2.12, + }, + mediaTypes: videoMediaTypes, + }, + { + bidder, + params: { + ...params, + floor: "1.55", + }, + mediaTypes: videoMediaTypes, + }, + { + bidder, + params: { + ...params, + floor: "abc", + }, + mediaTypes: videoMediaTypes, + } + ] + + const bids = spec.buildRequests(requests, defaultBidderRequest) + + const payload1 = JSON.parse(bids[0].data); + const payload2 = JSON.parse(bids[1].data); + const payload3 = JSON.parse(bids[2].data); + + expect(payload1.imp[0].bidfloor).to.exist.and.equal(2.12); + expect(payload2.imp[0].bidfloor).to.exist.and.equal(1.55); + expect(payload3.imp[0].bidfloor).to.not.exist; + }); });