mk9-prebid
Version:
Header Bidding Management Library
735 lines (659 loc) • 26.4 kB
JavaScript
import { expect } from 'chai';
import { spec } from 'modules/adyoulikeBidAdapter.js';
import { newBidder } from 'src/adapters/bidderFactory.js';
describe('Adyoulike Adapter', function () {
const canonicalUrl = 'https://canonical.url/?t=%26';
const referrerUrl = 'http://referrer.url/?param=value';
const defaultDC = 'hb-api';
const consentString = 'BOJ8RZsOJ8RZsABAB8AAAAAZ+A==';
const bidderRequest = {
'auctionId': '1d1a030790a475',
'bidderRequestId': '22edbae2733bf6',
'timeout': 3000,
'gdprConsent': {
consentString: consentString,
gdprApplies: true
},
refererInfo: {referer: referrerUrl}
};
const bidRequestWithEmptyPlacement = [
{
'bidId': 'bid_id_0',
'bidder': 'adyoulike',
'placementCode': 'adunit/hb-0',
'params': {},
'sizes': '300x250',
'mediaTypes':
{ 'banner':
{'sizes': ['300x250', '300x600']
}
}
}
];
const bidRequestWithEmptySizes = {
'bids': [
{
'bidId': 'bid_id_0',
'bidder': 'adyoulike',
'placementCode': 'adunit/hb-0',
'params': {
'placement': 'placement_0'
},
'transactionId': 'bid_id_0_transaction_id'
}
],
};
const bidRequestWithSinglePlacement = [
{
'bidId': 'bid_id_0',
'bidder': 'adyoulike',
'placementCode': 'adunit/hb-0',
'params': {
'placement': 'placement_0'
},
'sizes': '300x250',
'mediaTypes':
{ 'banner':
{'sizes': ['300x250']
},
'native':
{ 'image': {
'required': true,
},
'title': {
'required': true,
'len': 80
},
'cta': {
'required': false
},
'sponsoredBy': {
'required': true
},
'clickUrl': {
'required': true
},
'privacyIcon': {
'required': false
},
'privacyLink': {
'required': false
},
'body': {
'required': true
},
'icon': {
'required': true,
'sizes': []
}
},
},
'transactionId': 'bid_id_0_transaction_id'
}
];
const bidRequestWithNativeImageType = [
{
'bidId': 'bid_id_0',
'bidder': 'adyoulike',
'placementCode': 'adunit/hb-0',
'params': {
'placement': 'placement_0'
},
'sizes': '300x250',
'mediaTypes':
{
'native': {
'type': 'image',
'additional': {
'will': 'be',
'sent': ['300x250']
}
},
},
'transactionId': 'bid_id_0_transaction_id'
}
];
const sentBidNative = {
'bid_id_0': {
'PlacementID': 'e622af275681965d3095808561a1e510',
'TransactionID': 'e8355240-d976-4cd5-a493-640656fe08e8',
'AvailableSizes': '',
'Native': {
'image': {
'required': true,
'sizes': []
},
'title': {
'required': true,
'len': 80
},
'cta': {
'required': false
},
'sponsoredBy': {
'required': true
},
'clickUrl': {
'required': true
},
'privacyIcon': {
'required': false
},
'privacyLink': {
'required': false
},
'body': {
'required': true
},
'icon': {
'required': true,
'sizes': []
}
}
}
};
const sentBidVideo = {
'bid_id_0': {
'PlacementID': 'e622af275681965d3095808561a1e510',
'TransactionID': 'e8355240-d976-4cd5-a493-640656fe08e8',
'AvailableSizes': '',
'Video': {
playerSize: [640, 480]
}
}
};
const sentNativeImageType = {
'additional': {
'sent': [
'300x250'
],
'will': 'be'
},
'body': {
'required': false
},
'clickUrl': {
'required': true
},
'cta': {
'required': false
},
'icon': {
'required': false
},
'image': {
'required': true
},
'sponsoredBy': {
'required': true
},
'title': {
'required': true
},
'type': 'image'
};
const bidRequestWithDCPlacement = [
{
'bidId': 'bid_id_0',
'bidder': 'adyoulike',
'placementCode': 'adunit/hb-0',
'params': {
'placement': 'placement_0',
'DC': 'fra01'
},
'sizes': '300x250',
'mediaTypes':
{ 'banner':
{'sizes': ['300x250']
}
},
'transactionId': 'bid_id_0_transaction_id'
}
];
const bidRequestMultiPlacements = [
{
'bidId': 'bid_id_0',
'bidder': 'adyoulike',
'placementCode': 'adunit/hb-0',
'params': {
'placement': 'placement_0'
},
'sizes': '300x250',
'mediaTypes':
{ 'banner':
{'sizes': ['300x250']
}
},
'transactionId': 'bid_id_0_transaction_id'
},
{
'bidId': 'bid_id_1',
'bidder': 'adyoulike',
'placementCode': 'adunit/hb-1',
'params': {
'placement': 'placement_1'
},
'sizes': [[300, 600]],
'mediaTypes':
{ 'banner':
{'sizes': ['300x600']
}
},
'transactionId': 'bid_id_1_transaction_id'
},
{
'bidId': 'bid_id_2',
'bidder': 'adyoulike',
'placementCode': 'adunit/hb-2',
'params': {},
'sizes': '300x400',
'transactionId': 'bid_id_2_transaction_id'
},
{
'bidId': 'bid_id_3',
'bidder': 'adyoulike',
'placementCode': 'adunit/hb-3',
'params': {
'placement': 'placement_3'
},
'transactionId': 'bid_id_3_transaction_id'
}
];
const requestDataOnePlacement = {
'bid_id_0':
{ 'PlacementID': 'e622af275681965d3095808561a1e510',
'TransactionID': '1bca18cc-c0fe-439b-88c2-8247d3448f22',
'Width': 300,
'Height': 600,
'AvailableSizes': '300x600'
}
}
const requestDataMultiPlacement = {
'bid_id_0':
{ 'PlacementID': 'e622af275681965d3095808561a1e510',
'TransactionID': '1bca18cc-c0fe-439b-88c2-8247d3448f22',
'Width': 300,
'Height': 600,
'AvailableSizes': '300x600'
},
'bid_id_1':
{ 'PlacementID': 'e622af275681965d3095808561a1e510',
'TransactionID': 'e63b2d86-ca60-4167-9cf1-497607079634',
'Width': 400,
'Height': 250,
'AvailableSizes': '300x250'
}
}
const responseWithEmptyPlacement = [
{
'Placement': 'placement_0'
}
];
const testMetaObject = {
'networkId': 123,
'advertiserId': '3',
'advertiserName': 'foobar',
'advertiserDomains': ['foobar.com'],
'brandId': '345',
'brandName': 'Foo',
'primaryCatId': '34',
'secondaryCatIds': ['IAB-222', 'IAB-333'],
'mediaType': 'banner'
};
const admSample = "\u003cscript id=\"ayl-prebid-a11a121205932e75e622af275681965d\"\u003e\n(function(){\n\twindow.isPrebid = true\n\tvar prebidResults = /*PREBID*/{\"OnEvents\":{\"CLICK\":[{\"Kind\":\"PIXEL_URL\",\"Url\":\"https://testPixelCLICK.com/fake\"}],\"IMPRESSION\":[{\"Kind\":\"PIXEL_URL\",\"Url\":\"https://testPixelIMP.com/fake\"},{\"Kind\":\"JAVASCRIPT_URL\",\"Url\":\"https://testJsIMP.com/fake.js\"}]},\"Disabled\":false,\"Attempt\":\"a11a121205932e75e622af275681965d\",\"ApiPrefix\":\"https://fo-api.omnitagjs.com/fo-api\",\"TrackingPrefix\":\"https://tracking.omnitagjs.com/tracking\",\"DynamicPrefix\":\"https://tag-dyn.omnitagjs.com/fo-dyn\",\"StaticPrefix\":\"https://fo-static.omnitagjs.com/fo-static\",\"BlobPrefix\":\"https://fo-api.omnitagjs.com/fo-api/blobs\",\"SspPrefix\":\"https://fo-ssp.omnitagjs.com/fo-ssp\",\"VisitorPrefix\":\"https://visitor.omnitagjs.com/visitor\",\"Trusted\":true,\"Placement\":\"e622af275681965d3095808561a1e510\",\"PlacementAccess\":\"ALL\",\"Site\":\"6e2df7a92203c3c7a25561ed63f25a27\",\"Lang\":\"EN\",\"SiteLogo\":null,\"HasSponsorImage\":false,\"ResizeIframe\":true,\"IntegrationConfig\":{\"Kind\":\"WIDGET\",\"Widget\":{\"ExtraStyleSheet\":\"\",\"Placeholders\":{\"Body\":{\"Color\":{\"R\":77,\"G\":21,\"B\":82,\"A\":100},\"BackgroundColor\":{\"R\":255,\"G\":255,\"B\":255,\"A\":100},\"FontFamily\":\"Lato\",\"Width\":\"100%\",\"Align\":\"\",\"BoxShadow\":true},\"CallToAction\":{\"Color\":{\"R\":26,\"G\":157,\"B\":212,\"A\":100}},\"Description\":{\"Length\":130},\"Image\":{\"Width\":600,\"Height\":600,\"Lowres\":false,\"Raw\":false},\"Size\":{\"Height\":\"250px\",\"Width\":\"300px\"},\"Sponsor\":{\"Color\":{\"R\":35,\"G\":35,\"B\":35,\"A\":100},\"Label\":true,\"WithoutLogo\":false},\"Title\":{\"Color\":{\"R\":219,\"G\":181,\"B\":255,\"A\":100}}},\"Selector\":{\"Kind\":\"CSS\",\"Css\":\"#ayl-prebid-a11a121205932e75e622af275681965d\"},\"Insertion\":\"AFTER\",\"ClickFormat\":true,\"Creative20\":true,\"WidgetKind\":\"CREATIVE_TEMPLATE_4\"}},\"Legal\":\"Sponsored\",\"ForcedCampaign\":\"f1c80d4bb5643c222ae8de75e9b2f991\",\"ForcedTrack\":\"\",\"ForcedCreative\":\"\",\"ForcedSource\":\"\",\"DisplayMode\":\"DEFAULT\",\"Campaign\":\"f1c80d4bb5643c222ae8de75e9b2f991\",\"CampaignAccess\":\"ALL\",\"CampaignKind\":\"AD_TRAFFIC\",\"DataSource\":\"LOCAL\",\"DataSourceUrl\":\"\",\"DataSourceOnEventsIsolated\":false,\"DataSourceWithoutCookie\":false,\"Content\":{\"Preview\":{\"Thumbnail\":{\"Image\":{\"Kind\":\"EXTERNAL\",\"Data\":{\"External\":{\"Url\":\"https://tag-dyn.omnitagjs.com/fo-dyn/native/preview/image?key=fd4362d35bb174d6f1c80d4bb5643c22\\u0026kind=INTERNAL\\u0026ztop=0.000000\\u0026zleft=0.000000\\u0026zwidth=0.333333\\u0026zheight=1.000000\\u0026width=[width]\\u0026height=[height]\"}},\"ZoneTop\":0,\"ZoneLeft\":0,\"ZoneWidth\":1,\"ZoneHeight\":1,\"Smart\":false,\"NoTransform\":false,\"Quality\":\"NORMAL\"}},\"Text\":{\"CALLTOACTION\":\"Click here to learn more\",\"DESCRIPTION\":\"Considérant l'extrémité conjoncturelle, il serait bon d'anticiper toutes les voies de bon sens.\",\"SPONSOR\":\"Tested by\",\"TITLE\":\"Adserver Traffic Redirect Internal\"},\"Sponsor\":{\"Name\":\"QA Team\"},\"Credit\":{\"Logo\":{\"Resource\":{\"Kind\":\"EXTERNAL\",\"Data\":{\"External\":{\"Url\":\"https://fo-static.omnitagjs.com/fo-static/native/images/info-ayl.png\"}},\"ZoneTop\":0,\"ZoneLeft\":0,\"ZoneWidth\":1,\"ZoneHeight\":1,\"Smart\":false,\"NoTransform\":false,\"Quality\":\"NORMAL\"}},\"Url\":\"https://blobs.omnitagjs.com/adchoice/\"}},\"Landing\":{\"Url\":\"https://www.w3.org/People/mimasa/test/xhtml/entities/entities-11.xhtml#lat1\",\"LegacyTracking\":false},\"ViewButtons\":{\"Close\":{\"Skip\":6000}},\"InternalContentFields\":{\"AnimatedImage\":false}},\"AdDomain\":\"adyoulike.com\",\"Opener\":\"REDIRECT\",\"PerformUITriggers\":[\"CLICK\"],\"RedirectionTarget\":\"TAB\"}/*PREBID*/;\n\tvar insertAds = function insertAds() {\insertAds();\n\t}\n})();\n\u003c/script\u003e";
const responseWithSinglePlacement = [
{
'BidID': 'bid_id_0',
'Placement': 'placement_0',
'Ad': admSample,
'Price': 0.5,
'Height': 600,
'Meta': testMetaObject
}
];
const responseWithSingleNative = [{
'BidID': 'bid_id_0',
'Placement': 'placement_0',
'Native': {
'body': 'Considérant l\'extrémité conjoncturelle, il serait bon d\'anticiper toutes les voies de bon sens.',
'cta': 'Click here to learn more',
'clickUrl': 'https://tracking.omnitagjs.com/tracking/ar?event_kind=CLICK&attempt=a11a121205932e75e622af275681965d&campaign=f1c80d4bb5643c222ae8de75e9b2f991&url=https%3A%2F%2Fwww.w3.org%2FPeople%2Fmimasa%2Ftest%2Fxhtml%2Fentities%2Fentities-11.xhtml%23lat1',
'image': {
'height': 600,
'url': 'https://blobs.omnitagjs.com/blobs/f1/f1c80d4bb5643c22/fd4362d35bb174d6f1c80d4bb5643c22',
'width': 300
},
'privacyIcon': 'https://fo-static.omnitagjs.com/fo-static/native/images/info-ayl.png',
'privacyLink': 'https://blobs.omnitagjs.com/adchoice/',
'sponsoredBy': 'QA Team',
'title': 'Adserver Traffic Redirect Internal',
'impressionTrackers': [
'https://testPixelIMP.com/fake',
'https://tracking.omnitagjs.com/tracking/pixel?event_kind=IMPRESSION&attempt=a11a121205932e75e622af275681965d&campaign=f1c80d4bb5643c222ae8de75e9b2f991',
'https://tracking.omnitagjs.com/tracking/pixel?event_kind=INSERTION&attempt=a11a121205932e75e622af275681965d&campaign=f1c80d4bb5643c222ae8de75e9b2f991',
],
'javascriptTrackers': [
'https://testJsIMP.com/fake.js'
],
'clickTrackers': [
'https://testPixelCLICK.com/fake'
]
},
'Price': 0.5,
'Height': 600,
}];
const nativeResult = [{
cpm: 0.5,
creativeId: undefined,
currency: 'USD',
netRevenue: true,
requestId: 'bid_id_0',
ttl: 3600,
mediaType: 'native',
native: {
body: 'Considérant l\'extrémité conjoncturelle, il serait bon d\'anticiper toutes les voies de bon sens.',
clickTrackers: [
'https://testPixelCLICK.com/fake'
],
clickUrl: 'https://tracking.omnitagjs.com/tracking/ar?event_kind=CLICK&attempt=a11a121205932e75e622af275681965d&campaign=f1c80d4bb5643c222ae8de75e9b2f991&url=https%3A%2F%2Fwww.w3.org%2FPeople%2Fmimasa%2Ftest%2Fxhtml%2Fentities%2Fentities-11.xhtml%23lat1',
cta: 'Click here to learn more',
image: {
height: 600,
url: 'https://blobs.omnitagjs.com/blobs/f1/f1c80d4bb5643c22/fd4362d35bb174d6f1c80d4bb5643c22',
width: 300,
},
impressionTrackers: [
'https://testPixelIMP.com/fake',
'https://tracking.omnitagjs.com/tracking/pixel?event_kind=IMPRESSION&attempt=a11a121205932e75e622af275681965d&campaign=f1c80d4bb5643c222ae8de75e9b2f991',
'https://tracking.omnitagjs.com/tracking/pixel?event_kind=INSERTION&attempt=a11a121205932e75e622af275681965d&campaign=f1c80d4bb5643c222ae8de75e9b2f991'
],
javascriptTrackers: [
'https://testJsIMP.com/fake.js'
],
privacyIcon: 'https://fo-static.omnitagjs.com/fo-static/native/images/info-ayl.png',
privacyLink: 'https://blobs.omnitagjs.com/adchoice/',
sponsoredBy: 'QA Team',
title: 'Adserver Traffic Redirect Internal',
},
meta: testMetaObject
}];
const responseWithSingleVideo = [{
'BidID': 'bid_id_0',
'Placement': 'placement_0',
'Vast': 'PFZBU1Q+RW1wdHkgc2FtcGxlPC92YXN0Pg==',
'Price': 0.5,
'Height': 600,
}];
const videoResult = [{
cpm: 0.5,
creativeId: undefined,
currency: 'USD',
netRevenue: true,
requestId: 'bid_id_0',
ttl: 3600,
mediaType: 'video',
meta: {
advertiserDomains: []
},
vastXml: '<VAST>Empty sample</vast>'
}];
const responseWithMultiplePlacements = [
{
'BidID': 'bid_id_0',
'Placement': 'placement_0',
'Ad': 'placement_0',
'Price': 0.5,
'Height': 0, // test with wrong value
'Width': 300
},
{
'BidID': 'bid_id_1',
'Placement': 'placement_1',
'Ad': 'placement_1',
'Price': 0.6,
'Height': 250
// 'Width' test with missing value
}
];
const adapter = newBidder(spec);
let getEndpoint = (dc = defaultDC) => `https://${dc}.omnitagjs.com/hb-api/prebid`;
describe('inherited functions', function () {
it('exists and is a function', function () {
expect(adapter.callBids).to.exist.and.to.be.a('function');
});
});
describe('isBidRequestValid', function () {
let bid = {
'bidId': 'bid_id_1',
'bidder': 'adyoulike',
'placementCode': 'adunit/hb-1',
'params': {
'placement': 'placement_1'
},
'sizes': [[300, 600]],
'transactionId': 'bid_id_1_transaction_id'
};
let bidWSize = {
'bidId': 'bid_id_1',
'bidder': 'adyoulike',
'placementCode': 'adunit/hb-1',
'params': {
'placement': 'placement_1',
'size': [250, 300],
},
'transactionId': 'bid_id_1_transaction_id'
};
let nativeBid = {
'bidId': 'bid_id_1',
'bidder': 'adyoulike',
'placementCode': 'adunit/hb-1',
'params': {
'placement': 'placement_1'
},
mediaTypes: {
native: {
}
},
'transactionId': 'bid_id_1_transaction_id'
};
it('should return true when required params found', function () {
expect(!!spec.isBidRequestValid(bid)).to.equal(true);
});
it('should return true when required params found with size in bid params', function () {
expect(!!spec.isBidRequestValid(bidWSize)).to.equal(true);
});
it('should return true when required params found for native ad', function () {
expect(!!spec.isBidRequestValid(nativeBid)).to.equal(true);
});
it('should return false when required params are not passed', function () {
let bid = Object.assign({}, bid);
delete bid.size;
expect(!!spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return false when required params are not passed', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.params = {
'placement': 0
};
expect(!!spec.isBidRequestValid(bid)).to.equal(false);
});
});
describe('buildRequests', function () {
let canonicalQuery;
beforeEach(function () {
let canonical = document.createElement('link');
canonical.rel = 'canonical';
canonical.href = canonicalUrl;
canonicalQuery = sinon.stub(window.top.document.head, 'querySelector');
canonicalQuery.withArgs('link[rel="canonical"][href]').returns(canonical);
});
afterEach(function () {
canonicalQuery.restore();
});
it('Should expand short native image config type', function() {
const request = spec.buildRequests(bidRequestWithNativeImageType, bidderRequest);
const payload = JSON.parse(request.data);
expect(request.url).to.contain(getEndpoint());
expect(request.method).to.equal('POST');
expect(request.url).to.contains('CanonicalUrl=' + encodeURIComponent(canonicalUrl));
expect(request.url).to.contains('RefererUrl=' + encodeURIComponent(referrerUrl));
expect(request.url).to.contains('PublisherDomain=http%3A%2F%2Flocalhost%3A9876');
expect(payload.Version).to.equal('1.0');
expect(payload.Bids['bid_id_0'].PlacementID).to.be.equal('placement_0');
expect(payload.PageRefreshed).to.equal(false);
expect(payload.Bids['bid_id_0'].TransactionID).to.be.equal('bid_id_0_transaction_id');
expect(payload.Bids['bid_id_0'].Native).deep.equal(sentNativeImageType);
});
it('should add gdpr/usp consent information to the request', function () {
let consentString = 'BOJ8RZsOJ8RZsABAB8AAAAAZ+A==';
let uspConsentData = '1YCC';
let bidderRequest = {
'auctionId': '1d1a030790a475',
'bidderRequestId': '22edbae2733bf6',
'timeout': 3000,
'gdprConsent': {
consentString: consentString,
gdprApplies: true
},
'uspConsent': uspConsentData
};
bidderRequest.bids = bidRequestWithSinglePlacement;
const request = spec.buildRequests(bidRequestWithSinglePlacement, bidderRequest);
const payload = JSON.parse(request.data);
expect(payload.gdprConsent).to.exist;
expect(payload.gdprConsent.consentString).to.exist.and.to.equal(consentString);
expect(payload.gdprConsent.consentRequired).to.exist.and.to.be.true;
expect(payload.uspConsent).to.exist.and.to.equal(uspConsentData);
});
it('should not set a default value for gdpr consentRequired', function () {
let consentString = 'BOJ8RZsOJ8RZsABAB8AAAAAZ+A==';
let uspConsentData = '1YCC';
let bidderRequest = {
'auctionId': '1d1a030790a475',
'bidderRequestId': '22edbae2733bf6',
'timeout': 3000,
'gdprConsent': {
consentString: consentString
},
'uspConsent': uspConsentData
};
bidderRequest.bids = bidRequestWithSinglePlacement;
const request = spec.buildRequests(bidRequestWithSinglePlacement, bidderRequest);
const payload = JSON.parse(request.data);
expect(payload.gdprConsent).to.exist;
expect(payload.gdprConsent.consentString).to.exist.and.to.equal(consentString);
expect(payload.gdprConsent.consentRequired).to.be.null;
});
it('sends bid request to endpoint with single placement', function () {
const request = spec.buildRequests(bidRequestWithSinglePlacement, bidderRequest);
const payload = JSON.parse(request.data);
expect(request.url).to.contain(getEndpoint());
expect(request.method).to.equal('POST');
expect(request.url).to.contains('CanonicalUrl=' + encodeURIComponent(canonicalUrl));
expect(request.url).to.contains('RefererUrl=' + encodeURIComponent(referrerUrl));
expect(request.url).to.contains('PublisherDomain=http%3A%2F%2Flocalhost%3A9876');
expect(payload.Version).to.equal('1.0');
expect(payload.Bids['bid_id_0'].PlacementID).to.be.equal('placement_0');
expect(payload.PageRefreshed).to.equal(false);
expect(payload.Bids['bid_id_0'].TransactionID).to.be.equal('bid_id_0_transaction_id');
});
it('sends bid request to endpoint with single placement without canonical', function () {
canonicalQuery.restore();
const request = spec.buildRequests(bidRequestWithSinglePlacement, bidderRequest);
const payload = JSON.parse(request.data);
expect(request.url).to.contain(getEndpoint());
expect(request.method).to.equal('POST');
expect(request.url).to.not.contains('CanonicalUrl=' + encodeURIComponent(canonicalUrl));
expect(payload.Version).to.equal('1.0');
expect(payload.Bids['bid_id_0'].PlacementID).to.be.equal('placement_0');
expect(payload.PageRefreshed).to.equal(false);
expect(payload.Bids['bid_id_0'].TransactionID).to.be.equal('bid_id_0_transaction_id');
});
it('sends bid request to endpoint with multiple placements', function () {
const request = spec.buildRequests(bidRequestMultiPlacements, bidderRequest);
const payload = JSON.parse(request.data);
expect(request.url).to.contain(getEndpoint());
expect(request.method).to.equal('POST');
expect(request.url).to.contains('CanonicalUrl=' + encodeURIComponent(canonicalUrl));
expect(request.url).to.contains('RefererUrl=' + encodeURIComponent(referrerUrl));
expect(payload.Version).to.equal('1.0');
expect(payload.Bids['bid_id_0'].PlacementID).to.be.equal('placement_0');
expect(payload.Bids['bid_id_1'].PlacementID).to.be.equal('placement_1');
expect(payload.Bids['bid_id_3'].PlacementID).to.be.equal('placement_3');
expect(payload.Bids['bid_id_0'].TransactionID).to.be.equal('bid_id_0_transaction_id');
expect(payload.Bids['bid_id_1'].TransactionID).to.be.equal('bid_id_1_transaction_id');
expect(payload.Bids['bid_id_3'].TransactionID).to.be.equal('bid_id_3_transaction_id');
expect(payload.PageRefreshed).to.equal(false);
});
it('sends bid request to endpoint setted by parameters', function () {
const request = spec.buildRequests(bidRequestWithDCPlacement, bidderRequest);
const payload = JSON.parse(request.data);
expect(request.url).to.contain(getEndpoint(`${defaultDC}-fra01`));
});
});
//
describe('interpretResponse', function () {
let serverResponse;
beforeEach(function () {
serverResponse = {
body: {}
}
});
it('handles nobid responses', function () {
let response = [{
BidID: '123dfsdf',
Attempt: '32344fdse1',
Placement: '12df1'
}];
serverResponse.body = response;
let result = spec.interpretResponse(serverResponse, []);
expect(result).deep.equal([]);
});
it('receive reponse with single placement', function () {
serverResponse.body = responseWithSinglePlacement;
let result = spec.interpretResponse(serverResponse, {data: '{"Bids":' + JSON.stringify(requestDataOnePlacement) + '}'});
expect(result.length).to.equal(1);
expect(result[0].cpm).to.equal(0.5);
expect(result[0].ad).to.equal(admSample);
expect(result[0].width).to.equal(300);
expect(result[0].height).to.equal(600);
expect(result[0].meta).to.deep.equal(testMetaObject);
});
it('receive reponse with multiple placement', function () {
serverResponse.body = responseWithMultiplePlacements;
let result = spec.interpretResponse(serverResponse, {data: '{"Bids":' + JSON.stringify(requestDataMultiPlacement) + '}'});
expect(result.length).to.equal(2);
expect(result[0].cpm).to.equal(0.5);
expect(result[0].ad).to.equal('placement_0');
expect(result[0].width).to.equal(300);
expect(result[0].height).to.equal(600);
expect(result[1].cpm).to.equal(0.6);
expect(result[1].ad).to.equal('placement_1');
expect(result[1].width).to.equal(400);
expect(result[1].height).to.equal(250);
});
it('receive reponse with Native from ad markup', function () {
serverResponse.body = responseWithSinglePlacement;
let result = spec.interpretResponse(serverResponse, {data: '{"Bids":' + JSON.stringify(sentBidNative) + '}'});
expect(result.length).to.equal(1);
expect(result).to.deep.equal(nativeResult);
});
it('receive reponse with Native ad', function () {
serverResponse.body = responseWithSingleNative;
let result = spec.interpretResponse(serverResponse, {data: '{"Bids":' + JSON.stringify(sentBidNative) + '}'});
expect(result.length).to.equal(1);
const noMeta = [...nativeResult];
const metaBackup = noMeta[0].meta;
// this test should return default meta object
noMeta[0].meta = { advertiserDomains: [] };
expect(result).to.deep.equal(noMeta);
});
it('receive Vast reponse with Video ad', function () {
serverResponse.body = responseWithSingleVideo;
let result = spec.interpretResponse(serverResponse, {data: '{"Bids":' + JSON.stringify(sentBidVideo) + '}'});
expect(result.length).to.equal(1);
expect(result).to.deep.equal(videoResult);
});
});
});