mk9-prebid
Version:
Header Bidding Management Library
530 lines (483 loc) • 15.6 kB
JavaScript
import { expect } from 'chai';
import { spec } from '../../../modules/datablocksBidAdapter.js';
import { BotClientTests } from '../../../modules/datablocksBidAdapter.js';
import { getStorageManager } from '../../../src/storageManager.js';
export let storage = getStorageManager();
const bid = {
bidId: '2dd581a2b6281d',
bidder: 'datablocks',
bidderRequestId: '145e1d6a7837c9',
params: {
source_id: 7560,
host: 'v5demo.datablocks.net'
},
adUnitCode: '/19968336/header-bid-tag-0',
auctionId: '74f78609-a92d-4cf1-869f-1b244bbfb5d2',
mediaTypes: {
banner: {
sizes: [
[300, 250]
]
}
},
sizes: [
[300, 250]
],
transactionId: '1ccbee15-f6f6-46ce-8998-58fe5542e8e1'
};
const bid2 = {
bidId: '2dd581a2b624324g',
bidder: 'datablocks',
bidderRequestId: '145e1d6a7837543',
params: {
source_id: 7560,
host: 'v5demo.datablocks.net'
},
adUnitCode: '/19968336/header-bid-tag-0',
auctionId: '74f78609-a92d-4cf1-869f-1b244bbfb5d2',
mediaTypes: {
banner: {
sizes:
[728, 90]
}
},
transactionId: '1ccbee15-f6f6-46ce-8998-58fe55425432'
};
const nativeBid = {
adUnitCode: '/19968336/header-bid-tag-0',
auctionId: '160c78a4-f808-410f-b682-d8728f3a79ee',
bidId: '332045ee374a99',
bidder: 'datablocks',
bidderRequestId: '15d9012765e36c',
mediaTypes: {
native: {
title: {
required: true
},
body: {
required: true
},
image: {
required: true
}
}
},
nativeParams: {
title: {
required: true
},
body: {
required: true,
data: {
len: 250
}
},
image: {
required: true,
sizes: [728, 90]
}
},
params: {
source_id: 7560,
host: 'v5demo.datablocks.net'
},
transactionId: '0a4e9788-4def-4b94-bc25-564d7cac99f6'
}
const bidderRequest = {
auctionId: '8bfef1be-d3ac-4d18-8859-754c7b4cf017',
auctionStart: Date.now(),
biddeCode: 'datablocks',
bidderRequestId: '10c47a5fc3c41',
bids: [bid, bid2, nativeBid],
refererInfo: {
numIframes: 0,
reachedTop: true,
referer: 'https://v5demo.datablocks.net/test',
stack: ['https://v5demo.datablocks.net/test']
},
start: Date.now(),
timeout: 10000
};
const res_object = {
body: {
'id': '10c47a5fc3c41',
'bidid': '217868445-30021-19053-0',
'seatbid': [
{
'id': '22621593137287',
'impid': '1',
'adm': 'John is great',
'adomain': ['medianet.com'],
'price': 0.430000,
'cid': '2524568',
'adid': '0',
'crid': '0',
'cat': [],
'w': 300,
'h': 250,
'ext': {
'type': 'CPM',
'mtype': 'banner'
}
},
{
'id': '22645215457415',
'impid': '2',
'adm': 'john is the best',
'adomain': ['td.com'],
'price': 0.580000,
'cid': '2524574',
'adid': '0',
'crid': '0',
'cat': [],
'w': 728,
'h': 90,
'ext': {
'type': 'CPM',
'mtype': 'banner'
}
},
{
'id': '22645215457416',
'impid': '3',
'adm': '{"native":{"ver":"1.2","assets":[{"id":1,"required":1,"title":{"text":"John is amazing"}},{"id":5,"required":1,"data":{"value":"Sponsored by John"}},{"id":3,"required":1,"img":{"url":"https://example.image.com/", "h":"360", "w":"360"}}],"link":{"url":"https://click.example.com/c/264597/?fcid=29699699045816"},"imptrackers":["https://impression.example.com/i/264597/?fcid=29699699045816"]}}',
'adomain': ['td.com'],
'price': 10.00,
'cid': '2524574',
'adid': '0',
'crid': '0',
'cat': [],
'ext': {
'type': 'CPM',
'mtype': 'native'
}
}
],
'cur': 'USD',
'ext': {
'version': '1.2.93',
'buyerid': '1234567',
'syncs': [
{
'type': 'iframe',
'url': 'https://s.0cf.io'
},
{
'type': 'image',
'url': 'https://us.dblks.net/set_uid/'
}
]
}
}
}
let bid_request = {
method: 'POST',
url: 'https://prebid.datablocks.net/openrtb/?sid=2523014',
options: {
withCredentials: true
},
data: {
'id': 'c09c6e47-8bdb-4884-a46d-93165322b368',
'imp': [{
'id': '1',
'tagid': '/19968336/header-bid-tag-0',
'placement_id': 0,
'secure': true,
'banner': {
'w': 300,
'h': 250,
'format': [{
'w': 300,
'h': 250
}, {
'w': 300,
'h': 600
}]
}
}, {
'id': '2',
'tagid': '/19968336/header-bid-tag-1',
'placement_id': 12345,
'secure': true,
'banner': {
'w': 729,
'h': 90,
'format': [{
'w': 729,
'h': 90
}, {
'w': 970,
'h': 250
}]
}
}, {
'id': '3',
'tagid': '/19968336/prebid_multiformat_test',
'placement_id': 0,
'secure': true,
'native': {
'ver': '1.2',
'request': {
'assets': [{
'required': 1,
'id': 1,
'title': {}
}, {
'required': 1,
'id': 3,
'img': {
'type': 3
}
}, {
'required': 1,
'id': 5,
'data': {
'type': 1
}
}],
'context': 1,
'plcmttype': 1,
'ver': '1.2'
}
}
}],
'site': {
'domain': 'test.datablocks.net',
'page': 'https://test.datablocks.net/index.html',
'schain': {},
'ext': {
'p_domain': 'https://test.datablocks.net',
'rt': true,
'frames': 0,
'stack': ['https://test.datablocks.net/index.html'],
'timeout': 3000
},
'keywords': 'HTML, CSS, JavaScript'
},
'device': {
'ip': 'peer',
'ua': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36',
'js': 1,
'language': 'en',
'buyerid': '1234567',
'ext': {
'pb_eids': [{
'source': 'criteo.com',
'uids': [{
'id': 'test',
'atype': 1
}]
}],
'syncs': {
'1000': 'db_4044853',
'1001': true
},
'coppa': 0,
'gdpr': {},
'usp': {},
'client_info': {
'wiw': 2560,
'wih': 1281,
'saw': 2560,
'sah': 1417,
'scd': 24,
'sw': 2560,
'sh': 1440,
'whl': 4,
'wxo': 0,
'wyo': 0,
'wpr': 2,
'is_bot': false,
'is_hid': false,
'vs': 'hidden'
},
'fpd': {}
}
}
}
}
describe('DatablocksAdapter', function() {
describe('All needed functions are available', function() {
it(`isBidRequestValid is present and type function`, function () {
expect(spec.isBidRequestValid).to.exist.and.to.be.a('function')
});
it(`buildRequests is present and type function`, function () {
expect(spec.buildRequests).to.exist.and.to.be.a('function')
});
it(`getUserSyncs is present and type function`, function () {
expect(spec.getUserSyncs).to.exist.and.to.be.a('function')
});
it(`onBidWon is present and type function`, function () {
expect(spec.onBidWon).to.exist.and.to.be.a('function')
});
it(`onSetTargeting is present and type function`, function () {
expect(spec.onSetTargeting).to.exist.and.to.be.a('function')
});
it(`interpretResponse is present and type function`, function () {
expect(spec.interpretResponse).to.exist.and.to.be.a('function')
});
it(`store_dbid is present and type function`, function () {
expect(spec.store_dbid).to.exist.and.to.be.a('function')
});
it(`get_dbid is present and type function`, function () {
expect(spec.get_dbid).to.exist.and.to.be.a('function')
});
it(`store_syncs is present and type function`, function () {
expect(spec.store_syncs).to.exist.and.to.be.a('function')
});
it(`get_syncs is present and type function`, function () {
expect(spec.get_syncs).to.exist.and.to.be.a('function')
});
it(`queue_metric is present and type function`, function () {
expect(spec.queue_metric).to.exist.and.to.be.a('function')
});
it(`send_metrics is present and type function`, function () {
expect(spec.send_metrics).to.exist.and.to.be.a('function')
});
it(`get_client_info is present and type function`, function () {
expect(spec.get_client_info).to.exist.and.to.be.a('function')
});
it(`get_viewability is present and type function`, function () {
expect(spec.get_viewability).to.exist.and.to.be.a('function')
});
});
describe('get / store dbid', function() {
it('Should return true / undefined', function() {
expect(spec.store_dbid('12345')).to.be.true;
expect(spec.get_dbid()).to.be.a('string');
});
})
describe('get / store syncs', function() {
it('Should return true / array', function() {
expect(spec.store_syncs([{id: 1, uid: 'test'}])).to.be.true;
expect(spec.get_syncs()).to.be.a('object');
});
})
describe('queue / send metrics', function() {
it('Should return true', function() {
expect(spec.queue_metric({type: 'test'})).to.be.true;
expect(spec.queue_metric('string')).to.be.false;
expect(spec.send_metrics()).to.be.true;
});
})
describe('get_viewability', function() {
it('Should return undefined', function() {
expect(spec.get_viewability()).to.equal(undefined);
});
})
describe('get client info', function() {
it('Should return object', function() {
let client_info = spec.get_client_info()
expect(client_info).to.be.a('object');
expect(client_info).to.have.all.keys('wiw', 'wih', 'saw', 'sah', 'scd', 'sw', 'sh', 'whl', 'wxo', 'wyo', 'wpr', 'is_bot', 'is_hid', 'vs');
});
it('bot test should return boolean', function() {
let bot_test = new BotClientTests();
expect(bot_test.doTests()).to.be.a('boolean');
});
})
describe('isBidRequestValid', function() {
it('Should return true when source_id and Host are set', function() {
expect(spec.isBidRequestValid(bid)).to.be.true;
});
it('Should return false when host/source_id is not set', function() {
let moddedBid = Object.assign({}, bid);
delete moddedBid.params.source_id;
expect(spec.isBidRequestValid(moddedBid)).to.be.false;
});
it('Should return true when viewability reporting is opted out', function() {
let moddedBid = Object.assign({}, bid);
moddedBid.params.vis_optout = true;
spec.isBidRequestValid(moddedBid);
expect(spec.db_obj.vis_optout).to.be.true;
});
})
describe('getUserSyncs', function() {
it('Should return array of syncs', function() {
expect(spec.getUserSyncs({iframeEnabled: true, pixelEnabled: true}, [res_object], {gdprApplies: true, gdpr: 1, gdpr_consent: 'consent_string'}, {})).to.be.an('array');
});
});
describe('onSetTargeting', function() {
it('Should return undefined', function() {
expect(spec.onSetTargeting()).to.equal(undefined);
});
});
describe('onBidWon', function() {
it('Should return undefined', function() {
let won_bid = {params: [{source_id: 1}], requestId: 1, adUnitCode: 'unit', auctionId: 1, size: '300x250', cpm: 10, adserverTargeting: {hb_pb: 10}, timeToRespond: 10, ttl: 10};
expect(spec.onBidWon(won_bid)).to.equal(undefined);
});
});
describe('buildRequests', function() {
let request = spec.buildRequests([bid, bid2, nativeBid], bidderRequest);
expect(request).to.exist;
it('Returns POST method', function() {
expect(request.method).to.exist;
expect(request.method).to.equal('POST');
});
it('Returns valid URL', function() {
expect(request.url).to.exist;
expect(request.url).to.equal('https://7560.v5demo.datablocks.net/openrtb/?sid=7560');
});
it('Creates an array of request objects', function() {
expect(request.data.imp).to.be.an('array').that.is.not.empty;
});
it('Should be a valid openRTB request', function() {
let data = request.data;
expect(data).to.be.an('object');
expect(data).to.have.all.keys('device', 'imp', 'site', 'id');
expect(data.id).to.be.a('string');
expect(data.imp).to.be.a('array');
expect(data.device.ip).to.equal('peer');
let imps = data['imp'];
imps.forEach((imp, index) => {
let curBid = bidderRequest.bids[index];
if (imp.banner) {
expect(imp.banner).to.be.a('object');
expect(imp).to.have.all.keys('banner', 'id', 'secure', 'tagid', 'placement_id', 'ortb2', 'floor');
} else if (imp.native) {
expect(imp).to.have.all.keys('native', 'id', 'secure', 'tagid', 'placement_id', 'ortb2', 'floor');
expect(imp.native).to.have.all.keys('request', 'ver');
expect(imp.native.request).to.be.a('object');
} else {
expect(true).to.equal(false);
}
expect(imp.id).to.be.a('string');
expect(imp.id).to.equal(curBid.bidId);
expect(imp.tagid).to.be.a('string');
expect(imp.tagid).to.equal(curBid.adUnitCode);
expect(imp.secure).to.equal(false);
})
});
it('Returns empty data if no valid requests are passed', function() {
let test_request = spec.buildRequests([]);
expect(test_request).to.be.an('array').that.is.empty;
});
});
describe('interpretResponse', function() {
let response = spec.interpretResponse(res_object, bid_request);
it('Returns an array of valid server responses if response object is valid', function() {
expect(response).to.be.an('array').that.is.not.empty;
response.forEach(bid => {
expect(parseInt(bid.requestId)).to.be.a('number').greaterThan(0);
expect(bid.cpm).to.be.a('number');
expect(bid.creativeId).to.be.a('string');
expect(bid.currency).to.be.a('string');
expect(bid.netRevenue).to.be.a('boolean');
expect(bid.ttl).to.be.a('number');
expect(bid.mediaType).to.be.a('string');
if (bid.mediaType == 'banner') {
expect(bid.width).to.be.a('number');
expect(bid.height).to.be.a('number');
expect(bid.ad).to.be.a('string');
} else if (bid.mediaType == 'native') {
expect(bid.native).to.be.a('object');
}
})
it('Returns an empty array if invalid response is passed', function() {
serverResponses = spec.interpretResponse('invalid_response');
expect(serverResponses).to.be.an('array').that.is.empty;
});
});
});
});