diff --git a/modules/teadsBidAdapter.js b/modules/teadsBidAdapter.js index e8dbe4e1c6b..96855e56882 100644 --- a/modules/teadsBidAdapter.js +++ b/modules/teadsBidAdapter.js @@ -116,7 +116,7 @@ function buildRequestObject(bid) { let placementId = utils.getValue(bid.params, 'placementId'); let pageId = utils.getValue(bid.params, 'pageId'); - reqObj.sizes = utils.parseSizesInput(bid.sizes); + reqObj.sizes = getSizes(bid); reqObj.bidId = utils.getBidIdParameter('bidId', bid); reqObj.bidderRequestId = utils.getBidIdParameter('bidderRequestId', bid); reqObj.placementId = parseInt(placementId, 10); @@ -127,6 +127,33 @@ function buildRequestObject(bid) { return reqObj; } +function getSizes(bid) { + return utils.parseSizesInput(concatSizes(bid)); +} + +function concatSizes(bid) { + let playerSize = utils.deepAccess(bid, 'mediaTypes.video.playerSize'); + let videoSizes = utils.deepAccess(bid, 'mediaTypes.video.sizes'); + let bannerSizes = utils.deepAccess(bid, 'mediaTypes.banner.sizes'); + + if (utils.isArray(bannerSizes) || utils.isArray(playerSize) || utils.isArray(videoSizes)) { + let mediaTypesSizes = [bannerSizes, videoSizes, playerSize]; + return mediaTypesSizes + .reduce(function(acc, currSize) { + if (utils.isArray(currSize)) { + if (utils.isArray(currSize[0])) { + currSize.forEach(function (childSize) { acc.push(childSize) }) + } else { + acc.push(currSize); + } + } + return acc; + }, []) + } else { + return bid.sizes; + } +} + function _validateId(id) { return (parseInt(id) > 0); } diff --git a/test/spec/modules/teadsBidAdapter_spec.js b/test/spec/modules/teadsBidAdapter_spec.js index ab34c600a53..20fdbe947c0 100644 --- a/test/spec/modules/teadsBidAdapter_spec.js +++ b/test/spec/modules/teadsBidAdapter_spec.js @@ -3,7 +3,7 @@ import {spec} from 'modules/teadsBidAdapter'; import {newBidder} from 'src/adapters/bidderFactory'; const ENDPOINT = '//a.teads.tv/hb/bid-request'; -const AD_SCRIPT = '"'; +const AD_SCRIPT = '"'; describe('teadsBidAdapter', function() { const adapter = newBidder(spec); @@ -96,13 +96,14 @@ describe('teadsBidAdapter', function() { } ]; + let bidderResquestDefault = { + 'auctionId': '1d1a030790a475', + 'bidderRequestId': '22edbae2733bf6', + 'timeout': 3000 + }; + it('sends bid request to ENDPOINT via POST', function() { - let bidderRequest = { - 'auctionId': '1d1a030790a475', - 'bidderRequestId': '22edbae2733bf6', - 'timeout': 3000 - }; - const request = spec.buildRequests(bidRequests, bidderRequest); + const request = spec.buildRequests(bidRequests, bidderResquestDefault); expect(request.url).to.equal(ENDPOINT); expect(request.method).to.equal('POST'); @@ -129,7 +130,7 @@ describe('teadsBidAdapter', function() { expect(payload.gdpr_iab).to.exist; expect(payload.gdpr_iab.consent).to.equal(consentString); expect(payload.gdpr_iab.status).to.equal(12); - }) + }); it('should send GDPR to endpoint with 11 status', function() { let consentString = 'JRJ8RKfDeBNsERRDCSAAZ+A=='; @@ -152,7 +153,7 @@ describe('teadsBidAdapter', function() { expect(payload.gdpr_iab).to.exist; expect(payload.gdpr_iab.consent).to.equal(consentString); expect(payload.gdpr_iab.status).to.equal(11); - }) + }); it('should send GDPR to endpoint with 22 status', function() { let consentString = 'JRJ8RKfDeBNsERRDCSAAZ+A=='; @@ -173,7 +174,7 @@ describe('teadsBidAdapter', function() { expect(payload.gdpr_iab).to.exist; expect(payload.gdpr_iab.consent).to.equal(''); expect(payload.gdpr_iab.status).to.equal(22); - }) + }); it('should send GDPR to endpoint with 0 status', function() { let consentString = 'JRJ8RKfDeBNsERRDCSAAZ+A=='; @@ -196,7 +197,68 @@ describe('teadsBidAdapter', function() { expect(payload.gdpr_iab).to.exist; expect(payload.gdpr_iab.consent).to.equal(consentString); expect(payload.gdpr_iab.status).to.equal(0); - }) + }); + + it('should use good mediaTypes video playerSizes', function() { + const mediaTypesPlayerSize = { + 'mediaTypes': { + 'video': { + 'playerSize': [32, 34] + } + } + }; + checkMediaTypesSizes(mediaTypesPlayerSize, '32x34') + }); + + it('should use good mediaTypes video sizes', function() { + const mediaTypesVideoSizes = { + 'mediaTypes': { + 'video': { + 'sizes': [12, 14] + } + } + }; + checkMediaTypesSizes(mediaTypesVideoSizes, '12x14') + }); + + it('should use good mediaTypes banner sizes', function() { + const mediaTypesBannerSize = { + 'mediaTypes': { + 'banner': { + 'sizes': [46, 48] + } + } + }; + checkMediaTypesSizes(mediaTypesBannerSize, '46x48') + }); + + it('should use good mediaTypes for both video and banner sizes', function() { + const hybridMediaTypes = { + 'mediaTypes': { + 'banner': { + 'sizes': [46, 48] + }, + 'video': { + 'sizes': [[50, 34], [45, 45]] + } + } + }; + checkMediaTypesSizes(hybridMediaTypes, ['46x48', '50x34', '45x45']) + }); + + function checkMediaTypesSizes(mediaTypes, expectedSizes) { + const bidRequestWithBannerSizes = Object.assign(bidRequests[0], mediaTypes); + const requestWithBannerSizes = spec.buildRequests([bidRequestWithBannerSizes], bidderResquestDefault); + const payloadWithBannerSizes = JSON.parse(requestWithBannerSizes.data); + + return payloadWithBannerSizes.data.forEach(bid => { + if (Array.isArray(expectedSizes)) { + expect(JSON.stringify(bid.sizes)).to.equal(JSON.stringify(expectedSizes)); + } else { + expect(bid.sizes[0]).to.equal(expectedSizes); + } + }); + } }); describe('interpretResponse', function() {