diff --git a/modules/adbutlerBidAdapter.js b/modules/adbutlerBidAdapter.js
index d6492a72e1c..f633eba98a3 100644
--- a/modules/adbutlerBidAdapter.js
+++ b/modules/adbutlerBidAdapter.js
@@ -1,130 +1,122 @@
-/**
- * @overview AdButler Prebid.js adapter.
- * @author dkharton
- */
-
'use strict';
-var utils = require('src/utils.js');
-var adloader = require('src/adloader.js');
-var bidmanager = require('src/bidmanager.js');
-var bidfactory = require('src/bidfactory.js');
-var adaptermanager = require('src/adaptermanager');
-
-var AdButlerAdapter = function AdButlerAdapter() {
- function _callBids(params) {
- var bids = params.bids || [];
- var callbackData = {};
- var zoneCount = {};
- var pageID = Math.floor(Math.random() * 10e6);
-
- // Build and send bid requests
- for (var i = 0; i < bids.length; i++) {
- var bid = bids[i];
- var zoneID = utils.getBidIdParameter('zoneID', bid.params);
- var callbackID;
-
- if (!(zoneID in zoneCount)) {
- zoneCount[zoneID] = 0;
+import * as utils from 'src/utils';
+import {config} from 'src/config';
+import {registerBidder} from 'src/adapters/bidderFactory';
+
+const BIDDER_CODE = 'adbutler';
+
+export const spec = {
+ code: BIDDER_CODE,
+ pageID: Math.floor(Math.random() * 10e6),
+
+ isBidRequestValid: function (bid) {
+ return !!(bid.params.accountID && bid.params.zoneID);
+ },
+
+ buildRequests: function (validBidRequests) {
+ var i;
+ var zoneID;
+ var bidRequest;
+ var accountID;
+ var keyword;
+ var domain;
+ var requestURI;
+ var serverRequests = [];
+ var zoneCounters = {};
+
+ for (i = 0; i < validBidRequests.length; i++) {
+ bidRequest = validBidRequests[i];
+ zoneID = utils.getBidIdParameter('zoneID', bidRequest.params);
+ accountID = utils.getBidIdParameter('accountID', bidRequest.params);
+ keyword = utils.getBidIdParameter('keyword', bidRequest.params);
+ domain = utils.getBidIdParameter('domain', bidRequest.params);
+
+ if (!(zoneID in zoneCounters)) {
+ zoneCounters[zoneID] = 0;
}
- // build callbackID to get placementCode later
- callbackID = zoneID + '_' + zoneCount[zoneID];
+ if (typeof domain === 'undefined' || domain.length === 0) {
+ domain = 'servedbyadbutler.com';
+ }
- callbackData[callbackID] = {};
- callbackData[callbackID].bidId = bid.bidId;
+ requestURI = location.protocol + '//' + domain + '/adserve/;type=hbr;';
+ requestURI += 'ID=' + encodeURIComponent(accountID) + ';';
+ requestURI += 'setID=' + encodeURIComponent(zoneID) + ';';
+ requestURI += 'pid=' + encodeURIComponent(spec.pageID) + ';';
+ requestURI += 'place=' + encodeURIComponent(zoneCounters[zoneID]) + ';';
- var adRequest = buildRequest(bid, zoneCount[zoneID], pageID);
- zoneCount[zoneID]++;
+ // append the keyword for targeting if one was passed in
+ if (keyword !== '') {
+ requestURI += 'kw=' + encodeURIComponent(keyword) + ';';
+ }
- adloader.loadScript(adRequest);
+ zoneCounters[zoneID]++;
+ serverRequests.push({
+ method: 'GET',
+ url: requestURI,
+ data: {},
+ bidRequest: bidRequest
+ });
}
+ return serverRequests;
+ },
+
+ interpretResponse: function (serverResponse, bidRequest) {
+ var bidObj = bidRequest.bidRequest;
+ var bidResponses = [];
+ var bidResponse = {};
+ var isCorrectSize = false;
+ var isCorrectCPM = true;
+ var CPM;
+ var minCPM;
+ var maxCPM;
+ var width;
+ var height;
+
+ if (serverResponse && serverResponse.status === 'SUCCESS' && bidObj) {
+ CPM = serverResponse.cpm;
+ minCPM = utils.getBidIdParameter('minCPM', bidObj.params);
+ maxCPM = utils.getBidIdParameter('maxCPM', bidObj.params);
+ width = parseInt(serverResponse.width);
+ height = parseInt(serverResponse.height);
+
+ // Ensure response CPM is within the given bounds
+ if (minCPM !== '' && CPM < parseFloat(minCPM)) {
+ isCorrectCPM = false;
+ }
+ if (maxCPM !== '' && CPM > parseFloat(maxCPM)) {
+ isCorrectCPM = false;
+ }
- // Define callback function for bid responses
- $$PREBID_GLOBAL$$.adbutlerCB = function(aBResponseObject) {
- var bidResponse = {};
- var callbackID = aBResponseObject.zone_id + '_' + aBResponseObject.place;
- var width = parseInt(aBResponseObject.width);
- var height = parseInt(aBResponseObject.height);
- var isCorrectSize = false;
- var isCorrectCPM = true;
- var CPM;
- var minCPM;
- var maxCPM;
- var bidObj = callbackData[callbackID] ? utils.getBidRequest(callbackData[callbackID].bidId) : null;
-
- if (bidObj) {
- if (aBResponseObject.status === 'SUCCESS') {
- CPM = aBResponseObject.cpm;
- minCPM = utils.getBidIdParameter('minCPM', bidObj.params);
- maxCPM = utils.getBidIdParameter('maxCPM', bidObj.params);
-
- // Ensure response CPM is within the given bounds
- if (minCPM !== '' && CPM < parseFloat(minCPM)) {
- isCorrectCPM = false;
- }
- if (maxCPM !== '' && CPM > parseFloat(maxCPM)) {
- isCorrectCPM = false;
- }
-
- // Ensure that response ad matches one of the placement sizes.
- utils._each(bidObj.sizes, function(size) {
- if (width === size[0] && height === size[1]) {
- isCorrectSize = true;
- }
- });
-
- if (isCorrectCPM && isCorrectSize) {
- bidResponse = bidfactory.createBid(1, bidObj);
- bidResponse.bidderCode = 'adbutler';
- bidResponse.cpm = CPM;
- bidResponse.width = width;
- bidResponse.height = height;
- bidResponse.ad = aBResponseObject.ad_code;
- bidResponse.ad += addTrackingPixels(aBResponseObject.tracking_pixels);
- } else {
- bidResponse = bidfactory.createBid(2, bidObj);
- bidResponse.bidderCode = 'adbutler';
- }
- } else {
- bidResponse = bidfactory.createBid(2, bidObj);
- bidResponse.bidderCode = 'adbutler';
+ // Ensure that response ad matches one of the placement sizes.
+ utils._each(bidObj.sizes, function (size) {
+ if (width === size[0] && height === size[1]) {
+ isCorrectSize = true;
}
-
- bidmanager.addBidResponse(bidObj.placementCode, bidResponse);
+ });
+ if (isCorrectCPM && isCorrectSize) {
+ bidResponse.requestId = bidObj.bidId;
+ bidResponse.bidderCode = spec.code;
+ bidResponse.creativeId = serverResponse.placement_id;
+ bidResponse.cpm = CPM;
+ bidResponse.width = width;
+ bidResponse.height = height;
+ bidResponse.ad = serverResponse.ad_code;
+ bidResponse.ad += spec.addTrackingPixels(serverResponse.tracking_pixels);
+ bidResponse.currency = 'USD';
+ bidResponse.netRevenue = true;
+ bidResponse.ttl = config.getConfig('_bidderTimeout');
+ bidResponse.referrer = utils.getTopWindowUrl();
+ bidResponses.push(bidResponse);
}
- };
- }
-
- function buildRequest(bid, adIndex, pageID) {
- var accountID = utils.getBidIdParameter('accountID', bid.params);
- var zoneID = utils.getBidIdParameter('zoneID', bid.params);
- var keyword = utils.getBidIdParameter('keyword', bid.params);
- var domain = utils.getBidIdParameter('domain', bid.params);
-
- if (typeof domain === 'undefined' || domain.length === 0) {
- domain = 'servedbyadbutler.com';
}
+ return bidResponses;
+ },
- var requestURI = location.protocol + '//' + domain + '/adserve/;type=hbr;';
- requestURI += 'ID=' + encodeURIComponent(accountID) + ';';
- requestURI += 'setID=' + encodeURIComponent(zoneID) + ';';
- requestURI += 'pid=' + encodeURIComponent(pageID) + ';';
- requestURI += 'place=' + encodeURIComponent(adIndex) + ';';
-
- // append the keyword for targeting if one was passed in
- if (keyword !== '') {
- requestURI += 'kw=' + encodeURIComponent(keyword) + ';';
- }
- requestURI += 'jsonpfunc=$$PREBID_GLOBAL$$.adbutlerCB;';
- requestURI += 'click=CLICK_MACRO_PLACEHOLDER';
-
- return requestURI;
- }
-
- function addTrackingPixels(trackingPixels) {
+ addTrackingPixels: function (trackingPixels) {
var trackingPixelMarkup = '';
- utils._each(trackingPixels, function(pixelURL) {
+ utils._each(trackingPixels, function (pixelURL) {
var trackingPixel = '';
@@ -133,14 +125,5 @@ var AdButlerAdapter = function AdButlerAdapter() {
});
return trackingPixelMarkup;
}
-
- // Export the callBids function, so that prebid.js can execute this function
- // when the page asks to send out bid requests.
- return {
- callBids: _callBids
- };
};
-
-adaptermanager.registerBidAdapter(new AdButlerAdapter(), 'adbutler');
-
-module.exports = AdButlerAdapter;
+registerBidder(spec);
diff --git a/modules/adbutlerBidAdapter.md b/modules/adbutlerBidAdapter.md
new file mode 100644
index 00000000000..5905074270a
--- /dev/null
+++ b/modules/adbutlerBidAdapter.md
@@ -0,0 +1,31 @@
+# Overview
+
+**Module Name**: AdButler Bidder Adapter
+**Module Type**: Bidder Adapter
+**Maintainer**: dan@sparklit.com
+
+# Description
+
+Module that connects to an AdButler zone to fetch bids.
+
+# Test Parameters
+```
+ var adUnits = [
+ {
+ code: 'display-div',
+ sizes: [[300, 250]], // a display size
+ bids: [
+ {
+ bidder: "adbutler",
+ params: {
+ accountID: '167283',
+ zoneID: '210093',
+ keyword: 'red', //optional
+ minCPM: '1.00', //optional
+ maxCPM: '5.00' //optional
+ }
+ }
+ ]
+ }
+ ];
+```
\ No newline at end of file
diff --git a/test/spec/modules/adbutlerBidAdapter_spec.js b/test/spec/modules/adbutlerBidAdapter_spec.js
index d026ac8de98..352358be8d0 100644
--- a/test/spec/modules/adbutlerBidAdapter_spec.js
+++ b/test/spec/modules/adbutlerBidAdapter_spec.js
@@ -1,516 +1,209 @@
-describe('adbutler adapter tests', function () {
- var expect = require('chai').expect;
- var adapter = require('modules/adbutlerBidAdapter');
- var adLoader = require('src/adloader');
- var bidmanager = require('src/bidmanager');
+import {expect} from 'chai';
+import {spec} from 'modules/adbutlerBidAdapter';
- describe('creation of bid url', function () {
- var stubLoadScript;
+describe('AdButler adapter', () => {
+ let bidRequests;
- beforeEach(function () {
- stubLoadScript = sinon.stub(adLoader, 'loadScript');
- });
-
- afterEach(function () {
- stubLoadScript.restore();
- });
-
- if (typeof ($$PREBID_GLOBAL$$._bidsReceived) === 'undefined') {
- $$PREBID_GLOBAL$$._bidsReceived = [];
- }
- if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') {
- $$PREBID_GLOBAL$$._bidsRequested = [];
- }
- if (typeof ($$PREBID_GLOBAL$$._adsReceived) === 'undefined') {
- $$PREBID_GLOBAL$$._adsReceived = [];
- }
-
- it('should be called', function () {
- var params = {
- bidderCode: 'adbutler',
- bids: [
- {
- bidId: '3c9408cdbf2f68',
- sizes: [[300, 250]],
- bidder: 'adbutler',
- params: {
- accountID: '167283',
- zoneID: '210093'
- },
- requestId: '10b327aa396609',
- placementCode: '/123456/header-bid-tag-1'
- }
-
- ]
- };
-
- adapter().callBids(params);
-
- sinon.assert.called(stubLoadScript);
- });
-
- it('should populate the keyword', function() {
- var params = {
- bidderCode: 'adbutler',
- bids: [
- {
- bidId: '3c9408cdbf2f68',
- sizes: [[300, 250]],
- bidder: 'adbutler',
- params: {
- accountID: '167283',
- zoneID: '210093',
- keyword: 'fish'
- },
- requestId: '10b327aa396609',
- placementCode: '/123456/header-bid-tag-1'
- }
-
- ]
- };
-
- adapter().callBids(params);
-
- var requestURI = stubLoadScript.getCall(0).args[0];
-
- expect(requestURI).to.have.string(';kw=fish;');
- });
-
- it('should use custom domain string', function() {
- var params = {
- bidderCode: 'adbutler',
- bids: [
- {
- bidId: '3c9408cdbf2f68',
- sizes: [[300, 250]],
- bidder: 'adbutler',
- params: {
- accountID: '107878',
- zoneID: '86133',
- domain: 'servedbyadbutler.com.dan.test'
- },
- requestId: '10b327aa396609',
- placementCode: '/123456/header-bid-tag-1'
- }
- ]
- };
-
- adapter().callBids(params);
-
- var requestURI = stubLoadScript.getCall(0).args[0];
-
- expect(requestURI).to.have.string('.dan.test');
- });
- });
- describe('bid responses', function() {
- it('should return complete bid response', function() {
- var stubAddBidResponse = sinon.stub(bidmanager, 'addBidResponse');
-
- var params = {
- bidderCode: 'adbutler',
+ beforeEach(() => {
+ bidRequests = [
+ {
bidder: 'adbutler',
- bids: [
- {
- bidId: '3c94018cdbf2f68-1',
- sizes: [[300, 250]],
- bidder: 'adbutler',
- params: {
- accountID: '167283',
- zoneID: '210093',
- },
- requestId: '10b327aa396609',
- placementCode: '/123456/header-bid-tag-1'
- }
-
- ]
- };
-
- var response = {
- status: 'SUCCESS',
- account_id: 167283,
- zone_id: 210093,
- cpm: 1.5,
- width: 300,
- height: 250,
- place: 0
- };
-
- adapter().callBids(params);
-
- var adUnits = new Array();
- var unit = new Object();
- unit.bids = params.bids;
- unit.code = '/123456/header-bid-tag-1';
- unit.sizes = [[300, 250]];
- adUnits.push(unit);
-
- if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') {
- $$PREBID_GLOBAL$$._bidsRequested = [params];
- } else {
- $$PREBID_GLOBAL$$._bidsRequested.push(params);
+ params: {
+ accountID: '167283',
+ zoneID: '210093',
+ keyword: 'red',
+ minCPM: '1.00',
+ maxCPM: '5.00'
+ },
+ placementCode: '/19968336/header-bid-tag-1',
+ sizes: [[300, 250], [300, 600]],
+ bidId: '23acc48ad47af5',
+ requestId: '0fb4905b-9456-4152-86be-c6f6d259ba99',
+ bidderRequestId: '1c56ad30b9b8ca8',
+ transactionId: '92489f71-1bf2-49a0-adf9-000cea934729'
}
-
- $$PREBID_GLOBAL$$.adUnits = adUnits;
-
- $$PREBID_GLOBAL$$.adbutlerCB(response);
-
- var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0];
- var bidObject1 = stubAddBidResponse.getCall(0).args[1];
-
- expect(bidPlacementCode1).to.equal('/123456/header-bid-tag-1');
- expect(bidObject1.getStatusCode()).to.equal(1);
- expect(bidObject1.bidderCode).to.equal('adbutler');
- expect(bidObject1.cpm).to.equal(1.5);
- expect(bidObject1.width).to.equal(300);
- expect(bidObject1.height).to.equal(250);
-
- stubAddBidResponse.restore();
- });
-
- it('should return empty bid response', function() {
- var stubAddBidResponse = sinon.stub(bidmanager, 'addBidResponse');
- var params = {
- bidderCode: 'adbutler',
- bids: [
- {
- bidId: '3c9408cdbf2f68-2',
- sizes: [[300, 250]],
- bidder: 'adbutler',
- params: {
- accountID: '167283',
- zoneID: '210085',
- },
- requestId: '10b327aa396609',
- placementCode: '/123456/header-bid-tag-1'
- }
-
- ]
- };
-
- var response = {
- status: 'NO_ELIGIBLE_ADS',
- zone_id: 210085,
- width: 728,
- height: 90,
- place: 0
- };
-
- adapter().callBids(params);
-
- var adUnits = new Array();
- var unit = new Object();
- unit.bids = params.bids;
- unit.code = '/123456/header-bid-tag-1';
- unit.sizes = [[300, 250]];
- adUnits.push(unit);
-
- if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') {
- $$PREBID_GLOBAL$$._bidsRequested = [params];
- } else {
- $$PREBID_GLOBAL$$._bidsRequested.push(params);
- }
-
- $$PREBID_GLOBAL$$.adUnits = adUnits;
-
- $$PREBID_GLOBAL$$.adbutlerCB(response);
-
- var bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0];
- var bidObject1 = stubAddBidResponse.getCall(0).args[1];
-
- expect(bidPlacementCode1).to.equal('/123456/header-bid-tag-1');
- expect(bidObject1.getStatusCode()).to.equal(2);
- expect(bidObject1.bidderCode).to.equal('adbutler');
-
- stubAddBidResponse.restore();
- });
-
- it('should return empty bid response on incorrect size', function() {
- var stubAddBidResponse = sinon.stub(bidmanager, 'addBidResponse');
- var params = {
- bidderCode: 'adbutler',
- bids: [
- {
- bidId: '3c9408cdbf2f68-3',
- sizes: [[300, 250]],
- bidder: 'adbutler',
- params: {
- accountID: '167283',
- zoneID: '210085',
- },
- requestId: '10b327aa396609',
- placementCode: '/123456/header-bid-tag-1'
- }
-
- ]
- };
-
- var response = {
- status: 'SUCCESS',
- account_id: 167283,
- zone_id: 210085,
- cpm: 1.5,
- width: 728,
- height: 90,
- place: 0
- };
-
- adapter().callBids(params);
-
- var adUnits = new Array();
- var unit = new Object();
- unit.bids = params.bids;
- unit.code = '/123456/header-bid-tag-1';
- unit.sizes = [[300, 250]];
- adUnits.push(unit);
-
- if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') {
- $$PREBID_GLOBAL$$._bidsRequested = [params];
- } else {
- $$PREBID_GLOBAL$$._bidsRequested.push(params);
- }
-
- $$PREBID_GLOBAL$$.adUnits = adUnits;
-
- $$PREBID_GLOBAL$$.adbutlerCB(response);
-
- var bidObject1 = stubAddBidResponse.getCall(0).args[1];
- expect(bidObject1.getStatusCode()).to.equal(2);
-
- stubAddBidResponse.restore();
- });
-
- it('should return empty bid response with CPM too low', function() {
- var stubAddBidResponse = sinon.stub(bidmanager, 'addBidResponse');
- var params = {
- bidderCode: 'adbutler',
- bids: [
- {
- bidId: '3c9408cdbf2f68-4',
- sizes: [[300, 250]],
- bidder: 'adbutler',
- params: {
- accountID: '167283',
- zoneID: '210093',
- minCPM: '5.00'
- },
- requestId: '10b327aa396609',
- placementCode: '/123456/header-bid-tag-1'
- }
-
- ]
- };
-
- var response = {
- status: 'SUCCESS',
- account_id: 167283,
- zone_id: 210093,
- cpm: 1.5,
- width: 300,
- height: 250,
- place: 0
- };
-
- adapter().callBids(params);
-
- var adUnits = new Array();
- var unit = new Object();
- unit.bids = params.bids;
- unit.code = '/123456/header-bid-tag-1';
- unit.sizes = [[300, 250]];
- adUnits.push(unit);
-
- if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') {
- $$PREBID_GLOBAL$$._bidsRequested = [params];
- } else {
- $$PREBID_GLOBAL$$._bidsRequested.push(params);
- }
-
- $$PREBID_GLOBAL$$.adUnits = adUnits;
-
- $$PREBID_GLOBAL$$.adbutlerCB(response);
-
- var bidObject1 = stubAddBidResponse.getCall(0).args[1];
- expect(bidObject1.getStatusCode()).to.equal(2);
-
- stubAddBidResponse.restore();
- });
-
- it('should return empty bid response with CPM too high', function() {
- var stubAddBidResponse = sinon.stub(bidmanager, 'addBidResponse');
-
- var params = {
- bidderCode: 'adbutler',
- bids: [
- {
- bidId: '3c9408cdbf2f68-5',
- sizes: [[300, 250]],
- bidder: 'adbutler',
- params: {
- accountID: '167283',
- zoneID: '210093',
- maxCPM: '1.00'
- },
- requestId: '10b327aa396609',
- placementCode: '/123456/header-bid-tag-1'
- }
-
- ]
- };
-
- var response = {
- status: 'SUCCESS',
- account_id: 167283,
- zone_id: 210093,
- cpm: 1.5,
- width: 300,
- height: 250,
- place: 0
- };
-
- adapter().callBids(params);
-
- var adUnits = new Array();
- var unit = new Object();
- unit.bids = params.bids;
- unit.code = '/123456/header-bid-tag-1';
- unit.sizes = [[300, 250]];
- adUnits.push(unit);
-
- if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') {
- $$PREBID_GLOBAL$$._bidsRequested = [params];
- } else {
- $$PREBID_GLOBAL$$._bidsRequested.push(params);
- }
-
- $$PREBID_GLOBAL$$.adUnits = adUnits;
-
- $$PREBID_GLOBAL$$.adbutlerCB(response);
-
- var bidObject1 = stubAddBidResponse.getCall(0).args[1];
- expect(bidObject1.getStatusCode()).to.equal(2);
-
- stubAddBidResponse.restore();
- });
+ ];
});
- describe('ad code', function() {
- it('should be populated', function() {
- var stubAddBidResponse = sinon.stub(bidmanager, 'addBidResponse');
-
- var params = {
- bidderCode: 'adbutler',
- bids: [
- {
- bidId: '3c9408cdbf2f68-6',
- sizes: [[300, 250]],
+ describe('implementation', () => {
+ describe('for requests', () => {
+ it('should accept valid bid', () => {
+ let validBid = {
bidder: 'adbutler',
params: {
accountID: '167283',
zoneID: '210093'
- },
- requestId: '10b327aa396609',
- placementCode: '/123456/header-bid-tag-1'
- }
-
- ]
- };
-
- var response = {
- status: 'SUCCESS',
- account_id: 167283,
- zone_id: 210093,
- cpm: 1.5,
- width: 300,
- height: 250,
- place: 0,
- ad_code: ''
- };
-
- adapter().callBids(params);
-
- var adUnits = new Array();
- var unit = new Object();
- unit.bids = params.bids;
- unit.code = '/123456/header-bid-tag-1';
- unit.sizes = [[300, 250]];
- adUnits.push(unit);
-
- if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') {
- $$PREBID_GLOBAL$$._bidsRequested = [params];
- } else {
- $$PREBID_GLOBAL$$._bidsRequested.push(params);
- }
-
- $$PREBID_GLOBAL$$.adUnits = adUnits;
-
- $$PREBID_GLOBAL$$.adbutlerCB(response);
+ }
+ },
+ isValid = spec.isBidRequestValid(validBid);
- var bidObject1 = stubAddBidResponse.getCall(0).args[1];
- expect(bidObject1.getStatusCode()).to.equal(1);
- expect(bidObject1.ad).to.have.length.above(1);
-
- stubAddBidResponse.restore();
- });
+ expect(isValid).to.equal(true);
+ });
- it('should contain tracking pixels', function() {
- var stubAddBidResponse = sinon.stub(bidmanager, 'addBidResponse');
-
- var params = {
- bidderCode: 'adbutler',
- bids: [
- {
- bidId: '3c9408cdbf2f68-7',
- sizes: [[300, 250]],
+ it('should reject invalid bid', () => {
+ let invalidBid = {
bidder: 'adbutler',
params: {
accountID: '167283',
- zoneID: '210093'
+ }
+ },
+ isValid = spec.isBidRequestValid(invalidBid);
+
+ expect(isValid).to.equal(false);
+ });
+
+ it('should use custom domain string', () => {
+ let bidRequests = [
+ {
+ bidId: '3c9408cdbf2f68',
+ sizes: [[300, 250]],
+ bidder: 'adbutler',
+ params: {
+ accountID: '107878',
+ zoneID: '86133',
+ domain: 'servedbyadbutler.com.dan.test'
+ },
+ requestId: '10b327aa396609',
+ placementCode: '/123456/header-bid-tag-1'
+ }
+ ],
+ requests = spec.buildRequests(bidRequests),
+ requestURL = requests[0].url;
+
+ expect(requestURL).to.have.string('.dan.test');
+ });
+
+ it('should set default domain', () => {
+ let requests = spec.buildRequests(bidRequests),
+ request = requests[0];
+
+ let [domain] = request.url.split('/adserve/');
+
+ expect(domain).to.equal('http://servedbyadbutler.com');
+ });
+
+ it('should set the keyword parameter', () => {
+ let requests = spec.buildRequests(bidRequests),
+ requestURL = requests[0].url;
+
+ expect(requestURL).to.have.string(';kw=red;');
+ });
+
+ it('should increment the count for the same zone', () => {
+ let bidRequests = [
+ {
+ sizes: [[300, 250]],
+ bidder: 'adbutler',
+ params: {
+ accountID: '107878',
+ zoneID: '86133',
+ domain: 'servedbyadbutler.com.dan.test'
+ }
+ }, {
+ sizes: [[300, 250]],
+ bidder: 'adbutler',
+ params: {
+ accountID: '107878',
+ zoneID: '86133',
+ domain: 'servedbyadbutler.com.dan.test'
+ }
},
- requestId: '10b327aa396609',
- placementCode: '/123456/header-bid-tag-1'
- }
-
- ]
- };
-
- var response = {
- status: 'SUCCESS',
- account_id: 167283,
- zone_id: 210093,
- cpm: 1.5,
- width: 300,
- height: 250,
- place: 0,
- ad_code: '',
- tracking_pixels: [
- 'http://tracking.pixel.com/params=info'
- ]
- };
-
- adapter().callBids(params);
-
- var adUnits = new Array();
- var unit = new Object();
- unit.bids = params.bids;
- unit.code = '/123456/header-bid-tag-1';
- unit.sizes = [[300, 250]];
- adUnits.push(unit);
-
- if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') {
- $$PREBID_GLOBAL$$._bidsRequested = [params];
- } else {
- $$PREBID_GLOBAL$$._bidsRequested.push(params);
- }
-
- $$PREBID_GLOBAL$$.adUnits = adUnits;
-
- $$PREBID_GLOBAL$$.adbutlerCB(response);
-
- var bidObject1 = stubAddBidResponse.getCall(0).args[1];
- expect(bidObject1.getStatusCode()).to.equal(1);
- expect(bidObject1.ad).to.have.string('http://tracking.pixel.com/params=info');
+ ],
+ requests = spec.buildRequests(bidRequests),
+ firstRequest = requests[0].url,
+ secondRequest = requests[1].url;
+
+ expect(firstRequest).to.have.string(';place=0;');
+ expect(secondRequest).to.have.string(';place=1;');
+ });
+ });
- stubAddBidResponse.restore();
+ describe('bid responses', () => {
+ it('should return complete bid response', () => {
+ let serverResponse = {
+ status: 'SUCCESS',
+ account_id: 167283,
+ zone_id: 210093,
+ cpm: 1.5,
+ width: 300,
+ height: 250,
+ place: 0,
+ ad_code: '',
+ tracking_pixels: [
+ 'http://tracking.pixel.com/params=info'
+ ]
+ },
+ bids = spec.interpretResponse(serverResponse, {'bidRequest': bidRequests[0]});
+
+ expect(bids).to.be.lengthOf(1);
+
+ expect(bids[0].bidderCode).to.equal('adbutler');
+ expect(bids[0].cpm).to.equal(1.5);
+ expect(bids[0].width).to.equal(300);
+ expect(bids[0].height).to.equal(250);
+ expect(bids[0].currency).to.equal('USD');
+ expect(bids[0].netRevenue).to.equal(true);
+ expect(bids[0].ad).to.have.length.above(1);
+ expect(bids[0].ad).to.have.string('http://tracking.pixel.com/params=info');
+ });
+
+ it('should return empty bid response', () => {
+ let serverResponse = {
+ status: 'NO_ELIGIBLE_ADS',
+ zone_id: 210083,
+ width: 300,
+ height: 250,
+ place: 0
+ },
+ bids = spec.interpretResponse(serverResponse, {'bidRequest': bidRequests[0]});
+
+ expect(bids).to.be.lengthOf(0);
+ });
+
+ it('should return empty bid response on incorrect size', () => {
+ let serverResponse = {
+ status: 'SUCCESS',
+ account_id: 167283,
+ zone_id: 210083,
+ cpm: 1.5,
+ width: 728,
+ height: 90,
+ place: 0
+ },
+ bids = spec.interpretResponse(serverResponse, {'bidRequest': bidRequests[0]});
+
+ expect(bids).to.be.lengthOf(0);
+ });
+
+ it('should return empty bid response with CPM too low', () => {
+ let serverResponse = {
+ status: 'SUCCESS',
+ account_id: 167283,
+ zone_id: 210093,
+ cpm: 0.75,
+ width: 300,
+ height: 250,
+ place: 0
+ },
+ bids = spec.interpretResponse(serverResponse, {'bidRequest': bidRequests[0]});
+
+ expect(bids).to.be.lengthOf(0);
+ });
+
+ it('should return empty bid response with CPM too high', () => {
+ let serverResponse = {
+ status: 'SUCCESS',
+ account_id: 167283,
+ zone_id: 210093,
+ cpm: 7.00,
+ width: 300,
+ height: 250,
+ place: 0
+ },
+ bids = spec.interpretResponse(serverResponse, {'bidRequest': bidRequests[0]});
+
+ expect(bids).to.be.lengthOf(0);
+ });
});
});
});
diff --git a/test/spec/modules/c1xBidAdapter_spec.js b/test/spec/modules/c1xBidAdapter_spec.js
index 3e482dfaae9..e1a48a5b701 100644
--- a/test/spec/modules/c1xBidAdapter_spec.js
+++ b/test/spec/modules/c1xBidAdapter_spec.js
@@ -177,6 +177,23 @@ describe('c1x adapter tests: ', () => {
});
it('should show error when bidder sends invalid bid responses', () => {
let responses;
+ let adUnits = [];
+ let unit = {};
+ let params = getDefaultBidRequest();
+
+ unit.bids = params.bids;
+ unit.code = '/123456/header-bid-tag-1';
+ unit.sizes = [[300, 250]];
+ adUnits.push(unit);
+
+ if (typeof ($$PREBID_GLOBAL$$._bidsRequested) === 'undefined') {
+ $$PREBID_GLOBAL$$._bidsRequested = [params];
+ } else {
+ $$PREBID_GLOBAL$$._bidsRequested.push(params);
+ }
+
+ $$PREBID_GLOBAL$$.adUnits = adUnits;
+
pbjs._c1xResponse(responses);
let bidObject = stubAddBidResponse.getCall(0).args[1];
expect(bidObject.statusMessage).to.equal('Bid returned empty or error response');