mk9-prebid
Version:
Header Bidding Management Library
827 lines (777 loc) • 36.3 kB
JavaScript
import {assert, expect} from 'chai';
import { spec, storage } from 'modules/mgidBidAdapter.js';
import { version } from 'package.json';
import * as utils from '../../../src/utils.js';
describe('Mgid bid adapter', function () {
let sandbox;
let logErrorSpy;
let logWarnSpy;
beforeEach(function () {
sandbox = sinon.sandbox.create();
logErrorSpy = sinon.spy(utils, 'logError');
logWarnSpy = sinon.spy(utils, 'logWarn');
});
afterEach(function () {
sandbox.restore();
utils.logError.restore();
utils.logWarn.restore();
});
const ua = navigator.userAgent;
const screenHeight = screen.height;
const screenWidth = screen.width;
const dnt = (navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') ? 1 : 0;
const language = navigator.language ? 'language' : 'userLanguage';
let lang = navigator[language].split('-')[0];
if (lang.length != 2 && lang.length != 3) {
lang = '';
}
const secure = window.location.protocol === 'https:' ? 1 : 0;
const mgid_ver = spec.VERSION;
const utcOffset = (new Date()).getTimezoneOffset().toString();
describe('isBidRequestValid', function () {
let bid = {
'adUnitCode': 'div',
'bidder': 'mgid',
'params': {
'property': '10433394',
'zone': 'zone'
},
};
it('should not accept bid without required params', function () {
let isValid = spec.isBidRequestValid(bid);
expect(isValid).to.equal(false);
});
it('should return false when params are not passed', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.params = {};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return false when valid params are not passed', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.params = {accountId: '', placementId: ''};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return false when valid params are not passed', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.adUnitCode = '';
bid.mediaTypes = {
banner: {
sizes: [[300, 250]]
}
};
bid.params = {accountId: 2, placementId: 1};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return false when adUnitCode not passed', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.adUnitCode = '';
bid.mediaTypes = {
banner: {
sizes: [[300, 250]]
}
};
bid.params = {accountId: 2, placementId: 1};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return true when valid params are passed as nums', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.adUnitCode = 'div';
bid.mediaTypes = {
banner: {
sizes: [[300, 250]]
}
};
bid.params = {accountId: 2, placementId: 1};
expect(spec.isBidRequestValid(bid)).to.equal(true);
});
it('should return false when valid params are not passed', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.mediaTypes = {
native: {
sizes: [[300, 250]]
}
};
bid.params = {accountId: '0', placementId: '00'};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return false when valid mediaTypes are not passed', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.params = {accountId: '1', placementId: '1'};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return false when valid mediaTypes.banner are not passed', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.params = {accountId: '1', placementId: '1'};
bid.mediaTypes = {
};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return false when valid mediaTypes.banner.sizes are not passed', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.params = {accountId: '1', placementId: '1'};
bid.mediaTypes = {
sizes: []
};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return false when valid mediaTypes.banner.sizes are not valid', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.params = {accountId: '1', placementId: '1'};
bid.mediaTypes = {
sizes: [300, 250]
};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return true when valid params are passed as strings', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.adUnitCode = 'div';
bid.params = {accountId: '1', placementId: '1'};
bid.mediaTypes = {
banner: {
sizes: [[300, 250]]
}
};
expect(spec.isBidRequestValid(bid)).to.equal(true);
});
it('should return false when valid mediaTypes.native is not object', function () {
let bid = Object.assign({}, bid);
bid.params = {accountId: '1', placementId: '1'};
bid.mediaTypes = {
native: []
};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return false when mediaTypes.native is empty object', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.params = {accountId: '1', placementId: '1'};
bid.mediaTypes = {
native: {}
};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return false when mediaTypes.native is invalid object', function () {
let bid = Object.assign({}, bid);
delete bid.params;
bid.params = {accountId: '1', placementId: '1'};
bid.mediaTypes = {
native: {
image: {
sizes: [80, 80]
},
}
};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return false when mediaTypes.native has unsupported required asset', function () {
let bid = Object.assign({}, bid);
bid.params = {accountId: '2', placementId: '1'};
bid.mediaTypes = {
native: {
title: {required: true},
image: {required: false, sizes: [80, 80]},
sponsored: {required: false},
},
};
bid.nativeParams = {
title: {required: true},
image: {required: false, sizes: [80, 80]},
sponsored: {required: false},
unsupported: {required: true},
};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
it('should return true when mediaTypes.native all assets needed', function () {
let bid = Object.assign({}, bid);
bid.adUnitCode = 'div';
bid.params = {accountId: '2', placementId: '1'};
bid.mediaTypes = {
native: {
title: {required: true},
image: {required: false, sizes: [80, 80]},
sponsored: {required: false},
},
};
bid.nativeParams = {
title: {required: true},
image: {required: false, sizes: [80, 80]},
sponsored: {required: false},
};
expect(spec.isBidRequestValid(bid)).to.equal(true);
});
});
describe('override defaults', function () {
let bid = {
bidder: 'mgid',
params: {
accountId: '1',
placementId: '2',
},
};
it('should return object', function () {
let bid = Object.assign({}, bid);
bid.mediaTypes = {
banner: {
sizes: [[300, 250]]
}
};
let bidRequests = [bid];
const request = spec.buildRequests(bidRequests);
expect(request).to.exist.and.to.be.a('object');
});
it('should return overwrite default bidurl', function () {
let bid = Object.assign({}, bid);
bid.params = {
bidUrl: 'https://newbidurl.com/',
accountId: '1',
placementId: '2',
};
bid.mediaTypes = {
banner: {
sizes: [[300, 250]]
}
};
let bidRequests = [bid];
const request = spec.buildRequests(bidRequests);
expect(request.url).to.include('https://newbidurl.com/1');
});
it('should return overwrite default bidFloor', function () {
let bid = Object.assign({}, bid);
bid.params = {
bidFloor: 1.1,
accountId: '1',
placementId: '2',
};
bid.mediaTypes = {
banner: {
sizes: [[300, 250]]
}
};
let bidRequests = [bid];
const request = spec.buildRequests(bidRequests);
expect(request.data).to.be.a('string');
const data = JSON.parse(request.data);
expect(data).to.be.a('object');
expect(data.imp).to.be.a('array');
expect(data.imp).to.have.lengthOf(1);
expect(data.imp[0].bidfloor).to.deep.equal(1.1);
});
it('should return overwrite default currency', function () {
let bid = Object.assign({}, bid);
bid.params = {
cur: 'GBP',
accountId: '1',
placementId: '2',
};
bid.mediaTypes = {
banner: {
sizes: [[300, 250]]
}
};
let bidRequests = [bid];
const request = spec.buildRequests(bidRequests);
expect(request.data).to.be.a('string');
const data = JSON.parse(request.data);
expect(data).to.be.a('object');
expect(data.cur).to.deep.equal(['GBP']);
});
});
describe('buildRequests', function () {
let abid = {
adUnitCode: 'div',
bidder: 'mgid',
params: {
accountId: '1',
placementId: '2',
},
};
it('should return undefined if no validBidRequests passed', function () {
expect(spec.buildRequests([])).to.be.undefined;
});
it('should return request url with muid', function () {
let getDataFromLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage');
getDataFromLocalStorageStub.withArgs('mgMuidn').returns('xxx');
let bid = Object.assign({}, abid);
bid.mediaTypes = {
banner: {
sizes: [[300, 250]]
}
};
let bidRequests = [bid];
const request = spec.buildRequests(bidRequests);
expect(request.url).deep.equal('https://prebid.mgid.com/prebid/1?muid=xxx');
getDataFromLocalStorageStub.restore();
});
it('should proper handle gdpr', function () {
let bid = Object.assign({}, abid);
bid.mediaTypes = {
banner: {
sizes: [[300, 250]]
}
};
let bidRequests = [bid];
const request = spec.buildRequests(bidRequests, {gdprConsent: {consentString: 'gdpr', gdprApplies: true}});
expect(request.url).deep.equal('https://prebid.mgid.com/prebid/1');
expect(request.method).deep.equal('POST');
const data = JSON.parse(request.data);
expect(data.user).deep.equal({ext: {consent: 'gdpr'}});
expect(data.regs).deep.equal({ext: {gdpr: 1}});
});
it('should return proper banner imp', function () {
let bid = Object.assign({}, abid);
bid.mediaTypes = {
banner: {
sizes: [[300, 250]]
}
};
let bidRequests = [bid];
const page = top.location.href;
const domain = utils.parseUrl(page).hostname;
const request = spec.buildRequests(bidRequests);
expect(request.url).deep.equal('https://prebid.mgid.com/prebid/1');
expect(request.method).deep.equal('POST');
const data = JSON.parse(request.data);
expect(data.site.domain).to.deep.equal(domain);
expect(data.site.page).to.deep.equal(page);
expect(data.cur).to.deep.equal(['USD']);
expect(data.device.ua).to.deep.equal(ua);
expect(data.device.dnt).equal(dnt);
expect(data.device.h).equal(screenHeight);
expect(data.device.w).equal(screenWidth);
expect(data.device.language).to.deep.equal(lang);
expect(data.imp[0].tagid).to.deep.equal('2/div');
expect(data.imp[0].banner).to.deep.equal({w: 300, h: 250});
expect(data.imp[0].secure).to.deep.equal(secure);
expect(request).to.deep.equal({
'method': 'POST',
'url': 'https://prebid.mgid.com/prebid/1',
'data': '{"site":{"domain":"' + domain + '","page":"' + page + '"},"cur":["USD"],"geo":{"utcoffset":' + utcOffset + '},"device":{"ua":"' + ua + '","js":1,"dnt":' + dnt + ',"h":' + screenHeight + ',"w":' + screenWidth + ',"language":"' + lang + '"},"ext":{"mgid_ver":"' + mgid_ver + '","prebid_ver":"' + version + '"},"imp":[{"tagid":"2/div","secure":' + secure + ',"banner":{"w":300,"h":250}}]}',
});
});
it('should not return native imp if minimum asset list not requested', function () {
let bid = Object.assign({}, abid);
bid.mediaTypes = {
native: '',
};
bid.nativeParams = {
title: {required: true},
image: {sizes: [80, 80]},
};
let bidRequests = [bid];
const request = spec.buildRequests(bidRequests);
expect(request).to.be.undefined;
});
it('should return proper native imp', function () {
let bid = Object.assign({}, abid);
bid.mediaTypes = {
native: '',
};
bid.nativeParams = {
title: {required: true},
image: {sizes: [80, 80]},
sponsored: { },
};
let bidRequests = [bid];
const page = top.location.href;
const domain = utils.parseUrl(page).hostname;
const request = spec.buildRequests(bidRequests);
expect(request).to.be.a('object');
expect(request.url).deep.equal('https://prebid.mgid.com/prebid/1');
expect(request.method).deep.equal('POST');
const data = JSON.parse(request.data);
expect(data.site.domain).to.deep.equal(domain);
expect(data.site.page).to.deep.equal(page);
expect(data.cur).to.deep.equal(['USD']);
expect(data.device.ua).to.deep.equal(ua);
expect(data.device.dnt).equal(dnt);
expect(data.device.h).equal(screenHeight);
expect(data.device.w).equal(screenWidth);
expect(data.device.language).to.deep.equal(lang);
expect(data.imp[0].tagid).to.deep.equal('2/div');
expect(data.imp[0].native).is.a('object').and.to.deep.equal({'request': {'assets': [{'id': 1, 'required': 1, 'title': {'len': 80}}, {'id': 2, 'img': {'h': 80, 'type': 3, 'w': 80}, 'required': 0}, {'data': {'type': 1}, 'id': 11, 'required': 0}], 'plcmtcnt': 1}});
expect(data.imp[0].secure).to.deep.equal(secure);
expect(request).to.deep.equal({
'method': 'POST',
'url': 'https://prebid.mgid.com/prebid/1',
'data': '{"site":{"domain":"' + domain + '","page":"' + page + '"},"cur":["USD"],"geo":{"utcoffset":' + utcOffset + '},"device":{"ua":"' + ua + '","js":1,"dnt":' + dnt + ',"h":' + screenHeight + ',"w":' + screenWidth + ',"language":"' + lang + '"},"ext":{"mgid_ver":"' + mgid_ver + '","prebid_ver":"' + version + '"},"imp":[{"tagid":"2/div","secure":' + secure + ',"native":{"request":{"plcmtcnt":1,"assets":[{"id":1,"required":1,"title":{"len":80}},{"id":2,"required":0,"img":{"type":3,"w":80,"h":80}},{"id":11,"required":0,"data":{"type":1}}]}}}]}',
});
});
it('should return proper native imp with image altered', function () {
let bid = Object.assign({}, abid);
bid.mediaTypes = {
native: '',
};
bid.nativeParams = {
title: {required: true},
image: {wmin: 50, hmin: 50, required: true},
icon: {},
sponsored: { },
};
let bidRequests = [bid];
const page = top.location.href;
const domain = utils.parseUrl(page).hostname;
const request = spec.buildRequests(bidRequests);
expect(request).to.be.a('object');
expect(request.url).deep.equal('https://prebid.mgid.com/prebid/1');
expect(request.method).deep.equal('POST');
const data = JSON.parse(request.data);
expect(data.site.domain).to.deep.equal(domain);
expect(data.site.page).to.deep.equal(page);
expect(data.cur).to.deep.equal(['USD']);
expect(data.device.ua).to.deep.equal(ua);
expect(data.device.dnt).equal(dnt);
expect(data.device.h).equal(screenHeight);
expect(data.device.w).equal(screenWidth);
expect(data.device.language).to.deep.equal(lang);
expect(data.imp[0].tagid).to.deep.equal('2/div');
expect(data.imp[0].native).is.a('object').and.to.deep.equal({'request': {'assets': [{'id': 1, 'required': 1, 'title': {'len': 80}}, {'id': 2, 'img': {'h': 328, hmin: 50, 'type': 3, 'w': 492, wmin: 50}, 'required': 1}, {'id': 3, 'img': {'h': 50, 'type': 1, 'w': 50}, 'required': 0}, {'data': {'type': 1}, 'id': 11, 'required': 0}], 'plcmtcnt': 1}});
expect(data.imp[0].secure).to.deep.equal(secure);
expect(request).to.deep.equal({
'method': 'POST',
'url': 'https://prebid.mgid.com/prebid/1',
'data': '{"site":{"domain":"' + domain + '","page":"' + page + '"},"cur":["USD"],"geo":{"utcoffset":' + utcOffset + '},"device":{"ua":"' + ua + '","js":1,"dnt":' + dnt + ',"h":' + screenHeight + ',"w":' + screenWidth + ',"language":"' + lang + '"},"ext":{"mgid_ver":"' + mgid_ver + '","prebid_ver":"' + version + '"},"imp":[{"tagid":"2/div","secure":' + secure + ',"native":{"request":{"plcmtcnt":1,"assets":[{"id":1,"required":1,"title":{"len":80}},{"id":2,"required":1,"img":{"type":3,"w":492,"h":328,"wmin":50,"hmin":50}},{"id":3,"required":0,"img":{"type":1,"w":50,"h":50}},{"id":11,"required":0,"data":{"type":1}}]}}}]}',
});
});
it('should return proper native imp with sponsoredBy', function () {
let bid = Object.assign({}, abid);
bid.mediaTypes = {
native: '',
};
bid.nativeParams = {
title: {required: true},
image: {sizes: [80, 80]},
sponsoredBy: { },
};
let bidRequests = [bid];
const page = top.location.href;
const domain = utils.parseUrl(page).hostname;
const request = spec.buildRequests(bidRequests);
expect(request).to.be.a('object');
expect(request.url).deep.equal('https://prebid.mgid.com/prebid/1');
expect(request.method).deep.equal('POST');
const data = JSON.parse(request.data);
expect(data.site.domain).to.deep.equal(domain);
expect(data.site.page).to.deep.equal(page);
expect(data.cur).to.deep.equal(['USD']);
expect(data.device.ua).to.deep.equal(ua);
expect(data.device.dnt).equal(dnt);
expect(data.device.h).equal(screenHeight);
expect(data.device.w).equal(screenWidth);
expect(data.device.language).to.deep.equal(lang);
expect(data.imp[0].tagid).to.deep.equal('2/div');
expect(data.imp[0].native).is.a('object').and.to.deep.equal({'request': {'assets': [{'id': 1, 'required': 1, 'title': {'len': 80}}, {'id': 2, 'img': {'h': 80, 'type': 3, 'w': 80}, 'required': 0}, {'data': {'type': 1}, 'id': 4, 'required': 0}], 'plcmtcnt': 1}});
expect(data.imp[0].secure).to.deep.equal(secure);
expect(request).to.deep.equal({
'method': 'POST',
'url': 'https://prebid.mgid.com/prebid/1',
'data': '{"site":{"domain":"' + domain + '","page":"' + page + '"},"cur":["USD"],"geo":{"utcoffset":' + utcOffset + '},"device":{"ua":"' + ua + '","js":1,"dnt":' + dnt + ',"h":' + screenHeight + ',"w":' + screenWidth + ',"language":"' + lang + '"},"ext":{"mgid_ver":"' + mgid_ver + '","prebid_ver":"' + version + '"},"imp":[{"tagid":"2/div","secure":' + secure + ',"native":{"request":{"plcmtcnt":1,"assets":[{"id":1,"required":1,"title":{"len":80}},{"id":2,"required":0,"img":{"type":3,"w":80,"h":80}},{"id":4,"required":0,"data":{"type":1}}]}}}]}',
});
});
it('should return proper banner request', function () {
let bid = Object.assign({}, abid);
bid.mediaTypes = {
banner: {
sizes: [[300, 600], [300, 250]],
pos: 1,
},
};
let bidRequests = [bid];
const request = spec.buildRequests(bidRequests);
const page = top.location.href;
const domain = utils.parseUrl(page).hostname;
expect(request.url).deep.equal('https://prebid.mgid.com/prebid/1');
expect(request.method).deep.equal('POST');
const data = JSON.parse(request.data);
expect(data.site.domain).to.deep.equal(domain);
expect(data.site.page).to.deep.equal(page);
expect(data.cur).to.deep.equal(['USD']);
expect(data.device.ua).to.deep.equal(ua);
expect(data.device.dnt).equal(dnt);
expect(data.device.h).equal(screenHeight);
expect(data.device.w).equal(screenWidth);
expect(data.device.language).to.deep.equal(lang);
expect(data.imp[0].tagid).to.deep.equal('2/div');
expect(data.imp[0].banner).to.deep.equal({w: 300, h: 600, format: [{w: 300, h: 600}, {w: 300, h: 250}], pos: 1});
expect(data.imp[0].secure).to.deep.equal(secure);
expect(request).to.deep.equal({
'method': 'POST',
'url': 'https://prebid.mgid.com/prebid/1',
'data': '{"site":{"domain":"' + domain + '","page":"' + page + '"},"cur":["USD"],"geo":{"utcoffset":' + utcOffset + '},"device":{"ua":"' + ua + '","js":1,"dnt":' + dnt + ',"h":' + screenHeight + ',"w":' + screenWidth + ',"language":"' + lang + '"},"ext":{"mgid_ver":"' + mgid_ver + '","prebid_ver":"' + version + '"},"imp":[{"tagid":"2/div","secure":' + secure + ',"banner":{"w":300,"h":600,"format":[{"w":300,"h":600},{"w":300,"h":250}],"pos":1}}]}',
});
});
});
describe('interpretResponse', function () {
it('should not push proper native bid response if adm is missing', function () {
let resp = {
body: {'id': '57c0c2b1b732ca', 'bidid': '57c0c2b1b732ca', 'cur': 'GBP', 'seatbid': [{'bid': [{'price': 1.5, 'h': 600, 'w': 300, 'id': '1', 'impid': '61e40632c53fc2', 'adid': '2898532/2419121/2592854/2499195', 'nurl': 'https nurl', 'burl': 'https burl', 'cid': '44082', 'crid': '2898532/2419121/2592854/2499195', 'cat': ['IAB7', 'IAB14', 'IAB18-3', 'IAB1-2'], 'ext': {'place': 0, 'crtype': 'native'}, 'adomain': ['test.com']}], 'seat': '44082'}]}
};
let bids = spec.interpretResponse(resp);
expect(bids).to.deep.equal([])
});
it('should not push proper native bid response if assets is empty', function () {
let resp = {
body: {'id': '57c0c2b1b732ca', 'bidid': '57c0c2b1b732ca', 'cur': 'GBP', 'seatbid': [{'bid': [{'price': 1.5, 'h': 600, 'w': 300, 'id': '1', 'impid': '61e40632c53fc2', 'adid': '2898532/2419121/2592854/2499195', 'nurl': 'https nurl', 'burl': 'https burl', 'adm': '{"native":{"ver":"1.1","link":{"url":"link_url"},"assets":[],"imptrackers":["imptrackers1"]}}', 'cid': '44082', 'crid': '2898532/2419121/2592854/2499195', 'cat': ['IAB7', 'IAB14', 'IAB18-3', 'IAB1-2'], 'ext': {'place': 0, 'crtype': 'native'}, 'adomain': ['test.com']}], 'seat': '44082'}]}
};
let bids = spec.interpretResponse(resp);
expect(bids).to.deep.equal([])
});
it('should push proper native bid response, assets1', function () {
let resp = {
body: {'id': '57c0c2b1b732ca', 'bidid': '57c0c2b1b732ca', 'cur': 'GBP', 'seatbid': [{'bid': [{'price': 1.5, 'h': 600, 'w': 300, 'id': '1', 'impid': '61e40632c53fc2', 'adid': '2898532/2419121/2592854/2499195', 'nurl': 'https nurl', 'burl': 'https burl', 'adm': '{"native":{"ver":"1.1","link":{"url":"link_url"},"assets":[{"id":1,"required":0,"title":{"text":"title1"}},{"id":2,"required":0,"img":{"w":80,"h":80,"type":3,"url":"image_src"}},{"id":3,"required":0,"img":{"w":50,"h":50,"type":1,"url":"icon_src"}},{"id":4,"required":0,"data":{"type":4,"value":"sponsored"}},{"id":5,"required":0,"data":{"type":6,"value":"price1"}},{"id":6,"required":0,"data":{"type":7,"value":"price2"}}],"imptrackers":["imptrackers1"]}}', 'cid': '44082', 'crid': '2898532/2419121/2592854/2499195', 'cat': ['IAB7', 'IAB14', 'IAB18-3', 'IAB1-2'], 'ext': {'place': 0, 'crtype': 'native'}, 'adomain': ['test.com']}], 'seat': '44082'}], ext: {'muidn': 'userid'}}
};
let bids = spec.interpretResponse(resp);
expect(bids).to.deep.equal([{
'ad': '{"native":{"ver":"1.1","link":{"url":"link_url"},"assets":[{"id":1,"required":0,"title":{"text":"title1"}},{"id":2,"required":0,"img":{"w":80,"h":80,"type":3,"url":"image_src"}},{"id":3,"required":0,"img":{"w":50,"h":50,"type":1,"url":"icon_src"}},{"id":4,"required":0,"data":{"type":4,"value":"sponsored"}},{"id":5,"required":0,"data":{"type":6,"value":"price1"}},{"id":6,"required":0,"data":{"type":7,"value":"price2"}}],"imptrackers":["imptrackers1"]}}',
'burl': 'https burl',
'cpm': 1.5,
'creativeId': '2898532/2419121/2592854/2499195',
'currency': 'GBP',
'dealId': '',
'height': 0,
'isBurl': true,
'mediaType': 'native',
'meta': {'advertiserDomains': ['test.com']},
'native': {
'clickTrackers': [],
'clickUrl': 'link_url',
'data': 'price1',
'icon': {
'height': 50,
'url': 'icon_src',
'width': 50
},
'image': {
'height': 80,
'url': 'image_src',
'width': 80
},
'impressionTrackers': [
'imptrackers1'
],
'jstracker': [],
'sponsoredBy': 'sponsored',
'title': 'title1'
},
'netRevenue': true,
'nurl': 'https nurl',
'requestId': '61e40632c53fc2',
'ttl': 300,
'width': 0
}])
});
it('should push proper native bid response, assets2', function () {
let resp = {
body: {'id': '57c0c2b1b732ca', 'bidid': '57c0c2b1b732ca', 'cur': 'GBP', 'seatbid': [{'bid': [{'price': 1.5, 'h': 600, 'w': 300, 'id': '1', 'impid': '61e40632c53fc2', 'adid': '2898532/2419121/2592854/2499195', 'nurl': 'https nurl', 'burl': 'https burl', 'adm': '{"native":{"ver":"1.1","link":{"url":"link_url"},"assets":[{"id":1,"required":0,"title":{"text":"title1"}},{"id":2,"required":0,"img":{"w":80,"h":80,"type":3,"url":"image_src"}},{"id":3,"required":0,"img":{"w":50,"h":50,"type":1,"url":"icon_src"}}],"imptrackers":["imptrackers1"]}}', 'cid': '44082', 'crid': '2898532/2419121/2592854/2499195', 'cat': ['IAB7', 'IAB14', 'IAB18-3', 'IAB1-2'], 'ext': {'place': 0, 'crtype': 'native'}, 'adomain': ['test.com']}], 'seat': '44082'}]}
};
let bids = spec.interpretResponse(resp);
expect(bids).to.deep.equal([
{
'ad': '{"native":{"ver":"1.1","link":{"url":"link_url"},"assets":[{"id":1,"required":0,"title":{"text":"title1"}},{"id":2,"required":0,"img":{"w":80,"h":80,"type":3,"url":"image_src"}},{"id":3,"required":0,"img":{"w":50,"h":50,"type":1,"url":"icon_src"}}],"imptrackers":["imptrackers1"]}}',
'cpm': 1.5,
'creativeId': '2898532/2419121/2592854/2499195',
'currency': 'GBP',
'dealId': '',
'height': 0,
'isBurl': true,
'mediaType': 'native',
'meta': {'advertiserDomains': ['test.com']},
'netRevenue': true,
'nurl': 'https nurl',
'burl': 'https burl',
'requestId': '61e40632c53fc2',
'ttl': 300,
'width': 0,
'native': {
clickTrackers: [],
title: 'title1',
image: {
url: 'image_src',
width: 80,
height: 80,
},
icon: {
url: 'icon_src',
width: 50,
height: 50,
},
impressionTrackers: ['imptrackers1'],
jstracker: [],
clickUrl: 'link_url',
}
}
]);
});
it('should not push bid response', function () {
let bids = spec.interpretResponse();
expect(bids).to.be.undefined;
});
it('should push proper banner bid response', function () {
let resp = {
body: {'id': '57c0c2b1b732ca', 'bidid': '57c0c2b1b732ca', 'cur': '', 'seatbid': [{'bid': [{'price': 1.5, 'h': 600, 'w': 300, 'id': '1', 'impid': '61e40632c53fc2', 'adid': '2898532/2419121/2592854/2499195', 'nurl': 'https nurl', 'burl': 'https burl', 'adm': 'html: adm', 'cid': '44082', 'crid': '2898532/2419121/2592854/2499195', 'cat': ['IAB7', 'IAB14', 'IAB18-3', 'IAB1-2'], 'adomain': ['test.com']}], 'seat': '44082'}]}
};
let bids = spec.interpretResponse(resp);
expect(bids).to.deep.equal([
{
'ad': 'html: adm',
'cpm': 1.5,
'creativeId': '2898532/2419121/2592854/2499195',
'currency': 'USD',
'dealId': '',
'height': 600,
'isBurl': true,
'mediaType': 'banner',
'meta': {'advertiserDomains': ['test.com']},
'netRevenue': true,
'nurl': 'https nurl',
'burl': 'https burl',
'requestId': '61e40632c53fc2',
'ttl': 300,
'width': 300,
}
]);
});
});
describe('getUserSyncs', function () {
it('should do nothing on getUserSyncs', function () {
spec.getUserSyncs()
});
});
describe('on bidWon', function () {
beforeEach(function() {
sinon.stub(utils, 'triggerPixel');
});
afterEach(function() {
utils.triggerPixel.restore();
});
it('should replace nurl and burl for native', function () {
const burl = 'burl&s=${' + 'AUCTION_PRICE}';
const nurl = 'nurl&s=${' + 'AUCTION_PRICE}';
const bid = {'bidderCode': 'mgid', 'width': 0, 'height': 0, 'statusMessage': 'Bid available', 'adId': '3d0b6ff1dda89', 'requestId': '2a423489e058a1', 'mediaType': 'native', 'source': 'client', 'ad': '{"native":{"ver":"1.1","link":{"url":"LinkURL"},"assets":[{"id":1,"required":0,"title":{"text":"TITLE"}},{"id":2,"required":0,"img":{"w":80,"h":80,"type":3,"url":"ImageURL"}},{"id":3,"required":0,"img":{"w":50,"h":50,"type":1,"url":"IconURL"}},{"id":11,"required":0,"data":{"type":1,"value":"sponsored"}}],"imptrackers":["ImpTrackerURL"]}}', 'cpm': 0.66, 'creativeId': '353538_591471', 'currency': 'USD', 'dealId': '', 'netRevenue': true, 'ttl': 300, 'nurl': nurl, 'burl': burl, 'isBurl': true, 'native': {'title': 'TITLE', 'image': {'url': 'ImageURL', 'height': 80, 'width': 80}, 'icon': {'url': 'IconURL', 'height': 50, 'width': 50}, 'sponsored': 'sponsored', 'clickUrl': 'LinkURL', 'clickTrackers': [], 'impressionTrackers': ['ImpTrackerURL'], 'jstracker': []}, 'auctionId': 'a92bffce-14d2-4f8f-a78a-7b9b5e4d28fa', 'responseTimestamp': 1556867386065, 'requestTimestamp': 1556867385916, 'bidder': 'mgid', 'adUnitCode': 'div-gpt-ad-1555415275793-0', 'timeToRespond': 149, 'pbLg': '0.50', 'pbMg': '0.60', 'pbHg': '0.66', 'pbAg': '0.65', 'pbDg': '0.66', 'pbCg': '', 'size': '0x0', 'adserverTargeting': {'hb_bidder': 'mgid', 'hb_adid': '3d0b6ff1dda89', 'hb_pb': '0.66', 'hb_size': '0x0', 'hb_source': 'client', 'hb_format': 'native', 'hb_native_title': 'TITLE', 'hb_native_image': 'hb_native_image:3d0b6ff1dda89', 'hb_native_icon': 'IconURL', 'hb_native_linkurl': 'hb_native_linkurl:3d0b6ff1dda89'}, 'status': 'targetingSet', 'params': [{'accountId': '184', 'placementId': '353538'}]};
spec.onBidWon(bid);
expect(bid.nurl).to.deep.equal('nurl&s=0.66');
expect(bid.burl).to.deep.equal('burl&s=0.66');
});
it('should replace nurl and burl for banner', function () {
const burl = 'burl&s=${' + 'AUCTION_PRICE}';
const nurl = 'nurl&s=${' + 'AUCTION_PRICE}';
const bid = {'bidderCode': 'mgid', 'width': 0, 'height': 0, 'statusMessage': 'Bid available', 'adId': '3d0b6ff1dda89', 'requestId': '2a423489e058a1', 'mediaType': 'banner', 'source': 'client', 'ad': burl, 'cpm': 0.66, 'creativeId': '353538_591471', 'currency': 'USD', 'dealId': '', 'netRevenue': true, 'ttl': 300, 'nurl': nurl, 'burl': burl, 'isBurl': true, 'auctionId': 'a92bffce-14d2-4f8f-a78a-7b9b5e4d28fa', 'responseTimestamp': 1556867386065, 'requestTimestamp': 1556867385916, 'bidder': 'mgid', 'adUnitCode': 'div-gpt-ad-1555415275793-0', 'timeToRespond': 149, 'pbLg': '0.50', 'pbMg': '0.60', 'pbHg': '0.66', 'pbAg': '0.65', 'pbDg': '0.66', 'pbCg': '', 'size': '0x0', 'adserverTargeting': {'hb_bidder': 'mgid', 'hb_adid': '3d0b6ff1dda89', 'hb_pb': '0.66', 'hb_size': '0x0', 'hb_source': 'client', 'hb_format': 'banner', 'hb_banner_title': 'TITLE', 'hb_banner_image': 'hb_banner_image:3d0b6ff1dda89', 'hb_banner_icon': 'IconURL', 'hb_banner_linkurl': 'hb_banner_linkurl:3d0b6ff1dda89'}, 'status': 'targetingSet', 'params': [{'accountId': '184', 'placementId': '353538'}]};
spec.onBidWon(bid);
expect(bid.nurl).to.deep.equal('nurl&s=0.66');
expect(bid.burl).to.deep.equal(burl);
expect(bid.ad).to.deep.equal('burl&s=0.66');
});
});
describe('price floor module', function() {
let bidRequest;
let bidRequests0 = {
adUnitCode: 'div',
bidder: 'mgid',
params: {
accountId: '1',
placementId: '2',
},
mediaTypes: {
banner: {
sizes: [[300, 250]]
}
},
sizes: [[300, 250]],
}
beforeEach(function() {
bidRequest = [utils.deepClone(bidRequests0)];
});
it('obtain floor from getFloor', function() {
bidRequest[0].getFloor = () => {
return {
currency: 'USD',
floor: 1.23
};
};
const payload = JSON.parse(spec.buildRequests(bidRequest).data);
expect(payload.imp[0]).to.have.property('bidfloor', 1.23);
expect(payload.imp[0]).to.not.have.property('bidfloorcur');
});
it('obtain floor from params', function() {
bidRequest[0].getFloor = () => {
return {
currency: 'USD',
floor: 1.23
};
};
bidRequest[0].params.bidfloor = 0.1;
const payload = JSON.parse(spec.buildRequests(bidRequest).data);
expect(payload.imp[0]).to.have.property('bidfloor', 0.1);
expect(payload.imp[0]).to.not.have.property('bidfloorcur');
});
it('undefined currency -> USD', function() {
bidRequest[0].params.currency = 'EUR'
bidRequest[0].getFloor = () => {
return {
floor: 1.23
};
};
const payload = JSON.parse(spec.buildRequests(bidRequest).data);
expect(payload.imp[0]).to.have.property('bidfloor', 1.23);
expect(payload.imp[0]).to.have.property('bidfloorcur', 'USD');
});
it('altered currency', function() {
bidRequest[0].getFloor = () => {
return {
currency: 'EUR',
floor: 1.23
};
};
const payload = JSON.parse(spec.buildRequests(bidRequest).data);
expect(payload.imp[0]).to.have.property('bidfloor', 1.23);
expect(payload.imp[0]).to.have.property('bidfloorcur', 'EUR');
});
it('altered currency, same as in request', function() {
bidRequest[0].params.cur = 'EUR'
bidRequest[0].getFloor = () => {
return {
currency: 'EUR',
floor: 1.23
};
};
const payload = JSON.parse(spec.buildRequests(bidRequest).data);
expect(payload.imp[0]).to.have.property('bidfloor', 1.23);
expect(payload.imp[0]).to.not.have.property('bidfloorcur');
});
it('bad floor value', function() {
bidRequest[0].getFloor = () => {
return {
currency: 'USD',
floor: 'test'
};
};
const payload = JSON.parse(spec.buildRequests(bidRequest).data);
expect(payload.imp[0]).to.not.have.property('bidfloor');
expect(payload.imp[0]).to.not.have.property('bidfloorcur');
});
it('empty floor object', function() {
bidRequest[0].getFloor = () => {
return {};
};
const payload = JSON.parse(spec.buildRequests(bidRequest).data);
expect(payload.imp[0]).to.not.have.property('bidfloor');
expect(payload.imp[0]).to.not.have.property('bidfloorcur');
});
it('undefined floor result', function() {
bidRequest[0].getFloor = () => {};
const payload = JSON.parse(spec.buildRequests(bidRequest).data);
expect(payload.imp[0]).to.not.have.property('bidfloor');
expect(payload.imp[0]).to.not.have.property('bidfloorcur');
});
});
});