diff --git a/modules/gridBidAdapter.js b/modules/gridBidAdapter.js index d1743ac63af..313f88e967a 100644 --- a/modules/gridBidAdapter.js +++ b/modules/gridBidAdapter.js @@ -72,10 +72,14 @@ export const spec = { let forceBidderName = false; let {bidderRequestId, auctionId, gdprConsent, uspConsent, timeout, refererInfo} = bidderRequest || {}; - // TODO: is 'page' the right value here? const referer = refererInfo ? encodeURIComponent(refererInfo.page) : ''; + const bidderTimeout = config.getConfig('bidderTimeout') || timeout; + const tmax = timeout ? Math.min(bidderTimeout, timeout) : bidderTimeout; const imp = []; const bidsMap = {}; + const requests = []; + const sources = []; + const bidsArray = []; validBidRequests.forEach((bid) => { if (!bidderRequestId) { @@ -93,7 +97,8 @@ export const spec = { if (!endpoint) { endpoint = ALIAS_CONFIG[bid.bidder] && ALIAS_CONFIG[bid.bidder].endpoint; } - const { params: { uid, keywords, forceBidder }, mediaTypes, bidId, adUnitCode, rtd, ortb2Imp } = bid; + const { params: { uid, keywords, forceBidder, multiRequest }, mediaTypes, bidId, adUnitCode, rtd, ortb2Imp } = bid; + const { pubdata, secid, pubid, source, content: bidParamsContent } = bid.params; bidsMap[bidId] = bid; const bidFloor = _getFloor(mediaTypes || {}, bid); const jwTargeting = rtd && rtd.jwplayer && rtd.jwplayer.targeting; @@ -105,9 +110,10 @@ export const spec = { content = jwTargeting.content; } } + let impObj = { id: bidId.toString(), - tagid: uid.toString(), + tagid: (secid || uid).toString(), ext: { divid: adUnitCode.toString() } @@ -150,7 +156,54 @@ export const spec = { } if (impObj.banner || impObj.video) { - imp.push(impObj); + if (multiRequest) { + const reqSource = { + tid: bid.auctionId && bid.auctionId.toString(), + ext: { + wrapper: 'Prebid_js', + wrapper_version: '$prebid.version$' + } + }; + if (bid.schain) { + reqSource.ext.schain = bid.schain; + } + const request = { + id: bid.bidderRequestId && bid.bidderRequestId.toString(), + site: { + page: referer, + }, + tmax, + source: reqSource, + imp: [impObj] + }; + + if (pubid) { + request.site.publisher = { id: pubid }; + } + + const reqJwpseg = (pubdata && pubdata.jwpseg) || (jwTargeting && jwTargeting.segments); + + const siteContent = bidParamsContent || (jwTargeting && jwTargeting.content); + + if (siteContent) { + request.site.content = siteContent; + } + + if (reqJwpseg && reqJwpseg.length) { + request.user = { + data: [{ + name: 'iow_labs_pub_data', + segment: segmentProcessing(reqJwpseg, 'jwpseg'), + }] + }; + } + + requests.push(request); + sources.push(source); + bidsArray.push(bid); + } else { + imp.push(impObj); + } } if (!forceBidderName && forceBidder && ALIAS_CONFIG[forceBidder]) { @@ -165,7 +218,7 @@ export const spec = { this.forceBidderName = forceBidderName; } - const source = { + const reqSource = { tid: auctionId && auctionId.toString(), ext: { wrapper: 'Prebid_js', @@ -174,28 +227,25 @@ export const spec = { }; if (schain) { - source.ext.schain = schain; + reqSource.ext.schain = schain; } - const bidderTimeout = config.getConfig('bidderTimeout') || timeout; - const tmax = timeout ? Math.min(bidderTimeout, timeout) : bidderTimeout; - - let request = { + const mainRequest = (imp.length || !requests.length) ? { id: bidderRequestId && bidderRequestId.toString(), site: { page: referer }, tmax, - source, + source: reqSource, imp - }; + } : null; if (content) { - request.site.content = content; + mainRequest.site.content = content; } if (jwpseg && jwpseg.length) { - user = { + mainRequest.user = { data: [{ name: 'iow_labs_pub_data', segment: segmentProcessing(jwpseg, 'jwpseg'), @@ -203,131 +253,151 @@ export const spec = { }; } - const ortb2UserData = deepAccess(bidderRequest, 'ortb2.user.data'); - if (ortb2UserData && ortb2UserData.length) { - if (!user) { - user = { data: [] }; + [...requests, mainRequest].forEach((request) => { + if (!request) { + return; } - user = mergeDeep(user, { - data: [...ortb2UserData] - }); - } - if (gdprConsent && gdprConsent.consentString) { - userExt = {consent: gdprConsent.consentString}; - } + const ortb2UserData = deepAccess(bidderRequest, 'ortb2.user.data'); + if (ortb2UserData && ortb2UserData.length) { + user = request.user || { data: [] }; + user = mergeDeep(user, { + data: [...ortb2UserData] + }); + } - const ortb2UserExtDevice = deepAccess(bidderRequest, 'ortb2.user.ext.device'); - if (ortb2UserExtDevice) { - userExt = userExt || {}; - userExt.device = { ...ortb2UserExtDevice }; - } + if (gdprConsent && gdprConsent.consentString) { + userExt = {consent: gdprConsent.consentString}; + } - if (userIdAsEids && userIdAsEids.length) { - userExt = userExt || {}; - userExt.eids = [...userIdAsEids]; - } + const ortb2UserExtDevice = deepAccess(bidderRequest, 'ortb2.user.ext.device'); + if (ortb2UserExtDevice) { + userExt = userExt || {}; + userExt.device = { ...ortb2UserExtDevice }; + } - if (userExt && Object.keys(userExt).length) { - user = user || {}; - user.ext = userExt; - } + if (userIdAsEids && userIdAsEids.length) { + userExt = userExt || {}; + userExt.eids = [...userIdAsEids]; + } - const fpdUserId = getUserIdFromFPDStorage(); + if (userExt && Object.keys(userExt).length) { + user = user || {}; + user.ext = userExt; + } - if (fpdUserId) { - user = user || {}; - user.id = fpdUserId.toString(); - } + const fpdUserId = getUserIdFromFPDStorage(); - if (user) { - request.user = user; - } + if (fpdUserId) { + user = user || {}; + user.id = fpdUserId.toString(); + } - const userKeywords = deepAccess(bidderRequest, 'ortb2.user.keywords') || null; - const siteKeywords = deepAccess(bidderRequest, 'ortb2.site.keywords') || null; + if (user) { + request.user = user; + } - if (userKeywords) { - pageKeywords = pageKeywords || {}; - pageKeywords.user = pageKeywords.user || {}; - pageKeywords.user.ortb2 = [ - { - name: 'keywords', - keywords: userKeywords.split(','), - } - ]; - } - if (siteKeywords) { - pageKeywords = pageKeywords || {}; - pageKeywords.site = pageKeywords.site || {}; - pageKeywords.site.ortb2 = [ - { - name: 'keywords', - keywords: siteKeywords.split(','), - } - ]; - } + const userKeywords = deepAccess(bidderRequest, 'ortb2.user.keywords') || null; + const siteKeywords = deepAccess(bidderRequest, 'ortb2.site.keywords') || null; - if (pageKeywords) { - pageKeywords = reformatKeywords(pageKeywords); - if (pageKeywords) { - request.ext = { - keywords: pageKeywords - }; + if (userKeywords) { + pageKeywords = pageKeywords || {}; + pageKeywords.user = pageKeywords.user || {}; + pageKeywords.user.ortb2 = [ + { + name: 'keywords', + keywords: userKeywords.split(','), + } + ]; + } + if (siteKeywords) { + pageKeywords = pageKeywords || {}; + pageKeywords.site = pageKeywords.site || {}; + pageKeywords.site.ortb2 = [ + { + name: 'keywords', + keywords: siteKeywords.split(','), + } + ]; } - } - if (gdprConsent && gdprConsent.gdprApplies) { - request.regs = { - ext: { - gdpr: gdprConsent.gdprApplies ? 1 : 0 + if (pageKeywords) { + pageKeywords = reformatKeywords(pageKeywords); + if (pageKeywords) { + request.ext = { + keywords: pageKeywords + }; } - }; - } - - if (uspConsent) { - if (!request.regs) { - request.regs = {ext: {}}; } - request.regs.ext.us_privacy = uspConsent; - } - if (config.getConfig('coppa') === true) { - if (!request.regs) { - request.regs = {}; + if (gdprConsent && gdprConsent.gdprApplies) { + request.regs = { + ext: { + gdpr: gdprConsent.gdprApplies ? 1 : 0 + } + }; } - request.regs.coppa = 1; - } - const site = deepAccess(bidderRequest, 'ortb2.site'); - if (site) { - const pageCategory = [...(site.cat || []), ...(site.pagecat || [])].filter((category) => { - return category && typeof category === 'string' - }); - if (pageCategory.length) { - request.site.cat = pageCategory; - } - const genre = deepAccess(site, 'content.genre'); - if (genre && typeof genre === 'string') { - request.site.content = {...request.site.content, genre}; + if (uspConsent) { + if (!request.regs) { + request.regs = {ext: {}}; + } + request.regs.ext.us_privacy = uspConsent; } - const data = deepAccess(site, 'content.data'); - if (data && data.length) { - const siteContent = request.site.content || {}; - request.site.content = mergeDeep(siteContent, { data }); + + if (config.getConfig('coppa') === true) { + if (!request.regs) { + request.regs = {}; + } + request.regs.coppa = 1; } - const id = deepAccess(site, 'content.id'); - if (id) { - request.site.content = {...request.site.content, id}; + + const site = deepAccess(bidderRequest, 'ortb2.site'); + if (site) { + const pageCategory = [...(site.cat || []), ...(site.pagecat || [])].filter((category) => { + return category && typeof category === 'string' + }); + if (pageCategory.length) { + request.site.cat = pageCategory; + } + const genre = deepAccess(site, 'content.genre'); + if (genre && typeof genre === 'string') { + request.site.content = {...request.site.content, genre}; + } + const data = deepAccess(site, 'content.data'); + if (data && data.length) { + const siteContent = request.site.content || {}; + request.site.content = mergeDeep(siteContent, { data }); + } + const id = deepAccess(site, 'content.id'); + if (id) { + request.site.content = {...request.site.content, id}; + } } - } + }); - return { + return [...requests.map((req, i) => { + let sp; + const url = (endpoint || ENDPOINT_URL).replace(/[?&]sp=([^?&=]+)/, (i, found) => { + if (found) { + sp = found; + } + return ''; + }); + let currentSource = sources[i] || sp; + const urlWithParams = url + (url.indexOf('?') > -1 ? '&' : '?') + 'no_mapping=1' + (currentSource ? `&sp=${currentSource}` : ''); + return { + method: 'POST', + url: urlWithParams, + data: JSON.stringify(req), + bid: bidsArray[i], + }; + }), ...(mainRequest ? [{ method: 'POST', url: endpoint || ENDPOINT_URL, - data: JSON.stringify(request), + data: JSON.stringify(mainRequest), bidsMap - }; + }] : [])]; }, /** * Unpack the response from the server into a list of bids. @@ -395,7 +465,7 @@ export const spec = { */ function _getFloor (mediaTypes, bid) { const curMediaType = mediaTypes.video ? 'video' : 'banner'; - let floor = bid.params.bidFloor || 0; + let floor = bid.params.bidFloor || bid.params.floorcpm || 0; if (typeof bid.getFloor === 'function') { const floorInfo = bid.getFloor({ @@ -431,7 +501,7 @@ function _addBidResponse(serverBid, bidRequest, bidResponses, RendererConst, bid if (!serverBid.auid) errorMessage = LOG_ERROR_MESS.noAuid + JSON.stringify(serverBid); if (!errorMessage && !serverBid.adm && !serverBid.nurl) errorMessage = LOG_ERROR_MESS.noAdm + JSON.stringify(serverBid); else { - const bid = bidRequest.bidsMap[serverBid.impid]; + const bid = bidRequest.bidsMap ? bidRequest.bidsMap[serverBid.impid] : bidRequest.bid; if (bid) { const bidResponse = { requestId: bid.bidId, // bid.bidderRequestId @@ -483,7 +553,7 @@ function _addBidResponse(serverBid, bidRequest, bidResponses, RendererConst, bid } function createVideoRequest(bid, mediaType) { - const {playerSize, mimes, durationRangeSec, protocols} = mediaType; + const { playerSize, mimes, durationRangeSec, protocols } = mediaType; const size = (playerSize || bid.sizes || [])[0]; if (!size) return; diff --git a/test/spec/modules/gridBidAdapter_spec.js b/test/spec/modules/gridBidAdapter_spec.js index 94524e07fb3..f98ca683024 100644 --- a/test/spec/modules/gridBidAdapter_spec.js +++ b/test/spec/modules/gridBidAdapter_spec.js @@ -126,7 +126,7 @@ describe('TheMediaGrid Adapter', function () { genre: 'Adventure' } }; - const request = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2: {site}}); + const [request] = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2: {site}}); const payload = parseRequest(request.data); expect(payload.site.cat).to.deep.equal([...site.cat, ...site.pagecat]); expect(payload.site.content.genre).to.deep.equal(site.content.genre); @@ -137,7 +137,7 @@ describe('TheMediaGrid Adapter', function () { const getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage').callsFake( arg => arg === 'tmguid' ? fpdUserIdVal : null); - const request = spec.buildRequests([bidRequests[0]], bidderRequest); + const [request] = spec.buildRequests([bidRequests[0]], bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload).to.deep.equal({ @@ -174,7 +174,7 @@ describe('TheMediaGrid Adapter', function () { const getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage').callsFake( arg => arg === 'tmguid' ? fpdUserIdVal : null); - const request = spec.buildRequests([bidRequests[0], bidRequests[1]], bidderRequest); + const [request] = spec.buildRequests([bidRequests[0], bidRequests[1]], bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload).to.deep.equal({ @@ -220,7 +220,7 @@ describe('TheMediaGrid Adapter', function () { const getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage').callsFake( arg => arg === 'tmguid' ? fpdUserIdVal : null); - const request = spec.buildRequests(bidRequests.slice(0, 3), bidderRequest); + const [request] = spec.buildRequests(bidRequests.slice(0, 3), bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload).to.deep.equal({ @@ -270,12 +270,68 @@ describe('TheMediaGrid Adapter', function () { getDataFromLocalStorageStub.restore(); }); + it('should attach valid params to the tags with multiRequest', function () { + const fpdUserIdVal = '0b0f84a1-1596-4165-9742-2e1a7dfac57f'; + const getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage').callsFake( + arg => arg === 'tmguid' ? fpdUserIdVal : null); + + const bidMultiRequests = bidRequests.slice(0, 3).map((bidReq) => ({ + ...bidReq, + params: { ...bidReq.params, multiRequest: true } + })); + bidMultiRequests[1].params.pubid = 'some_pub_id'; + bidMultiRequests[2].params.source = 'jwp'; + const requests = spec.buildRequests(bidMultiRequests, bidderRequest); + requests.forEach((request, i) => { + expect(request.data).to.be.an('string'); + const payload = parseRequest(request.data); + const banner = bidMultiRequests[i].mediaTypes ? bidRequests[i].mediaTypes.banner : { sizes: bidMultiRequests[i].sizes }; + const video = bidMultiRequests[i].mediaTypes && bidMultiRequests[i].mediaTypes.video; + const source = bidMultiRequests[i].params.source; + const url = `https://grid.bidswitch.net/hbjson?no_mapping=1${source ? `&sp=${source}` : ''}`; + expect(request.url).to.equal(url); + expect(payload).to.deep.equal({ + 'id': bidderRequest.bidderRequestId, + 'site': { + 'page': referrer, + ...(bidMultiRequests[i].params.pubid && { 'publisher': { 'id': bidMultiRequests[i].params.pubid } }) + }, + 'tmax': bidderRequest.timeout, + 'source': { + 'tid': bidderRequest.auctionId, + 'ext': {'wrapper': 'Prebid_js', 'wrapper_version': '$prebid.version$'} + }, + 'user': { + 'id': fpdUserIdVal + }, + 'imp': [{ + 'id': bidMultiRequests[i].bidId, + 'tagid': bidMultiRequests[i].params.uid, + 'ext': {'divid': bidMultiRequests[i].adUnitCode}, + ...(bidMultiRequests[i].params.bidFloor && { 'bidfloor': bidMultiRequests[i].params.bidFloor }), + ...(banner && { banner: { + 'w': banner.sizes[0][0], + 'h': banner.sizes[0][1], + 'format': banner.sizes.map(([w, h]) => ({ w, h })) + }}), + ...(video && { video: { + 'w': video.playerSize[0][0], + 'h': video.playerSize[0][1], + 'mimes': video.mimes + }}) + }] + }); + }); + + getDataFromLocalStorageStub.restore(); + }); + it('should support mixed mediaTypes', function () { const fpdUserIdVal = '0b0f84a1-1596-4165-9742-2e1a7dfac57f'; const getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage').callsFake( arg => arg === 'tmguid' ? fpdUserIdVal : null); - const request = spec.buildRequests(bidRequests, bidderRequest); + const [request] = spec.buildRequests(bidRequests, bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload).to.deep.equal({ @@ -341,7 +397,7 @@ describe('TheMediaGrid Adapter', function () { it('if gdprConsent is present payload must have gdpr params', function () { const gdprBidderRequest = Object.assign({gdprConsent: {consentString: 'AAA', gdprApplies: true}}, bidderRequest); - const request = spec.buildRequests(bidRequests, gdprBidderRequest); + const [request] = spec.buildRequests(bidRequests, gdprBidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload).to.have.property('user'); @@ -354,7 +410,7 @@ describe('TheMediaGrid Adapter', function () { it('if usPrivacy is present payload must have us_privacy param', function () { const bidderRequestWithUSP = Object.assign({uspConsent: '1YNN'}, bidderRequest); - const request = spec.buildRequests(bidRequests, bidderRequestWithUSP); + const [request] = spec.buildRequests(bidRequests, bidderRequestWithUSP); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload).to.have.property('regs'); @@ -387,7 +443,7 @@ describe('TheMediaGrid Adapter', function () { userIdAsEids: eids }, bid); }); - const request = spec.buildRequests(bidRequestsWithUserIds, bidderRequest); + const [request] = spec.buildRequests(bidRequestsWithUserIds, bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload).to.have.property('user'); @@ -403,7 +459,7 @@ describe('TheMediaGrid Adapter', function () { }; const ortb2 = {user: {ext: {device: ortb2UserExtDevice}}}; - const request = spec.buildRequests(bidRequests, {...bidderRequest, ortb2}); + const [request] = spec.buildRequests(bidRequests, {...bidderRequest, ortb2}); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload).to.have.property('user'); @@ -427,7 +483,7 @@ describe('TheMediaGrid Adapter', function () { schain: schain }, bid); }); - const request = spec.buildRequests(bidRequestsWithSChain, bidderRequest); + const [request] = spec.buildRequests(bidRequestsWithSChain, bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload).to.have.property('source'); @@ -451,7 +507,7 @@ describe('TheMediaGrid Adapter', function () { } }, bid); }); - const request = spec.buildRequests(bidRequestsWithJwTargeting, bidderRequest); + const [request] = spec.buildRequests(bidRequestsWithJwTargeting, bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload).to.have.property('user'); @@ -494,7 +550,7 @@ describe('TheMediaGrid Adapter', function () { } }; const bidRequestWithKW = { ...bidRequests[0], params: { ...bidRequests[0].params, keywords } } - const request = spec.buildRequests([bidRequestWithKW], {...bidderRequest, ortb2}); + const [request] = spec.buildRequests([bidRequestWithKW], {...bidderRequest, ortb2}); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload.ext.keywords).to.deep.equal({ @@ -556,7 +612,7 @@ describe('TheMediaGrid Adapter', function () { } ]; const ortb2 = {user: {data: userData}}; - const request = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2}); + const [request] = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2}); const payload = parseRequest(request.data); expect(payload.user.data).to.deep.equal(userData); }); @@ -575,7 +631,7 @@ describe('TheMediaGrid Adapter', function () { } ]; const ortb2 = {site: { content: { data: contentData } }}; - const request = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2}); + const [request] = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2}); const payload = parseRequest(request.data); expect(payload.site.content.data).to.deep.equal(contentData); }); @@ -608,7 +664,7 @@ describe('TheMediaGrid Adapter', function () { } } }); - const request = spec.buildRequests([bidRequestsWithJwTargeting], {...bidderRequest, ortb2}); + const [request] = spec.buildRequests([bidRequestsWithJwTargeting], {...bidderRequest, ortb2}); const payload = parseRequest(request.data); expect(payload.user.data).to.deep.equal([{ name: 'iow_labs_pub_data', @@ -622,7 +678,7 @@ describe('TheMediaGrid Adapter', function () { it('should have site.content.id filled from config ortb2.site.content.id', function () { const contentId = 'jw_abc'; const ortb2 = {site: {content: {id: contentId}}}; - const request = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2}); + const [request] = spec.buildRequests([bidRequests[0]], {...bidderRequest, ortb2}); const payload = parseRequest(request.data); expect(payload.site.content.id).to.equal(contentId); }); @@ -630,7 +686,7 @@ describe('TheMediaGrid Adapter', function () { it('should be right tmax when timeout in config is less then timeout in bidderRequest', function() { const getConfigStub = sinon.stub(config, 'getConfig').callsFake( arg => arg === 'bidderTimeout' ? 2000 : null); - const request = spec.buildRequests([bidRequests[0]], bidderRequest); + const [request] = spec.buildRequests([bidRequests[0]], bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload.tmax).to.equal(2000); @@ -639,7 +695,7 @@ describe('TheMediaGrid Adapter', function () { it('should be right tmax when timeout in bidderRequest is less then timeout in config', function() { const getConfigStub = sinon.stub(config, 'getConfig').callsFake( arg => arg === 'bidderTimeout' ? 5000 : null); - const request = spec.buildRequests([bidRequests[0]], bidderRequest); + const [request] = spec.buildRequests([bidRequests[0]], bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload.tmax).to.equal(3000); @@ -648,7 +704,7 @@ describe('TheMediaGrid Adapter', function () { it('should contain regs.coppa if coppa is true in config', function () { const getConfigStub = sinon.stub(config, 'getConfig').callsFake( arg => arg === 'coppa' ? true : null); - const request = spec.buildRequests([bidRequests[0]], bidderRequest); + const [request] = spec.buildRequests([bidRequests[0]], bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload).to.have.property('regs'); @@ -680,7 +736,7 @@ describe('TheMediaGrid Adapter', function () { const bidRequestsWithOrtb2Imp = bidRequests.slice(0, 3).map((bid, ind) => { return Object.assign(ortb2Imp[ind] ? { ortb2Imp: ortb2Imp[ind] } : {}, bid); }); - const request = spec.buildRequests(bidRequestsWithOrtb2Imp, bidderRequest); + const [request] = spec.buildRequests(bidRequestsWithOrtb2Imp, bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload.imp[0].ext).to.deep.equal({ @@ -716,7 +772,7 @@ describe('TheMediaGrid Adapter', function () { const bidRequestsWithOrtb2Imp = bidRequests.slice(0, 3).map((bid, ind) => { return Object.assign(ortb2Imp[ind] ? { ortb2Imp: ortb2Imp[ind] } : {}, bid); }); - const request = spec.buildRequests(bidRequestsWithOrtb2Imp, bidderRequest); + const [request] = spec.buildRequests(bidRequestsWithOrtb2Imp, bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload.imp[0].instl).to.equal(1); @@ -750,7 +806,7 @@ describe('TheMediaGrid Adapter', function () { timeout: 3000 }; const parsedReferrer = encodeURIComponent(bidderRequestWithNumId.refererInfo.page); - const request = spec.buildRequests([bidRequestWithNumId], bidderRequestWithNumId); + const [request] = spec.buildRequests([bidRequestWithNumId], bidderRequestWithNumId); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload).to.deep.equal({ @@ -792,7 +848,7 @@ describe('TheMediaGrid Adapter', function () { } }, bidRequests[1]); it('should return the value from getFloor if present', function () { - const request = spec.buildRequests([bidRequest], bidderRequest); + const [request] = spec.buildRequests([bidRequest], bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload.imp[0].bidfloor).to.equal(floorTestData.floor); @@ -801,7 +857,7 @@ describe('TheMediaGrid Adapter', function () { const bidfloor = 0.80; const bidRequestsWithFloor = { ...bidRequest }; bidRequestsWithFloor.params = Object.assign({bidFloor: bidfloor}, bidRequestsWithFloor.params); - const request = spec.buildRequests([bidRequestsWithFloor], bidderRequest); + const [request] = spec.buildRequests([bidRequestsWithFloor], bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload.imp[0].bidfloor).to.equal(floorTestData.floor); @@ -810,7 +866,7 @@ describe('TheMediaGrid Adapter', function () { const bidfloor = 1.80; const bidRequestsWithFloor = { ...bidRequest }; bidRequestsWithFloor.params = Object.assign({bidFloor: bidfloor}, bidRequestsWithFloor.params); - const request = spec.buildRequests([bidRequestsWithFloor], bidderRequest); + const [request] = spec.buildRequests([bidRequestsWithFloor], bidderRequest); expect(request.data).to.be.an('string'); const payload = parseRequest(request.data); expect(payload.imp[0].bidfloor).to.equal(bidfloor); @@ -844,7 +900,7 @@ describe('TheMediaGrid Adapter', function () { 'auctionId': '1cbd2feafe5e8b', } ]; - const request = spec.buildRequests(bidRequests); + const [request] = spec.buildRequests(bidRequests); const expectedResponse = [ { 'requestId': '659423fff799cb', @@ -904,7 +960,7 @@ describe('TheMediaGrid Adapter', function () { 'auctionId': '1fa09aee5c8c99', } ]; - const request = spec.buildRequests(bidRequests); + const [request] = spec.buildRequests(bidRequests); const expectedResponse = [ { 'requestId': '659423fff799cb', @@ -1050,7 +1106,7 @@ describe('TheMediaGrid Adapter', function () { {'bid': [{'impid': '112432ab4f34', 'price': 1.80, 'adm': '\n<\/Ad>\n<\/VAST>', 'nurl': 'https://wrong_url.com', 'auid': 14, content_type: 'video', 'adomain': ['example.com'], w: 300, h: 600}], 'seat': '2'}, {'bid': [{'impid': 'a74b342f8cd', 'price': 1.50, 'nurl': '', 'auid': 15, content_type: 'video'}], 'seat': '2'} ]; - const request = spec.buildRequests(bidRequests); + const [request] = spec.buildRequests(bidRequests); const expectedResponse = [ { 'requestId': '659423fff799cb', @@ -1167,7 +1223,7 @@ describe('TheMediaGrid Adapter', function () { 'auctionId': '1fa09aee5c84d34', } ]; - const request = spec.buildRequests(bidRequests); + const [request] = spec.buildRequests(bidRequests); const result = spec.interpretResponse({'body': {'seatbid': responses.slice(2)}}, request); expect(result.length).to.equal(0); }); @@ -1237,7 +1293,7 @@ describe('TheMediaGrid Adapter', function () { 'auctionId': '32a1f276cb87cb8', } ]; - const request = spec.buildRequests(bidRequests); + const [request] = spec.buildRequests(bidRequests); const expectedResponse = [ { 'requestId': '2164be6358b9', @@ -1344,7 +1400,7 @@ describe('TheMediaGrid Adapter', function () { ], 'seat': '1' }; - const request = spec.buildRequests(bidRequests); + const [request] = spec.buildRequests(bidRequests); const expectedResponse = [ { 'requestId': '26d6f897b516',