From 2a46206d64aa52a9371bacfbaff3a1ae94c395e1 Mon Sep 17 00:00:00 2001
From: jbartek-improve <31618107+jbartek-improve@users.noreply.github.com>
Date: Thu, 26 Oct 2017 17:53:47 +0200
Subject: [PATCH] Update Improve Digital adapter for Prebid 1.0 (#1728)
* Update Improve Digital adapter for Prebid 1.0
* Removed bidderCode from bids
* Added creativeId to bid response; updated format of the first argument of interpretResponse
---
modules/improvedigitalBidAdapter.js | 379 ++++-----
modules/improvedigitalBidAdapter.md | 47 +
.../modules/improvedigitalBidAdapter_spec.js | 804 ++++++------------
3 files changed, 493 insertions(+), 737 deletions(-)
create mode 100644 modules/improvedigitalBidAdapter.md
diff --git a/modules/improvedigitalBidAdapter.js b/modules/improvedigitalBidAdapter.js
index 51fb61b03e29..bc00127b2699 100644
--- a/modules/improvedigitalBidAdapter.js
+++ b/modules/improvedigitalBidAdapter.js
@@ -1,176 +1,150 @@
-const LIB_VERSION_GLOBAL = '3.0.5';
-
-const CONSTANTS = require('src/constants');
-const utils = require('src/utils');
-const bidfactory = require('src/bidfactory');
-const bidmanager = require('src/bidmanager');
-const adloader = require('src/adloader');
-const Adapter = require('src/adapter').default;
-const adaptermanager = require('src/adaptermanager');
-
-const IMPROVE_DIGITAL_BIDDER_CODE = 'improvedigital';
-
-const ImproveDigitalAdapter = function () {
- let baseAdapter = new Adapter(IMPROVE_DIGITAL_BIDDER_CODE);
- baseAdapter.idClient = new ImproveDigitalAdServerJSClient('hb');
-
- const LIB_VERSION = LIB_VERSION_GLOBAL;
+import * as utils from 'src/utils';
+import { registerBidder } from 'src/adapters/bidderFactory';
+import { userSync } from 'src/userSync';
+
+const BIDDER_CODE = 'improvedigital';
+
+export const spec = {
+ version: '4.0.0',
+ code: BIDDER_CODE,
+ aliases: ['id'],
+
+ /**
+ * Determines whether or not the given bid request is valid.
+ *
+ * @param {object} bid The bid to validate.
+ * @return boolean True if this is a valid bid, and false otherwise.
+ */
+ isBidRequestValid: function (bid) {
+ return !!(bid && bid.params && (bid.params.placementId || (bid.params.placementKey && bid.params.publisherId)));
+ },
+
+ /**
+ * Make a server request from the list of BidRequests.
+ *
+ * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server.
+ * @return ServerRequest Info describing the request to the server.
+ */
+ buildRequests: function (bidRequests) {
+ let normalizedBids = bidRequests.map((bidRequest) => {
+ return getNormalizedBidRequest(bidRequest);
+ });
- // Ad server needs to implement JSONP using this function as the callback
- const CALLBACK_FUNCTION = '$$PREBID_GLOBAL$$' + '.improveDigitalResponse';
+ let idClient = new ImproveDigitalAdServerJSClient('hb');
+ let requestParameters = {
+ singleRequestMode: false,
+ httpRequestType: idClient.CONSTANTS.HTTP_REQUEST_TYPE.GET,
+ returnObjType: idClient.CONSTANTS.RETURN_OBJ_TYPE.PREBID,
+ libVersion: this.version
+ };
- baseAdapter.getNormalizedBidRequest = function(bid) {
- let adUnitId = utils.getBidIdParameter('placementCode', bid) || null;
- let placementId = utils.getBidIdParameter('placementId', bid.params) || null;
- let publisherId = null;
- let placementKey = null;
+ let requestObj = idClient.createRequest(
+ normalizedBids, // requestObject
+ requestParameters
+ );
- if (placementId === null) {
- publisherId = utils.getBidIdParameter('publisherId', bid.params) || null;
- placementKey = utils.getBidIdParameter('placementKey', bid.params) || null;
+ if (requestObj.errors && requestObj.errors.length > 0) {
+ utils.logError('ID WARNING 0x01');
}
- let keyValues = utils.getBidIdParameter('keyValues', bid.params) || null;
- let localSize = utils.getBidIdParameter('size', bid.params) || null;
- let bidId = utils.getBidIdParameter('bidId', bid);
- let normalizedBidRequest = {};
- if (placementId) {
- normalizedBidRequest.placementId = placementId;
- } else {
- if (publisherId) {
- normalizedBidRequest.publisherId = publisherId;
- }
- if (placementKey) {
- normalizedBidRequest.placementKey = placementKey;
+ return requestObj.requests;
+ },
+
+ /**
+ * Unpack the response from the server into a list of bids.
+ *
+ * @param {*} serverResponse A successful response from the server.
+ * @return {Bid[]} An array of bids which were nested inside the server.
+ */
+ interpretResponse: function (serverResponse, request) {
+ const bids = [];
+ utils._each(serverResponse.body.bid, function (bidObject) {
+ if (!bidObject.price || bidObject.price === null ||
+ bidObject.hasOwnProperty('errorCode') ||
+ typeof bidObject.adm !== 'string') {
+ return;
}
- }
- if (keyValues) {
- normalizedBidRequest.keyValues = keyValues;
- }
- if (localSize && localSize.w && localSize.h) {
- normalizedBidRequest.size = {};
- normalizedBidRequest.size.h = localSize.h;
- normalizedBidRequest.size.w = localSize.w;
- }
- if (bidId) {
- normalizedBidRequest.id = bidId;
- }
- if (adUnitId) {
- normalizedBidRequest.adUnitId = adUnitId;
- }
- return normalizedBidRequest;
- }
-
- let submitNoBidResponse = function(bidRequest) {
- let bid = bidfactory.createBid(CONSTANTS.STATUS.NO_BID, bidRequest);
- bid.bidderCode = IMPROVE_DIGITAL_BIDDER_CODE;
- bidmanager.addBidResponse(bidRequest.placementCode, bid);
- };
-
- $$PREBID_GLOBAL$$.improveDigitalResponse = function(response) {
- let bidRequests = utils.getBidderRequestAllAdUnits(IMPROVE_DIGITAL_BIDDER_CODE);
- if (bidRequests && bidRequests.bids && bidRequests.bids.length > 0) {
- utils._each(bidRequests.bids, function (bidRequest) {
- let bidObjects = response.bid || [];
- utils._each(bidObjects, function (bidObject) {
- if (bidObject.id === bidRequest.bidId) {
- if (!bidObject.price || bidObject.price === null) {
- submitNoBidResponse(bidRequest);
- return;
- }
- if (bidObject.errorCode && bidObject.errorCode !== 0) {
- submitNoBidResponse(bidRequest);
- return;
- }
- if (!bidObject.adm || bidObject.adm === null || typeof bidObject.adm !== 'string') {
- submitNoBidResponse(bidRequest);
- return;
- }
-
- let bid = bidfactory.createBid(CONSTANTS.STATUS.GOOD, bidRequest);
-
- let syncString = '';
- let syncArray = (bidObject.sync && bidObject.sync.length > 0) ? bidObject.sync : [];
+ let bid = {};
+ let nurl = '';
+ if (bidObject.nurl && bidObject.nurl.length > 0) {
+ nurl = `
`;
+ }
+ bid.ad = `${nurl}`;
+ bid.adId = bidObject.id;
+ bid.cpm = parseFloat(bidObject.price);
+ bid.creativeId = bidObject.crid;
+ bid.currency = bidObject.currency ? bidObject.currency.toUpperCase() : 'USD';
+ if (utils.isNumber(bidObject.lid)) {
+ bid.dealId = bidObject.lid;
+ } else if (typeof bidObject.lid === 'object' && bidObject.lid['1']) {
+ bid.dealId = bidObject.lid['1'];
+ }
+ bid.height = bidObject.h;
+ bid.netRevenue = bidObject.isNet ? bidObject.isNet : false;
+ bid.requestId = bidObject.id;
+ bid.width = bidObject.w;
- utils._each(syncArray, function (syncElement) {
- let syncInd = syncElement.replace(/\//g, '\\\/');
- syncString = `${syncString}${(syncString === '') ? 'document.writeln(\"' : ''}
`;
- });
- syncString = `${syncString}${(syncString === '') ? '' : '\")'}`;
+ bids.push(bid);
- let nurl = '';
- if (bidObject.nurl && bidObject.nurl.length > 0) {
- nurl = `
`;
- }
- bid.ad = `${nurl}`;
- bid.bidderCode = IMPROVE_DIGITAL_BIDDER_CODE;
- bid.cpm = parseFloat(bidObject.price);
- bid.width = bidObject.w;
- bid.height = bidObject.h;
-
- bidmanager.addBidResponse(bidRequest.placementCode, bid);
- }
+ // Register user sync URLs
+ if (utils.isArray(bidObject.sync)) {
+ utils._each(bidObject.sync, function (syncElement) {
+ userSync.registerSync('image', spec.code, syncElement);
});
- });
- }
- };
-
- baseAdapter.callBids = function (params) {
- // params will contain an array
- let bidRequests = params.bids || [];
- let loc = utils.getTopWindowLocation();
- let requestParameters = {
- singleRequestMode: false,
- httpRequestType: this.idClient.CONSTANTS.HTTP_REQUEST_TYPE.GET,
- callback: CALLBACK_FUNCTION,
- secure: (loc.protocol === 'https:') ? 1 : 0,
- libVersion: this.LIB_VERSION
- };
-
- let normalizedBids = bidRequests.map((bidRequest) => {
- let normalizedBidRequest = this.getNormalizedBidRequest(bidRequest);
- if (bidRequest.params && bidRequest.params.singleRequest) {
- requestParameters.singleRequestMode = true;
}
- return normalizedBidRequest;
});
+ return bids;
+ }
+};
- let request = this.idClient.createRequest(
- normalizedBids, // requestObject
- requestParameters
- );
+function getNormalizedBidRequest(bid) {
+ let adUnitId = utils.getBidIdParameter('adUnitCode', bid) || null;
+ let placementId = utils.getBidIdParameter('placementId', bid.params) || null;
+ let publisherId = null;
+ let placementKey = null;
- if (request.errors && request.errors.length > 0) {
- utils.logError('ID WARNING 0x01');
- }
+ if (placementId === null) {
+ publisherId = utils.getBidIdParameter('publisherId', bid.params) || null;
+ placementKey = utils.getBidIdParameter('placementKey', bid.params) || null;
+ }
+ let keyValues = utils.getBidIdParameter('keyValues', bid.params) || null;
+ let localSize = utils.getBidIdParameter('size', bid.params) || null;
+ let bidId = utils.getBidIdParameter('bidId', bid);
+ let transactionId = utils.getBidIdParameter('transactionId', bid);
- if (request && request.requests && request.requests[0]) {
- utils._each(request.requests, function (requestElement) {
- if (requestElement.url) {
- adloader.loadScript(requestElement.url, null);
- }
- });
+ let normalizedBidRequest = {};
+ if (placementId) {
+ normalizedBidRequest.placementId = placementId;
+ } else {
+ if (publisherId) {
+ normalizedBidRequest.publisherId = publisherId;
+ }
+ if (placementKey) {
+ normalizedBidRequest.placementKey = placementKey;
}
}
- // Export the callBids function, so that prebid.js can execute this function
- // when the page asks to send out bid requests.
- return Object.assign(this, {
- LIB_VERSION: LIB_VERSION,
- idClient: baseAdapter.idClient,
- getNormalizedBidRequest: baseAdapter.getNormalizedBidRequest,
- callBids: baseAdapter.callBids
- });
-};
-
-ImproveDigitalAdapter.createNew = function () {
- return new ImproveDigitalAdapter();
-};
-
-adaptermanager.registerBidAdapter(new ImproveDigitalAdapter(), IMPROVE_DIGITAL_BIDDER_CODE);
-
-module.exports = ImproveDigitalAdapter;
+ if (keyValues) {
+ normalizedBidRequest.keyValues = keyValues;
+ }
+ if (localSize && localSize.w && localSize.h) {
+ normalizedBidRequest.size = {};
+ normalizedBidRequest.size.h = localSize.h;
+ normalizedBidRequest.size.w = localSize.w;
+ }
+ if (bidId) {
+ normalizedBidRequest.id = bidId;
+ }
+ if (adUnitId) {
+ normalizedBidRequest.adUnitId = adUnitId;
+ }
+ if (transactionId) {
+ normalizedBidRequest.transactionId = transactionId;
+ }
+ return normalizedBidRequest;
+}
+registerBidder(spec);
function ImproveDigitalAdServerJSClient(endPoint) {
this.CONSTANTS = {
@@ -184,13 +158,17 @@ function ImproveDigitalAdServerJSClient(endPoint) {
},
AD_SERVER_BASE_URL: 'ad.360yield.com',
END_POINT: endPoint || 'hb',
- AD_SERVER_URL_PARAM: '?jsonp=',
- CLIENT_VERSION: 'JS-4.0.2',
+ AD_SERVER_URL_PARAM: 'jsonp=',
+ CLIENT_VERSION: 'JS-4.2.0',
MAX_URL_LENGTH: 2083,
ERROR_CODES: {
BAD_HTTP_REQUEST_TYPE_PARAM: 1,
MISSING_PLACEMENT_PARAMS: 2,
LIB_VERSION_MISSING: 3
+ },
+ RETURN_OBJ_TYPE: {
+ DEFAULT: 0,
+ PREBID: 1
}
};
@@ -210,6 +188,8 @@ function ImproveDigitalAdServerJSClient(endPoint) {
return this.getErrorReturn(this.CONSTANTS.ERROR_CODES.LIB_VERSION_MISSING);
}
+ requestParameters.returnObjType = requestParameters.returnObjType || this.CONSTANTS.RETURN_OBJ_TYPE.DEFAULT;
+
let impressionObjects = [];
let impressionObject;
let counter;
@@ -223,12 +203,19 @@ function ImproveDigitalAdServerJSClient(endPoint) {
impressionObjects.push(impressionObject);
}
+ let returnIdMappings = true;
+ if (requestParameters.returnObjType === this.CONSTANTS.RETURN_OBJ_TYPE.PREBID) {
+ returnIdMappings = false;
+ }
+
let returnObject = {};
- returnObject.idMappings = [];
returnObject.requests = [];
+ if (returnIdMappings) {
+ returnObject.idMappings = [];
+ }
let errors = null;
- let baseUrl = `${(requestParameters.secure === 1 ? 'https' : 'http')}://${this.CONSTANTS.AD_SERVER_BASE_URL}/${this.CONSTANTS.END_POINT}${this.CONSTANTS.AD_SERVER_URL_PARAM}`;
+ let baseUrl = `${(requestParameters.secure === 1 ? 'https' : 'http')}://${this.CONSTANTS.AD_SERVER_BASE_URL}/${this.CONSTANTS.END_POINT}?${this.CONSTANTS.AD_SERVER_URL_PARAM}`;
let bidRequestObject = {
bid_request: this.createBasicBidRequestObject(requestParameters, extraRequestParameters)
@@ -243,49 +230,39 @@ function ImproveDigitalAdServerJSClient(endPoint) {
adUnitId: impressionObject.adUnitId
});
} else {
- returnObject.idMappings.push({
- adUnitId: impressionObject.adUnitId,
- id: impressionObject.impressionObject.id
- });
- bidRequestObject.bid_request.imp = bidRequestObject.bid_request.imp || [];
-
- bidRequestObject.bid_request.imp.push(impressionObject.impressionObject);
- let outputUri = encodeURIComponent(baseUrl + JSON.stringify(bidRequestObject));
-
- if (!requestParameters.singleRequestMode) {
- returnObject.requests.push({
- url: baseUrl + encodeURIComponent(JSON.stringify(bidRequestObject))
+ if (returnIdMappings) {
+ returnObject.idMappings.push({
+ adUnitId: impressionObject.adUnitId,
+ id: impressionObject.impressionObject.id
});
- bidRequestObject = {
- bid_request: this.createBasicBidRequestObject(requestParameters, extraRequestParameters)
- };
}
+ bidRequestObject.bid_request.imp = bidRequestObject.bid_request.imp || [];
+ bidRequestObject.bid_request.imp.push(impressionObject.impressionObject);
+ let writeLongRequest = false;
+ const outputUri = baseUrl + encodeURIComponent(JSON.stringify(bidRequestObject));
if (outputUri.length > this.CONSTANTS.MAX_URL_LENGTH) {
+ writeLongRequest = true;
if (bidRequestObject.bid_request.imp.length > 1) {
+ // Pop the current request and process it again in the next iteration
bidRequestObject.bid_request.imp.pop();
- returnObject.requests.push({
- url: baseUrl + encodeURIComponent(JSON.stringify(bidRequestObject))
- });
- bidRequestObject = {
- bid_request: this.createBasicBidRequestObject(requestParameters, extraRequestParameters)
- };
- bidRequestObject.bid_request.imp = [];
- bidRequestObject.bid_request.imp.push(impressionObject.impressionObject);
- } else {
- // We have a problem. Single request is too long for a URI
+ if (returnIdMappings) {
+ returnObject.idMappings.pop();
+ }
+ counter--;
}
}
+
+ if (writeLongRequest ||
+ !requestParameters.singleRequestMode ||
+ counter === impressionObjects.length - 1) {
+ returnObject.requests.push(this.formatRequest(requestParameters, bidRequestObject));
+ bidRequestObject = {
+ bid_request: this.createBasicBidRequestObject(requestParameters, extraRequestParameters)
+ };
+ }
}
}
- if (bidRequestObject.bid_request &&
- bidRequestObject.bid_request.imp &&
- bidRequestObject.bid_request.imp.length > 0) {
- returnObject.requests = returnObject.requests || [];
- returnObject.requests.push({
- url: baseUrl + encodeURIComponent(JSON.stringify(bidRequestObject))
- });
- }
if (errors) {
returnObject.errors = errors;
@@ -294,6 +271,24 @@ function ImproveDigitalAdServerJSClient(endPoint) {
return returnObject;
};
+ this.formatRequest = function(requestParameters, bidRequestObject) {
+ switch (requestParameters.returnObjType) {
+ case this.CONSTANTS.RETURN_OBJ_TYPE.PREBID:
+ return {
+ method: 'GET',
+ url: `//${this.CONSTANTS.AD_SERVER_BASE_URL}/${this.CONSTANTS.END_POINT}`,
+ data: `${this.CONSTANTS.AD_SERVER_URL_PARAM}${JSON.stringify(bidRequestObject)}`
+ };
+ default:
+ const baseUrl = `${(requestParameters.secure === 1 ? 'https' : 'http')}://` +
+ `${this.CONSTANTS.AD_SERVER_BASE_URL}/` +
+ `${this.CONSTANTS.END_POINT}?${this.CONSTANTS.AD_SERVER_URL_PARAM}`;
+ return {
+ url: baseUrl + encodeURIComponent(JSON.stringify(bidRequestObject))
+ }
+ }
+ };
+
this.createBasicBidRequestObject = function(requestParameters, extraRequestParameters) {
let impressionBidRequestObject = {};
if (requestParameters.requestId) {
diff --git a/modules/improvedigitalBidAdapter.md b/modules/improvedigitalBidAdapter.md
new file mode 100644
index 000000000000..3d91d4f82f24
--- /dev/null
+++ b/modules/improvedigitalBidAdapter.md
@@ -0,0 +1,47 @@
+# Overview
+
+**Module Name**: Improve Digital Bidder Adapter
+**Module Type**: Bidder Adapter
+**Maintainer**: hb@improvedigital.com
+
+# Description
+
+Module that connects to Improve Digital's demand sources
+
+# Test Parameters
+```
+ var adUnits = [{
+ code: 'div-gpt-ad-1499748733608-0',
+ bids: [
+ {
+ bidder: 'improvedigital',
+ params: {
+ placementId:1053688
+ }
+ }
+ ]
+ }, {
+ code: 'div-gpt-ad-1499748833901-0',
+ bids: [{
+ bidder: 'improvedigital',
+ params: {
+ placementId:1053689,
+ keyValues: {
+ testKey: ["testValue"]
+ }
+ }
+ }]
+ }, {
+ code: 'div-gpt-ad-1499748913322-0',
+ bids: [{
+ bidder: 'improvedigital',
+ params: {
+ placementId:1053687,
+ size: {
+ w:300,
+ h:300
+ }
+ }
+ }]
+ }];
+```
\ No newline at end of file
diff --git a/test/spec/modules/improvedigitalBidAdapter_spec.js b/test/spec/modules/improvedigitalBidAdapter_spec.js
index 5b0a9d37d571..750eecc2a7d0 100644
--- a/test/spec/modules/improvedigitalBidAdapter_spec.js
+++ b/test/spec/modules/improvedigitalBidAdapter_spec.js
@@ -1,599 +1,313 @@
-describe('improvedigital adapter tests', function () {
- const expect = require('chai').expect;
- const Adapter = require('modules/improvedigitalBidAdapter');
- const bidmanager = require('src/bidmanager');
- const adloader = require('src/adloader');
- const constants = require('src/constants.json');
- var bidfactory = require('src/bidfactory');
- var utils = require('src/utils.js');
-
- var improveDigitalAdapter,
- sandbox,
- bidsRequestedOriginal;
+import { expect } from 'chai';
+import { ImproveDigitalAdServerJSClient, spec } from 'modules/improvedigitalBidAdapter';
+import { userSync } from 'src/userSync';
+
+describe('Improve Digital Adapter Tests', function () {
+ let idClient = new ImproveDigitalAdServerJSClient('hb');
+
+ const METHOD = 'GET';
+ const URL = '//ad.360yield.com/hb';
+ const PARAM_PREFIX = 'jsonp=';
const simpleBidRequest = {
- bidderCode: 'improvedigital',
- bids: [
- {
- bidId: '1a2b3c',
- placementCode: 'placement1',
- params: {
- placementId: 1012544
- }
- }
- ]
+ bidder: 'improvedigital',
+ params: {
+ placementId: 1053688
+ },
+ adUnitCode: 'div-gpt-ad-1499748733608-0',
+ transactionId: 'f183e871-fbed-45f0-a427-c8a63c4c01eb',
+ bidId: '33e9500b21129f',
+ bidderRequestId: '2772c1e566670b',
+ auctionId: '192721e36a0239'
};
const simpleSmartTagBidRequest = {
- bidderCode: 'improvedigital',
- bids: [
- {
- bidId: '1a2b3c',
- placementCode: 'placement1',
- params: {
- publisherId: 1032,
- placementKey: 'data_team_test_hb_smoke_test'
- }
- }
- ]
+ bidder: 'improvedigital',
+ bidId: '1a2b3c',
+ placementCode: 'placement1',
+ params: {
+ publisherId: 1032,
+ placementKey: 'data_team_test_hb_smoke_test'
+ }
};
- const keyValueBidRequest = {
- bidderCode: 'improvedigital',
- bids: [
- {
- bidId: '1a2b3c',
- placementCode: 'placement1',
- params: {
- placementId: 1012546,
- keyValues: {
- hbkv: ['01']
- }
- }
- }
- ]
- };
+ describe('isBidRequestValid', () => {
+ it('should return false when no bid', () => {
+ expect(spec.isBidRequestValid()).to.equal(false);
+ });
- const sizeBidRequest = {
- bidderCode: 'improvedigital',
- bids: [
- {
- bidId: '1a2b3c',
- placementCode: 'placement1',
- params: {
- placementId: 1012545,
- size: {
- w: 800,
- h: 600
- }
- }
- }
- ]
- };
+ it('should return false when no bid.params', () => {
+ let bid = {};
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
- const twoAdSlots = {
- bidderCode: 'improvedigital',
- bids: [
- {
- bidId: '1a2b3c',
- placementCode: 'placement1',
- params: {
- placementId: 1012544,
- }
- },
- {
- bidId: '4d5e6f',
- placementCode: 'placement2',
- params: {
- placementId: 1012545,
- size: {
- w: 800,
- h: 600
- }
- }
- }
- ]
- };
+ it('should return false when both placementId and placementKey + publisherId are missing', () => {
+ let bid = { 'params': {} };
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
- const threeAdSlots = {
- bidderCode: 'improvedigital',
- bids: [
- {
- bidId: '1a2b3c',
- placementCode: 'placement1',
+ it('should return false when only one of placementKey and publisherId is present', () => {
+ let bid = {
params: {
- placementId: 1012544,
+ publisherId: 1234
}
- },
- {
- bidId: '4d5e6f',
- placementCode: 'placement2',
+ };
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ bid = {
params: {
- placementId: 1012545,
- size: {
- w: 800,
- h: 600
- }
+ placementKey: 'xyz'
}
- },
- {
- bidId: '7g8h9i',
- placementCode: 'placement3',
- params: {
- placementId: 1012546,
- keyValues: {
- hbkv: ['01']
- }
- }
- }
- ]
- };
+ };
+ expect(spec.isBidRequestValid(bid)).to.equal(false);
+ });
- const badRequest1 = {
- bidderCode: 'improvedigital',
- bids: [
- {
- bidId: '1a2b3c',
- placementCode: 'placement1',
- params: {
- unknownId: 123456
- }
- }
- ]
- };
+ it('should return true when placementId is passed', () => {
+ let bid = { 'params': {} };
+ expect(spec.isBidRequestValid(simpleBidRequest)).to.equal(true);
+ });
- const twoAdSlotsSingleRequest = {
- bidderCode: 'improvedigital',
- bids: [
- {
- bidId: '1a2b3c',
- placementCode: 'placement1',
- params: {
- singleRequest: true,
- placementId: 1012544,
- }
- },
- {
- bidId: '4d5e6f',
- placementCode: 'placement2',
- params: {
- placementId: 1012545,
- size: {
- w: 800,
- h: 600
- }
+ it('should return true when both placementKey and publisherId are passed', () => {
+ let bid = { 'params': {} };
+ expect(spec.isBidRequestValid(simpleSmartTagBidRequest)).to.equal(true);
+ });
+ });
+
+ describe('buildRequests', () => {
+ it('should make a well-formed request objects', () => {
+ const requests = spec.buildRequests([simpleBidRequest]);
+ expect(requests).to.be.an('array');
+ expect(requests.length).to.equal(1);
+
+ const request = requests[0];
+ expect(request.method).to.equal(METHOD);
+ expect(request.url).to.equal(URL);
+ expect(request.data.substring(0, PARAM_PREFIX.length)).to.equal(PARAM_PREFIX);
+
+ const params = JSON.parse(request.data.substring(PARAM_PREFIX.length));
+ expect(params.bid_request).to.be.an('object');
+ expect(params.bid_request.id).to.be.a('string');
+ expect(params.bid_request.version).to.equal(`${spec.version}-${idClient.CONSTANTS.CLIENT_VERSION}`);
+ expect(params.bid_request.imp).to.deep.equal([
+ {
+ id: '33e9500b21129f',
+ pid: 1053688,
+ tid: 'f183e871-fbed-45f0-a427-c8a63c4c01eb',
+ banner: {}
}
- }
- ]
- };
+ ]);
+ });
- const simpleResponse = {
- id: '701903620',
- site_id: 191642,
- bid: [
- {
- price: 1.85185185185185,
- lid: 268514,
- advid: '5279',
- id: '1a2b3c',
- sync: [
- 'http://link',
- 'http://link2',
- 'http://link3'
- ],
- nurl: 'http://nurl',
- h: 300,
- pid: 1053687,
- crid: '422030',
- w: 300,
- cid: '99005',
- adm: 'document.writeln(\" {
+ const requests = spec.buildRequests([simpleSmartTagBidRequest]);
+ const params = JSON.parse(requests[0].data.substring(PARAM_PREFIX.length));
+ expect(params.bid_request.imp[0].pubid).to.equal(1032);
+ expect(params.bid_request.imp[0].pkey).to.equal('data_team_test_hb_smoke_test');
+ });
- const zeroPriceResponse = {
- id: '701903620',
- site_id: 191642,
- bid: [
- {
- price: 0,
- lid: 268514,
- advid: '5279',
- id: '1a2b3c',
- sync: [
- 'http://link',
- 'http://link2',
- 'http://link3'
- ],
- nurl: 'http://nurl',
- h: 300,
- pid: 1053687,
- crid: '422030',
- w: 300,
- cid: '99005',
- adm: 'document.writeln(\" {
+ let bidRequest = Object.assign({}, simpleBidRequest);
+ const keyValues = {
+ testKey: [
+ 'testValue'
+ ]
+ };
+ bidRequest.params.keyValues = keyValues;
+ const request = spec.buildRequests([bidRequest])[0];
+ const params = JSON.parse(request.data.substring(PARAM_PREFIX.length));
+ expect(params.bid_request.imp[0].kvw).to.deep.equal(keyValues);
+ });
- const multipleResponse = {
- id: '701903620',
- site_id: 191642,
- bid: [
- {
- price: 1.85185185185185,
- lid: 268514,
- advid: '5279',
- id: '1a2b3c',
- sync: [
- 'http://link',
- 'http://link2',
- 'http://link3'
- ],
- nurl: 'http://nurl',
- h: 300,
- pid: 1053687,
- crid: '422030',
- w: 300,
- cid: '99005',
- adm: 'document.writeln(\" {
+ let bidRequest = Object.assign({}, simpleBidRequest);
+ const size = {
w: 800,
- cid: '99005',
- adm: 'document.writeln(\" {
+ const requests = spec.buildRequests([
+ simpleBidRequest,
+ simpleSmartTagBidRequest
+ ]);
+ expect(requests).to.be.an('array');
+ expect(requests.length).to.equal(2);
+ });
+ });
+
+ describe('interpretResponse', () => {
+ const serverResponse = {
+ 'body': {
+ 'id': '687a06c541d8d1',
+ 'site_id': 191642,
+ 'bid': [
+ {
+ 'isNet': false,
+ 'id': '33e9500b21129f',
+ 'advid': '5279',
+ 'price': 1.45888594164456,
+ 'nurl': 'http://ad.360yield.com/imp_pixel?ic=wVmhKI07hCVyGC1sNdFp.6buOSiGYOw8jPyZLlcMY2RCwD4ek3Fy6.xUI7U002skGBs3objMBoNU-Frpvmb9js3NKIG0YZJgWaNdcpXY9gOXE9hY4-wxybCjVSNzhOQB-zic73hzcnJnKeoGgcfvt8fMy18-yD0aVdYWt4zbqdoITOkKNCPBEgbPFu1rcje-o7a64yZ7H3dKvtnIixXQYc1Ep86xGSBGXY6xW2KfUOMT6vnkemxO72divMkMdhR8cAuqIubbx-ZID8-xf5c9k7p6DseeBW0I8ionrlTHx.rGosgxhiFaMqtr7HiA7PBzKvPdeEYN0hQ8RYo8JzYL82hA91A3V2m9Ij6y0DfIJnnrKN8YORffhxmJ6DzwEl1zjrVFbD01bqB3Vdww8w8PQJSkKQkd313tr-atU8LS26fnBmOngEkVHwAr2WCKxuUvxHmuVBTA-Lgz7wKwMoOJCA3hFxMavVb0ZFB7CK0BUTVU6z0De92Q.FJKNCHLMbjX3vcAQ90=',
+ 'h': 290,
+ 'pid': 1053688,
+ 'sync': [
+ 'http://link1',
+ 'http://link2'
+ ],
+ 'crid': '422031',
+ 'w': 600,
+ 'cid': '99006',
+ 'adm': 'document.writeln(\"
<\\/a>\");document.writeln(\"<\\/improvedigital_ad_output_information>\");'
+ }
],
- nurl: 'http://nurl2',
- h: 600,
- pid: 1053687,
- crid: '422030',
- w: 800,
- cid: '99005',
- adm: 'document.writeln(\"
<\\/a>\");document.writeln(\"<\\/improvedigital_ad_output_information>\");'
+ }
],
- nurl: 'http://nurl2',
- h: 600,
- pid: 1053687,
- crid: '422030',
- w: 800,
- cid: '99005'
+ 'debug': ''
}
- ],
- debug: ''
- };
+ };
- const simpleResponseNoSync = {
- id: '701903620',
- site_id: 191642,
- bid: [
+ let expectedBid = [
{
- price: 1.85185185185185,
- lid: 268514,
- advid: '5279',
- id: '1a2b3c',
- sync: [],
- nurl: 'http://nurl',
- h: 300,
- pid: 1053687,
- crid: '422030',
- w: 300,
- cid: '99005',
- adm: 'document.writeln(\"',
+ 'adId': '33e9500b21129f',
+ 'creativeId': '422031',
+ 'cpm': 1.45888594164456,
+ 'currency': 'USD',
+ 'height': 290,
+ 'netRevenue': false,
+ 'requestId': '33e9500b21129f',
+ 'width': 600
}
- ]
- };
+ ];
- var randomNumber = 9876543210;
- beforeEach(() => {
- improveDigitalAdapter = new Adapter();
- sandbox = sinon.sandbox.create();
- sandbox.stub(
- utils,
- 'getUniqueIdentifierStr',
- function() {
- var retValue = randomNumber.toString();
- randomNumber++;
- return retValue;
+ let expectedTwoBids = [
+ expectedBid[0],
+ {
+ 'ad': '
',
+ 'adId': '1234',
+ 'creativeId': '422033',
+ 'cpm': 1.23,
+ 'currency': 'USD',
+ 'height': 400,
+ 'netRevenue': true,
+ 'requestId': '1234',
+ 'width': 700
}
- );
- bidsRequestedOriginal = $$PREBID_GLOBAL$$._bidsRequested;
- $$PREBID_GLOBAL$$._bidsRequested = [];
- });
+ ];
- afterEach(() => {
- sandbox.restore();
- $$PREBID_GLOBAL$$._bidsRequested = bidsRequestedOriginal;
- });
-
- describe('callBids simpleBidRequest', () => {
- beforeEach(() => {
- sandbox.stub(
- adloader,
- 'loadScript'
- );
- improveDigitalAdapter.callBids(simpleBidRequest);
+ it('should return a well-formed bid', () => {
+ const bids = spec.interpretResponse(serverResponse);
+ expect(bids).to.deep.equal(expectedBid);
});
- it('should call loadScript with correct parameters', () => {
- sinon.assert.calledOnce(adloader.loadScript);
- sinon.assert.calledWith(adloader.loadScript, 'http://ad.360yield.com/hb?jsonp=%7B%22bid_request%22%3A%7B%22id%22%3A%229876543210%22%2C%22callback%22%3A%22$$PREBID_GLOBAL$$.improveDigitalResponse%22%2C%22secure%22%3A0%2C%22version%22%3A%22' + improveDigitalAdapter.LIB_VERSION + '-' + improveDigitalAdapter.idClient.CONSTANTS.CLIENT_VERSION + '%22%2C%22imp%22%3A%5B%7B%22id%22%3A%221a2b3c%22%2C%22pid%22%3A1012544%2C%22banner%22%3A%7B%7D%7D%5D%7D%7D', null);
- });
- });
- describe('callBids simpleSmartTagBidRequest', () => {
- beforeEach(() => {
- randomNumber = 9876543210;
- sandbox.stub(
- adloader,
- 'loadScript'
- );
- improveDigitalAdapter.callBids(simpleSmartTagBidRequest);
+ it('should return two bids', () => {
+ const bids = spec.interpretResponse(serverResponseTwoBids);
+ expect(bids).to.deep.equal(expectedTwoBids);
});
- it('should call loadScript with correct parameters', () => {
- sinon.assert.calledOnce(adloader.loadScript);
- sinon.assert.calledWith(adloader.loadScript, 'http://ad.360yield.com/hb?jsonp=%7B%22bid_request%22%3A%7B%22id%22%3A%229876543210%22%2C%22callback%22%3A%22$$PREBID_GLOBAL$$.improveDigitalResponse%22%2C%22secure%22%3A0%2C%22version%22%3A%22' + improveDigitalAdapter.LIB_VERSION + '-' + improveDigitalAdapter.idClient.CONSTANTS.CLIENT_VERSION + '%22%2C%22imp%22%3A%5B%7B%22id%22%3A%221a2b3c%22%2C%22pubid%22%3A1032%2C%22pkey%22%3A%22data_team_test_hb_smoke_test%22%2C%22banner%22%3A%7B%7D%7D%5D%7D%7D', null);
- });
- });
- describe('callBids keyValueBidRequest', () => {
- beforeEach(() => {
- randomNumber = 9876543210;
- sandbox.stub(
- adloader,
- 'loadScript'
- );
- improveDigitalAdapter.callBids(keyValueBidRequest);
- });
- it('should call loadScript with correct parameters', () => {
- sinon.assert.calledOnce(adloader.loadScript);
- sinon.assert.calledWith(adloader.loadScript, 'http://ad.360yield.com/hb?jsonp=%7B%22bid_request%22%3A%7B%22id%22%3A%229876543210%22%2C%22callback%22%3A%22$$PREBID_GLOBAL$$.improveDigitalResponse%22%2C%22secure%22%3A0%2C%22version%22%3A%22' + improveDigitalAdapter.LIB_VERSION + '-' + improveDigitalAdapter.idClient.CONSTANTS.CLIENT_VERSION + '%22%2C%22imp%22%3A%5B%7B%22id%22%3A%221a2b3c%22%2C%22pid%22%3A1012546%2C%22kvw%22%3A%7B%22hbkv%22%3A%5B%2201%22%5D%7D%2C%22banner%22%3A%7B%7D%7D%5D%7D%7D', null);
+ it('should register user syncs', () => {
+ const registerSyncSpy = sinon.spy(userSync, 'registerSync');
+ const bids = spec.interpretResponse(serverResponse);
+ expect(registerSyncSpy.withArgs('image', 'improvedigital', 'http://link1').calledOnce).to.equal(true);
+ expect(registerSyncSpy.withArgs('image', 'improvedigital', 'http://link2').calledOnce).to.equal(true);
});
- });
- describe('callBids sizeBidRequest', () => {
- beforeEach(() => {
- randomNumber = 9876543210;
- sandbox.stub(
- adloader,
- 'loadScript'
- );
- improveDigitalAdapter.callBids(sizeBidRequest);
- });
- it('should call loadScript with correct parameters', () => {
- sinon.assert.calledOnce(adloader.loadScript);
- sinon.assert.calledWith(adloader.loadScript, 'http://ad.360yield.com/hb?jsonp=%7B%22bid_request%22%3A%7B%22id%22%3A%229876543210%22%2C%22callback%22%3A%22$$PREBID_GLOBAL$$.improveDigitalResponse%22%2C%22secure%22%3A0%2C%22version%22%3A%22' + improveDigitalAdapter.LIB_VERSION + '-' + improveDigitalAdapter.idClient.CONSTANTS.CLIENT_VERSION + '%22%2C%22imp%22%3A%5B%7B%22id%22%3A%221a2b3c%22%2C%22pid%22%3A1012545%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A600%7D%7D%5D%7D%7D', null);
- });
- });
+ it('should set dealId correctly', () => {
+ let response = JSON.parse(JSON.stringify(serverResponse));
+ let bids;
- describe('callBids twoAdSlots', () => {
- beforeEach(() => {
- randomNumber = 9876543210;
- sandbox.stub(
- adloader,
- 'loadScript'
- );
- improveDigitalAdapter.callBids(twoAdSlots);
- });
- it('should call loadScript twice with correct parameters', () => {
- sinon.assert.calledTwice(adloader.loadScript);
- sinon.assert.calledWith(adloader.loadScript, 'http://ad.360yield.com/hb?jsonp=%7B%22bid_request%22%3A%7B%22id%22%3A%229876543210%22%2C%22callback%22%3A%22$$PREBID_GLOBAL$$.improveDigitalResponse%22%2C%22secure%22%3A0%2C%22version%22%3A%22' + improveDigitalAdapter.LIB_VERSION + '-' + improveDigitalAdapter.idClient.CONSTANTS.CLIENT_VERSION + '%22%2C%22imp%22%3A%5B%7B%22id%22%3A%221a2b3c%22%2C%22pid%22%3A1012544%2C%22banner%22%3A%7B%7D%7D%5D%7D%7D', null);
- sinon.assert.calledWith(adloader.loadScript, 'http://ad.360yield.com/hb?jsonp=%7B%22bid_request%22%3A%7B%22id%22%3A%229876543211%22%2C%22callback%22%3A%22$$PREBID_GLOBAL$$.improveDigitalResponse%22%2C%22secure%22%3A0%2C%22version%22%3A%22' + improveDigitalAdapter.LIB_VERSION + '-' + improveDigitalAdapter.idClient.CONSTANTS.CLIENT_VERSION + '%22%2C%22imp%22%3A%5B%7B%22id%22%3A%224d5e6f%22%2C%22pid%22%3A1012545%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A600%7D%7D%5D%7D%7D', null);
- });
- });
+ response.body.bid[0].lid = 'xyz';
+ bids = spec.interpretResponse(response);
+ expect(bids[0].dealId).to.not.exist;
- describe('callBids threeAdSlots', () => {
- beforeEach(() => {
- randomNumber = 9876543210;
- sandbox.stub(
- adloader,
- 'loadScript'
- );
- improveDigitalAdapter.callBids(threeAdSlots);
- });
- it('should call loadScript thrice with correct parameters', () => {
- sinon.assert.calledThrice(adloader.loadScript);
- sinon.assert.calledWith(adloader.loadScript, 'http://ad.360yield.com/hb?jsonp=%7B%22bid_request%22%3A%7B%22id%22%3A%229876543210%22%2C%22callback%22%3A%22$$PREBID_GLOBAL$$.improveDigitalResponse%22%2C%22secure%22%3A0%2C%22version%22%3A%22' + improveDigitalAdapter.LIB_VERSION + '-' + improveDigitalAdapter.idClient.CONSTANTS.CLIENT_VERSION + '%22%2C%22imp%22%3A%5B%7B%22id%22%3A%221a2b3c%22%2C%22pid%22%3A1012544%2C%22banner%22%3A%7B%7D%7D%5D%7D%7D', null);
- sinon.assert.calledWith(adloader.loadScript, 'http://ad.360yield.com/hb?jsonp=%7B%22bid_request%22%3A%7B%22id%22%3A%229876543211%22%2C%22callback%22%3A%22$$PREBID_GLOBAL$$.improveDigitalResponse%22%2C%22secure%22%3A0%2C%22version%22%3A%22' + improveDigitalAdapter.LIB_VERSION + '-' + improveDigitalAdapter.idClient.CONSTANTS.CLIENT_VERSION + '%22%2C%22imp%22%3A%5B%7B%22id%22%3A%224d5e6f%22%2C%22pid%22%3A1012545%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A600%7D%7D%5D%7D%7D', null);
- sinon.assert.calledWith(adloader.loadScript, 'http://ad.360yield.com/hb?jsonp=%7B%22bid_request%22%3A%7B%22id%22%3A%229876543212%22%2C%22callback%22%3A%22$$PREBID_GLOBAL$$.improveDigitalResponse%22%2C%22secure%22%3A0%2C%22version%22%3A%22' + improveDigitalAdapter.LIB_VERSION + '-' + improveDigitalAdapter.idClient.CONSTANTS.CLIENT_VERSION + '%22%2C%22imp%22%3A%5B%7B%22id%22%3A%227g8h9i%22%2C%22pid%22%3A1012546%2C%22kvw%22%3A%7B%22hbkv%22%3A%5B%2201%22%5D%7D%2C%22banner%22%3A%7B%7D%7D%5D%7D%7D', null);
- });
- });
+ response.body.bid[0].lid = 268515;
+ bids = spec.interpretResponse(response);
+ expect(bids[0].dealId).to.equal(268515);
- describe('callBids bad request 1', () => {
- beforeEach(() => {
- sandbox.stub(
- adloader,
- 'loadScript'
- );
- improveDigitalAdapter.callBids(badRequest1);
+ response.body.bid[0].lid = {
+ 1: 268515
+ };
+ bids = spec.interpretResponse(response);
+ expect(bids[0].dealId).to.equal(268515);
});
- it('should not call loadScript', () => {
- sinon.assert.notCalled(adloader.loadScript);
- });
- });
- describe('callBids twoAdSlotsSingleRequest', () => {
- beforeEach(() => {
- randomNumber = 9876543210;
- sandbox.stub(
- adloader,
- 'loadScript'
- );
- improveDigitalAdapter.callBids(twoAdSlotsSingleRequest);
+ it('should set currency', () => {
+ let response = JSON.parse(JSON.stringify(serverResponse));
+ response.body.bid[0].currency = 'eur';
+ const bids = spec.interpretResponse(response);
+ expect(bids[0].currency).to.equal('EUR');
});
- it('should call loadScript twice with correct parameters', () => {
- sinon.assert.calledOnce(adloader.loadScript);
- sinon.assert.calledWith(adloader.loadScript, 'http://ad.360yield.com/hb?jsonp=%7B%22bid_request%22%3A%7B%22id%22%3A%229876543210%22%2C%22callback%22%3A%22$$PREBID_GLOBAL$$.improveDigitalResponse%22%2C%22secure%22%3A0%2C%22version%22%3A%22' + improveDigitalAdapter.LIB_VERSION + '-' + improveDigitalAdapter.idClient.CONSTANTS.CLIENT_VERSION + '%22%2C%22imp%22%3A%5B%7B%22id%22%3A%221a2b3c%22%2C%22pid%22%3A1012544%2C%22banner%22%3A%7B%7D%7D%2C%7B%22id%22%3A%224d5e6f%22%2C%22pid%22%3A1012545%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A600%7D%7D%5D%7D%7D', null);
- });
- });
- describe('improveDigitalResponse no response', () => {
- beforeEach(() => {
- sandbox.stub(
- bidmanager,
- 'addBidResponse'
- );
- $$PREBID_GLOBAL$$._bidsRequested.push(simpleBidRequest);
- improveDigitalAdapter.callBids(simpleBidRequest);
- $$PREBID_GLOBAL$$.improveDigitalResponse([]);
- });
- it('should not call bidmanager.addBidResponse', () => {
- sinon.assert.notCalled(bidmanager.addBidResponse);
- });
- });
-
- describe('improveDigitalResponse simpleResponse', () => {
- beforeEach(() => {
- sandbox.stub(
- bidmanager,
- 'addBidResponse'
- );
- $$PREBID_GLOBAL$$._bidsRequested.push(simpleBidRequest);
- improveDigitalAdapter.callBids(simpleBidRequest);
- $$PREBID_GLOBAL$$.improveDigitalResponse(simpleResponse);
- });
- it('should call bidmanager.addBidResponse once with correct parameters', () => {
- sinon.assert.calledOnce(bidmanager.addBidResponse);
- sinon.assert.calledWith(bidmanager.addBidResponse, 'placement1', sinon.match({bidderCode: 'improvedigital', width: 300, height: 300, statusMessage: 'Bid available', ad: '
', cpm: 1.85185185185185, adId: '1a2b3c'}));
- });
- });
+ it('should return empty array for bad response or no price', () => {
+ let response = JSON.parse(JSON.stringify(serverResponse));
+ let bids;
- describe('improveDigitalResponse zero bid', () => {
- beforeEach(() => {
- randomNumber = 1111111111;
- sandbox.stub(
- bidmanager,
- 'addBidResponse'
- );
- $$PREBID_GLOBAL$$._bidsRequested.push(simpleBidRequest);
- improveDigitalAdapter.callBids(simpleBidRequest);
- $$PREBID_GLOBAL$$.improveDigitalResponse(zeroPriceResponse);
- });
- it('should call bidmanager.addBidResponse once with correct parameters', () => {
- sinon.assert.calledOnce(bidmanager.addBidResponse);
- sinon.assert.calledWith(bidmanager.addBidResponse, 'placement1', sinon.match({bidderCode: 'improvedigital', width: 0, height: 0, statusMessage: 'Bid returned empty or error response', adId: '1a2b3c'}));
- });
- });
+ // Price missing or 0
+ response.body.bid[0].price = 0;
+ bids = spec.interpretResponse(response);
+ expect(bids).to.deep.equal([]);
+ delete response.body.bid[0].price;
+ bids = spec.interpretResponse(response);
+ expect(bids).to.deep.equal([]);
+ response.body.bid[0].price = null;
+ bids = spec.interpretResponse(response);
+ expect(bids).to.deep.equal([]);
- describe('improveDigitalResponse multipleResponseWithOneNoBid', () => {
- beforeEach(() => {
- randomNumber = 1111111111;
- sandbox.stub(
- bidmanager,
- 'addBidResponse'
- );
- $$PREBID_GLOBAL$$._bidsRequested.push(twoAdSlots);
- improveDigitalAdapter.callBids(twoAdSlots);
- $$PREBID_GLOBAL$$.improveDigitalResponse(multipleResponseWithOneNoBid);
- });
- it('should call bidmanager.addBidResponse once with correct parameters', () => {
- sinon.assert.calledTwice(bidmanager.addBidResponse);
- sinon.assert.calledWith(bidmanager.addBidResponse, 'placement1', sinon.match({bidderCode: 'improvedigital', width: 300, height: 300, adId: '1a2b3c', statusMessage: 'Bid available', ad: '
', cpm: 1.85185185185185}));
- sinon.assert.calledWith(bidmanager.addBidResponse, 'placement2', sinon.match({bidderCode: 'improvedigital', width: 0, height: 0, adId: '4d5e6f', statusMessage: 'Bid returned empty or error response'}));
- });
- });
+ // errorCode present
+ response = JSON.parse(JSON.stringify(serverResponse));
+ response.body.bid[0].errorCode = undefined;
+ bids = spec.interpretResponse(response);
+ expect(bids).to.deep.equal([]);
- describe('improveDigitalResponse multipleInvalidResponses', () => {
- beforeEach(() => {
- randomNumber = 1111111111;
- sandbox.stub(
- bidmanager,
- 'addBidResponse'
- );
- $$PREBID_GLOBAL$$._bidsRequested.push(twoAdSlots);
- improveDigitalAdapter.callBids(twoAdSlots);
- $$PREBID_GLOBAL$$.improveDigitalResponse(multipleInvalidResponses);
- });
- it('should call bidmanager.addBidResponse twice both with invalid', () => {
- sinon.assert.calledTwice(bidmanager.addBidResponse);
- sinon.assert.calledWith(bidmanager.addBidResponse, 'placement1', sinon.match({bidderCode: 'improvedigital', width: 0, height: 0, adId: '1a2b3c', statusMessage: 'Bid returned empty or error response'}));
- sinon.assert.calledWith(bidmanager.addBidResponse, 'placement2', sinon.match({bidderCode: 'improvedigital', width: 0, height: 0, adId: '4d5e6f', statusMessage: 'Bid returned empty or error response'}));
+ // Adm missing or bad
+ response = JSON.parse(JSON.stringify(serverResponse));
+ delete response.body.bid[0].adm;
+ bids = spec.interpretResponse(response);
+ expect(bids).to.deep.equal([]);
+ response.body.bid[0].adm = null;
+ bids = spec.interpretResponse(response);
+ expect(bids).to.deep.equal([]);
+ response.body.bid[0].adm = 1234;
+ bids = spec.interpretResponse(response);
+ expect(bids).to.deep.equal([]);
+ response.body.bid[0].adm = {};
+ bids = spec.interpretResponse(response);
+ expect(bids).to.deep.equal([]);
});
- });
- describe('improveDigitalResponse simpleResponseNoSync', () => {
- beforeEach(() => {
- sandbox.stub(
- bidmanager,
- 'addBidResponse'
- );
- $$PREBID_GLOBAL$$._bidsRequested.push(simpleBidRequest);
- improveDigitalAdapter.callBids(simpleBidRequest);
- $$PREBID_GLOBAL$$.improveDigitalResponse(simpleResponseNoSync);
- });
- it('should call bidmanager.addBidResponse once with correct parameters', () => {
- sinon.assert.calledOnce(bidmanager.addBidResponse);
- sinon.assert.calledWith(bidmanager.addBidResponse, 'placement1', sinon.match({bidderCode: 'improvedigital', width: 300, height: 300, statusMessage: 'Bid available', ad: '
', cpm: 1.85185185185185, adId: '1a2b3c'}));
+ it('should set netRevenue', () => {
+ let response = JSON.parse(JSON.stringify(serverResponse));
+ response.body.bid[0].isNet = true;
+ const bids = spec.interpretResponse(response);
+ expect(bids[0].netRevenue).to.equal(true);
});
});
});