-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* 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
1 parent
2c7f7ed
commit d7c9350
Showing
3 changed files
with
233 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} | ||
} | ||
]; | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
}); | ||
}); | ||
}); |