mk9-prebid
Version:
Header Bidding Management Library
643 lines (525 loc) • 18 kB
JavaScript
import {
expect
} from 'chai';
import {
spec,
internals
} from 'modules/theAdxBidAdapter.js';
import {
newBidder
} from 'src/adapters/bidderFactory.js';
describe('TheAdxAdapter', function () {
const adapter = newBidder(spec);
describe('getUserSyncs', () => {
const USER_SYNC_IFRAME_URL = 'https://ssp.theadx.com/async_usersync_iframe.html'
const USER_SYNC_IMAGE_URL = 'https://ssp.theadx.com/async_usersync_image.gif'
expect(spec.getUserSyncs({
iframeEnabled: true,
pixelEnabled: true,
}, [{
body: {
ext: {
sync: {
iframe: [USER_SYNC_IFRAME_URL],
image: [USER_SYNC_IMAGE_URL],
}
}
}
}])).to.deep.equal([{
type: 'iframe',
url: USER_SYNC_IFRAME_URL
},
{
type: 'image',
url: USER_SYNC_IMAGE_URL
},
]);
});
describe('bid validator', function () {
it('rejects a bid that is missing the placementId', function () {
let testBid = {};
expect(spec.isBidRequestValid(testBid)).to.be.false;
});
it('accepts a bid with all the expected parameters', function () {
let testBid = {
params: {
pid: '1',
tagId: '1',
}
};
expect(spec.isBidRequestValid(testBid)).to.be.true;
});
});
describe('request builder', function () {
// Taken from the docs, so used as much as is valid
const sampleBidRequest = {
'bidder': 'tests',
'bidId': '51ef8751f9aead',
'params': {
'pid': '1',
'tagId': '1',
},
'adUnitCode': 'div-gpt-ad-sample',
'transactionId': 'd7b773de-ceaa-484d-89ca-d9f51b8d61ec',
'sizes': [
[300, 250]
],
'bidderRequestId': '418b37f85e772c',
'auctionId': '18fd8b8b0bd757',
'mediaTypes': {
banner: {
'sizes': [
[320, 50],
[300, 250],
[300, 600]
]
}
}
};
const sampleBidderRequest = {
bidderRequestId: 'sample',
refererInfo: {
canonicalUrl: 'https://domain.com/to',
referer: 'https://domain.com/from'
}
}
it('successfully generates a URL', function () {
const placementId = '1';
const bidRequests = [sampleBidRequest];
let results = spec.buildRequests(bidRequests, sampleBidderRequest);
let result = results.pop();
expect(result.url).to.not.be.undefined;
expect(result.url).to.not.be.null;
expect(result.url).to.include('tagid=' + placementId);
});
it('uses the bidId id as the openRtb request ID', function () {
const bidId = '51ef8751f9aead';
let bidRequests = [
sampleBidRequest
];
let results = spec.buildRequests(bidRequests, sampleBidderRequest);
let result = results.pop();
// Double encoded JSON
let payload = JSON.parse(result.data);
expect(payload).to.not.be.null;
expect(payload.id).to.equal(bidId);
});
it('generates the device payload as expected', function () {
let bidRequests = [
sampleBidRequest
];
let results = spec.buildRequests(bidRequests, sampleBidderRequest);
let result = results.pop();
// Double encoded JSON
let payload = JSON.parse(result.data);
expect(payload).to.not.be.null;
let userData = payload.user;
expect(userData).to.not.be.null;
});
it('generates multiple requests with single imp bodies', function () {
const SECOND_PLACEMENT_ID = '2';
let firstBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
let secondBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
secondBidRequest.params.tagId = SECOND_PLACEMENT_ID;
let bidRequests = [
firstBidRequest,
secondBidRequest
];
let results = spec.buildRequests(bidRequests, sampleBidderRequest);
expect(results instanceof Array).to.be.true;
expect(results.length).to.equal(2);
let firstRequest = results[0];
// Double encoded JSON
let firstPayload = JSON.parse(firstRequest.data);
expect(firstPayload).to.not.be.null;
expect(firstPayload.imp).to.not.be.null;
expect(firstPayload.imp.length).to.equal(1);
expect(firstRequest.url).to.not.be.null;
expect(firstRequest.url.indexOf('tagid=1')).to.be.gt(0);
let secondRequest = results[1];
// Double encoded JSON
let secondPayload = JSON.parse(secondRequest.data);
expect(secondPayload).to.not.be.null;
expect(secondPayload.imp).to.not.be.null;
expect(secondPayload.imp.length).to.equal(1);
expect(secondRequest.url).to.not.be.null;
expect(secondRequest.url.indexOf(`tagid=${SECOND_PLACEMENT_ID}`)).to.be.gte(0);
});
it('generates a banner request as expected', function () {
// clone the sample for stability
let localBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
let results = spec.buildRequests([localBidRequest], sampleBidderRequest);
let result = results.pop();
// Double encoded JSON
let payload = JSON.parse(result.data);
expect(payload).to.not.be.null;
let imps = payload.imp;
let firstImp = imps[0];
expect(firstImp.banner).to.not.be.null;
let bannerData = firstImp.banner;
expect(bannerData.w).to.equal(320);
expect(bannerData.h).to.equal(50);
});
it('generates a banner request using a singular adSize instead of an array', function () {
// clone the sample for stability
let localBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
localBidRequest.sizes = [320, 50];
localBidRequest.mediaTypes = {
banner: {}
};
let results = spec.buildRequests([localBidRequest], sampleBidderRequest);
let result = results.pop();
// Double encoded JSON
let payload = JSON.parse(result.data);
expect(payload).to.not.be.null;
let imps = payload.imp;
let firstImp = imps[0];
expect(firstImp.banner).to.not.be.null;
let bannerData = firstImp.banner;
expect(bannerData.w).to.equal(320);
expect(bannerData.h).to.equal(50);
});
it('fails gracefully on an invalid size', function () {
// clone the sample for stability
let localBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
localBidRequest.sizes = ['x', 'w'];
localBidRequest.mediaTypes = {
banner: {
sizes: ['y', 'z']
}
};
let results = spec.buildRequests([localBidRequest], sampleBidderRequest);
let result = results.pop();
// Double encoded JSON
let payload = JSON.parse(result.data);
expect(payload).to.not.be.null;
let imps = payload.imp;
let firstImp = imps[0];
expect(firstImp.banner).to.not.be.null;
let bannerData = firstImp.banner;
expect(bannerData.w).to.equal(null);
expect(bannerData.h).to.equal(null);
});
it('generates a video request as expected', function () {
// clone the sample for stability
let localBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
localBidRequest.mediaTypes = {
video: {
sizes: [
[326, 256]
]
}
};
let results = spec.buildRequests([localBidRequest], sampleBidderRequest);
let result = results.pop();
// Double encoded JSON
let payload = JSON.parse(result.data);
expect(payload).to.not.be.null;
let imps = payload.imp;
let firstImp = imps[0];
expect(firstImp.video).to.not.be.null;
let videoData = firstImp.video;
expect(videoData.w).to.equal(326);
expect(videoData.h).to.equal(256);
});
it('generates a native request as expected', function () {
// clone the sample for stability
let localBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
localBidRequest.mediaTypes = {
native: {
image: {
required: false,
sizes: [100, 50]
},
title: {
required: false,
len: 140
},
sponsoredBy: {
required: false
},
clickUrl: {
required: false
},
body: {
required: false
},
icon: {
required: false,
sizes: [50, 50]
},
}
};
let results = spec.buildRequests([localBidRequest], sampleBidderRequest);
let result = results.pop();
// Double encoded JSON
let payload = JSON.parse(result.data);
expect(payload).to.not.be.null;
let imps = payload.imp;
let firstImp = imps[0];
expect(firstImp.native).to.not.be.null;
});
it('propagates the mediaTypes object in the built request', function () {
let localBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
localBidRequest.mediaTypes = {
video: {}
};
let results = spec.buildRequests([localBidRequest], sampleBidderRequest);
let result = results.pop();
let mediaTypes = result.mediaTypes;
expect(mediaTypes).to.not.be.null;
expect(mediaTypes).to.not.be.undefined;
expect(mediaTypes.video).to.not.be.null;
expect(mediaTypes.video).to.not.be.undefined;
});
});
describe('response interpreter', function () {
it('returns an empty array when no bids present', function () {
// an empty JSON body indicates no ad was found
let result = spec.interpretResponse({
body: ''
}, {})
expect(result).to.eql([]);
});
it('gracefully fails when a non-JSON body is present', function () {
let result = spec.interpretResponse({
body: 'THIS IS NOT <JSON/>'
}, {})
expect(result).to.eql([]);
});
it('returns a valid bid response on sucessful banner request', function () {
let incomingRequestId = 'XXtestingXX';
let responsePrice = 3.14
let responseCreative = 'sample_creative&{FOR_COVARAGE}';
let responseCreativeId = '274';
let responseCurrency = 'TRY';
let responseWidth = 300;
let responseHeight = 250;
let responseTtl = 213;
let sampleResponse = {
id: '66043f5ca44ecd8f8769093b1615b2d9',
seatbid: [{
bid: [{
id: 'c21bab0e-7668-4d8f-908a-63e094c09197',
impid: '1',
price: responsePrice,
adid: responseCreativeId,
crid: responseCreativeId,
adm: responseCreative,
adomain: [
'www.domain.com'
],
cid: '274',
attr: [],
w: responseWidth,
h: responseHeight,
ext: {
ttl: responseTtl
}
}],
seat: '201',
group: 0
}],
bidid: 'c21bab0e-7668-4d8f-908a-63e094c09197',
cur: responseCurrency
};
let sampleRequest = {
bidId: incomingRequestId,
mediaTypes: {
banner: {}
},
requestId: incomingRequestId
};
let serverResponse = {
body: sampleResponse
}
let result = spec.interpretResponse(serverResponse, sampleRequest);
expect(result.length).to.equal(1);
let processedBid = result[0];
// expect(processedBid.requestId).to.equal(incomingRequestId);
expect(processedBid.cpm).to.equal(responsePrice);
expect(processedBid.width).to.equal(responseWidth);
expect(processedBid.height).to.equal(responseHeight);
expect(processedBid.ad).to.equal(responseCreative);
expect(processedBid.ttl).to.equal(responseTtl);
expect(processedBid.creativeId).to.equal(responseCreativeId);
expect(processedBid.netRevenue).to.equal(true);
expect(processedBid.currency).to.equal(responseCurrency);
});
it('returns an valid bid response on sucessful video request', function () {
let incomingRequestId = 'XXtesting-275XX';
let responsePrice = 6
let vast_url = 'https://theadx.com/vast?rid=a8ae0b48-a8db-4220-ba0c-7458f452b1f5&{FOR_COVARAGE}'
let responseCreativeId = '1556';
let responseCurrency = 'TRY';
let responseWidth = 284;
let responseHeight = 285;
let responseTtl = 286;
let sampleResponse = {
id: '1234567890',
seatbid: [{
bid: [{
id: 'a8ae0b48-a8db-4220-ba0c-7458f452b1f5',
impid: '1',
price: responsePrice,
adid: responseCreativeId,
crid: responseCreativeId,
cid: '270',
attr: [],
w: responseWidth,
h: responseHeight,
ext: {
vast_url: vast_url,
ttl: responseTtl
}
}],
seat: '201',
group: 0
}],
bidid: 'a8ae0b48-a8db-4220-ba0c-7458f452b1f5',
cur: 'TRY'
};
let sampleRequest = {
bidId: incomingRequestId,
mediaTypes: {
video: {}
},
requestId: incomingRequestId
};
let result = spec.interpretResponse({
body: sampleResponse
},
sampleRequest
);
expect(result.length).to.equal(1);
let processedBid = result[0];
// expect(processedBid.requestId).to.equal(incomingRequestId);
expect(processedBid.cpm).to.equal(responsePrice);
expect(processedBid.width).to.equal(responseWidth);
expect(processedBid.height).to.equal(responseHeight);
expect(processedBid.ad).to.equal(null);
expect(processedBid.ttl).to.equal(responseTtl);
expect(processedBid.creativeId).to.equal(responseCreativeId);
expect(processedBid.netRevenue).to.equal(true);
expect(processedBid.currency).to.equal(responseCurrency);
expect(processedBid.vastUrl).to.equal(vast_url);
});
it('returns an valid bid response on sucessful native request', function () {
let incomingRequestId = 'XXtesting-275XX';
let responsePrice = 6
let nurl = 'https://app.theadx.com/ixc?rid=02aefd80-2df9-11e9-896d-d33384d77f5c&time=v-1549888312715&sp=1WzMjcRpeyk%3D';
let linkUrl = 'https%3A%2F%2Fapp.theadx.com%2Fgclick%3Frid%3D02aefd80-2df9-11e9-896d-d33384d77f5c%26url%3Dhttps%253A%252F%252Fwww.theadx.com%252Ftr%252Fhedeflemeler'
let responseCreativeId = '1556';
let responseCurrency = 'TRY';
let responseTtl = 286;
let sampleResponse = {
id: '1234567890',
seatbid: [{
bid: [{
id: 'a8ae0b48-a8db-4220-ba0c-7458f452b1f5',
impid: '1',
nurl: nurl,
price: responsePrice,
adid: responseCreativeId,
crid: responseCreativeId,
cid: '270',
attr: [],
ext: {
ttl: responseTtl,
native: {
ver: 1,
link: {
url: linkUrl
},
assets: [{
id: 3,
img: {
url: 'https://ads.theadx.com/winwords/120/17508/154712307258.73.jpg',
h: 627,
w: 1200
}
}, {
id: 0,
title: {
ext: 'SELF-MANAGED DSP'
}
}, {
id: 5,
data: {
value: 'Sponsored by Theadx'
}
}, {
id: 4,
data: {
value: 'Gerçek Zamanlı Self-Managed DSP ile kampanya oluşturmak ve yönetmek çok kolay '
}
}, {
id: 2,
img: {
url: 'https://ads.theadx.com/winwords/120/17508/154712307258.74.png',
h: 128,
w: 128
}
}]
},
rid: '02ac3e60-2df9-11e9-9d09-bba751e172da',
impu: 'https://ssp.theadx.com/ixc?rid=02ac3e60-2df9-11e9-9d09-bba751e172da&time=1549888312719&tid=1',
cliu: 'https://ssp.theadx.com/click?trid=02ac3e60-2df9-11e9-9d09-bba751e172da'
}
}],
seat: '201',
group: 0
}],
bidid: 'a8ae0b48-a8db-4220-ba0c-7458f452b1f5',
cur: 'TRY'
};
let sampleRequest = {
bidId: incomingRequestId,
mediaTypes: {
native: {
image: {
required: false,
sizes: [100, 50]
},
title: {
required: false,
len: 140
},
sponsoredBy: {
required: false
},
clickUrl: {
required: false
},
body: {
required: false
},
icon: {
required: false,
sizes: [50, 50]
}
},
},
requestId: incomingRequestId
};
let result = spec.interpretResponse({
body: sampleResponse
},
sampleRequest
);
expect(result.length).to.equal(1);
let processedBid = result[0];
// expect(processedBid.requestId).to.equal(incomingRequestId);
expect(processedBid.cpm).to.equal(responsePrice);
expect(processedBid.width).to.equal(0);
expect(processedBid.height).to.equal(0);
expect(processedBid.ad).to.equal(null);
expect(processedBid.ttl).to.equal(responseTtl);
expect(processedBid.creativeId).to.equal(responseCreativeId);
expect(processedBid.netRevenue).to.equal(true);
expect(processedBid.currency).to.equal(responseCurrency);
expect(processedBid.native.impressionTrackers[0]).to.equal(nurl);
expect(processedBid.native.clickUrl).to.equal(linkUrl);
});
});
});