UNPKG

mk9-prebid

Version:

Header Bidding Management Library

341 lines (289 loc) 10.1 kB
import {expect} from 'chai'; import {spec} from 'modules/asoBidAdapter.js'; import {parseUrl} from 'src/utils.js'; import {BANNER, VIDEO} from 'src/mediaTypes.js'; describe('Adserver.Online bidding adapter', function () { const bannerRequest = { bidder: 'aso', params: { zone: 1, attr: { keywords: ['a', 'b'], tags: ['t1', 't2'] } }, adUnitCode: 'adunit-banner', mediaTypes: { banner: { sizes: [ [300, 250], [240, 400], ] } }, bidId: 'bidid1', bidderRequestId: 'bidreq1', auctionId: 'auctionid1', userIdAsEids: [{ source: 'src1', uids: [ { id: 'id123...' } ] }] }; const videoRequest = { bidder: 'aso', params: { zone: 2, video: { api: [2], maxduration: 30 } }, mediaTypes: { video: { context: 'outstream', playerSize: [[640, 480]], protocols: [1, 2], mimes: ['video/mp4'], } }, adUnitCode: 'adunit-video', bidId: 'bidid12', bidderRequestId: 'bidreq2', auctionId: 'auctionid12' }; const bidderRequest = { refererInfo: { numIframes: 0, reachedTop: true, referer: 'https://example.com' } }; const gdprConsent = { gdprApplies: true, consentString: 'consentString', vendorData: { purpose: { consents: { 1: true, 2: true, 3: false } } } }; const uspConsent = 'usp_consent'; describe('isBidRequestValid', function () { it('should return true when required params found in bidVideo', function () { expect(spec.isBidRequestValid(videoRequest)).to.be.true }); it('should return true when required params found in bidBanner', function () { expect(spec.isBidRequestValid(bannerRequest)).to.be.true }); it('should return false when required params not found', function () { expect(spec.isBidRequestValid({})).to.be.false; }); it('should return false when required params are not passed', function () { const bid = Object.assign({}, bannerRequest); delete bid.params; bid.params = {}; expect(spec.isBidRequestValid(bid)).to.be.false }); it('should return false when required zone param not found', function () { const bid = JSON.parse(JSON.stringify(videoRequest)); delete bid.params.zone; expect(spec.isBidRequestValid(bid)).to.be.false; }); }); describe('buildRequests', function () { it('creates a valid banner request', function () { bannerRequest.getFloor = () => ({ currency: 'USD', floor: 0.5 }); const requests = spec.buildRequests([bannerRequest], bidderRequest); expect(requests).to.have.lengthOf(1); const request = requests[0]; expect(request).to.exist; expect(request.method).to.equal('POST'); const parsedRequestUrl = parseUrl(request.url); expect(parsedRequestUrl.hostname).to.equal('srv.aso1.net'); expect(parsedRequestUrl.pathname).to.equal('/prebid/bidder'); const query = parsedRequestUrl.search; expect(query.pbjs).to.equal('$prebid.version$'); expect(query.zid).to.equal('1'); expect(request.data).to.exist; const payload = request.data; expect(payload.site).to.not.equal(null); expect(payload.site.ref).to.equal(''); expect(payload.site.page).to.equal('https://example.com'); expect(payload.device).to.not.equal(null); expect(payload.device.w).to.equal(window.innerWidth); expect(payload.device.h).to.equal(window.innerHeight); expect(payload.imp).to.have.lengthOf(1); expect(payload.imp[0].tagid).to.equal('adunit-banner'); expect(payload.imp[0].banner).to.not.equal(null); expect(payload.imp[0].banner.w).to.equal(300); expect(payload.imp[0].banner.h).to.equal(250); expect(payload.imp[0].bidfloor).to.equal(0.5); expect(payload.imp[0].bidfloorcur).to.equal('USD'); }); it('creates a valid video request', function () { const requests = spec.buildRequests([videoRequest], bidderRequest); expect(requests).to.have.lengthOf(1); const request = requests[0]; expect(request).to.exist; expect(request.method).to.equal('POST'); const parsedRequestUrl = parseUrl(request.url); expect(parsedRequestUrl.hostname).to.equal('srv.aso1.net'); expect(parsedRequestUrl.pathname).to.equal('/prebid/bidder'); const query = parsedRequestUrl.search; expect(query.pbjs).to.equal('$prebid.version$'); expect(query.zid).to.equal('2'); expect(request.data).to.not.be.empty; const payload = request.data; expect(payload.site).to.not.equal(null); expect(payload.site.ref).to.equal(''); expect(payload.site.page).to.equal('https://example.com'); expect(payload.device).to.not.equal(null); expect(payload.device.w).to.equal(window.innerWidth); expect(payload.device.h).to.equal(window.innerHeight); expect(payload.imp).to.have.lengthOf(1); expect(payload.imp[0].tagid).to.equal('adunit-video'); expect(payload.imp[0].video).to.not.equal(null); expect(payload.imp[0].video.w).to.equal(640); expect(payload.imp[0].video.h).to.equal(480); expect(payload.imp[0].banner).to.be.undefined; }); }); describe('GDPR/USP compliance', function () { it('should send GDPR/USP consent data if it applies', function () { bidderRequest.gdprConsent = gdprConsent; bidderRequest.uspConsent = uspConsent; const requests = spec.buildRequests([bannerRequest], bidderRequest); expect(requests).to.have.lengthOf(1); const request = requests[0]; expect(request.data).to.not.be.empty; const payload = request.data; expect(payload.user.ext.consent).to.equal('consentString'); expect(payload.regs.ext.us_privacy).to.equal(uspConsent); expect(payload.regs.ext.gdpr).to.equal(1); }); it('should not send GDPR/USP consent data if it does not apply', function () { bidderRequest.gdprConsent = null; bidderRequest.uspConsent = null; const requests = spec.buildRequests([bannerRequest], bidderRequest); expect(requests).to.have.lengthOf(1); const request = requests[0]; expect(request.data).to.not.be.empty; const payload = request.data; expect(payload).to.not.have.nested.property('regs.ext.gdpr'); expect(payload).to.not.have.nested.property('user.ext.consent'); expect(payload).to.not.have.nested.property('regs.ext.us_privacy'); }); }); describe('response handler', function () { const bannerResponse = { body: { id: 'auctionid1', bidid: 'bidid1', seatbid: [{ bid: [ { impid: 'impid1', price: 0.3, crid: 321, adm: '<!-- HTML/JS -->', w: 300, h: 250, adomain: ['example.com'], } ] }], cur: 'USD', ext: { user_syncs: [ { url: 'sync_url', type: 'iframe' } ] } }, }; const videoResponse = { body: { id: 'auctionid2', bidid: 'bidid2', seatbid: [{ bid: [ { impid: 'impid2', price: 0.5, crid: 123, adm: '<!-- VAST XML -->', adomain: ['example.com'], w: 640, h: 480, } ] }], cur: 'USD' }, }; it('handles banner responses', function () { bannerRequest.bidRequest = { mediaType: BANNER }; const result = spec.interpretResponse(bannerResponse, bannerRequest); expect(result).to.have.lengthOf(1); expect(result[0]).to.exist; expect(result[0].width).to.equal(300); expect(result[0].height).to.equal(250); expect(result[0].mediaType).to.equal(BANNER); expect(result[0].creativeId).to.equal(321); expect(result[0].cpm).to.be.within(0.1, 0.5); expect(result[0].ad).to.equal('<!-- HTML/JS -->'); expect(result[0].currency).to.equal('USD'); expect(result[0].netRevenue).to.equal(true); expect(result[0].ttl).to.equal(300); expect(result[0].dealId).to.not.exist; expect(result[0].meta.advertiserDomains[0]).to.equal('example.com'); }); it('handles video responses', function () { const request = { bidRequest: videoRequest }; request.bidRequest.mediaType = VIDEO; const result = spec.interpretResponse(videoResponse, request); expect(result).to.have.lengthOf(1); expect(result[0].width).to.equal(640); expect(result[0].height).to.equal(480); expect(result[0].mediaType).to.equal(VIDEO); expect(result[0].creativeId).to.equal(123); expect(result[0].cpm).to.equal(0.5); expect(result[0].vastXml).to.equal('<!-- VAST XML -->'); expect(result[0].renderer).to.be.a('object'); expect(result[0].currency).to.equal('USD'); expect(result[0].netRevenue).to.equal(true); expect(result[0].ttl).to.equal(300); }); it('handles empty responses', function () { const response = []; const bidderRequest = {}; const result = spec.interpretResponse(response, bidderRequest); expect(result.length).to.equal(0); }); describe('getUserSyncs', function () { const syncOptions = { iframeEnabled: true }; it('should return iframe sync option', function () { expect(spec.getUserSyncs(syncOptions, [bannerResponse], gdprConsent, uspConsent)[0].type).to.equal('iframe'); expect(spec.getUserSyncs(syncOptions, [bannerResponse], gdprConsent, uspConsent)[0].url).to.equal( 'sync_url?gdpr=1&consents_str=consentString&consents=1%2C2&us_privacy=usp_consent&' ); }); }); }); });