UNPKG

mk9-prebid

Version:

Header Bidding Management Library

1,377 lines (1,178 loc) 157 kB
import { expect } from 'chai'; import { executeRenderer } from 'src/Renderer.js'; import * as utils from 'src/utils.js'; import { spec } from 'modules/adotBidAdapter.js'; const BIDDER_URL = 'https://dsp.adotmob.com/headerbidding/bidrequest'; describe('Adot Adapter', function () { const examples = { adUnit_banner: { adUnitCode: 'ad_unit_banner', bidder: 'adot', bidderRequestId: 'bid_request_id', bidId: 'bid_id', params: {}, mediaTypes: { banner: { sizes: [[300, 250]] } } }, adUnit_video_outstream: { adUnitCode: 'ad_unit_video_outstream', bidder: 'adot', bidderRequestId: 'bid_request_id', bidId: 'bid_id', params: {}, mediaTypes: { video: { context: 'outstream', playerSize: [[300, 250]], mimes: ['video/mp4'], minDuration: 5, maxDuration: 30, protocols: [2, 3] } } }, adUnit_video_instream: { adUnitCode: 'ad_unit_video_instream', bidder: 'adot', bidderRequestId: 'bid_request_id', bidId: 'bid_id', params: { video: { instreamContext: 'pre-roll' } }, mediaTypes: { video: { context: 'instream', playerSize: [[300, 250]], mimes: ['video/mp4'], minDuration: 5, maxDuration: 30, protocols: [2, 3] } } }, adUnitContext: { refererInfo: { referer: 'https://we-are-adot.com/test', }, gdprConsent: { consentString: 'consent_string', gdprApplies: true } }, adUnit_position: { adUnitCode: 'ad_unit_position', bidder: 'adot', bidderRequestId: 'bid_request_id', bidId: 'bid_id', params: { position: 1 }, mediaTypes: { banner: { sizes: [[300, 250]] } } }, adUnit_native: { adUnitCode: 'ad_unit_native', bidder: 'adot', bidderRequestId: 'bid_request_id', bidId: 'bid_id', params: {}, mediaTypes: { native: { title: {required: true, len: 140}, icon: {required: true, sizes: [50, 50]}, image: {required: false, sizes: [320, 200]}, sponsoredBy: {required: false}, body: {required: false}, cta: {required: true} } } }, serverRequest_banner: { method: 'POST', url: 'https://we-are-adot.com/bidrequest', data: { id: 'bid_request_id', imp: [ { id: 'imp_id_banner_0_0', banner: { format: [{ w: 300, h: 200 }] }, video: null } ], site: { page: 'https://we-are-adot.com/test', domain: 'we-are-adot.com', name: 'we-are-adot.com' }, device: { ua: '', language: 'en' }, user: null, regs: null, at: 1, ext: { adot: { 'adapter_version': 'v1.0.0' } } }, _adot_internal: { impressions: [ { impressionId: 'imp_id_banner_0_0', adUnitCode: 'ad_unit_banner', bidId: 'imp_id_banner' } ] } }, serverRequest_banner_twoImps: { method: 'POST', url: 'https://we-are-adot.com/bidrequest', data: { id: 'bid_request_id', imp: [ { id: 'imp_id_banner_0_0', banner: { format: [{ w: 300, h: 200 }] }, video: null }, { id: 'imp_id_banner_2_0_0', banner: { format: [{ w: 300, h: 200 }] }, video: null } ], site: { page: 'https://we-are-adot.com/test', domain: 'we-are-adot.com', name: 'we-are-adot.com' }, device: { ua: '', language: 'en' }, user: null, regs: null, at: 1, ext: { adot: { 'adapter_version': 'v1.0.0' } } }, _adot_internal: { impressions: [ { impressionId: 'imp_id_banner_0_0', adUnitCode: 'ad_unit_banner', bidId: 'imp_id_banner' }, { impressionId: 'imp_id_banner_2_0_0', adUnitCode: 'ad_unit_banner_2', bidId: 'imp_id_banner_2' } ] } }, serverRequest_video_instream: { method: 'POST', url: 'https://we-are-adot.com/bidrequest', data: { id: 'bid_request_id', imp: [ { id: 'imp_id_video_instream_0', banner: null, video: { mimes: ['video/mp4'], w: 300, h: 200, startdelay: 0, minduration: 5, maxduration: 35, protocols: [2, 3] } } ], site: { page: 'https://we-are-adot.com/test', domain: 'we-are-adot.com', name: 'we-are-adot.com' }, device: { ua: '', language: 'en' }, user: null, regs: null, at: 1, ext: { adot: { 'adapter_version': 'v1.0.0' } } }, _adot_internal: { impressions: [ { impressionId: 'imp_id_video_instream_0', adUnitCode: 'ad_unit_video_instream', bidId: 'imp_id_video_instream' } ] } }, serverRequest_video_outstream: { method: 'POST', url: 'https://we-are-adot.com/bidrequest', data: { id: 'bid_request_id', imp: [ { id: 'imp_id_video_outstream_0', banner: null, video: { mimes: ['video/mp4'], w: 300, h: 200, startdelay: null, minduration: 5, maxduration: 35, protocols: [2, 3] } } ], site: { page: 'https://we-are-adot.com/test', domain: 'we-are-adot.com', name: 'we-are-adot.com' }, device: { ua: '', language: 'en' }, user: null, regs: null, at: 1, ext: { adot: { 'adapter_version': 'v1.0.0' } } }, _adot_internal: { impressions: [ { impressionId: 'imp_id_video_outstream_0', adUnitCode: 'ad_unit_video_outstream', bidId: 'imp_id_video_outstream' } ] } }, serverRequest_video_instream_outstream: { method: 'POST', url: 'https://we-are-adot.com/bidrequest', data: { id: 'bid_request_id', imp: [ { id: 'imp_id_video_instream_0', banner: null, video: { mimes: ['video/mp4'], w: 300, h: 200, startdelay: 0, minduration: 5, maxduration: 35, protocols: [2, 3] } }, { id: 'imp_id_video_outstream_0', banner: null, video: { mimes: ['video/mp4'], w: 300, h: 200, startdelay: null, minduration: 5, maxduration: 35, protocols: [2, 3] } } ], site: { page: 'https://we-are-adot.com/test', domain: 'we-are-adot.com', name: 'we-are-adot.com' }, device: { ua: '', language: 'en' }, user: null, regs: null, at: 1, ext: { adot: { 'adapter_version': 'v1.0.0' } } }, _adot_internal: { impressions: [ { impressionId: 'imp_id_video_instream_0', adUnitCode: 'ad_unit_video_instream', bidId: 'imp_id_video_instream' }, { impressionId: 'imp_id_video_outstream_0', adUnitCode: 'ad_unit_video_outstream', bidId: 'imp_id_video_outstream' } ] } }, serverRequest_position: { method: 'POST', url: 'https://we-are-adot.com/bidrequest', data: { id: 'bid_request_id', imp: [ { id: 'imp_id_banner', banner: { format: [{ w: 300, h: 200 }], position: 1 }, video: null } ], site: { page: 'https://we-are-adot.com/test', domain: 'we-are-adot.com', name: 'we-are-adot.com' }, device: { ua: '', language: 'en' }, user: null, regs: null, at: 1, ext: { adot: { 'adapter_version': 'v1.0.0' } } }, _adot_internal: { impressions: [ { impressionId: 'imp_id_banner', adUnitCode: 'ad_unit_position' } ] } }, serverRequest_native: { method: 'POST', url: 'https://we-are-adot.com/bidrequest', data: { id: 'bid_request_id', imp: [ { id: 'imp_id_native_0', native: { request: { assets: [ { id: 1, required: true, title: { len: 140 } }, { id: 2, required: true, img: { type: 1, wmin: 50, hmin: 50 } }, { id: 3, required: false, img: { type: 3, wmin: 320, hmin: 200 } }, { id: 4, required: false, data: { type: 1 } }, { id: 5, required: false, data: { type: 2 } }, { id: 6, required: true, data: { type: 12 } } ] } }, video: null, banner: null } ], site: { page: 'https://we-are-adot.com/test', domain: 'we-are-adot.com', name: 'we-are-adot.com' }, device: { ua: '', language: 'en' }, user: null, regs: null, at: 1, ext: { adot: { 'adapter_version': 'v1.0.0' } } }, _adot_internal: { impressions: [ { impressionId: 'imp_id_native_0', adUnitCode: 'ad_unit_native', bidId: 'imp_id_native' } ] } }, serverResponse_banner: { body: { cur: 'EUR', seatbid: [ { bid: [ { impid: 'imp_id_banner_0_0', crid: 'creative_id', adm: 'creative_data_${AUCTION_PRICE}', nurl: 'win_notice_url_${AUCTION_PRICE}', price: 1.5, h: 350, w: 300, ext: { adot: { media_type: 'banner' } } } ] } ] } }, serverResponse_banner_twoBids: { body: { cur: 'EUR', seatbid: [ { bid: [ { impid: 'imp_id_banner_0_0', crid: 'creative_id', adm: 'creative_data_${AUCTION_PRICE}', nurl: 'win_notice_url_${AUCTION_PRICE}', price: 1.5, h: 350, w: 300, adomain: ['adot'], ext: { adot: { media_type: 'banner' } } }, { impid: 'imp_id_banner_2_0_0', crid: 'creative_id_2', adm: 'creative_data_2_${AUCTION_PRICE}', nurl: 'win_notice_url_2_${AUCTION_PRICE}', adomain: ['adot'], price: 2.5, h: 400, w: 350, ext: { adot: { media_type: 'banner' } } } ] } ] } }, serverResponse_video_instream: { body: { cur: 'EUR', seatbid: [ { bid: [ { impid: 'imp_id_video_instream_0', crid: 'creative_id', adm: 'creative_data_${AUCTION_PRICE}', nurl: 'win_notice_url_${AUCTION_PRICE}', price: 1.5, ext: { adot: { media_type: 'video' } } } ] } ] } }, serverResponse_video_outstream: { body: { cur: 'EUR', seatbid: [ { bid: [ { impid: 'imp_id_video_outstream_0', crid: 'creative_id', adm: 'creative_data_${AUCTION_PRICE}', nurl: 'win_notice_url_${AUCTION_PRICE}', price: 1.5, ext: { adot: { media_type: 'video' } } } ] } ] } }, serverResponse_video_instream_outstream: { body: { cur: 'EUR', seatbid: [ { bid: [ { impid: 'imp_id_video_instream_0', crid: 'creative_id', adm: 'creative_data_${AUCTION_PRICE}', nurl: 'win_notice_url_${AUCTION_PRICE}', price: 1.5, ext: { adot: { media_type: 'video' } } }, { impid: 'imp_id_video_outstream_0', crid: 'creative_id', adm: 'creative_data_${AUCTION_PRICE}', nurl: 'win_notice_url_${AUCTION_PRICE}', price: 1.5, ext: { adot: { media_type: 'video' } } } ] } ] } }, serverResponse_native: { body: { cur: 'EUR', seatbid: [ { bid: [ { impid: 'imp_id_native_0', crid: 'creative_id', adm: '{"native":{"assets":[{"id":1,"title":{"len":140,"text":"Hi everyone"}},{"id":2,"img":{"url":"https://adotmob.com","type":1,"w":50,"h":50}},{"id":3,"img":{"url":"https://adotmob.com","type":3,"w":320,"h":200}},{"id":4,"data":{"type":1,"value":"adotmob"}},{"id":5,"data":{"type":2,"value":"This is a test ad"}},{"id":6,"data":{"type":12,"value":"Click to buy"}}],"link":{"url":"https://adotmob.com?auction=${AUCTION_PRICE}"}}}', nurl: 'win_notice_url_${AUCTION_PRICE}', price: 1.5, ext: { adot: { media_type: 'native' } } } ] } ] } } }; describe('isBidRequestValid', function () { describe('General', function () { it('should return false when not given an ad unit', function () { const adUnit = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an invalid ad unit', function () { const adUnit = 'bad_bid'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit without bidder code', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.bidder = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with a bad bidder code', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.bidder = 'unknownBidder'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit without ad unit code', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.adUnitCode = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid ad unit code', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.adUnitCode = {}; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit without bid request identifier', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.bidderRequestId = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid bid request identifier', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.bidderRequestId = {}; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit without impression identifier', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.bidId = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid impression identifier', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.bidId = {}; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit without media types', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with empty media types', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes = {}; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with invalid media types', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes = 'bad_media_types'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); }); describe('Banner', function () { it('should return true when given a valid ad unit', function () { const adUnit = examples.adUnit_banner; expect(spec.isBidRequestValid(adUnit)).to.equal(true); }); it('should return true when given a valid ad unit without bidder parameters', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.params = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(true); }); it('should return false when given an ad unit without size', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes.banner.sizes = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid size', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes.banner.sizes = 'bad_banner_size'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an empty size', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes.banner.sizes = []; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid size value', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes.banner.sizes = ['bad_banner_size_value']; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with a size value with less than 2 dimensions', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes.banner.sizes = [[300]]; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with a size value with more than 2 dimensions', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes.banner.sizes = [[300, 250, 30]]; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with a negative width value', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes.banner.sizes = [[-300, 250]]; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with a negative height value', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes.banner.sizes = [[300, -250]]; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid width value', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes.banner.sizes = [[false, 250]]; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid height value', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes.banner.sizes = [[300, {}]]; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); }); describe('Video', function () { it('should return true when given a valid outstream ad unit', function () { const adUnit = examples.adUnit_video_outstream; expect(spec.isBidRequestValid(adUnit)).to.equal(true); }); it('should return true when given a valid pre-roll instream ad unit', function () { const adUnit = utils.deepClone(examples.adUnit_video_instream); adUnit.params.video.instreamContext = 'pre-roll'; expect(spec.isBidRequestValid(adUnit)).to.equal(true); }); it('should return true when given a valid mid-roll instream ad unit', function () { const adUnit = utils.deepClone(examples.adUnit_video_instream); adUnit.params.video.instreamContext = 'mid-roll'; expect(spec.isBidRequestValid(adUnit)).to.equal(true); }); it('should return true when given a valid post-roll instream ad unit', function () { const adUnit = utils.deepClone(examples.adUnit_video_instream); adUnit.params.video.instreamContext = 'post-roll'; expect(spec.isBidRequestValid(adUnit)).to.equal(true); }); it('should return true when given an ad unit without size', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.playerSize = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(true); }); it('should return true when given an ad unit with an empty size', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.playerSize = []; expect(spec.isBidRequestValid(adUnit)).to.equal(true); }); it('should return true when given an ad unit without minimum duration parameter', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.minDuration = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(true); }); it('should return true when given an ad unit without maximum duration parameter', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.maxDuration = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(true); }); it('should return false when given an ad unit without bidder parameters', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.params = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with invalid bidder parameters', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.params = 'bad_bidder_parameters'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit without video parameters', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with invalid video parameters', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video = 'bad_bidder_parameters'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit without mime types parameter', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.mimes = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid mime types parameter', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.mimes = 'bad_mime_types'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an empty mime types parameter', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.mimes = []; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid mime types parameter value', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.mimes = [200]; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid minimum duration parameter', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.minDuration = 'bad_min_duration'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid maximum duration parameter', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.maxDuration = 'bad_max_duration'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit without protocols parameter', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.protocols = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid protocols parameter', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.protocols = 'bad_protocols'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an empty protocols parameter', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.protocols = []; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid protocols parameter value', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.protocols = ['bad_protocols_value']; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an instream ad unit without instream context', function () { const adUnit = utils.deepClone(examples.adUnit_video_instream); adUnit.params.video.instreamContext = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an instream ad unit with an invalid instream context', function () { const adUnit = utils.deepClone(examples.adUnit_video_instream); adUnit.params.video.instreamContext = 'bad_instream_context'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit without context', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.context = undefined; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid context', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.context = []; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an adpod ad unit', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.context = 'adpod'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an unknown context', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.context = 'invalid_context'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid size', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.playerSize = 'bad_video_size'; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid size value', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.playerSize = ['bad_video_size_value']; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with a size value with less than 2 dimensions', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.playerSize = [[300]]; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with a size value with more than 2 dimensions', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.playerSize = [[300, 250, 30]]; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with a negative width value', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.playerSize = [[-300, 250]]; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with a negative height value', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.playerSize = [[300, -250]]; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid width value', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.playerSize = [[false, 250]]; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); it('should return false when given an ad unit with an invalid height value', function () { const adUnit = utils.deepClone(examples.adUnit_video_outstream); adUnit.mediaTypes.video.playerSize = [[300, {}]]; expect(spec.isBidRequestValid(adUnit)).to.equal(false); }); }); }); describe('buildRequests', function () { describe('ServerRequest', function () { it('should return a server request when given a valid ad unit and a valid ad unit context', function () { const adUnits = [examples.adUnit_banner]; const serverRequests = spec.buildRequests(adUnits, examples.adUnitContext); expect(serverRequests).to.be.an('array').and.to.have.length(1); expect(serverRequests[0].method).to.exist.and.to.be.a('string').and.to.equal('POST'); expect(serverRequests[0].url).to.exist.and.to.be.a('string').and.to.equal(BIDDER_URL); expect(serverRequests[0].data).to.exist.and.to.be.an('object'); expect(serverRequests[0]._adot_internal).to.exist.and.to.be.an('object'); expect(serverRequests[0]._adot_internal.impressions).to.exist.and.to.be.an('array').and.to.have.length(1); expect(serverRequests[0]._adot_internal.impressions[0]).to.exist.and.to.be.an('object'); expect(serverRequests[0]._adot_internal.impressions[0].impressionId).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0_0`); expect(serverRequests[0]._adot_internal.impressions[0].adUnitCode).to.exist.and.to.be.a('string').and.to.equal(adUnits[0].adUnitCode); }); it('should return a server request containing a position when given a valid ad unit and a valid ad unit context and a position in the bidder params', function () { const adUnits = [examples.adUnit_position]; const serverRequests = spec.buildRequests(adUnits, examples.adUnitContext); expect(serverRequests).to.be.an('array').and.to.have.length(1); expect(serverRequests[0].method).to.exist.and.to.be.a('string').and.to.equal('POST'); expect(serverRequests[0].url).to.exist.and.to.be.a('string').and.to.equal(BIDDER_URL); expect(serverRequests[0].data).to.exist.and.to.be.an('object'); expect(serverRequests[0]._adot_internal).to.exist.and.to.be.an('object'); expect(serverRequests[0]._adot_internal.impressions).to.exist.and.to.be.an('array').and.to.have.length(1); expect(serverRequests[0]._adot_internal.impressions[0]).to.exist.and.to.be.an('object'); expect(serverRequests[0]._adot_internal.impressions[0].impressionId).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0_0`); expect(serverRequests[0]._adot_internal.impressions[0].adUnitCode).to.exist.and.to.be.a('string').and.to.equal(adUnits[0].adUnitCode); expect(serverRequests[0].data.imp[0].banner.pos).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].params.position); }); it('should return a server request when given two valid ad units and a valid ad unit context', function () { const adUnits_1 = utils.deepClone(examples.adUnit_banner); adUnits_1.bidId = 'bid_id_1'; adUnits_1.adUnitCode = 'ad_unit_banner_1'; const adUnits_2 = utils.deepClone(examples.adUnit_banner); adUnits_2.bidId = 'bid_id_2'; adUnits_2.adUnitCode = 'ad_unit_banner_2'; const adUnits = [adUnits_1, adUnits_2]; const serverRequests = spec.buildRequests(adUnits, examples.adUnitContext); expect(serverRequests).to.be.an('array').and.to.have.length(1); expect(serverRequests[0].method).to.exist.and.to.be.a('string').and.to.equal('POST'); expect(serverRequests[0].url).to.exist.and.to.be.a('string').and.to.equal(BIDDER_URL); expect(serverRequests[0].data).to.exist.and.to.be.an('object'); expect(serverRequests[0]._adot_internal).to.exist.and.to.be.an('object'); expect(serverRequests[0]._adot_internal.impressions).to.exist.and.to.be.an('array').and.to.have.length(2); expect(serverRequests[0]._adot_internal.impressions[0]).to.exist.and.to.be.an('object'); expect(serverRequests[0]._adot_internal.impressions[0].impressionId).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0_0`); expect(serverRequests[0]._adot_internal.impressions[0].adUnitCode).to.exist.and.to.be.a('string').and.to.equal(adUnits[0].adUnitCode); expect(serverRequests[0]._adot_internal.impressions[1]).to.exist.and.to.be.an('object'); expect(serverRequests[0]._adot_internal.impressions[1].impressionId).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[1].bidId}_0_0`); expect(serverRequests[0]._adot_internal.impressions[1].adUnitCode).to.exist.and.to.be.a('string').and.to.equal(adUnits[1].adUnitCode); }); it('should return an empty server request list when given an empty ad unit list and a valid ad unit context', function () { const adUnits = []; const serverRequests = spec.buildRequests(adUnits, examples.adUnitContext); expect(serverRequests).to.be.an('array').and.to.have.length(0); }); it('should not return a server request when given no ad unit and a valid ad unit context', function () { const serverRequests = spec.buildRequests(null, examples.adUnitContext); expect(serverRequests).to.equal(null); }); it('should not return a server request when given a valid ad unit and no ad unit context', function () { const adUnits = [examples.adUnit_banner]; const serverRequests = spec.buildRequests(adUnits, null); expect(serverRequests).to.be.an('array').and.to.have.length(1); }); it('should not return a server request when given a valid ad unit and an invalid ad unit context', function () { const adUnits = [examples.adUnit_banner]; const serverRequests = spec.buildRequests(adUnits, {}); expect(serverRequests).to.be.an('array').and.to.have.length(1); }); }); describe('BidRequest', function () { it('should return a valid server request when given a valid ad unit', function () { const adUnits = [examples.adUnit_banner]; const serverRequests = spec.buildRequests(adUnits, examples.adUnitContext); expect(serverRequests).to.be.an('array').and.to.have.lengthOf(1); expect(serverRequests[0].data.id).to.exist.and.to.be.a('string').and.to.equal(adUnits[0].bidderRequestId); expect(serverRequests[0].data.at).to.exist.and.to.be.a('number').and.to.equal(1); expect(serverRequests[0].data.ext).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.ext.adot).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.ext.adot.adapter_version).to.exist.and.to.be.a('string').and.to.equal('v1.0.0'); }); it('should return one server request when given one valid ad unit', function () { const adUnits = [examples.adUnit_banner]; const serverRequests = spec.buildRequests(adUnits, examples.adUnitContext); expect(serverRequests).to.be.an('array').and.to.have.lengthOf(1); expect(serverRequests[0].data.id).to.exist.and.to.be.a('string').and.to.equal(adUnits[0].bidderRequestId); }); it('should return one server request when given two valid ad units with different impression identifiers', function () { const adUnit_1 = utils.deepClone(examples.adUnit_banner); adUnit_1.bidId = 'bid_id_1'; const adUnit_2 = utils.deepClone(examples.adUnit_banner); adUnit_2.bidId = 'bid_id_2'; const adUnits = [adUnit_1, adUnit_2]; const serverRequests = spec.buildRequests(adUnits, examples.adUnitContext); expect(serverRequests).to.be.an('array').and.to.have.lengthOf(1); expect(serverRequests[0].data.id).to.exist.and.to.be.a('string').and.to.equal(adUnits[0].bidderRequestId); expect(serverRequests[0].data.id).to.exist.and.to.be.a('string').and.to.equal(adUnits[1].bidderRequestId); }); it('should return two server requests when given two valid ad units with different bid request identifiers', function () { const adUnit_1 = utils.deepClone(examples.adUnit_banner); adUnit_1.bidderRequestId = 'bidder_request_id_1'; const adUnit_2 = utils.deepClone(examples.adUnit_banner); adUnit_2.bidderRequestId = 'bidder_request_id_2'; const adUnits = [adUnit_1, adUnit_2]; const serverRequests = spec.buildRequests(adUnits, examples.adUnitContext); expect(serverRequests).to.be.an('array').and.to.have.lengthOf(2); expect(serverRequests[0].data.id).to.exist.and.to.be.a('string').and.to.equal(adUnits[0].bidderRequestId); expect(serverRequests[1].data.id).to.exist.and.to.be.a('string').and.to.equal(adUnits[1].bidderRequestId); }); }); describe('Impression', function () { describe('Banner', function () { it('should return a server request with one impression when given a valid ad unit', function () { const adUnits = [examples.adUnit_banner]; const serverRequests = spec.buildRequests(adUnits, examples.adUnitContext); expect(serverRequests).to.be.an('array').and.to.have.lengthOf(1); expect(serverRequests[0].data).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.imp).to.exist.and.to.be.an('array').and.to.have.lengthOf(1); expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0_0`); expect(serverRequests[0].data.imp[0].banner).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.imp[0].banner.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.banner.sizes[0][0]); expect(serverRequests[0].data.imp[0].banner.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.banner.sizes[0][1]); expect(serverRequests[0].data.imp[0].banner.format).to.exist.and.to.be.an('array').and.to.have.lengthOf(1); expect(serverRequests[0].data.imp[0].banner.format[0]).to.exist.and.to.be.an('object').and.to.deep.equal({ w: adUnits[0].mediaTypes.banner.sizes[0][0], h: adUnits[0].mediaTypes.banner.sizes[0][1] }); }); it('should return a server request with two impressions containing one banner formats when given a valid ad unit with two banner sizes', function () { const adUnit = utils.deepClone(examples.adUnit_banner); adUnit.mediaTypes.banner.sizes = [ [300, 250], [350, 300] ]; const adUnits = [adUnit]; const serverRequests = spec.buildRequests(adUnits, examples.adUnitContext); expect(serverRequests).to.be.an('array').and.to.have.lengthOf(1); expect(serverRequests[0].data).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.imp).to.exist.and.to.be.an('array').and.to.have.lengthOf(2); expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0_0`); expect(serverRequests[0].data.imp[0].banner).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.imp[0].banner.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.banner.sizes[0][0]); expect(serverRequests[0].data.imp[0].banner.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.banner.sizes[0][1]); expect(serverRequests[0].data.imp[0].banner.format).to.exist.and.to.be.an('array').and.to.have.lengthOf(1); expect(serverRequests[0].data.imp[0].banner.format[0]).to.exist.and.to.be.an('object').and.to.deep.equal({ w: adUnits[0].mediaTypes.banner.sizes[0][0], h: adUnits[0].mediaTypes.banner.sizes[0][1] }); expect(serverRequests[0].data.imp[1]).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.imp[1].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0_1`); expect(serverRequests[0].data.imp[1].banner).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.imp[1].banner.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.banner.sizes[1][0]); expect(serverRequests[0].data.imp[1].banner.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.banner.sizes[1][1]); expect(serverRequests[0].data.imp[1].banner.format).to.exist.and.to.be.an('array').and.to.have.lengthOf(1); expect(serverRequests[0].data.imp[1].banner.format[0]).to.exist.and.to.be.an('object').and.to.deep.equal({ w: adUnits[0].mediaTypes.banner.sizes[1][0], h: adUnits[0].mediaTypes.banner.sizes[1][1] }); }); it('should return a server request with two impressions when given two valid ad units with different impression identifiers', function () { const adUnit_1 = utils.deepClone(examples.adUnit_banner); adUnit_1.bidId = 'bid_id_1'; const adUnit_2 = utils.deepClone(examples.adUnit_banner); adUnit_2.bidId = 'bid_id_2'; const adUnits = [adUnit_1, adUnit_2]; const serverRequests = spec.buildRequests(adUnits, examples.adUnitContext); expect(serverRequests).to.be.an('array').and.to.have.lengthOf(1); expect(serverRequests[0].data).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.imp).to.exist.and.to.be.an('array').and.to.have.lengthOf(2); expect(serverRequests[0].data.imp[0]).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.imp[0].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[0].bidId}_0_0`); expect(serverRequests[0].data.imp[0].banner).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.imp[0].banner.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.banner.sizes[0][0]); expect(serverRequests[0].data.imp[0].banner.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[0].mediaTypes.banner.sizes[0][1]); expect(serverRequests[0].data.imp[0].banner.format).to.exist.and.to.be.an('array'); expect(serverRequests[0].data.imp[0].banner.format[0]).to.exist.and.to.be.an('object').and.to.deep.equal({ w: adUnits[0].mediaTypes.banner.sizes[0][0], h: adUnits[0].mediaTypes.banner.sizes[0][1] }); expect(serverRequests[0].data.imp[1]).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.imp[1].id).to.exist.and.to.be.a('string').and.to.equal(`${adUnits[1].bidId}_0_0`); expect(serverRequests[0].data.imp[1].banner).to.exist.and.to.be.an('object'); expect(serverRequests[0].data.imp[1].banner.w).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.banner.sizes[0][0]); expect(serverRequests[0].data.imp[1].banner.h).to.exist.and.to.be.a('number').and.to.equal(adUnits[1].mediaTypes.banner.sizes[0][1]); expect(serverRequests[0].data.imp[1].banner.format).to.exist.and.to.be.an('array'); expect(serverRequests[0].data.imp[1].banner.format[0]).to.exist.and.to.be.an('object').and.to.deep.equal({ w: adUnits[1].mediaTypes.banner.sizes[0][0], h: adUnits[1].mediaTypes.banner.sizes[0][1] }); }); it('should return a server request with one overriden impression when given two valid ad units with identical identifiers', function () { const adUnit_1 = utils.deepClone(examples.adUnit_banner); adUnit_1.mediaTypes.banner.sizes = [[300, 250]]; const