mk9-prebid
Version:
Header Bidding Management Library
960 lines (897 loc) • 33.5 kB
JavaScript
import { expect } from 'chai';
import { spec, VIDEO_ENDPOINT, BANNER_ENDPOINT, OUTSTREAM_SRC, DEFAULT_MIMES } from 'modules/beachfrontBidAdapter.js';
import { parseUrl } from 'src/utils.js';
describe('BeachfrontAdapter', function () {
let bidRequests;
beforeEach(function () {
bidRequests = [
{
bidder: 'beachfront',
params: {
bidfloor: 2.00,
appId: '3b16770b-17af-4d22-daff-9606bdf2c9c3'
},
adUnitCode: 'div-gpt-ad-1460505748561-0',
bidId: '25186806a41eab',
bidderRequestId: '15bdd8d4a0ebaf',
auctionId: 'f17d62d0-e3e3-48d0-9f73-cb4ea358a309'
}, {
bidder: 'beachfront',
params: {
bidfloor: 1.00,
appId: '11bc5dd5-7421-4dd8-c926-40fa653bec76'
},
adUnitCode: 'div-gpt-ad-1460505748561-1',
bidId: '365088ee6d649d',
bidderRequestId: '15bdd8d4a0ebaf',
auctionId: 'f17d62d0-e3e3-48d0-9f73-cb4ea358a309'
}
];
});
describe('spec.isBidRequestValid', function () {
it('should return true when the required params are passed', function () {
const bidRequest = bidRequests[0];
expect(spec.isBidRequestValid(bidRequest)).to.equal(true);
});
it('should return false when the "bidfloor" param is missing', function () {
const bidRequest = bidRequests[0];
bidRequest.params = {
appId: '11bc5dd5-7421-4dd8-c926-40fa653bec76'
};
expect(spec.isBidRequestValid(bidRequest)).to.equal(false);
});
it('should return false when the "appId" param is missing', function () {
const bidRequest = bidRequests[0];
bidRequest.params = {
bidfloor: 5.00
};
expect(spec.isBidRequestValid(bidRequest)).to.equal(false);
});
it('should return false when no bid params are passed', function () {
const bidRequest = bidRequests[0];
bidRequest.params = {};
expect(spec.isBidRequestValid(bidRequest)).to.equal(false);
});
it('should return false when a bid request is not passed', function () {
expect(spec.isBidRequestValid()).to.equal(false);
expect(spec.isBidRequestValid({})).to.equal(false);
});
describe('for multi-format bids', function () {
it('should return true when the required params are passed for video', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
video: {}
};
bidRequest.params = {
video: {
bidfloor: 1.00,
appId: '3b16770b-17af-4d22-daff-9606bdf2c9c3'
}
};
expect(spec.isBidRequestValid(bidRequest)).to.equal(true);
});
it('should return false when the required params are missing for video', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
video: {}
};
bidRequest.params = {
banner: {
bidfloor: 1.00,
appId: '3b16770b-17af-4d22-daff-9606bdf2c9c3'
}
};
expect(spec.isBidRequestValid(bidRequest)).to.equal(false);
});
it('should return true when the required params are passed for banner', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
banner: {}
};
bidRequest.params = {
banner: {
bidfloor: 1.00,
appId: '3b16770b-17af-4d22-daff-9606bdf2c9c3'
}
};
expect(spec.isBidRequestValid(bidRequest)).to.equal(true);
});
it('should return false when the required params are missing for banner', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
banner: {}
};
bidRequest.params = {
video: {
bidfloor: 1.00,
appId: '3b16770b-17af-4d22-daff-9606bdf2c9c3'
}
};
expect(spec.isBidRequestValid(bidRequest)).to.equal(false);
});
});
});
describe('spec.buildRequests', function () {
describe('for video bids', function () {
it('should attach the bid request object', function () {
bidRequests[0].mediaTypes = { video: {} };
bidRequests[1].mediaTypes = { video: {} };
const requests = spec.buildRequests(bidRequests);
expect(requests[0].bidRequest).to.equal(bidRequests[0]);
expect(requests[1].bidRequest).to.equal(bidRequests[1]);
});
it('should create a POST request for each bid', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { video: {} };
const requests = spec.buildRequests([ bidRequest ]);
expect(requests[0].method).to.equal('POST');
expect(requests[0].url).to.equal(VIDEO_ENDPOINT + bidRequest.params.appId);
});
it('should attach request data', function () {
const width = 640;
const height = 480;
const bidRequest = bidRequests[0];
bidRequest.params.tagid = '7cd7a7b4-ef3f-4aeb-9565-3627f255fa10';
bidRequest.mediaTypes = {
video: {
playerSize: [ width, height ]
}
};
const topLocation = parseUrl('http://www.example.com?foo=bar', { decodeSearchAsString: true });
const bidderRequest = {
refererInfo: {
referer: topLocation.href
}
};
const requests = spec.buildRequests([ bidRequest ], bidderRequest);
const data = requests[0].data;
expect(data.isPrebid).to.equal(true);
expect(data.appId).to.equal(bidRequest.params.appId);
expect(data.domain).to.equal(document.location.hostname);
expect(data.id).to.be.a('string');
expect(data.imp[0].video).to.deep.contain({ w: width, h: height, mimes: DEFAULT_MIMES });
expect(data.imp[0].bidfloor).to.equal(bidRequest.params.bidfloor);
expect(data.imp[0].tagid).to.equal(bidRequest.params.tagid);
expect(data.site).to.deep.equal({ page: topLocation.href, domain: topLocation.hostname });
expect(data.device).to.deep.contain({ ua: navigator.userAgent, language: navigator.language, js: 1 });
expect(data.cur).to.deep.equal(['USD']);
});
it('must read from the floors module if available', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { video: {} };
bidRequest.getFloor = () => ({ currency: 'USD', floor: 1.16 });
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.imp[0].bidfloor).to.equal(1.16);
});
it('must use the bid floor param if no value is returned from the floors module', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { video: {} };
bidRequest.getFloor = () => ({});
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.imp[0].bidfloor).to.equal(bidRequest.params.bidfloor);
});
it('must parse bid size from a nested array', function () {
const width = 640;
const height = 480;
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
video: {
playerSize: [[ width, height ]]
}
};
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.imp[0].video).to.deep.contain({ w: width, h: height });
});
it('must parse bid size from a string', function () {
const width = 640;
const height = 480;
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
video: {
playerSize: `${width}x${height}`
}
};
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.imp[0].video).to.deep.contain({ w: width, h: height });
});
it('must handle an empty bid size', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
video: {
playerSize: []
}
};
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.imp[0].video).to.deep.contain({ w: undefined, h: undefined });
});
it('must fall back to the size on the bid object', function () {
const width = 640;
const height = 480;
const bidRequest = bidRequests[0];
bidRequest.sizes = [ width, height ];
bidRequest.mediaTypes = { video: {} };
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.imp[0].video).to.deep.contain({ w: width, h: height });
});
it('must set video params from the standard object', function () {
const bidRequest = bidRequests[0];
const mimes = ['video/webm'];
const playbackmethod = 2;
const maxduration = 30;
const placement = 4;
const skip = 1;
bidRequest.mediaTypes = {
video: { mimes, playbackmethod, maxduration, placement, skip }
};
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.imp[0].video).to.deep.contain({ mimes, playbackmethod, maxduration, placement, skip });
});
it('must override video params from the bidder object', function () {
const bidRequest = bidRequests[0];
const mimes = ['video/webm'];
const playbackmethod = 2;
const maxduration = 30;
const placement = 4;
const skip = 1;
bidRequest.mediaTypes = { video: { placement: 3, skip: 0 } };
bidRequest.params.video = { mimes, playbackmethod, maxduration, placement, skip };
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.imp[0].video).to.deep.contain({ mimes, playbackmethod, maxduration, placement, skip });
});
it('must add US privacy data to the request', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { video: {} };
const uspConsent = '2112YYZ';
const bidderRequest = { uspConsent };
const requests = spec.buildRequests([ bidRequest ], bidderRequest);
const data = requests[0].data;
expect(data.regs.ext.us_privacy).to.equal(uspConsent);
});
it('must add GDPR consent data to the request', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { video: {} };
const consentString = 'BOJ8RZsOJ8RZsABAB8AAAAAZ+A==';
const bidderRequest = {
gdprConsent: {
gdprApplies: true,
consentString
}
};
const requests = spec.buildRequests([ bidRequest ], bidderRequest);
const data = requests[0].data;
expect(data.regs.ext.gdpr).to.equal(1);
expect(data.user.ext.consent).to.equal(consentString);
});
it('must add schain data to the request', () => {
const schain = {
ver: '1.0',
complete: 1,
nodes: [
{
asi: 'directseller.com',
sid: '00001',
rid: 'BidRequest1',
hp: 1
}
]
};
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { video: {} };
bidRequest.schain = schain;
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.source.ext.schain).to.deep.equal(schain);
});
it('must add supported user IDs to the request', () => {
const userId = {
tdid: '54017816',
idl_env: '13024996',
uid2: { id: '45843401' },
haloId: { haloId: '60314917', auSeg: ['segment1', 'segment2'] }
};
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { video: {} };
bidRequest.userId = userId;
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.user.ext.eids).to.deep.equal([
{
source: 'adserver.org',
uids: [{
id: userId.tdid,
ext: {
rtiPartner: 'TDID'
}
}]
},
{
source: 'liveramp.com',
uids: [{
id: userId.idl_env,
ext: {
rtiPartner: 'idl'
}
}]
},
{
source: 'uidapi.com',
uids: [{
id: userId.uid2.id,
ext: {
rtiPartner: 'UID2'
}
}]
},
{
source: 'audigent.com',
uids: [{
id: userId.haloId,
atype: 1,
}]
}
]);
});
});
describe('for banner bids', function () {
it('should attach the bid requests array', function () {
bidRequests[0].mediaTypes = { banner: {} };
bidRequests[1].mediaTypes = { banner: {} };
const requests = spec.buildRequests(bidRequests);
expect(requests[0].bidRequest).to.deep.equal(bidRequests);
});
it('should create a single POST request for all bids', function () {
bidRequests[0].mediaTypes = { banner: {} };
bidRequests[1].mediaTypes = { banner: {} };
const requests = spec.buildRequests(bidRequests);
expect(requests.length).to.equal(1);
expect(requests[0].method).to.equal('POST');
expect(requests[0].url).to.equal(BANNER_ENDPOINT);
});
it('should attach request data', function () {
const width = 300;
const height = 250;
const bidRequest = bidRequests[0];
bidRequest.params.tagid = '7cd7a7b4-ef3f-4aeb-9565-3627f255fa10';
bidRequest.mediaTypes = {
banner: {
sizes: [ width, height ]
}
};
const topLocation = parseUrl('http://www.example.com?foo=bar', { decodeSearchAsString: true });
const bidderRequest = {
refererInfo: {
referer: topLocation.href
}
};
const requests = spec.buildRequests([ bidRequest ], bidderRequest);
const data = requests[0].data;
expect(data.slots).to.deep.equal([
{
slot: bidRequest.adUnitCode,
id: bidRequest.params.appId,
bidfloor: bidRequest.params.bidfloor,
tagid: bidRequest.params.tagid,
sizes: [{ w: width, h: height }]
}
]);
expect(data.page).to.equal(topLocation.href);
expect(data.domain).to.equal(topLocation.hostname);
expect(data.search).to.equal(topLocation.search);
expect(data.ua).to.equal(navigator.userAgent);
});
it('must read from the floors module if available', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { banner: {} };
bidRequest.getFloor = () => ({ currency: 'USD', floor: 1.16 });
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.slots[0].bidfloor).to.equal(1.16);
});
it('must use the bid floor param if no value is returned from the floors module', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { banner: {} };
bidRequest.getFloor = () => ({});
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.slots[0].bidfloor).to.equal(bidRequest.params.bidfloor);
});
it('must parse bid size from a nested array', function () {
const width = 300;
const height = 250;
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
banner: {
sizes: [[ width, height ]]
}
};
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.slots[0].sizes).to.deep.equal([
{ w: width, h: height }
]);
});
it('must parse bid size from a string', function () {
const width = 300;
const height = 250;
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
banner: {
sizes: `${width}x${height}`
}
};
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.slots[0].sizes).to.deep.equal([
{ w: width, h: height }
]);
});
it('must handle an empty bid size', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
banner: {
sizes: []
}
};
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.slots[0].sizes).to.deep.equal([]);
});
it('must fall back to the size on the bid object', function () {
const width = 300;
const height = 250;
const bidRequest = bidRequests[0];
bidRequest.sizes = [ width, height ];
bidRequest.mediaTypes = { banner: {} };
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.slots[0].sizes).to.deep.contain({ w: width, h: height });
});
it('must add US privacy data to the request', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { banner: {} };
const uspConsent = '2112YYZ';
const bidderRequest = { uspConsent };
const requests = spec.buildRequests([ bidRequest ], bidderRequest);
const data = requests[0].data;
expect(data.usPrivacy).to.equal(uspConsent);
});
it('must add GDPR consent data to the request', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { banner: {} };
const consentString = 'BOJ8RZsOJ8RZsABAB8AAAAAZ+A==';
const bidderRequest = {
gdprConsent: {
gdprApplies: true,
consentString
}
};
const requests = spec.buildRequests([ bidRequest ], bidderRequest);
const data = requests[0].data;
expect(data.gdpr).to.equal(1);
expect(data.gdprConsent).to.equal(consentString);
});
it('must add schain data to the request', () => {
const schain = {
ver: '1.0',
complete: 1,
nodes: [
{
asi: 'directseller.com',
sid: '00001',
rid: 'BidRequest1',
hp: 1
}
]
};
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { banner: {} };
bidRequest.schain = schain;
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.schain).to.deep.equal(schain);
});
it('must add supported user IDs to the request', () => {
const userId = {
tdid: '54017816',
idl_env: '13024996',
uid2: { id: '45843401' },
haloId: { haloId: '60314917', auSeg: ['segment1', 'segment2'] }
};
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { banner: {} };
bidRequest.userId = userId;
const requests = spec.buildRequests([ bidRequest ]);
const data = requests[0].data;
expect(data.tdid).to.equal(userId.tdid);
expect(data.idl).to.equal(userId.idl_env);
expect(data.uid2).to.equal(userId.uid2.id);
expect(data.haloid).to.equal(userId.haloId);
});
});
describe('for multi-format bids', function () {
it('should create a POST request for each bid format', function () {
const width = 300;
const height = 250;
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
video: {
playerSize: [ width, height ]
},
banner: {
sizes: [ width, height ]
}
};
bidRequest.params = {
video: {
bidfloor: 2.00,
appId: '11bc5dd5-7421-4dd8-c926-40fa653bec76'
},
banner: {
bidfloor: 1.00,
appId: '3b16770b-17af-4d22-daff-9606bdf2c9c3'
}
};
const requests = spec.buildRequests([ bidRequest ]);
expect(requests.length).to.equal(2);
expect(requests[0].url).to.contain(VIDEO_ENDPOINT);
expect(requests[1].url).to.contain(BANNER_ENDPOINT);
});
it('must parse bid sizes for each bid format', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
video: {
playerSize: [ 640, 360 ]
},
banner: {
sizes: [ 300, 250 ]
}
};
bidRequest.params = {
video: {
bidfloor: 2.00,
appId: '11bc5dd5-7421-4dd8-c926-40fa653bec76'
},
banner: {
bidfloor: 1.00,
appId: '3b16770b-17af-4d22-daff-9606bdf2c9c3'
}
};
const requests = spec.buildRequests([ bidRequest ]);
expect(requests[0].data.imp[0].video).to.deep.contain({ w: 640, h: 360 });
expect(requests[1].data.slots[0].sizes).to.deep.equal([{ w: 300, h: 250 }]);
});
});
});
describe('spec.interpretResponse', function () {
describe('for video bids', function () {
it('should return no bids if the response is not valid', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { video: {} };
const bidResponse = spec.interpretResponse({ body: null }, { bidRequest });
expect(bidResponse.length).to.equal(0);
});
it('should return no bids if the response "bidPrice" is missing', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { video: {} };
const serverResponse = {
url: 'http://reachms.bfmio.com/getmu?aid=bid:19c4a196-fb21-4c81-9a1a-ecc5437a39da'
};
const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest });
expect(bidResponse.length).to.equal(0);
});
it('should return a valid video bid response', function () {
const width = 640;
const height = 480;
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
video: {
playerSize: [ width, height ]
}
};
const serverResponse = {
bidPrice: 5.00,
url: 'http://reachms.bfmio.com/getmu?aid=bid:19c4a196-fb21-4c81-9a1a-ecc5437a39da',
vast: '<VAST version="3.0"></VAST>',
crid: '123abc'
};
const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest });
expect(bidResponse).to.deep.equal({
requestId: bidRequest.bidId,
bidderCode: spec.code,
cpm: serverResponse.bidPrice,
creativeId: serverResponse.crid,
vastUrl: serverResponse.url,
vastXml: serverResponse.vast,
width: width,
height: height,
renderer: null,
meta: { mediaType: 'video', advertiserDomains: [] },
mediaType: 'video',
currency: 'USD',
netRevenue: true,
ttl: 300
});
});
it('should return only vast url if the response type is "nurl"', () => {
const width = 640;
const height = 480;
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
video: {
playerSize: [ width, height ]
}
};
bidRequest.params.video = { responseType: 'nurl' };
const serverResponse = {
bidPrice: 5.00,
url: 'http://reachms.bfmio.com/getmu?aid=bid:19c4a196-fb21-4c81-9a1a-ecc5437a39da',
vast: '<VAST version="3.0"></VAST>',
crid: '123abc'
};
const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest });
expect(bidResponse.vastUrl).to.equal(serverResponse.url);
expect(bidResponse.vastXml).to.equal(undefined);
});
it('should return only vast xml if the response type is "adm"', () => {
const width = 640;
const height = 480;
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
video: {
playerSize: [ width, height ]
}
};
bidRequest.params.video = { responseType: 'adm' };
const serverResponse = {
bidPrice: 5.00,
url: 'http://reachms.bfmio.com/getmu?aid=bid:19c4a196-fb21-4c81-9a1a-ecc5437a39da',
vast: '<VAST version="3.0"></VAST>',
crid: '123abc'
};
const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest });
expect(bidResponse.vastUrl).to.equal(undefined);
expect(bidResponse.vastXml).to.equal(serverResponse.vast);
});
it('should return a renderer for outstream video bids', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
video: {
context: 'outstream'
}
};
const serverResponse = {
bidPrice: 5.00,
url: 'http://reachms.bfmio.com/getmu?aid=bid:19c4a196-fb21-4c81-9a1a-ecc5437a39da',
crid: '123abc'
};
const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest });
expect(bidResponse.renderer).to.deep.contain({
id: bidRequest.bidId,
url: OUTSTREAM_SRC
});
expect(bidResponse.renderer.render).to.be.a('function');
});
it('should return meta data for the bid response', () => {
const width = 640;
const height = 480;
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = {
video: {
playerSize: [ width, height ]
}
};
const serverResponse = {
bidPrice: 5.00,
url: 'http://reachms.bfmio.com/getmu?aid=bid:19c4a196-fb21-4c81-9a1a-ecc5437a39da',
meta: {
advertiserDomains: ['example.com'],
advertiserId: '123'
}
};
const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest });
expect(bidResponse.meta).to.deep.equal({
mediaType: 'video',
advertiserDomains: ['example.com'],
advertiserId: '123'
});
});
});
describe('for banner bids', function () {
it('should return no bids if the response is not valid', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { banner: {} };
const bidResponse = spec.interpretResponse({ body: null }, { bidRequest });
expect(bidResponse.length).to.equal(0);
});
it('should return no bids if the response is empty', function () {
const bidRequest = bidRequests[0];
bidRequest.mediaTypes = { banner: {} };
const bidResponse = spec.interpretResponse({ body: [] }, { bidRequest });
expect(bidResponse.length).to.equal(0);
});
it('should return valid banner bid responses', function () {
bidRequests[0].mediaTypes = {
banner: {
sizes: [[ 300, 250 ], [ 728, 90 ]]
}
};
bidRequests[1].mediaTypes = {
banner: {
sizes: [[ 300, 600 ], [ 200, 200 ]]
}
};
const serverResponse = [{
slot: bidRequests[0].adUnitCode,
adm: '<div id="44851937"></div>',
crid: 'crid_1',
price: 3.02,
w: 728,
h: 90
}, {
slot: bidRequests[1].adUnitCode,
adm: '<div id="44860506"></div>',
crid: 'crid_2',
price: 3.06,
w: 300,
h: 600
}];
const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest: bidRequests });
expect(bidResponse.length).to.equal(2);
for (let i = 0; i < bidRequests.length; i++) {
expect(bidResponse[ i ]).to.deep.equal({
requestId: bidRequests[ i ].bidId,
bidderCode: spec.code,
ad: serverResponse[ i ].adm,
creativeId: serverResponse[ i ].crid,
cpm: serverResponse[ i ].price,
width: serverResponse[ i ].w,
height: serverResponse[ i ].h,
meta: { mediaType: 'banner', advertiserDomains: [] },
mediaType: 'banner',
currency: 'USD',
netRevenue: true,
ttl: 300
});
}
});
it('should return meta data for the bid response', () => {
bidRequests[0].mediaTypes = {
banner: {
sizes: [[ 300, 250 ], [ 728, 90 ]]
}
};
const serverResponse = [{
slot: bidRequests[0].adUnitCode,
adm: '<div id="44851937"></div>',
crid: 'crid_1',
price: 3.02,
w: 728,
h: 90,
meta: {
advertiserDomains: ['example.com'],
advertiserId: '123'
}
}];
const bidResponse = spec.interpretResponse({ body: serverResponse }, { bidRequest: bidRequests });
expect(bidResponse[0].meta).to.deep.equal({
mediaType: 'banner',
advertiserDomains: ['example.com'],
advertiserId: '123'
});
});
});
});
describe('spec.getUserSyncs', function () {
describe('for video bids', function () {
let bidResponse;
beforeEach(function () {
bidResponse = {
bidPrice: 5.00,
url: 'http://reachms.bfmio.com/getmu?aid=bid:19c4a196-fb21-4c81-9a1a-ecc5437a39da',
crid: '123abc'
};
});
it('should return an iframe user sync if iframes are enabled', function () {
const syncOptions = {
iframeEnabled: true,
pixelEnabled: true
};
const serverResponses = [{
body: bidResponse
}];
const userSyncs = spec.getUserSyncs(syncOptions, serverResponses);
expect(userSyncs.length).to.equal(1);
expect(userSyncs[0].type).to.equal('iframe');
});
it('should return an image user sync if iframes are disabled', function () {
const syncOptions = {
iframeEnabled: false,
pixelEnabled: true
};
const serverResponses = [{
body: bidResponse
}];
const userSyncs = spec.getUserSyncs(syncOptions, serverResponses);
expect(userSyncs.length).to.equal(1);
expect(userSyncs[0].type).to.equal('image');
});
it('should not return user syncs if none are enabled', function () {
const syncOptions = {
iframeEnabled: false,
pixelEnabled: false
};
const serverResponses = [{
body: bidResponse
}];
const userSyncs = spec.getUserSyncs(syncOptions, serverResponses);
expect(userSyncs).to.deep.equal([]);
});
});
describe('for banner bids', function () {
let bidResponse;
beforeEach(function () {
bidResponse = {
slot: bidRequests[0].adUnitCode,
adm: '<div id="44851937"></div>',
crid: 'crid_1',
price: 3.02,
w: 728,
h: 90
};
});
it('should return user syncs defined the bid response', function () {
const syncUrl = 'https://sync.bfmio.com/sync_iframe?ifpl=5&ifg=1&id=test&gdpr=0&gc=&gce=0';
const syncOptions = {
iframeEnabled: true,
pixelEnabled: true
};
const serverResponses = [{
body: [
{ sync: syncUrl },
bidResponse
]
}];
const userSyncs = spec.getUserSyncs(syncOptions, serverResponses);
expect(userSyncs).to.deep.equal([
{ type: 'iframe', url: syncUrl }
]);
});
it('should not return user syncs if iframes are disabled', function () {
const syncUrl = 'https://sync.bfmio.com/sync_iframe?ifpl=5&ifg=1&id=test&gdpr=0&gc=&gce=0';
const syncOptions = {
iframeEnabled: false,
pixelEnabled: true
};
const serverResponses = [{
body: [
{ sync: syncUrl },
bidResponse
]
}];
const userSyncs = spec.getUserSyncs(syncOptions, serverResponses);
expect(userSyncs).to.deep.equal([]);
});
it('should not return user syncs if there are none in the bid response', function () {
const syncOptions = {
iframeEnabled: true,
pixelEnabled: true
};
const serverResponses = [{
body: [
bidResponse
]
}];
const userSyncs = spec.getUserSyncs(syncOptions, serverResponses);
expect(userSyncs).to.deep.equal([]);
});
});
});
});