UNPKG

mk9-prebid

Version:

Header Bidding Management Library

1,047 lines (995 loc) 36.9 kB
import { expect } from 'chai'; import { spec } from 'modules/oneVideoBidAdapter.js'; describe('OneVideoBidAdapter', function () { let bidRequest; let bidderRequest = { 'bidderCode': 'oneVideo', 'auctionId': 'e158486f-8c7f-472f-94ce-b0cbfbb50ab4', 'bidderRequestId': '1e498b84fffc39', 'bids': bidRequest, 'auctionStart': 1520001292880, 'timeout': 3000, 'start': 1520001292884, 'doneCbCallCount': 0, 'refererInfo': { 'numIframes': 1, 'reachedTop': true, 'referer': 'test.com' } }; let mockConfig; beforeEach(function () { bidRequest = { mediaTypes: { video: { context: 'instream', playerSize: [640, 480] } }, bidder: 'oneVideo', sizes: [640, 480], bidId: '30b3efwfwe1e', adUnitCode: 'video1', params: { video: { playerWidth: 640, playerHeight: 480, mimes: ['video/mp4', 'application/javascript'], protocols: [2, 5], api: [2], position: 1, delivery: [2], playbackmethod: [1, 5], sid: 134, rewarded: 1, placement: 1, hp: 1, inventoryid: 123 }, site: { id: 1, page: 'https://news.yahoo.com/portfolios', referrer: 'http://www.yahoo.com' }, pubId: 'brxd' } }; }); describe('spec.isBidRequestValid', function () { it('should return false when mediaTypes video OR banner not declared', function () { bidRequest.mediaTypes = {}; expect(spec.isBidRequestValid(bidRequest)).to.equal(false); }); it('should return true (skip validations) when e2etest = true', function () { bidRequest.params.video = { e2etest: true }; expect(spec.isBidRequestValid(bidRequest)).to.equal(true); }); it('should return true when mediaTypes.video has all mandatory params', function () { bidRequest.mediaTypes.video = { context: 'instream', playerSize: [640, 480], mimes: ['video/mp4', 'application/javascript'], } bidRequest.params.video = {}; expect(spec.isBidRequestValid(bidRequest)).to.equal(true); }); it('should return true when params.video has all override params instead of mediaTypes.video', function () { bidRequest.mediaTypes.video = { context: 'instream' }; bidRequest.params.video = { playerWidth: 640, playerHeight: 480, mimes: ['video/mp4', 'application/javascript'] }; expect(spec.isBidRequestValid(bidRequest)).to.equal(true); }); it('should return true when playerWidth & playerHeight are passed in params.video', function () { bidRequest.mediaTypes.video = { context: 'instream', mimes: ['video/mp4', 'application/javascript'] }; bidRequest.params.video = { playerWidth: 640, playerHeight: 480, }; expect(spec.isBidRequestValid(bidRequest)).to.equal(true); }); it('should return true when mimes is passed in params.video', function () { bidRequest.mediaTypes.video = { context: 'instream', playerSizes: [640, 480] }; bidRequest.video = { mimes: ['video/mp4', 'application/javascript'] }; expect(spec.isBidRequestValid(bidRequest)).to.equal(true); }); it('should return false when both mediaTypes.video and params.video Objects are missing', function () { bidRequest.mediaTypes = {}; bidRequest.params = { pubId: 'brxd' }; expect(spec.isBidRequestValid(bidRequest)).to.equal(false); }); it('should return false when both mediaTypes.video and params.video are missing mimes and player size', function () { bidRequest.mediaTypes = { video: { context: 'instream' } }; bidRequest.params = { pubId: 'brxd' }; expect(spec.isBidRequestValid(bidRequest)).to.equal(false); }); it('should return false when the "pubId" param is missing', function () { bidRequest.params = { video: { playerWidth: 480, playerHeight: 640, mimes: ['video/mp4', 'application/javascript'], } }; expect(spec.isBidRequestValid(bidRequest)).to.equal(false); }); it('should return true when the "pubId" param exists', function () { bidRequest.mediaTypes = { video: { playerSizes: [640, 480], mimes: ['video/mp4', 'application/javascript'] }, pubId: 'brxd' }; expect(spec.isBidRequestValid(bidRequest)).to.equal(true); }); it('should return false when no bid params are passed', function () { bidRequest.params = {}; expect(spec.isBidRequestValid(bidRequest)).to.equal(false); }); it('should return false when the mediaType is "banner" and display="undefined" (DAP 3P)', function () { bidRequest = { mediaTypes: { banner: { sizes: [640, 480] } } } expect(spec.isBidRequestValid(bidRequest)).to.equal(false); }) it('should return true when the mediaType is "banner" and display=1 (DAP 3P)', function () { bidRequest = { mediaTypes: { banner: { sizes: [640, 480] } }, bidder: 'oneVideo', sizes: [640, 480], bidId: '30b3efwfwe1e', adUnitCode: 'video1', params: { video: { playerWidth: 640, playerHeight: 480, mimes: ['video/mp4', 'application/javascript'], protocols: [2, 5], api: [2], position: 1, delivery: [2], playbackmethod: [1, 5], sid: 134, rewarded: 1, placement: 1, inventoryid: 123, display: 1 }, site: { id: 1, page: 'https://news.yahoo.com/portfolios', referrer: 'http://www.yahoo.com' }, pubId: 'brxd' } }; expect(spec.isBidRequestValid(bidRequest)).to.equal(true); }) it('should return false when the mediaType is "video" and context="outstream" and display=1 (DAP 3P)', function () { bidRequest = { mediaTypes: { video: { context: 'outstream', playerSize: [640, 480] } }, params: { video: { display: 1 } } } expect(spec.isBidRequestValid(bidRequest)).to.equal(false); }) it('should return true for Multi-Format AdUnits, when the mediaTypes are both "banner" and "video" (Multi-Format Support)', function () { bidRequest = { mediaTypes: { banner: { sizes: [640, 480] }, video: { context: 'outstream', playerSize: [640, 480], mimes: ['video/mp4', 'application/javascript'] } }, bidder: 'oneVideo', sizes: [640, 480], bidId: '30b3efwfwe1e', adUnitCode: 'video1', params: { video: { protocols: [2, 5], api: [2] }, site: { page: 'https://news.yahoo.com/portfolios', referrer: 'http://www.yahoo.com' }, pubId: 'brxd' } }; expect(spec.isBidRequestValid(bidRequest)).to.equal(true); }) }); describe('spec.buildRequests', function () { it('should create a POST request for every bid', function () { const requests = spec.buildRequests([bidRequest], bidderRequest); expect(requests[0].method).to.equal('POST'); expect(requests[0].url).to.equal(spec.ENDPOINT + bidRequest.params.pubId); }); it('should attach the bid request object', function () { const requests = spec.buildRequests([bidRequest], bidderRequest); expect(requests[0].bidRequest).to.equal(bidRequest); }); it('should attach request data', function () { const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; const [width, height] = bidRequest.sizes; const placement = bidRequest.params.video.placement; const rewarded = bidRequest.params.video.rewarded; const inventoryid = bidRequest.params.video.inventoryid; const VERSION = '3.1.2'; expect(data.imp[0].video.w).to.equal(width); expect(data.imp[0].video.h).to.equal(height); expect(data.imp[0].bidfloor).to.equal(bidRequest.params.bidfloor); expect(data.imp[0].ext.rewarded).to.equal(rewarded); expect(data.imp[0].video.placement).to.equal(placement); expect(data.imp[0].ext.inventoryid).to.equal(inventoryid); expect(data.imp[0].ext.prebidver).to.equal('$prebid.version$'); expect(data.imp[0].ext.adapterver).to.equal(VERSION); }); it('must parse bid size from a nested array', function () { const width = 640; const height = 480; bidRequest.sizes = [ [width, height] ]; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.imp[0].video.w).to.equal(width); expect(data.imp[0].video.h).to.equal(height); }); it('should set pubId to HBExchange when bid.params.video.e2etest = true', function () { bidRequest.params.video.e2etest = true; const requests = spec.buildRequests([bidRequest], bidderRequest); expect(requests[0].method).to.equal('POST'); expect(requests[0].url).to.equal(spec.E2ETESTENDPOINT + 'HBExchange'); }); it('should attach End 2 End test data', function () { bidRequest.params.video.e2etest = true; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.imp[0].bidfloor).to.not.exist; expect(data.imp[0].video.w).to.equal(300); expect(data.imp[0].video.h).to.equal(250); expect(data.imp[0].video.mimes).to.eql(['video/mp4', 'application/javascript']); expect(data.imp[0].video.api).to.eql([2]); expect(data.site.page).to.equal('https://verizonmedia.com'); expect(data.site.ref).to.equal('https://verizonmedia.com'); expect(data.tmax).to.equal(1000); }); it('it should create new schain and send it if video.params.sid exists', function () { const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; const schain = data.source.ext.schain; expect(schain.nodes.length).to.equal(1); expect(schain.nodes[0].sid).to.equal(bidRequest.params.video.sid); expect(schain.nodes[0].rid).to.equal(data.id); }) it('should send Global or Bidder specific schain if sid is not passed in video.params.sid', function () { bidRequest.params.video.sid = null; const globalSchain = { ver: '1.0', complete: 1, nodes: [{ asi: 'some-platform.com', sid: '111111', rid: bidRequest.id, hp: 1 }] }; bidRequest.schain = globalSchain; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; const schain = data.source.ext.schain; expect(schain.nodes.length).to.equal(1); expect(schain).to.equal(globalSchain); }); it('should ignore Global or Bidder specific schain if video.params.sid exists and send new schain', function () { const globalSchain = { ver: '1.0', complete: 1, nodes: [{ asi: 'some-platform.com', sid: '111111', rid: bidRequest.id, hp: 1 }] }; bidRequest.schain = globalSchain; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; const schain = data.source.ext.schain; expect(schain.nodes.length).to.equal(1); expect(schain.complete).to.equal(1); expect(schain.nodes[0].sid).to.equal(bidRequest.params.video.sid); expect(schain.nodes[0].rid).to.equal(data.id); }) it('should append hp to new schain created by sid if video.params.hp is passed', function () { const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; const schain = data.source.ext.schain; expect(schain.nodes[0].hp).to.equal(bidRequest.params.video.hp); }) it('should not accept key values pairs if custom is Undefined ', function () { bidRequest.params.video.custom = null; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.imp[0].ext.custom).to.be.undefined; }); it('should not accept key values pairs if custom is Array ', function () { bidRequest.params.video.custom = []; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.imp[0].ext.custom).to.be.undefined; }); it('should not accept key values pairs if custom is Number ', function () { bidRequest.params.video.custom = 123456; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.imp[0].ext.custom).to.be.undefined; }); it('should not accept key values pairs if custom is String ', function () { bidRequest.params.video.custom = 'keyValuePairs'; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.imp[0].ext.custom).to.be.undefined; }); it('should not accept key values pairs if custom is Boolean ', function () { bidRequest.params.video.custom = true; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.imp[0].ext.custom).to.be.undefined; }); it('should accept key values pairs if custom is Object ', function () { bidRequest.params.video.custom = {}; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.imp[0].ext.custom).to.be.a('object'); }); it('should accept key values pairs if custom is Object ', function () { bidRequest.params.video.custom = { key1: 'value1', key2: 'value2', key3: 4444444, key4: false, key5: { nested: 'object' }, key6: ['string', 2, true, null], key7: null, key8: undefined }; const requests = spec.buildRequests([bidRequest], bidderRequest); const custom = requests[0].data.imp[0].ext.custom; expect(custom['key1']).to.be.a('string'); expect(custom['key2']).to.be.a('string'); expect(custom['key3']).to.be.a('number'); expect(custom['key4']).to.not.exist; expect(custom['key5']).to.not.exist; expect(custom['key6']).to.not.exist; expect(custom['key7']).to.not.exist; expect(custom['key8']).to.not.exist; }); describe('content object validations', function () { it('should not accept content object if value is Undefined ', function () { bidRequest.params.video.content = null; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.site.content).to.be.undefined; }); it('should not accept content object if value is is Array ', function () { bidRequest.params.video.content = []; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.site.content).to.be.undefined; }); it('should not accept content object if value is Number ', function () { bidRequest.params.video.content = 123456; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.site.content).to.be.undefined; }); it('should not accept content object if value is String ', function () { bidRequest.params.video.content = 'keyValuePairs'; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.site.content).to.be.undefined; }); it('should not accept content object if value is Boolean ', function () { bidRequest.params.video.content = true; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.site.content).to.be.undefined; }); it('should accept content object if value is Object ', function () { bidRequest.params.video.content = {}; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.site.content).to.be.a('object'); }); it('should not append unsupported content object keys', function () { bidRequest.params.video.content = { fake: 'news', unreal: 'param', counterfit: 'data' }; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.site.content).to.be.empty; }); it('should not append content string parameters if value is not string ', function () { bidRequest.params.video.content = { id: 1234, title: ['Title'], series: ['Series'], season: ['Season'], genre: ['Genre'], contentrating: {1: 'C-Rating'}, language: {1: 'EN'} }; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.site.content).to.be.a('object'); expect(data.site.content).to.be.empty }); it('should not append content Number parameters if value is not Number ', function () { bidRequest.params.video.content = { episode: '1', context: 'context', livestream: {0: 'stream'}, len: [360], prodq: [1], }; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.site.content).to.be.a('object'); expect(data.site.content).to.be.empty }); it('should not append content Array parameters if value is not Array ', function () { bidRequest.params.video.content = { cat: 'categories', }; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.site.content).to.be.a('object'); expect(data.site.content).to.be.empty }); it('should not append content ext if value is not Object ', function () { bidRequest.params.video.content = { ext: 'content.ext', }; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.site.content).to.be.a('object'); expect(data.site.content).to.be.empty }); it('should append supported parameters if value match validations ', function () { bidRequest.params.video.content = { id: '1234', title: 'Title', series: 'Series', season: 'Season', cat: [ 'IAB1' ], genre: 'Genre', contentrating: 'C-Rating', language: 'EN', episode: 1, prodq: 1, context: 1, livestream: 0, len: 360, ext: {} }; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.site.content).to.deep.equal(bidRequest.params.video.content); }); }); }); describe('price floor module validations', function () { beforeEach(function () { bidRequest.getFloor = (floorObj) => { return { floor: bidRequest.floors.values[floorObj.mediaType + '|640x480'], currency: floorObj.currency, mediaType: floorObj.mediaType } } }); it('should get bidfloor from getFloor method', function () { bidRequest.params.cur = 'EUR'; bidRequest.floors = { currency: 'EUR', values: { 'video|640x480': 5.55 } }; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.cur).is.a('string'); expect(data.cur).to.equal('EUR'); expect(data.imp[0].bidfloor).is.a('number'); expect(data.imp[0].bidfloor).to.equal(5.55); }); it('should use adUnit/module currency & floor instead of bid.params.bidfloor', function () { bidRequest.params.cur = 'EUR'; bidRequest.params.bidfloor = 3.33; bidRequest.floors = { currency: 'EUR', values: { 'video|640x480': 5.55 } }; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.cur).is.a('string'); expect(data.cur).to.equal('EUR'); expect(data.imp[0].bidfloor).is.a('number'); expect(data.imp[0].bidfloor).to.equal(5.55); }); it('should load banner instead of video floor when DAP is active bid.params.video.display = 1', function () { bidRequest.params.video.display = 1; bidRequest.params.cur = 'EUR'; bidRequest.mediaTypes = { banner: { sizes: [ [640, 480] ] } }; bidRequest.floors = { currency: 'EUR', values: { 'banner|640x480': 2.22, 'video|640x480': 9.99 } }; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.cur).is.a('string'); expect(data.cur).to.equal('EUR'); expect(data.imp[0].bidfloor).is.a('number'); expect(data.imp[0].bidfloor).to.equal(2.22); }) it('should load video floor when multi-format adUnit is present', function () { bidRequest.params.cur = 'EUR'; bidRequest.mediaTypes.banner = { sizes: [ [640, 480] ] }; bidRequest.floors = { currency: 'EUR', values: { 'banner|640x480': 2.22, 'video|640x480': 9.99 } }; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; expect(data.cur).is.a('string'); expect(data.cur).to.equal('EUR'); expect(data.imp[0].bidfloor).is.a('number'); expect(data.imp[0].bidfloor).to.equal(9.99); }) }) describe('spec.interpretResponse', function () { it('should return no bids if the response is not valid', function () { const bidResponse = spec.interpretResponse({ body: null }, { bidRequest }); expect(bidResponse.length).to.equal(0); }); it('should return no bids if the response "nurl" and "adm" are missing', function () { const serverResponse = { seatbid: [{ bid: [{ price: 6.01 }] }] }; const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest }); expect(bidResponse.length).to.equal(0); }); it('should return no bids if the response "price" is missing', function () { const serverResponse = { seatbid: [{ bid: [{ adm: '<VAST></VAST>' }] }] }; const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest }); expect(bidResponse.length).to.equal(0); }); it('should return a valid video bid response with just "adm"', function () { const serverResponse = { seatbid: [{ bid: [{ id: 1, adid: 123, crid: 2, price: 6.01, adm: '<VAST></VAST>', adomain: [ 'verizonmedia.com' ], }] }], cur: 'USD' }; const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest }); let o = { requestId: bidRequest.bidId, bidderCode: spec.code, cpm: serverResponse.seatbid[0].bid[0].price, creativeId: serverResponse.seatbid[0].bid[0].crid, vastXml: serverResponse.seatbid[0].bid[0].adm, width: 640, height: 480, mediaType: 'video', currency: 'USD', ttl: 300, netRevenue: true, adUnitCode: bidRequest.adUnitCode, renderer: (bidRequest.mediaTypes.video.context === 'outstream') ? newRenderer(bidRequest, bidResponse) : undefined, meta: { advertiserDomains: ['verizonmedia.com'] } }; expect(bidResponse).to.deep.equal(o); }); // @abrowning14 check that banner DAP response is appended to o.ad + mediaType: 'banner' it('should return a valid DAP banner bid-response', function () { bidRequest = { mediaTypes: { banner: { sizes: [640, 480] } }, params: { video: { display: 1 } } } const serverResponse = { seatbid: [{ bid: [{ id: 1, adid: 123, crid: 2, price: 6.01, adm: '<div>DAP UNIT HERE</div>' }] }], cur: 'USD' }; const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest }); expect(bidResponse.ad).to.equal('<div>DAP UNIT HERE</div>'); expect(bidResponse.mediaType).to.equal('banner'); expect(bidResponse.renderer).to.be.undefined; }); it('should default ttl to 300', function () { const serverResponse = {seatbid: [{bid: [{id: 1, adid: 123, crid: 2, price: 6.01, adm: '<VAST></VAST>'}]}], cur: 'USD'}; const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest }); expect(bidResponse.ttl).to.equal(300); }); it('should not allow ttl above 3601, default to 300', function () { bidRequest.params.video.ttl = 3601; const serverResponse = {seatbid: [{bid: [{id: 1, adid: 123, crid: 2, price: 6.01, adm: '<VAST></VAST>'}]}], cur: 'USD'}; const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest }); expect(bidResponse.ttl).to.equal(300); }); it('should not allow ttl below 1, default to 300', function () { bidRequest.params.video.ttl = 0; const serverResponse = {seatbid: [{bid: [{id: 1, adid: 123, crid: 2, price: 6.01, adm: '<VAST></VAST>'}]}], cur: 'USD'}; const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest }); expect(bidResponse.ttl).to.equal(300); }); it('should use custom ttl if under 3600', function () { bidRequest.params.video.ttl = 1000; const serverResponse = {seatbid: [{bid: [{id: 1, adid: 123, crid: 2, price: 6.01, adm: '<VAST></VAST>'}]}], cur: 'USD'}; const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest }); expect(bidResponse.ttl).to.equal(1000); }); }); describe('when GDPR and uspConsent applies', function () { beforeEach(function () { bidderRequest = { 'gdprConsent': { 'consentString': 'test-gdpr-consent-string', 'gdprApplies': true }, 'uspConsent': '1YN-', 'bidderCode': 'oneVideo', 'auctionId': 'e158486f-8c7f-472f-94ce-b0cbfbb50ab4', 'bidderRequestId': '1e498b84fffc39', 'bids': bidRequest, 'auctionStart': 1520001292880, 'timeout': 3000, 'start': 1520001292884, 'doneCbCallCount': 0, 'refererInfo': { 'numIframes': 1, 'reachedTop': true, 'referer': 'test.com' } }; mockConfig = { consentManagement: { gdpr: { cmpApi: 'iab', timeout: 3000, allowAuctionWithoutConsent: 'cancel' }, usp: { cmpApi: 'iab', timeout: 1000, allowAuctionWithoutConsent: 'cancel' } } }; }); it('should send a signal to specify that GDPR applies to this request', function () { const request = spec.buildRequests([bidRequest], bidderRequest); expect(request[0].data.regs.ext.gdpr).to.equal(1); }); it('should send the consent string', function () { const request = spec.buildRequests([bidRequest], bidderRequest); expect(request[0].data.user.ext.consent).to.equal(bidderRequest.gdprConsent.consentString); }); it('should send the uspConsent string', function () { const request = spec.buildRequests([bidRequest], bidderRequest); expect(request[0].data.regs.ext.us_privacy).to.equal(bidderRequest.uspConsent); }); it('should send the uspConsent and GDPR ', function () { const request = spec.buildRequests([bidRequest], bidderRequest); expect(request[0].data.regs.ext.gdpr).to.equal(1); expect(request[0].data.regs.ext.us_privacy).to.equal(bidderRequest.uspConsent); }); }); describe('should send banner object', function () { it('should send banner object when display is 1 and context="instream" (DAP O&O)', function () { bidRequest = { mediaTypes: { video: { context: 'instream', playerSize: [640, 480] } }, bidder: 'oneVideo', sizes: [640, 480], bidId: '30b3efwfwe1e', adUnitCode: 'video1', params: { video: { playerWidth: 640, playerHeight: 480, mimes: ['video/mp4', 'application/javascript'], protocols: [2, 5], api: [2], position: 1, delivery: [2], playbackmethod: [1, 5], placement: 1, inventoryid: 123, sid: 134, display: 1, minduration: 10, maxduration: 30 }, site: { id: 1, page: 'https://www.yahoo.com/', referrer: 'http://www.yahoo.com' }, pubId: 'OneMDisplay' } }; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; const width = bidRequest.params.video.playerWidth; const height = bidRequest.params.video.playerHeight; const position = bidRequest.params.video.position; expect(spec.isBidRequestValid(bidRequest)).to.equal(true); expect(data.imp[0].banner.w).to.equal(width); expect(data.imp[0].banner.h).to.equal(height); expect(data.imp[0].banner.pos).to.equal(position); expect(data.imp[0].ext.inventoryid).to.equal(bidRequest.params.video.inventoryid); expect(data.imp[0].banner.mimes).to.equal(bidRequest.params.video.mimes); expect(data.imp[0].banner.placement).to.equal(bidRequest.params.video.placement); expect(data.imp[0].banner.ext.minduration).to.equal(bidRequest.params.video.minduration); expect(data.imp[0].banner.ext.maxduration).to.equal(bidRequest.params.video.maxduration); expect(data.site.id).to.equal(bidRequest.params.site.id); }); it('should send video object when display is other than 1 (VAST for All)', function () { bidRequest = { mediaTypes: { video: { context: 'instream', playerSize: [640, 480] } }, bidder: 'oneVideo', sizes: [640, 480], bidId: '30b3efwfwe1e', adUnitCode: 'video1', params: { video: { playerWidth: 640, playerHeight: 480, mimes: ['video/mp4', 'application/javascript'], protocols: [2, 5], api: [2], position: 1, delivery: [2], playbackmethod: [1, 5], placement: 123, sid: 134, display: 12 }, site: { id: 1, page: 'https://www.yahoo.com/', referrer: 'http://www.yahoo.com' }, pubId: 'OneMDisplay' } }; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; const width = bidRequest.params.video.playerWidth; const height = bidRequest.params.video.playerHeight; const position = bidRequest.params.video.position; expect(spec.isBidRequestValid(bidRequest)).to.equal(true); expect(data.imp[0].video.w).to.equal(width); expect(data.imp[0].video.h).to.equal(height); expect(data.imp[0].video.pos).to.equal(position); expect(data.imp[0].video.mimes).to.equal(bidRequest.params.video.mimes); }); it('should send video object when display is not passed (VAST for All)', function () { bidRequest = { mediaTypes: { video: { context: 'instream', playerSize: [640, 480] } }, bidder: 'oneVideo', sizes: [640, 480], bidId: '30b3efwfwe1e', adUnitCode: 'video1', params: { video: { playerWidth: 640, playerHeight: 480, mimes: ['video/mp4', 'application/javascript'], protocols: [2, 5], api: [2], position: 1, delivery: [2], playbackmethod: [1, 5], placement: 123, sid: 134, minduration: 10, maxduration: 30 }, site: { id: 1, page: 'https://www.yahoo.com/', referrer: 'http://www.yahoo.com' }, pubId: 'OneMDisplay' } }; const requests = spec.buildRequests([bidRequest], bidderRequest); const data = requests[0].data; const width = bidRequest.params.video.playerWidth; const height = bidRequest.params.video.playerHeight; const position = bidRequest.params.video.position; expect(spec.isBidRequestValid(bidRequest)).to.equal(true); expect(data.imp[0].video.w).to.equal(width); expect(data.imp[0].video.h).to.equal(height); expect(data.imp[0].video.pos).to.equal(position); expect(data.imp[0].video.mimes).to.equal(bidRequest.params.video.mimes); expect(data.imp[0].video.protocols).to.equal(bidRequest.params.video.protocols); expect(data.imp[0].video.linearity).to.equal(1); expect(data.imp[0].video.maxduration).to.equal(bidRequest.params.video.maxduration); expect(data.imp[0].video.minduration).to.equal(bidRequest.params.video.minduration); }); describe('getUserSyncs', function () { const GDPR_CONSENT_STRING = 'GDPR_CONSENT_STRING'; it('should get correct user sync when iframeEnabled', function () { let pixel = spec.getUserSyncs({ pixelEnabled: true }, {}, { gdprApplies: true, consentString: GDPR_CONSENT_STRING }) expect(pixel[1].type).to.equal('image'); expect(pixel[1].url).to.equal('https://sync-tm.everesttech.net/upi/pid/m7y5t93k?gdpr=1&gdpr_consent=' + GDPR_CONSENT_STRING + '&redir=https%3A%2F%2Fpixel.advertising.com%2Fups%2F55986%2Fsync%3Fuid%3D%24%7BUSER_ID%7D%26_origin%3D0&gdpr=1&gdpr_consent=' + encodeURI(GDPR_CONSENT_STRING)); }); it('should default to gdprApplies=0 when consentData is undefined', function () { let pixel = spec.getUserSyncs({ pixelEnabled: true }, {}, undefined); expect(pixel[1].url).to.equal('https://sync-tm.everesttech.net/upi/pid/m7y5t93k?gdpr=0&gdpr_consent=&redir=https%3A%2F%2Fpixel.advertising.com%2Fups%2F55986%2Fsync%3Fuid%3D%24%7BUSER_ID%7D%26_origin%3D0&gdpr=0&gdpr_consent='); }); }); describe('verify sync pixels', function () { let pixel = spec.getUserSyncs({ pixelEnabled: true }, {}, undefined); it('should be UPS sync pixel for DBM', function () { expect(pixel[0].url).to.equal('https://pixel.advertising.com/ups/57304/sync?gdpr=&gdpr_consent=&_origin=0&redir=true') }); it('should be TTD sync pixel', function () { expect(pixel[2].url).to.equal('https://match.adsrvr.org/track/cmf/generic?ttd_pid=adaptv&ttd_tpi=1') }); }) }); });