mk9-prebid
Version:
Header Bidding Management Library
728 lines (679 loc) • 27.6 kB
JavaScript
import { expect } from 'chai';
import { spec } from 'modules/emx_digitalBidAdapter.js';
import * as utils from 'src/utils.js';
import { newBidder } from 'src/adapters/bidderFactory.js';
describe('emx_digital Adapter', function () {
describe('callBids', function () {
const adapter = newBidder(spec);
it('exists and is a function', function () {
expect(adapter.callBids).to.exist.and.to.be.a('function');
});
});
describe('isBidRequestValid', function () {
describe('banner request validity', function () {
let bid = {
'bidder': 'emx_digital',
'params': {
'tagid': '25251'
},
'mediaTypes': {
'banner': {
'sizes': [[300, 250]]
}
},
'adUnitCode': 'adunit-code',
'sizes': [
[300, 250],
[300, 600]
],
'bidId': '30b31c2501de1e',
'bidderRequestId': '22edbae3120bf6',
'auctionId': '1d1a01234a475'
};
let badBid = {
'bidder': 'emx_digital',
'params': {
'tagid': '25251'
},
'mediaTypes': {
'banner': {
}
},
'adUnitCode': 'adunit-code',
'bidId': '30b31c2501de1e',
'bidderRequestId': '22edbae3120bf6',
'auctionId': '1d1a01234a475'
};
let noBid = {};
let otherBid = {
'bidder': 'emxdigital',
'params': {
'tagid': '25251'
},
'mediaTypes': {
'banner': {
'sizes': [[300, 250]]
}
},
'adUnitCode': 'adunit-code',
'sizes': [
[300, 250],
[300, 600]
],
'bidId': '30b31c2501de1e',
'bidderRequestId': '22edbae3120bf6',
'auctionId': '1d1a01234a475'
};
let noMediaSizeBid = {
'bidder': 'emxdigital',
'params': {
'tagid': '25251'
},
'mediaTypes': {
'banner': {}
},
'adUnitCode': 'adunit-code',
'sizes': [
[300, 250],
[300, 600]
],
'bidId': '30b31c2501de1e',
'bidderRequestId': '22edbae3120bf6',
'auctionId': '1d1a01234a475'
};
it('should return true when required params found', function () {
expect(spec.isBidRequestValid(bid)).to.equal(true);
expect(spec.isBidRequestValid(badBid)).to.equal(false);
expect(spec.isBidRequestValid(noBid)).to.equal(false);
expect(spec.isBidRequestValid(otherBid)).to.equal(false);
expect(spec.isBidRequestValid(noMediaSizeBid)).to.equal(false);
});
});
describe('video request validity', function () {
let bid = {
'bidder': 'emx_digital',
'params': {
'tagid': '25251',
'video': {}
},
'mediaTypes': {
'video': {
'context': 'instream',
'playerSize': [640, 480]
}
},
'adUnitCode': 'adunit-code',
'sizes': [
[300, 250],
[300, 600]
],
'bidId': '30b31c2501de1e',
'bidderRequestId': '22edbae3120bf6',
'auctionId': '1d1a01234a475'
};
let noInstreamBid = {
'bidder': 'emx_digital',
'params': {
'tagid': '25251',
'video': {
'protocols': [1, 7]
}
},
'mediaTypes': {
'video': {
'context': 'something_random'
}
},
'adUnitCode': 'adunit-code',
'sizes': [
[300, 250],
[300, 600]
],
'bidId': '30b31c2501de1e',
'bidderRequestId': '22edbae3120bf6',
'auctionId': '1d1a01234a475'
};
let outstreamBid = {
'bidder': 'emx_digital',
'params': {
'tagid': '25251',
'video': {}
},
'mediaTypes': {
'video': {
'context': 'outstream',
'playerSize': [640, 480]
}
},
'adUnitCode': 'adunit-code',
'sizes': [
[300, 250],
[300, 600]
],
'bidId': '30b31c2501de1e',
'bidderRequestId': '22edbae3120bf6',
'auctionId': '1d1a01234a475'
};
it('should return true when required params found', function () {
expect(spec.isBidRequestValid(bid)).to.equal(true);
expect(spec.isBidRequestValid(noInstreamBid)).to.equal(false);
expect(spec.isBidRequestValid(outstreamBid)).to.equal(true);
});
it('should contain tagid param', function () {
expect(spec.isBidRequestValid({
bidder: 'emx_digital',
params: {},
mediaTypes: {
banner: {
sizes: [[300, 250]]
}
}
})).to.equal(false);
expect(spec.isBidRequestValid({
bidder: 'emx_digital',
params: {
tagid: ''
},
mediaTypes: {
banner: {
sizes: [[300, 250]]
}
}
})).to.equal(false);
expect(spec.isBidRequestValid({
bidder: 'emx_digital',
params: {
tagid: '123'
},
mediaTypes: {
banner: {
sizes: [[300, 250]]
}
}
})).to.equal(true);
});
});
});
describe('buildRequests', function () {
let bidderRequest = {
'bidderCode': 'emx_digital',
'auctionId': 'e19f1eff-8b27-42a6-888d-9674e5a6130c',
'bidderRequestId': '22edbae3120bf6',
'timeout': 1500,
'refererInfo': {
'numIframes': 0,
'reachedTop': true,
'referer': 'https://example.com/index.html?pbjs_debug=true'
},
'bids': [{
'bidder': 'emx_digital',
'params': {
'tagid': '25251'
},
'adUnitCode': 'adunit-code',
'mediaTypes': {
'banner': {
'sizes': [
[300, 250],
[300, 600]
]
}
},
'sizes': [
[300, 250],
[300, 600]
],
'bidId': '30b31c2501de1e',
'auctionId': 'e19f1eff-8b27-42a6-888d-9674e5a6130c',
'transactionId': 'd7b773de-ceaa-484d-89ca-d9f51b8d61ec',
}]
};
let request = spec.buildRequests(bidderRequest.bids, bidderRequest);
it('sends bid request to ENDPOINT via POST', function () {
expect(request.method).to.equal('POST');
});
it('contains the correct options', function () {
expect(request.options.withCredentials).to.equal(true);
});
it('contains a properly formatted endpoint url', function () {
const url = request.url.split('?');
const queryParams = url[1].split('&');
expect(queryParams[0]).to.match(new RegExp('^t=\d*', 'g'));
expect(queryParams[1]).to.match(new RegExp('^ts=\d*', 'g'));
});
it('builds bidfloor value from bid param when getFloor function does not exist', function () {
const bidRequestWithFloor = utils.deepClone(bidderRequest.bids);
bidRequestWithFloor[0].params.bidfloor = 1;
const requestWithFloor = spec.buildRequests(bidRequestWithFloor, bidderRequest);
const data = JSON.parse(requestWithFloor.data);
expect(data.imp[0].bidfloor).to.equal(bidRequestWithFloor[0].params.bidfloor);
});
it('builds bidfloor value from getFloor function when it exists', function () {
const floorResponse = { currency: 'USD', floor: 3 };
const bidRequestWithGetFloor = utils.deepClone(bidderRequest.bids);
bidRequestWithGetFloor[0].getFloor = () => floorResponse;
const requestWithGetFloor = spec.buildRequests(bidRequestWithGetFloor, bidderRequest);
const data = JSON.parse(requestWithGetFloor.data);
expect(data.imp[0].bidfloor).to.equal(3);
});
it('builds bidfloor value from getFloor when both floor and getFloor function exists', function () {
const floorResponse = { currency: 'USD', floor: 3 };
const bidRequestWithBothFloors = utils.deepClone(bidderRequest.bids);
bidRequestWithBothFloors[0].params.bidfloor = 1;
bidRequestWithBothFloors[0].getFloor = () => floorResponse;
const requestWithBothFloors = spec.buildRequests(bidRequestWithBothFloors, bidderRequest);
const data = JSON.parse(requestWithBothFloors.data);
expect(data.imp[0].bidfloor).to.equal(3);
});
it('empty bidfloor value when floor and getFloor is not defined', function () {
const bidRequestWithoutFloor = utils.deepClone(bidderRequest.bids);
const requestWithoutFloor = spec.buildRequests(bidRequestWithoutFloor, bidderRequest);
const data = JSON.parse(requestWithoutFloor.data);
expect(data.imp[0].bidfloor).to.not.exist;
});
it('builds request properly', function () {
const data = JSON.parse(request.data);
expect(Array.isArray(data.imp)).to.equal(true);
expect(data.id).to.equal(bidderRequest.auctionId);
expect(data.imp.length).to.equal(1);
expect(data.imp[0].id).to.equal('30b31c2501de1e');
expect(data.imp[0].tid).to.equal('d7b773de-ceaa-484d-89ca-d9f51b8d61ec');
expect(data.imp[0].tagid).to.equal('25251');
expect(data.imp[0].secure).to.equal(0);
expect(data.imp[0].vastXml).to.equal(undefined);
});
it('properly sends site information and protocol', function () {
request = spec.buildRequests(bidderRequest.bids, bidderRequest);
request = JSON.parse(request.data);
expect(request.site).to.have.property('domain', 'example.com');
expect(request.site).to.have.property('page', 'https://example.com/index.html?pbjs_debug=true');
expect(request.site).to.have.property('ref', window.top.document.referrer);
});
it('builds correctly formatted request banner object', function () {
let bidRequestWithBanner = utils.deepClone(bidderRequest.bids);
let request = spec.buildRequests(bidRequestWithBanner, bidderRequest);
const data = JSON.parse(request.data);
expect(data.imp[0].video).to.equal(undefined);
expect(data.imp[0].banner).to.exist.and.to.be.a('object');
expect(data.imp[0].banner.w).to.equal(bidRequestWithBanner[0].mediaTypes.banner.sizes[0][0]);
expect(data.imp[0].banner.h).to.equal(bidRequestWithBanner[0].mediaTypes.banner.sizes[0][1]);
expect(data.imp[0].banner.format[0].w).to.equal(bidRequestWithBanner[0].mediaTypes.banner.sizes[0][0]);
expect(data.imp[0].banner.format[0].h).to.equal(bidRequestWithBanner[0].mediaTypes.banner.sizes[0][1]);
expect(data.imp[0].banner.format[1].w).to.equal(bidRequestWithBanner[0].mediaTypes.banner.sizes[1][0]);
expect(data.imp[0].banner.format[1].h).to.equal(bidRequestWithBanner[0].mediaTypes.banner.sizes[1][1]);
});
it('builds correctly formatted request video object for instream', function () {
let bidRequestWithVideo = utils.deepClone(bidderRequest.bids);
bidRequestWithVideo[0].mediaTypes = {
video: {
context: 'instream',
playerSize: [[640, 480]]
},
};
bidRequestWithVideo[0].params.video = {};
let request = spec.buildRequests(bidRequestWithVideo, bidderRequest);
const data = JSON.parse(request.data);
expect(data.imp[0].video).to.exist.and.to.be.a('object');
expect(data.imp[0].video.w).to.equal(bidRequestWithVideo[0].mediaTypes.video.playerSize[0][0]);
expect(data.imp[0].video.h).to.equal(bidRequestWithVideo[0].mediaTypes.video.playerSize[0][1]);
});
it('builds correctly formatted request video object for outstream', function () {
let bidRequestWithOutstreamVideo = utils.deepClone(bidderRequest.bids);
bidRequestWithOutstreamVideo[0].mediaTypes = {
video: {
context: 'outstream',
playerSize: [[640, 480]]
},
};
bidRequestWithOutstreamVideo[0].params.video = {};
let request = spec.buildRequests(bidRequestWithOutstreamVideo, bidderRequest);
const data = JSON.parse(request.data);
expect(data.imp[0].video).to.exist.and.to.be.a('object');
expect(data.imp[0].video.w).to.equal(bidRequestWithOutstreamVideo[0].mediaTypes.video.playerSize[0][0]);
expect(data.imp[0].video.h).to.equal(bidRequestWithOutstreamVideo[0].mediaTypes.video.playerSize[0][1]);
});
it('shouldn\'t contain a user obj without GDPR information', function () {
let request = spec.buildRequests(bidderRequest.bids, bidderRequest)
request = JSON.parse(request.data)
expect(request).to.not.have.property('user');
});
it('should have the right gdpr info when enabled', function () {
let consentString = 'OIJSZsOAFsABAB8EMXZZZZZ+A==';
const gdprBidderRequest = utils.deepClone(bidderRequest);
gdprBidderRequest.gdprConsent = {
'consentString': consentString,
'gdprApplies': true
};
let request = spec.buildRequests(gdprBidderRequest.bids, gdprBidderRequest);
request = JSON.parse(request.data)
expect(request.regs.ext).to.have.property('gdpr', 1);
expect(request.user.ext).to.have.property('consent', consentString);
});
it('should\'t contain consent string if gdpr isn\'t applied', function () {
const nonGdprBidderRequest = utils.deepClone(bidderRequest);
nonGdprBidderRequest.gdprConsent = {
'gdprApplies': false
};
let request = spec.buildRequests(nonGdprBidderRequest.bids, nonGdprBidderRequest);
request = JSON.parse(request.data)
expect(request.regs.ext).to.have.property('gdpr', 0);
expect(request).to.not.have.property('user');
});
it('should add us privacy info to request', function() {
const uspBidderRequest = utils.deepClone(bidderRequest);
let consentString = '1YNN';
uspBidderRequest.uspConsent = consentString;
let request = spec.buildRequests(uspBidderRequest.bids, uspBidderRequest);
request = JSON.parse(request.data);
expect(request.us_privacy).to.exist;
expect(request.us_privacy).to.exist.and.to.equal(consentString);
});
it('should add schain object to request', function() {
const schainBidderRequest = utils.deepClone(bidderRequest);
schainBidderRequest.bids[0].schain = {
'complete': 1,
'ver': '1.0',
'nodes': [
{
'asi': 'testing.com',
'sid': 'abc',
'hp': 1
}
]
};
let request = spec.buildRequests(schainBidderRequest.bids, schainBidderRequest);
request = JSON.parse(request.data);
expect(request.source.ext.schain).to.exist;
expect(request.source.ext.schain).to.have.property('complete', 1);
expect(request.source.ext.schain).to.have.property('ver', '1.0');
expect(request.source.ext.schain.nodes[0].asi).to.equal(schainBidderRequest.bids[0].schain.nodes[0].asi);
});
it('should add liveramp identitylink id to request', () => {
const idl_env = '123';
const bidRequestWithID = utils.deepClone(bidderRequest);
bidRequestWithID.userId = { idl_env };
let requestWithID = spec.buildRequests(bidRequestWithID.bids, bidRequestWithID);
requestWithID = JSON.parse(requestWithID.data);
expect(requestWithID.user.ext.eids[0]).to.deep.equal({
source: 'liveramp.com',
uids: [{
id: idl_env,
ext: {
rtiPartner: 'idl'
}
}]
});
});
it('should add UID 2.0 to request', () => {
const uid2 = { id: '456' };
const bidRequestWithUID = utils.deepClone(bidderRequest);
bidRequestWithUID.userId = { uid2 };
let requestWithUID = spec.buildRequests(bidRequestWithUID.bids, bidRequestWithUID);
requestWithUID = JSON.parse(requestWithUID.data);
expect(requestWithUID.user.ext.eids[0]).to.deep.equal({
source: 'uidapi.com',
uids: [{
id: uid2.id,
ext: {
rtiPartner: 'UID2'
}
}]
});
});
});
describe('interpretResponse', function () {
let bid = {
'bidder': 'emx_digital',
'params': {
'tagid': '25251',
'video': {}
},
'mediaTypes': {
'video': {
'context': 'instream',
'playerSize': [640, 480]
}
},
'adUnitCode': 'adunit-code',
'sizes': [
[300, 250],
[300, 600]
],
'bidId': '30b31c2501de1e',
'bidderRequestId': '22edbae3120bf6',
'auctionId': '1d1a01234a475'
};
const bid_outstream = {
'bidderRequest': {
'bids': [{
'bidder': 'emx_digital',
'params': {
'tagid': '25251',
'video': {}
},
'mediaTypes': {
'video': {
'context': 'outstream',
'playerSize': [640, 480]
}
},
'adUnitCode': 'adunit-code',
'sizes': [
[300, 250],
[300, 600]
],
'bidId': '987654321cba',
'bidderRequestId': '22edbae3120bf6',
'auctionId': '1d1a01234a475'
}, {
'bidder': 'emx_digital',
'params': {
'tagid': '25252',
'video': {}
},
'mediaTypes': {
'video': {
'context': 'instream',
'playerSize': [640, 480]
}
},
'adUnitCode': 'adunit-code',
'sizes': [
[300, 250],
[300, 600]
],
'bidId': '987654321dcb',
'bidderRequestId': '22edbae3120bf6',
'auctionId': '1d1a01234a475'
}]
}
};
const serverResponse = {
'id': '12819a18-56e1-4256-b836-b69a10202668',
'seatbid': [{
'bid': [{
'adid': '123456abcde',
'adm': '<!-- Creative -->',
'crid': '3434abab34',
'h': 250,
'id': '987654321cba',
'price': 0.5,
'ttl': 300,
'w': 300,
'adomain': ['example.com']
}],
'seat': '1356'
}, {
'bid': [{
'adid': '123456abcdf',
'adm': '<!-- Creative -->',
'crid': '3434abab35',
'h': 600,
'id': '987654321dcb',
'price': 0.5,
'ttl': 300,
'w': 300
}]
}]
};
const expectedResponse = [{
'requestId': '12819a18-56e1-4256-b836-b69a10202668',
'cpm': 0.5,
'width': 300,
'height': 250,
'creativeId': '3434abab34',
'dealId': null,
'currency': 'USD',
'netRevneue': true,
'mediaType': 'banner',
'ad': '<!-- Creative -->',
'ttl': 300,
'meta': {
'advertiserDomains': ['example.com']
}
}, {
'requestId': '12819a18-56e1-4256-b836-b69a10202668',
'cpm': 0.7,
'width': 300,
'height': 600,
'creativeId': '3434abab35',
'dealId': null,
'currency': 'USD',
'netRevneue': true,
'mediaType': 'banner',
'ad': '<!-- Creative -->',
'ttl': 300
}];
it('should properly format bid response', function () {
let result = spec.interpretResponse({
body: serverResponse
});
expect(Object.keys(result[0]).length).to.equal(Object.keys(expectedResponse[0]).length);
expect(Object.keys(result[0]).requestId).to.equal(Object.keys(expectedResponse[0]).requestId);
expect(Object.keys(result[0]).bidderCode).to.equal(Object.keys(expectedResponse[0]).bidderCode);
expect(Object.keys(result[0]).cpm).to.equal(Object.keys(expectedResponse[0]).cpm);
expect(Object.keys(result[0]).creativeId).to.equal(Object.keys(expectedResponse[0]).creativeId);
expect(Object.keys(result[0]).width).to.equal(Object.keys(expectedResponse[0]).width);
expect(Object.keys(result[0]).height).to.equal(Object.keys(expectedResponse[0]).height);
expect(Object.keys(result[0]).ttl).to.equal(Object.keys(expectedResponse[0]).ttl);
expect(Object.keys(result[0]).adId).to.equal(Object.keys(expectedResponse[0]).adId);
expect(Object.keys(result[0]).currency).to.equal(Object.keys(expectedResponse[0]).currency);
expect(Object.keys(result[0]).netRevenue).to.equal(Object.keys(expectedResponse[0]).netRevenue);
expect(Object.keys(result[0]).ad).to.equal(Object.keys(expectedResponse[0]).ad);
});
it('should return multiple bids', function () {
let result = spec.interpretResponse({
body: serverResponse
});
expect(Array.isArray(result.seatbid))
const ad0 = result[0];
const ad1 = result[1];
expect(ad0.ad).to.equal(serverResponse.seatbid[0].bid[0].adm);
expect(ad0.cpm).to.equal(serverResponse.seatbid[0].bid[0].price);
expect(ad0.creativeId).to.equal(serverResponse.seatbid[0].bid[0].crid);
expect(ad0.currency).to.equal('USD');
expect(ad0.netRevenue).to.equal(true);
expect(ad0.requestId).to.equal(serverResponse.seatbid[0].bid[0].id);
expect(ad0.ttl).to.equal(300);
expect(ad1.ad).to.equal(serverResponse.seatbid[1].bid[0].adm);
expect(ad1.cpm).to.equal(serverResponse.seatbid[1].bid[0].price);
expect(ad1.creativeId).to.equal(serverResponse.seatbid[1].bid[0].crid);
expect(ad1.currency).to.equal('USD');
expect(ad1.netRevenue).to.equal(true);
expect(ad1.requestId).to.equal(serverResponse.seatbid[1].bid[0].id);
expect(ad1.ttl).to.equal(300);
});
it('returns a banner bid for non-xml creatives', function () {
let result = spec.interpretResponse({
body: serverResponse
}, { bidRequest: bid }
);
const ad0 = result[0];
const ad1 = result[1];
expect(ad0.mediaType).to.equal('banner');
expect(ad0.ad.indexOf('<?xml version') === -1).to.equal(true);
expect(ad0.vastXml).to.equal(undefined);
expect(ad0.height).to.equal(serverResponse.seatbid[0].bid[0].h);
expect(ad0.width).to.equal(serverResponse.seatbid[0].bid[0].w);
expect(ad1.mediaType).to.equal('banner');
expect(ad1.ad.indexOf('<?xml version') === -1).to.equal(true);
expect(ad1.vastXml).to.equal(undefined);
expect(ad1.width).to.equal(serverResponse.seatbid[1].bid[0].w);
expect(ad1.height).to.equal(serverResponse.seatbid[1].bid[0].h);
});
it('returns a vastXml kvp for video creatives', function () {
const vastServerResponse = utils.deepClone(serverResponse);
vastServerResponse.seatbid[0].bid[0].adm = '<?xml version=><VAST></VAST></xml>';
vastServerResponse.seatbid[1].bid[0].adm = '<?xml version=><VAST></VAST></xml>';
let result = spec.interpretResponse({
body: vastServerResponse
}, { bidRequest: bid }
);
const ad0 = result[0];
const ad1 = result[1];
expect(ad0.mediaType).to.equal('video');
expect(ad0.ad.indexOf('<?xml version') > -1).to.equal(true);
expect(ad0.vastXml).to.equal(vastServerResponse.seatbid[0].bid[0].adm);
expect(ad0.ad).to.exist.and.to.be.a('string');
expect(ad1.mediaType).to.equal('video');
expect(ad1.ad.indexOf('<?xml version') > -1).to.equal(true);
expect(ad1.vastXml).to.equal(vastServerResponse.seatbid[1].bid[0].adm);
expect(ad1.ad).to.exist.and.to.be.a('string');
});
it('returns a renderer for outstream video creatives', function () {
const vastServerResponse = utils.deepClone(serverResponse);
vastServerResponse.seatbid[0].bid[0].adm = '<?xml version=><VAST></VAST></xml>';
vastServerResponse.seatbid[1].bid[0].adm = '<?xml version=><VAST></VAST></xml>';
let result = spec.interpretResponse({body: vastServerResponse}, bid_outstream);
const ad0 = result[0];
const ad1 = result[1];
expect(ad0.renderer).to.exist.and.to.be.a('object');
expect(ad0.renderer.url).to.equal('https://js.brealtime.com/outstream/1.30.0/bundle.js');
expect(ad0.renderer.id).to.equal('987654321cba');
expect(ad1.renderer).to.equal(undefined);
});
it('handles nobid responses', function () {
let serverResponse = {
'bids': []
};
let result = spec.interpretResponse({
body: serverResponse
});
expect(result.length).to.equal(0);
});
it('should not throw an error when decoding an improperly encoded adm', function () {
const badAdmServerResponse = utils.deepClone(serverResponse);
badAdmServerResponse.seatbid[0].bid[0].adm = '<script\\ src\\=\\\"https\\:\\/\\/nym1\\-ib\\.adnxs\\.com\\/ab\\?an_audit\\=0\\&referrer=https%3A%2F%2Fwww.emxdigital.com%3Ftest%3DhAiE3%VVl%26prebid%3D%25123%25\\&e\\=wqT_3QLPCfBDzwQAAAMA1gAFAQj2iaPtBRCdw\\-qeto72gkEYlNWN2smGoJhTKjYJzGJi83G9KkARzGJi83G9KkAZAAAAgD0KEkAhzGIJGwApESTIMQAAAGBmZu4_MMvWgAc4zApAzApIAlDo\\-YEUWNbsR2AAaIrFCnjOpQWAAQGKAQNVU0SSBQbwQJgB2AWgAVqoAQGwAQC4AQLAAQTIAQLQAQnYAQDgAQDwAQCKAjp1ZignYScsIDI4OTEwMSwgMTU3MTM0MTU1OCk7ARwscicsIDQxOTc1MDE2Nh4A9DQBkgLhAiE3VVlCWndpQmpwOEpFT2o1Z1JRWUFDRFc3RWN3QURnQVFBUkl6QXBReTlhQUIxZ0FZTHdFYUFCd0NuZ0FnQUZFaUFFQWtBRUFtQUVBb0FFQnFBRURzQUVBdVFGS1I2cF9jYjBxUU1FQlNrZXFmM0c5S2tESkFaR1JfRy1UVnRNXzJRRUFBQUFBQUFEd1AtQUJBUFVCQUFBQUFJQUNBSWdDcVlMWEJaQUNBWmdDQUtBQ0FLZ0NBTFVDQUFBQUFMMENBQUFBQU9BQ0FPZ0NBUGdDQUlBREFaZ0RBYWdEZ1k2ZkNib0RDVTVaVFRJNk5ESTRNdUFEOHhQNEE0NnV2Z3lJQkFDUUJBQ1lCQUd5QkFvSXFZTFhCUkNPcnI0TXdRUUFBQUFBQUFBQUFNa0VBQUFBBXgMQURSQgkJLEF3Q0ZBMkFRQThRUQ0SYEFBQVBnRUFJZ0Z1aUUumgKJASE2eElrelE2ZQGgMXV4SElBUW9BREU5Q3RlamNMMHFRRG9KVGxsTk1qbzBNamd5UVBNVFMRWAxQQV9VEQwMQUFBVx0MAFkdDABhHQwAYw0MAaXwi2VBQS7YAqwD4AK30UbqAlxodHRwczovL3d3dy5jZWxlYnV6ei5jb20vZy90YXlsb3Itc3dpZnQtZGVidXRzLXJlZC1oYWlyLWluLXN1Z2FybGFuZC12aWRlby8_YmlkZHJfZGVidWc9dHJ1ZfICEwoPQ1VTVE9NX01PREVMX0lEEgDyAhoKFkNVU1RPERY8TEVBRl9OQU1FEgDyAh4KGjYdAPQqAUFTVF9NT0RJRklFRBIAgAMAiAMBkAMAmAMUoAMBqgMAwAOsAsgDANgDlCHgAwDoAwD4AwOABACSBAkvb3BlbnJ0YjKYBACiBA8xNDQuMTIxLjIzMy4yMzeoBIkWsgQMCAAQABgAIAAwADgAuAQAwAQAyASxgoIB0gQOMTM1NiNOWU0yOjQyODLaBAIIAeAEAPAE6PmBFPoEEgkAAAAAZqdHQBEAAAAgWpRewIgFAZgFAKAF____________AaoFFjQ5MTgxNTcxMzQxNTU2NTI2OTQ5ZTHABQDJBQAAAAAAAPA_0gUJCQAAAAAAAAAA2AUB4AUB8AXW7gr6BQQIABAAkAYAmAYAuAYAwQYAAAAAAADwP8gGANAGwgTaBhYKEAAAAAAAAAAAAAAABQpQEAAYAOAGAfIGAggAgAcBiAcAoAcB\\&s\\=630dbbd55f593c7bfd9e7bccc4dbaa28203daaed\\&pp\\=\\$\\{EMX_MACRO\\}\\\"\\>\\<\\/script\\>';
badAdmServerResponse.seatbid[1].bid[0].adm = '%3F%%3Demx%3C3prebid';
assert.doesNotThrow(() => spec.interpretResponse({
body: badAdmServerResponse
}));
});
it('returns valid advertiser domain', function () {
const bidResponse = utils.deepClone(serverResponse);
let result = spec.interpretResponse({body: bidResponse});
expect(result[0].meta.advertiserDomains).to.deep.equal(expectedResponse[0].meta.advertiserDomains);
// case where adomains are not in request
expect(result[1].meta).to.not.exist;
});
});
describe('getUserSyncs', function () {
it('should register the iframe sync url', function () {
let syncs = spec.getUserSyncs({
iframeEnabled: true
});
expect(syncs).to.not.be.an('undefined');
expect(syncs).to.have.lengthOf(1);
expect(syncs[0].type).to.equal('iframe');
});
it('should pass gdpr params', function () {
let syncs = spec.getUserSyncs({ iframeEnabled: true }, {}, {
gdprApplies: false, consentString: 'test'
});
expect(syncs).to.not.be.an('undefined');
expect(syncs).to.have.lengthOf(1);
expect(syncs[0].type).to.equal('iframe');
expect(syncs[0].url).to.contains('gdpr=0');
});
});
});