mk9-prebid
Version:
Header Bidding Management Library
385 lines (359 loc) • 12.8 kB
JavaScript
import { expect } from 'chai';
import { spec } from 'modules/dspxBidAdapter.js';
import { newBidder } from 'src/adapters/bidderFactory.js';
const ENDPOINT_URL = 'https://buyer.dspx.tv/request/';
const ENDPOINT_URL_DEV = 'https://dcbuyer.dspx.tv/request/';
describe('dspxAdapter', function () {
const adapter = newBidder(spec);
describe('isBidRequestValid', function () {
let bid = {
'bidder': 'dspx',
'params': {
'placement': '6682',
'pfilter': {
'floorprice': 1000000
},
'bcat': 'IAB2,IAB4',
'dvt': 'desktop'
},
'sizes': [
[300, 250]
],
'bidId': '30b31c1838de1e',
'bidderRequestId': '22edbae2733bf6',
'auctionId': '1d1a030790a475'
};
it('should return true when required params found', function () {
expect(spec.isBidRequestValid(bid)).to.equal(true);
});
it('should return false when required params are not passed', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.params = {
'someIncorrectParam': 0
};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
});
describe('buildRequests', function () {
let bidRequests = [{
'bidder': 'dspx',
'params': {
'placement': '6682',
'pfilter': {
'floorprice': 1000000,
'private_auction': 0,
'geo': {
'country': 'DE'
}
},
'bcat': 'IAB2,IAB4',
'dvt': 'desktop'
},
'sizes': [
[300, 250]
],
'bidId': '30b31c1838de1e1',
'bidderRequestId': '22edbae2733bf61',
'auctionId': '1d1a030790a475',
'userId': {
'netId': '123',
'uid2': '456'
}
},
{
'bidder': 'dspx',
'params': {
'placement': '101',
'devMode': true
},
'sizes': [
[300, 250]
],
'bidId': '30b31c1838de1e2',
'bidderRequestId': '22edbae2733bf62',
'auctionId': '1d1a030790a476'
}, {
'bidder': 'dspx',
'params': {
'placement': '6682',
'pfilter': {
'floorprice': 1000000,
'private_auction': 0,
'geo': {
'country': 'DE'
}
},
'bcat': 'IAB2,IAB4',
'dvt': 'desktop'
},
'sizes': [
[300, 250]
],
'bidId': '30b31c1838de1e3',
'bidderRequestId': '22edbae2733bf69',
'auctionId': '1d1a030790a477'
},
{
'bidder': 'dspx',
'params': {
'placement': '101',
'devMode': true
},
'mediaTypes': {
'video': {
'playerSize': [640, 480],
'context': 'instream'
},
'banner': {
'sizes': [
[300, 250]
]
}
},
'bidId': '30b31c1838de1e4',
'bidderRequestId': '22edbae2733bf67',
'auctionId': '1d1a030790a478'
},
{
'bidder': 'dspx',
'params': {
'placement': '101',
'devMode': true
},
'mediaTypes': {
'video': {
'playerSize': [640, 480],
'context': 'instream'
}
},
'bidId': '30b31c1838de1e41',
'bidderRequestId': '22edbae2733bf67',
'auctionId': '1d1a030790a478'
}
];
// With gdprConsent
var bidderRequest = {
refererInfo: {
referer: 'some_referrer.net'
},
gdprConsent: {
consentString: 'BOJ/P2HOJ/P2HABABMAAAAAZ+A==',
vendorData: {someData: 'value'},
gdprApplies: true
}
};
var request1 = spec.buildRequests([bidRequests[0]], bidderRequest)[0];
it('sends bid request to our endpoint via GET', function () {
expect(request1.method).to.equal('GET');
expect(request1.url).to.equal(ENDPOINT_URL);
let data = request1.data.replace(/rnd=\d+\&/g, '').replace(/ref=.*\&bid/g, 'bid');
expect(data).to.equal('_f=html&alternative=prebid_js&inventory_item_id=6682&srw=300&srh=250&idt=100&bid_id=30b31c1838de1e1&pfilter%5Bfloorprice%5D=1000000&pfilter%5Bprivate_auction%5D=0&pfilter%5Bgeo%5D%5Bcountry%5D=DE&pfilter%5Bgdpr_consent%5D=BOJ%2FP2HOJ%2FP2HABABMAAAAAZ%2BA%3D%3D&pfilter%5Bgdpr%5D=true&bcat=IAB2%2CIAB4&dvt=desktop&did_netid=123&did_uid2=456');
});
var request2 = spec.buildRequests([bidRequests[1]], bidderRequest)[0];
it('sends bid request to our DEV endpoint via GET', function () {
expect(request2.method).to.equal('GET');
expect(request2.url).to.equal(ENDPOINT_URL_DEV);
let data = request2.data.replace(/rnd=\d+\&/g, '').replace(/ref=.*\&bid/g, 'bid');
expect(data).to.equal('_f=html&alternative=prebid_js&inventory_item_id=101&srw=300&srh=250&idt=100&bid_id=30b31c1838de1e2&pfilter%5Bgdpr_consent%5D=BOJ%2FP2HOJ%2FP2HABABMAAAAAZ%2BA%3D%3D&pfilter%5Bgdpr%5D=true&prebidDevMode=1');
});
// Without gdprConsent
var bidderRequestWithoutGdpr = {
refererInfo: {
referer: 'some_referrer.net'
}
};
var request3 = spec.buildRequests([bidRequests[2]], bidderRequestWithoutGdpr)[0];
it('sends bid request without gdprConsent to our endpoint via GET', function () {
expect(request3.method).to.equal('GET');
expect(request3.url).to.equal(ENDPOINT_URL);
let data = request3.data.replace(/rnd=\d+\&/g, '').replace(/ref=.*\&bid/g, 'bid');
expect(data).to.equal('_f=html&alternative=prebid_js&inventory_item_id=6682&srw=300&srh=250&idt=100&bid_id=30b31c1838de1e3&pfilter%5Bfloorprice%5D=1000000&pfilter%5Bprivate_auction%5D=0&pfilter%5Bgeo%5D%5Bcountry%5D=DE&bcat=IAB2%2CIAB4&dvt=desktop');
});
var request4 = spec.buildRequests([bidRequests[3]], bidderRequestWithoutGdpr)[0];
it('sends bid request without gdprConsent to our DEV endpoint via GET', function () {
expect(request4.method).to.equal('GET');
expect(request4.url).to.equal(ENDPOINT_URL_DEV);
let data = request4.data.replace(/rnd=\d+\&/g, '').replace(/ref=.*\&bid/g, 'bid');
expect(data).to.equal('_f=html&alternative=prebid_js&inventory_item_id=101&srw=300&srh=250&idt=100&bid_id=30b31c1838de1e4&prebidDevMode=1');
});
var request5 = spec.buildRequests([bidRequests[4]], bidderRequestWithoutGdpr)[0];
it('sends bid video request to our rads endpoint via GET', function () {
expect(request5.method).to.equal('GET');
let data = request5.data.replace(/rnd=\d+\&/g, '').replace(/ref=.*\&bid/g, 'bid');
expect(data).to.equal('_f=vast2&alternative=prebid_js&inventory_item_id=101&srw=640&srh=480&idt=100&bid_id=30b31c1838de1e41&prebidDevMode=1');
});
});
describe('interpretResponse', function () {
let serverResponse = {
'body': {
'cpm': 5000000,
'crid': 100500,
'width': '300',
'height': '250',
'type': 'sspHTML',
'tag': '<!-- test creative -->',
'requestId': '220ed41385952a',
'currency': 'EUR',
'ttl': 60,
'netRevenue': true,
'zone': '6682',
'adomain': ['bdomain']
}
};
let serverVideoResponse = {
'body': {
'cpm': 5000000,
'crid': 100500,
'width': '300',
'height': '250',
'vastXml': '{"reason":7001,"status":"accepted"}',
'requestId': '220ed41385952a',
'type': 'vast2',
'currency': 'EUR',
'ttl': 60,
'netRevenue': true,
'zone': '6682'
}
};
let expectedResponse = [{
requestId: '23beaa6af6cdde',
cpm: 0.5,
width: 0,
height: 0,
creativeId: 100500,
dealId: '',
currency: 'EUR',
netRevenue: true,
ttl: 300,
type: 'sspHTML',
ad: '<!-- test creative -->',
meta: {advertiserDomains: ['bdomain']}
}, {
requestId: '23beaa6af6cdde',
cpm: 0.5,
width: 0,
height: 0,
creativeId: 100500,
dealId: '',
currency: 'EUR',
netRevenue: true,
ttl: 300,
type: 'vast2',
vastXml: '{"reason":7001,"status":"accepted"}',
mediaType: 'video',
meta: {advertiserDomains: []}
}];
it('should get the correct bid response by display ad', function () {
let bidRequest = [{
'method': 'GET',
'url': ENDPOINT_URL,
'data': {
'bid_id': '30b31c1838de1e'
}
}];
let result = spec.interpretResponse(serverResponse, bidRequest[0]);
expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[0]));
expect(result[0].meta.advertiserDomains.length).to.equal(1);
expect(result[0].meta.advertiserDomains[0]).to.equal(expectedResponse[0].meta.advertiserDomains[0]);
});
it('should get the correct dspx video bid response by display ad', function () {
let bidRequest = [{
'method': 'GET',
'url': ENDPOINT_URL,
'mediaTypes': {
'video': {
'playerSize': [640, 480],
'context': 'instream'
}
},
'data': {
'bid_id': '30b31c1838de1e'
}
}];
let result = spec.interpretResponse(serverVideoResponse, bidRequest[0]);
expect(Object.keys(result[0])).to.have.members(Object.keys(expectedResponse[1]));
expect(result[0].meta.advertiserDomains.length).to.equal(0);
});
it('handles empty bid response', function () {
let response = {
body: {}
};
let result = spec.interpretResponse(response);
expect(result.length).to.equal(0);
});
});
describe(`getUserSyncs test usage`, function () {
let serverResponses;
beforeEach(function () {
serverResponses = [{
body: {
requestId: '23beaa6af6cdde',
cpm: 0.5,
width: 0,
height: 0,
creativeId: 100500,
dealId: '',
currency: 'EUR',
netRevenue: true,
ttl: 300,
type: 'sspHTML',
ad: '<!-- test creative -->',
userSync: {
iframeUrl: ['anyIframeUrl?a=1'],
imageUrl: ['anyImageUrl', 'anyImageUrl2']
}
}
}];
});
it(`return value should be an array`, function () {
expect(spec.getUserSyncs({ iframeEnabled: true })).to.be.an('array');
});
it(`array should have only one object and it should have a property type = 'iframe'`, function () {
expect(spec.getUserSyncs({ iframeEnabled: true }, serverResponses).length).to.be.equal(1);
let [userSync] = spec.getUserSyncs({ iframeEnabled: true }, serverResponses);
expect(userSync).to.have.property('type');
expect(userSync.type).to.be.equal('iframe');
});
it(`we have valid sync url for iframe`, function () {
let [userSync] = spec.getUserSyncs({ iframeEnabled: true }, serverResponses, {consentString: 'anyString'});
expect(userSync.url).to.be.equal('anyIframeUrl?a=1&gdpr_consent=anyString')
expect(userSync.type).to.be.equal('iframe');
});
it(`we have valid sync url for image`, function () {
let [userSync] = spec.getUserSyncs({ pixelEnabled: true }, serverResponses, {gdprApplies: true, consentString: 'anyString'});
expect(userSync.url).to.be.equal('anyImageUrl?gdpr=1&gdpr_consent=anyString')
expect(userSync.type).to.be.equal('image');
});
it(`we have valid sync url for image and iframe`, function () {
let userSync = spec.getUserSyncs({ iframeEnabled: true, pixelEnabled: true }, serverResponses, {gdprApplies: true, consentString: 'anyString'});
expect(userSync.length).to.be.equal(3);
expect(userSync[0].url).to.be.equal('anyIframeUrl?a=1&gdpr=1&gdpr_consent=anyString')
expect(userSync[0].type).to.be.equal('iframe');
expect(userSync[1].url).to.be.equal('anyImageUrl?gdpr=1&gdpr_consent=anyString')
expect(userSync[1].type).to.be.equal('image');
expect(userSync[2].url).to.be.equal('anyImageUrl2?gdpr=1&gdpr_consent=anyString')
expect(userSync[2].type).to.be.equal('image');
});
});
describe(`getUserSyncs test usage in passback response`, function () {
let serverResponses;
beforeEach(function () {
serverResponses = [{
body: {
reason: 8002,
status: 'error',
msg: 'passback',
}
}];
});
it(`check for zero array when iframeEnabled`, function () {
expect(spec.getUserSyncs({ iframeEnabled: true })).to.be.an('array');
expect(spec.getUserSyncs({ iframeEnabled: true }, serverResponses).length).to.be.equal(0);
});
it(`check for zero array when iframeEnabled`, function () {
expect(spec.getUserSyncs({ pixelEnabled: true })).to.be.an('array');
expect(spec.getUserSyncs({ pixelEnabled: true }, serverResponses).length).to.be.equal(0);
});
});
});