Skip to content

Commit

Permalink
Update ucfunnelBidAdapter (prebid#1990)
Browse files Browse the repository at this point in the history
* Add a new ucfunnel Adapter and test page

* Add a new ucfunnel Adapter and test page

* 1. Use prebid lib in the repo to keep updated
2. Replace var with let
3. Put JSON.parse(JSON.stringify()) into try catch block

* utils.getTopWindowLocation is a function

* Change to modules from adapters

* Migrate to module design

* [Dev Fix] Remove width and height which can be got from ad unit id

* Update ucfunnelBidAdapter to fit into new spec

* Correct the endpoint. Fix the error of query string

* Add test case for ucfunnelBidAdapter

* Fix lint error

* Update version number

* Combine all checks on bid request
  • Loading branch information
RyanChouTw authored and dluxemburg committed Jul 17, 2018
1 parent a1d4b69 commit f8ebe5a
Show file tree
Hide file tree
Showing 3 changed files with 233 additions and 0 deletions.
95 changes: 95 additions & 0 deletions modules/ucfunnelBidAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import * as utils from 'src/utils';
import {registerBidder} from 'src/adapters/bidderFactory';
import { BANNER } from 'src/mediaTypes';

const VER = 'ADGENT_PREBID-2018011501';
const BID_REQUEST_BASE_URL = '//hb.aralego.com/header';
const UCFUNNEL_BIDDER_CODE = 'ucfunnel';

export const spec = {
code: UCFUNNEL_BIDDER_CODE,
supportedMediaTypes: [BANNER],
/**
* Check if the bid is a valid zone ID in either number or string form
* @param {object} bid the ucfunnel bid to validate
* @return boolean for whether or not a bid is valid
*/
isBidRequestValid: function(bid) {
return !!(bid && bid.params && bid.params.adid && typeof bid.params.adid === 'string');
},

/**
* Format the bid request object for our endpoint
* @param {BidRequest[]} bidRequests Array of ucfunnel bidders
* @return object of parameters for Prebid AJAX request
*/
buildRequests: function(validBidRequests) {
var bidRequests = [];
for (var i = 0; i < validBidRequests.length; i++) {
var bid = validBidRequests[i];

var ucfunnelUrlParams = buildUrlParams(bid);

bidRequests.push({
method: 'GET',
url: BID_REQUEST_BASE_URL,
bidRequest: bid,
data: ucfunnelUrlParams
});
}
return bidRequests;
},

/**
* Format ucfunnel responses as Prebid bid responses
* @param {ucfunnelResponseObj} ucfunnelResponse A successful response from ucfunnel.
* @return {Bid[]} An array of formatted bids.
*/
interpretResponse: function (ucfunnelResponseObj, request) {
var bidResponses = [];
var bidRequest = request.bidRequest;
var responseBody = ucfunnelResponseObj ? ucfunnelResponseObj.body : {};

bidResponses.push({
requestId: bidRequest.bidId,
cpm: responseBody.cpm || 0,
width: responseBody.width,
height: responseBody.height,
creativeId: responseBody.ad_id,
dealId: responseBody.deal || null,
currency: 'USD',
netRevenue: true,
ttl: 1000,
mediaType: BANNER,
ad: responseBody.adm
});

return bidResponses;
}
};
registerBidder(spec);

function buildUrlParams(bid) {
const host = utils.getTopWindowLocation().host;
const page = utils.getTopWindowLocation().pathname;
const refer = document.referrer;
const language = navigator.language;
const dnt = (navigator.doNotTrack == 'yes' || navigator.doNotTrack == '1' || navigator.msDoNotTrack == '1') ? 1 : 0;

let queryString = [
'ifr', '0',
'bl', language,
'je', '1',
'dnt', dnt,
'host', host,
'u', page,
'ru', refer,
'adid', utils.getBidIdParameter('adid', bid.params),
'ver', VER
];

return queryString.reduce(
(memo, curr, index) =>
index % 2 === 0 && queryString[index + 1] !== undefined ? memo + curr + '=' + encodeURIComponent(queryString[index + 1]) + '&' : memo, ''
).slice(0, -1);
}
30 changes: 30 additions & 0 deletions modules/ucfunnelBidAdapter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Overview

```
Module Name: ucfunnel Bid Adapter
Module Type: Bidder Adapter
Maintainer: ryan.chou@ucfunnel.com
```

# Description

This module connects to ucfunnel's demand sources. It supports display, and rich media formats.
ucfunnel will provide ``adid`` that are specific to your ad type.
Please reach out to ``pr@ucfunnel.com`` to set up an ucfunnel account and above ids.
Use bidder code ```ucfunnel``` for all ucfunnel traffic.

# Test Parameters

```
var adUnits = [
{
code: 'test-LERC',
sizes: [[300, 250]],
bids: [{
bidder: 'ucfunnel',
params: {
adid: "test-ad-83444226E44368D1E32E49EEBE6D29" //String - required
}
}
];
```
108 changes: 108 additions & 0 deletions test/spec/modules/ucfunnelBidAdapter_spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import { expect } from 'chai';
import { spec } from 'modules/ucfunnelBidAdapter';

const URL = '//hb.aralego.com/header';
const BIDDER_CODE = 'ucfunnel';
const validBidReq = {
bidder: BIDDER_CODE,
params: {
adid: 'test-ad-83444226E44368D1E32E49EEBE6D29'
},
sizes: [[300, 250]],
bidId: '263be71e91dd9d',
auctionId: '9ad1fa8d-2297-4660-a018-b39945054746',
};

const invalidBidReq = {
bidder: BIDDER_CODE,
params: {
adid: 123456789
},
sizes: [[300, 250]],
bidId: '263be71e91dd9d',
auctionId: '9ad1fa8d-2297-4660-a018-b39945054746'
};

const bidReq = [{
bidder: BIDDER_CODE,
params: {
adid: 'test-ad-83444226E44368D1E32E49EEBE6D29'
},
sizes: [[300, 250]],
bidId: '263be71e91dd9d',
auctionId: '9ad1fa8d-2297-4660-a018-b39945054746'
}];

const validBidRes = {
ad_id: 'ad-83444226E44368D1E32E49EEBE6D29',
adm: '<html style="height:100%"><body style="width:300px;height: 100%;padding:0;margin:0 auto;"><div style="width:100%;height:100%;display:table;"><div style="width:100%;height:100%;display:table-cell;text-align:center;vertical-align:middle;"><a href="//www.ucfunnel.com/" target="_blank"><img src="//cdn.aralego.net/ucfad/house/ucf/AdGent-300x250.jpg" width="300px" height="250px" align="middle" style="border:none"></a></div></div></body></html>',
cpm: 0.01,
height: 250,
width: 300
};

const bidResponse = validBidRes;

const bidResArray = [
validBidRes,
{
ad: '',
bidRequestId: '263be71e91dd9d',
cpm: 100,
adId: '123abc',
currency: 'USD',
netRevenue: true,
width: 300,
height: 250,
ttl: 360
},
{
ad: '<div>Hello</div>',
bidRequestId: '',
cpm: 0,
adId: '123abc',
currency: 'USD',
netRevenue: true,
width: 300,
height: 250,
ttl: 360
}
];

describe('ucfunnel Adapter', () => {
describe('request', () => {
it('should validate bid request', () => {
expect(spec.isBidRequestValid(validBidReq)).to.equal(true);
});
it('should not validate incorrect bid request', () => {
expect(spec.isBidRequestValid(invalidBidReq)).to.equal(false);
});
});
describe('build request', () => {
it('Verify bid request', () => {
const request = spec.buildRequests(bidReq);
expect(request[0].method).to.equal('GET');
expect(request[0].url).to.equal(URL);
expect(request[0].data).to.match(new RegExp(`${bidReq[0].params.adid}`));
});
});

describe('interpretResponse', () => {
it('should build bid array', () => {
const request = spec.buildRequests(bidReq);
const result = spec.interpretResponse({body: bidResponse}, request[0]);
expect(result.length).to.equal(1);
});

it('should have all relevant fields', () => {
const request = spec.buildRequests(bidReq);
const result = spec.interpretResponse({body: bidResponse}, request[0]);
const bid = result[0];

expect(bid.requestId).to.equal('263be71e91dd9d');
expect(bid.cpm).to.equal(0.01);
expect(bid.width).to.equal(300);
expect(bid.height).to.equal(250);
});
});
});

0 comments on commit f8ebe5a

Please sign in to comment.