Skip to content

Commit 14bf872

Browse files
devcollectcentmike-chowla
authored andcommitted
New bidder adapter for collectcent (#3365)
* Create collectcentBidAdapter.js New bider adapter for collectcent * Create collectcentBidAdapter.md Description and integration example * Create collectcentBidAdapter_spec.js Collectcent bidder adapter tests added * Update collectcentBidAdapter_spec.js edit * Update collectcentBidAdapter.js Used bidderRequest.refererInfo.referer instead of window.location * Update collectcentBidAdapter.js * Update collectcentBidAdapter.js Rename URL to URL_MULTI
1 parent 65afce6 commit 14bf872

File tree

3 files changed

+238
-0
lines changed

3 files changed

+238
-0
lines changed

modules/collectcentBidAdapter.js

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import { registerBidder } from 'src/adapters/bidderFactory';
2+
import { BANNER, NATIVE, VIDEO } from 'src/mediaTypes';
3+
import * as utils from 'src/utils';
4+
5+
const BIDDER_CODE = 'collectcent';
6+
const URL_MULTI = '//publishers.motionspots.com/?c=o&m=multi';
7+
const URL_SYNC = '//publishers.motionspots.com/?c=o&m=cookie';
8+
9+
export const spec = {
10+
code: BIDDER_CODE,
11+
supportedMediaTypes: [BANNER, VIDEO, NATIVE],
12+
13+
/**
14+
* Determines whether or not the given bid request is valid.
15+
*
16+
* @param {object} bid The bid to validate.
17+
* @return boolean True if this is a valid bid, and false otherwise.
18+
*/
19+
isBidRequestValid: (bid) => {
20+
return Boolean(bid.bidId &&
21+
bid.params &&
22+
!isNaN(bid.params.placementId) &&
23+
spec.supportedMediaTypes.indexOf(bid.params.traffic) !== -1
24+
);
25+
},
26+
27+
/**
28+
* Make a server request from the list of BidRequests.
29+
*
30+
* @param {BidRequest[]} validBidRequests A non-empty list of valid bid requests that should be sent to the Server.
31+
* @return ServerRequest Info describing the request to the server.
32+
*/
33+
buildRequests: (validBidRequests, bidderRequest) => {
34+
let winTop;
35+
try {
36+
winTop = window.top;
37+
} catch (e) {
38+
utils.logMessage(e);
39+
winTop = window;
40+
};
41+
42+
const placements = [];
43+
const location = bidderRequest ? new URL(bidderRequest.refererInfo.referer) : winTop.location;
44+
const request = {
45+
'secure': (location.protocol === 'https:') ? 1 : 0,
46+
'deviceWidth': winTop.screen.width,
47+
'deviceHeight': winTop.screen.height,
48+
'host': location.host,
49+
'page': location.pathname,
50+
'placements': placements
51+
};
52+
53+
for (let i = 0; i < validBidRequests.length; i++) {
54+
const bid = validBidRequests[i];
55+
const params = bid.params;
56+
placements.push({
57+
placementId: params.placementId,
58+
bidId: bid.bidId,
59+
sizes: bid.sizes,
60+
traffic: params.traffic
61+
});
62+
}
63+
return {
64+
method: 'POST',
65+
url: URL_MULTI,
66+
data: request
67+
};
68+
},
69+
70+
/**
71+
* Unpack the response from the server into a list of bids.
72+
*
73+
* @param {*} serverResponse A successful response from the server.
74+
* @return {Bid[]} An array of bids which were nested inside the server.
75+
*/
76+
interpretResponse: (serverResponse) => {
77+
try {
78+
serverResponse = serverResponse.body;
79+
} catch (e) {
80+
utils.logMessage(e);
81+
};
82+
return serverResponse;
83+
},
84+
85+
getUserSyncs: () => {
86+
return [{
87+
type: 'image',
88+
url: URL_SYNC
89+
}];
90+
}
91+
};
92+
93+
registerBidder(spec);

modules/collectcentBidAdapter.md

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Overview
2+
3+
```
4+
Module Name: Collectcent SSP Bidder Adapter
5+
Module Type: Bidder Adapter
6+
Maintainer: [email protected]
7+
```
8+
9+
# Description
10+
11+
Module that connects to Collectcent SSP demand sources
12+
13+
# Test Parameters
14+
```
15+
var adUnits = [{
16+
code: 'placementCode',
17+
sizes: [[300, 250]],
18+
bids: [{
19+
bidder: 'collectcent',
20+
params: {
21+
placementId: 0,
22+
traffic: 'banner'
23+
}
24+
}]
25+
}
26+
];
27+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
import {expect} from 'chai';
2+
import {spec} from '../../../modules/collectcentBidAdapter';
3+
4+
describe('Collectcent', function () {
5+
let bid = {
6+
bidId: '2dd581a2b6281d',
7+
bidder: 'collectcent',
8+
bidderRequestId: '145e1d6a7837c9',
9+
params: {
10+
placementId: 123,
11+
traffic: 'banner'
12+
},
13+
placementCode: 'placement_0',
14+
auctionId: '74f78609-a92d-4cf1-869f-1b244bbfb5d2',
15+
sizes: [[300, 250]],
16+
transactionId: '3bb2f6da-87a6-4029-aeb0-bfe951372e62'
17+
};
18+
19+
describe('isBidRequestValid', function () {
20+
it('Should return true when placementId can be cast to a number', function () {
21+
expect(spec.isBidRequestValid(bid)).to.be.true;
22+
});
23+
it('Should return false when placementId is not a number', function () {
24+
bid.params.placementId = 'aaa';
25+
expect(spec.isBidRequestValid(bid)).to.be.false;
26+
});
27+
});
28+
29+
describe('buildRequests', function () {
30+
let serverRequest = spec.buildRequests([bid]);
31+
it('Creates a ServerRequest object with method, URL and data', function () {
32+
expect(serverRequest).to.exist;
33+
expect(serverRequest.method).to.exist;
34+
expect(serverRequest.url).to.exist;
35+
expect(serverRequest.data).to.exist;
36+
});
37+
it('Returns POST method', function () {
38+
expect(serverRequest.method).to.equal('POST');
39+
});
40+
it('Returns valid URL', function () {
41+
expect(serverRequest.url).to.equal('//publishers.motionspots.com/?c=o&m=multi');
42+
});
43+
it('Returns valid data if array of bids is valid', function () {
44+
let data = serverRequest.data;
45+
expect(data).to.be.an('object');
46+
expect(data).to.have.all.keys('deviceWidth', 'deviceHeight', 'secure', 'host', 'page', 'placements');
47+
expect(data.deviceWidth).to.be.a('number');
48+
expect(data.deviceHeight).to.be.a('number');
49+
expect(data.secure).to.be.within(0, 1);
50+
expect(data.host).to.be.a('string');
51+
expect(data.page).to.be.a('string');
52+
let placements = data['placements'];
53+
for (let i = 0; i < placements.length; i++) {
54+
let placement = placements[i];
55+
expect(placement).to.have.all.keys('placementId', 'bidId', 'traffic', 'sizes');
56+
expect(placement.placementId).to.be.a('number');
57+
expect(placement.bidId).to.be.a('string');
58+
expect(placement.traffic).to.be.a('string');
59+
expect(placement.sizes).to.be.an('array');
60+
}
61+
});
62+
it('Returns empty data if no valid requests are passed', function () {
63+
serverRequest = spec.buildRequests([]);
64+
let data = serverRequest.data;
65+
expect(data.placements).to.be.an('array').that.is.empty;
66+
});
67+
});
68+
describe('interpretResponse', function () {
69+
let resObject = {
70+
body: [ {
71+
requestId: '123',
72+
mediaType: 'banner',
73+
cpm: 0.3,
74+
width: 320,
75+
height: 50,
76+
ad: '<h1>Hello ad</h1>',
77+
ttl: 1000,
78+
creativeId: '123asd',
79+
netRevenue: true,
80+
currency: 'USD'
81+
} ]
82+
};
83+
let serverResponses = spec.interpretResponse(resObject);
84+
it('Returns an array of valid server responses if response object is valid', function () {
85+
expect(serverResponses).to.be.an('array').that.is.not.empty;
86+
for (let i = 0; i < serverResponses.length; i++) {
87+
let dataItem = serverResponses[i];
88+
expect(dataItem).to.have.all.keys('requestId', 'cpm', 'width', 'height', 'ad', 'ttl', 'creativeId',
89+
'netRevenue', 'currency', 'mediaType');
90+
expect(dataItem.requestId).to.be.a('string');
91+
expect(dataItem.cpm).to.be.a('number');
92+
expect(dataItem.width).to.be.a('number');
93+
expect(dataItem.height).to.be.a('number');
94+
expect(dataItem.ad).to.be.a('string');
95+
expect(dataItem.ttl).to.be.a('number');
96+
expect(dataItem.creativeId).to.be.a('string');
97+
expect(dataItem.netRevenue).to.be.a('boolean');
98+
expect(dataItem.currency).to.be.a('string');
99+
expect(dataItem.mediaType).to.be.a('string');
100+
}
101+
it('Returns an empty array if invalid response is passed', function () {
102+
serverResponses = spec.interpretResponse('invalid_response');
103+
expect(serverResponses).to.be.an('array').that.is.empty;
104+
});
105+
});
106+
});
107+
108+
describe('getUserSyncs', function () {
109+
let userSync = spec.getUserSyncs();
110+
it('Returns valid URL and `', function () {
111+
expect(userSync).to.be.an('array').with.lengthOf(1);
112+
expect(userSync[0].type).to.exist;
113+
expect(userSync[0].url).to.exist;
114+
expect(userSync[0].type).to.be.equal('image');
115+
expect(userSync[0].url).to.be.equal('//publishers.motionspots.com/?c=o&m=cookie');
116+
});
117+
});
118+
});

0 commit comments

Comments
 (0)