Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
* 'master' of https://github.com/prebid/Prebid.js:
  Added YIELDONE Bid Adapter for Prebid.js 1.0 (prebid#1900)
  XDomainRequest.send exception fix (prebid#1942)
  use same adUnits copy for s2s in callBids that we made in makeBidRequests (prebid#1940)
  • Loading branch information
m.sorochuk committed Dec 13, 2017
2 parents cee6390 + 93d33ca commit 6d94987
Show file tree
Hide file tree
Showing 6 changed files with 409 additions and 2 deletions.
71 changes: 71 additions & 0 deletions modules/yieldoneBidAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import * as utils from 'src/utils';
import {config} from 'src/config';
import {registerBidder} from 'src/adapters/bidderFactory';

const BIDDER_CODE = 'yieldone';
const ENDPOINT_URL = '//y.one.impact-ad.jp/h_bid';

export const spec = {
code: BIDDER_CODE,
aliases: ['y1'],
isBidRequestValid: function(bid) {
return !!(bid.params.placementId);
},
buildRequests: function(validBidRequests) {
return validBidRequests.map(bidRequest => {
const params = bidRequest.params;
const sizes = utils.parseSizesInput(bidRequest.sizes)[0];
const width = sizes.split('x')[0];
const height = sizes.split('x')[1];
const placementId = params.placementId;
const cb = Math.floor(Math.random() * 99999999999);
const referrer = encodeURIComponent(utils.getTopWindowUrl());
const bidId = bidRequest.bidId;
const payload = {
v: 'hb1',
p: placementId,
w: width,
h: height,
cb: cb,
r: referrer,
uid: bidId,
t: 'i'
};
return {
method: 'GET',
url: ENDPOINT_URL,
data: payload,
}
});
},
interpretResponse: function(serverResponse, bidRequest) {
const bidResponses = [];
const response = serverResponse.body;
const crid = response.crid || 0;
const width = response.width || 0;
const height = response.height || 0;
const cpm = response.cpm * 1000 || 0;
if (width !== 0 && height !== 0 && cpm !== 0 && crid !== 0) {
const dealId = response.dealid || '';
const currency = response.currency || 'JPY';
const netRevenue = (response.netRevenue === undefined) ? true : response.netRevenue;
const referrer = utils.getTopWindowUrl();
const bidResponse = {
requestId: bidRequest.data.uid,
cpm: cpm,
width: response.width,
height: response.height,
creativeId: crid,
dealId: dealId,
currency: currency,
netRevenue: netRevenue,
ttl: config.getConfig('_bidderTimeout'),
referrer: referrer,
ad: response.adTag
};
bidResponses.push(bidResponse);
}
return bidResponses;
}
}
registerBidder(spec);
27 changes: 27 additions & 0 deletions modules/yieldoneBidAdapter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Overview

```
Module Name: YIELDONE Bidder Adapter
Module Type: Bidder Adapter
Maintainer: [email protected]
```

# Description

Connect to YIELDONE for bids.

THE YIELDONE adapter requires setup and approval from the Rubicon Project team. Please reach out to your account team or [email protected] for more information.

# Test Parameters
```
var adUnits = [{
code: 'banner-ad-div',
sizes: [[300, 250]],
bids: [{
bidder: 'yieldone',
params: {
placementId: '44082'
}
}]
}];
```
4 changes: 3 additions & 1 deletion src/adaptermanager.js
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ exports.makeBidRequests = function(adUnits, auctionStart, auctionId, cbTimeout,
auctionId,
bidderRequestId,
tid,
adUnitsS2SCopy,
bids: getBids({bidderCode, auctionId, bidderRequestId, 'adUnits': adUnitsS2SCopy, labels}),
auctionStart: auctionStart,
timeout: _s2sConfig.timeout,
Expand Down Expand Up @@ -227,9 +228,10 @@ exports.callBids = (adUnits, bidRequests, addBidResponse, doneCb) => {
let adaptersServerSide = _s2sConfig.bidders;
const s2sAdapter = _bidderRegistry[_s2sConfig.adapter];
let tid = serverBidRequests[0].tid;
let adUnitsS2SCopy = serverBidRequests[0].adUnitsS2SCopy;

if (s2sAdapter) {
let s2sBidRequest = {tid, 'ad_units': getAdUnitCopyForPrebidServer(adUnits)};
let s2sBidRequest = {tid, 'ad_units': adUnitsS2SCopy};
if (s2sBidRequest.ad_units.length) {
let doneCbs = serverBidRequests.map(bidRequest => {
bidRequest.doneCbCallCount = 0;
Expand Down
6 changes: 5 additions & 1 deletion src/ajax.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,11 @@ export function ajaxBuilder(timeout = 3000) {
}
x.setRequestHeader('Content-Type', options.contentType || 'text/plain');
}
x.send(method === 'POST' && data);
if (method === 'POST' && data) {
x.send(data);
} else {
x.send();
}
} catch (error) {
utils.logError('xhr construction', error);
}
Expand Down
147 changes: 147 additions & 0 deletions test/spec/modules/yieldoneBidAdapter_spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
import { expect } from 'chai';
import { spec } from 'modules/yieldoneBidAdapter';
import { newBidder } from 'src/adapters/bidderFactory';

const ENDPOINT = '//y.one.impact-ad.jp/h_bid';

describe('yieldoneBidAdapter', function() {
const adapter = newBidder(spec);

describe('isBidRequestValid', () => {
let bid = {
'bidder': 'yieldone',
'params': {
placementId: '44082'
},
'adUnitCode': 'adunit-code',
'sizes': [
[300, 250]
],
'bidId': '23beaa6af6cdde',
'bidderRequestId': '19c0c1efdf37e7',
'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf1',
};

it('should return true when required params found', () => {
expect(spec.isBidRequestValid(bid)).to.equal(true);
});

it('should return false when placementId not passed correctly', () => {
bid.params.placementId = '';
expect(spec.isBidRequestValid(bid)).to.equal(false);
});

it('should return false when require params are not passed', () => {
let bid = Object.assign({}, bid);
bid.params = {};
expect(spec.isBidRequestValid(bid)).to.equal(false);
});
});

describe('buildRequests', () => {
let bidRequests = [
{
'bidder': 'yieldone',
'params': {
placementId: '44082'
},
'adUnitCode': 'adunit-code1',
'sizes': [
[300, 250]
],
'bidId': '23beaa6af6cdde',
'bidderRequestId': '19c0c1efdf37e7',
'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf1',
},
{
'bidder': 'yieldone',
'params': {
placementId: '44337'
},
'adUnitCode': 'adunit-code2',
'sizes': [
[300, 250]
],
'bidId': '382091349b149f"',
'bidderRequestId': '"1f9c98192de251"',
'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf1',
}
];

const request = spec.buildRequests(bidRequests);

it('sends bid request to our endpoint via GET', () => {
expect(request[0].method).to.equal('GET');
expect(request[1].method).to.equal('GET');
});

it('attaches source and version to endpoint URL as query params', () => {
expect(request[0].url).to.equal(ENDPOINT);
expect(request[1].url).to.equal(ENDPOINT);
});
});

describe('interpretResponse', () => {
let bidRequest = [
{
'method': 'GET',
'url': '//y.one.impact-ad.jp/h_bid',
'data': {
'v': 'hb1',
'p': '44082',
'w': '300',
'h': '250',
'cb': 12892917383,
'r': 'http%3A%2F%2Flocalhost%3A9876%2F%3Fid%3D74552836',
'uid': '23beaa6af6cdde',
't': 'i'
}
}
];

let serverResponse = {
body: {
'adTag': '<!-- adtag -->',
'cpm': 0.0536616,
'crid': '2494768',
'statusMessage': 'Bid available',
'uid': '23beaa6af6cdde',
'width': 300,
'height': 250
}
};

it('should get the correct bid response', () => {
let expectedResponse = [{
'requestId': '23beaa6af6cdde',
'cpm': 53.6616,
'width': 300,
'height': 250,
'creativeId': '2494768',
'dealId': '',
'currency': 'JPY',
'netRevenue': true,
'ttl': 3000,
'referrer': '',
'ad': '<!-- adtag -->'
}];
let result = spec.interpretResponse(serverResponse, bidRequest[0]);
expect(Object.keys(result)).to.deep.equal(Object.keys(expectedResponse));
});

it('handles empty bid response', () => {
let response = {
body: {
'uid': '2c0b634db95a01',
'height': 0,
'crid': '',
'statusMessage': 'Bid returned empty or error response',
'width': 0,
'cpm': 0
}
};
let result = spec.interpretResponse(response, bidRequest[0]);
expect(result.length).to.equal(0);
});
});
});
Loading

0 comments on commit 6d94987

Please sign in to comment.