mk9-prebid
Version:
Header Bidding Management Library
1,377 lines (1,178 loc) • 157 kB
JavaScript
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