From 38de40a6855f0c16e2c0440abfaf2ff918b15eab Mon Sep 17 00:00:00 2001 From: Lovell Fuller Date: Wed, 28 Feb 2018 18:45:37 +0000 Subject: [PATCH] Audience Network: allow native bids for non-IAB sizes --- modules/audienceNetworkBidAdapter.js | 29 ++++++++++- .../modules/audienceNetworkBidAdapter_spec.js | 49 +++++++++++++++++++ 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/modules/audienceNetworkBidAdapter.js b/modules/audienceNetworkBidAdapter.js index 3153a64a48d..ed78f336102 100644 --- a/modules/audienceNetworkBidAdapter.js +++ b/modules/audienceNetworkBidAdapter.js @@ -26,7 +26,8 @@ const isBidRequestValid = bid => typeof bid.params.placementId === 'string' && bid.params.placementId.length > 0 && Array.isArray(bid.sizes) && bid.sizes.length > 0 && - (isVideo(bid.params.format) || bid.sizes.map(flattenSize).some(isValidSize)); + (isFullWidth(bid.params.format) ? bid.sizes.map(flattenSize).every(size => size === '300x250') : true) && + (isValidNonSizedFormat(bid.params.format) || bid.sizes.map(flattenSize).some(isValidSize)); /** * Flattens a 2-element [W, H] array as a 'WxH' string, @@ -51,6 +52,23 @@ const expandSize = size => size.split('x').map(Number); */ const isValidSize = size => includes(['300x250', '320x50'], size); +/** + * Is this a valid, non-sized format? + * @param {String} size + * @returns {Boolean} + */ +const isValidNonSizedFormat = format => includes(['video', 'native'], format); + +/** + * Is this a valid size and format? + * @param {String} size + * @returns {Boolean} + */ +const isValidSizeAndFormat = (size, format) => + (isFullWidth(format) && flattenSize(size) === '300x250') || + isValidNonSizedFormat(format) || + isValidSize(flattenSize(size)); + /** * Is this a video format? * @param {String} format @@ -58,6 +76,13 @@ const isValidSize = size => includes(['300x250', '320x50'], size); */ const isVideo = format => format === 'video'; +/** + * Is this a fullwidth format? + * @param {String} format + * @returns {Boolean} + */ +const isFullWidth = format => format === 'fullwidth'; + /** * Which SDK version should be used for this format? * @param {String} format @@ -120,7 +145,7 @@ const buildRequests = bids => { bids.forEach(bid => bid.sizes .map(flattenSize) - .filter(size => isValidSize(size) || isVideo(bid.params.format)) + .filter(size => isValidSizeAndFormat(size, bid.params.format)) .slice(0, 1) .forEach(size => { placementids.push(bid.params.placementId); diff --git a/test/spec/modules/audienceNetworkBidAdapter_spec.js b/test/spec/modules/audienceNetworkBidAdapter_spec.js index 6b21eb459d4..d92597c913c 100644 --- a/test/spec/modules/audienceNetworkBidAdapter_spec.js +++ b/test/spec/modules/audienceNetworkBidAdapter_spec.js @@ -92,6 +92,17 @@ describe('AudienceNetwork adapter', () => { })).to.equal(true); }); + it('native with non-IAB size', () => { + expect(isBidRequestValid({ + bidder, + sizes: [[728, 90]], + params: { + placementId, + format: 'native' + } + })).to.equal(true); + }); + it('video', () => { expect(isBidRequestValid({ bidder, @@ -139,6 +150,44 @@ describe('AudienceNetwork adapter', () => { data: 'placementids[]=test-placement-id&adformats[]=video&testmode=false&pageurl=&sdk[]=&playerwidth=640&playerheight=480' }]); }); + + it('can build URL for native unit in non-IAB size', () => { + expect(buildRequests([{ + bidder, + bidId: requestId, + sizes: [[728, 90]], + params: { + placementId, + format: 'native' + } + }])).to.deep.equal([{ + adformats: ['native'], + method: 'GET', + requestIds: [requestId], + sizes: ['728x90'], + url: 'https://an.facebook.com/v2/placementbid.json', + data: 'placementids[]=test-placement-id&adformats[]=native&testmode=false&pageurl=&sdk[]=5.5.web' + }]); + }); + + it('can build URL for fullwidth 300x250 unit', () => { + expect(buildRequests([{ + bidder, + bidId: requestId, + sizes: [[300, 250]], + params: { + placementId, + format: 'fullwidth' + } + }])).to.deep.equal([{ + adformats: ['fullwidth'], + method: 'GET', + requestIds: [requestId], + sizes: ['300x250'], + url: 'https://an.facebook.com/v2/placementbid.json', + data: 'placementids[]=test-placement-id&adformats[]=fullwidth&testmode=false&pageurl=&sdk[]=5.5.web' + }]); + }); }); describe('interpretResponse', () => {