Skip to content

Commit 703b898

Browse files
authored
Submitting Clicktripz bid adapter (#4929)
Clicktripz bid adapter - adapter - description - test
1 parent f890eb8 commit 703b898

File tree

3 files changed

+254
-0
lines changed

3 files changed

+254
-0
lines changed

modules/clicktripzBidAdapter.js

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import {logError, _each} from '../src/utils.js';
2+
import {registerBidder} from '../src/adapters/bidderFactory.js';
3+
4+
const BIDDER_CODE = 'clicktripz';
5+
const ENDPOINT_URL = 'https://www.clicktripz.com/x/prebid/v1';
6+
7+
export const spec = {
8+
code: BIDDER_CODE,
9+
aliases: ['ctz'], // short code
10+
11+
isBidRequestValid: function (bid) {
12+
if (bid && bid.params && bid.params.placementId && bid.params.siteId) {
13+
return true;
14+
}
15+
16+
return false;
17+
},
18+
19+
buildRequests: function (validBidRequests) {
20+
let bidRequests = [];
21+
22+
_each(validBidRequests, function (bid) {
23+
bidRequests.push({
24+
bidId: bid.bidId,
25+
placementId: bid.params.placementId,
26+
siteId: bid.params.siteId,
27+
sizes: bid.sizes.map(function (size) {
28+
return size.join('x')
29+
})
30+
});
31+
});
32+
return {
33+
method: 'POST',
34+
url: ENDPOINT_URL,
35+
data: bidRequests
36+
};
37+
},
38+
39+
interpretResponse: function (serverResponse) {
40+
let bidResponses = [];
41+
42+
if (serverResponse && serverResponse.body) {
43+
_each(serverResponse.body, function (bid) {
44+
if (bid.errors) {
45+
logError(bid.errors);
46+
return;
47+
}
48+
49+
const size = bid.size.split('x');
50+
bidResponses.push({
51+
requestId: bid.bidId,
52+
cpm: bid.cpm,
53+
width: size[0],
54+
height: size[1],
55+
creativeId: bid.creativeId,
56+
currency: bid.currency,
57+
netRevenue: bid.netRevenue,
58+
ttl: bid.ttl,
59+
adUrl: bid.adUrl
60+
});
61+
});
62+
}
63+
return bidResponses;
64+
}
65+
};
66+
67+
registerBidder(spec);

modules/clicktripzBidAdapter.md

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Overview
2+
3+
```
4+
Module Name: Clicktripz Bidder Adapter
5+
Module Type: Bidder Adapter
6+
Maintainer: [email protected]
7+
```
8+
9+
# Description
10+
Our module makes it easy to integrate Clicktripz demand sources into your website.
11+
12+
Supported Ad Fortmats:
13+
* Banner
14+
15+
# Test Parameters
16+
```
17+
var adUnits = [
18+
{
19+
code: 'test-div',
20+
mediaTypes: {
21+
banner: {
22+
sizes: [[300, 250], [300,600]],
23+
}
24+
},
25+
bids: [
26+
{
27+
bidder: "clicktripz",
28+
params: {
29+
placementId: '4312c63f',
30+
siteId: 'prebid',
31+
}
32+
}
33+
]
34+
}
35+
];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
import {expect} from 'chai';
2+
import {spec} from 'modules/clicktripzBidAdapter.js';
3+
4+
const ENDPOINT_URL = 'https://www.clicktripz.com/x/prebid/v1';
5+
6+
describe('clicktripzBidAdapter', function () {
7+
describe('isBidRequestValid', function () {
8+
let bid = {
9+
'bidder': 'clicktripz',
10+
'params': {
11+
placementId: 'testPlacementId',
12+
siteId: 'testSiteId'
13+
},
14+
'adUnitCode': 'adunit-code',
15+
'sizes': [
16+
[300, 250]
17+
],
18+
'bidId': '1234asdf1234',
19+
'bidderRequestId': '1234asdf1234asdf',
20+
'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf120'
21+
};
22+
23+
let bid2 = {
24+
'bidder': 'clicktripz',
25+
'params': {
26+
placementId: 'testPlacementId'
27+
},
28+
'adUnitCode': 'adunit-code',
29+
'sizes': [
30+
[300, 250]
31+
],
32+
'bidId': '1234asdf1234',
33+
'bidderRequestId': '1234asdf1234asdf',
34+
'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf120'
35+
};
36+
37+
let bid3 = {
38+
'bidder': 'clicktripz',
39+
'params': {
40+
siteId: 'testSiteId'
41+
},
42+
'adUnitCode': 'adunit-code',
43+
'sizes': [
44+
[300, 250]
45+
],
46+
'bidId': '1234asdf1234',
47+
'bidderRequestId': '1234asdf1234asdf',
48+
'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf120'
49+
};
50+
51+
it('should return true when required params found', function () {
52+
expect(spec.isBidRequestValid(bid)).to.equal(true);
53+
});
54+
55+
it('should return false when required params are NOT found', function () {
56+
expect(spec.isBidRequestValid(bid2)).to.equal(false);
57+
expect(spec.isBidRequestValid(bid3)).to.equal(false);
58+
});
59+
});
60+
61+
describe('buildRequests', function () {
62+
let validBidRequests = [{
63+
'bidder': 'clicktripz',
64+
'params': {
65+
placementId: 'testPlacementId',
66+
siteId: 'testSiteId'
67+
},
68+
'sizes': [
69+
[300, 250],
70+
[300, 300]
71+
],
72+
'bidId': '23beaa6af6cdde',
73+
'bidderRequestId': '19c0c1efdf37e7',
74+
'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf1',
75+
}, {
76+
'bidder': 'clicktripz',
77+
'params': {
78+
placementId: 'testPlacementId2',
79+
siteId: 'testSiteId2'
80+
},
81+
'sizes': [
82+
[300, 250]
83+
],
84+
'bidId': '25beaa6af6cdde',
85+
'bidderRequestId': '19c0c1efdf37e7',
86+
'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf1',
87+
}];
88+
89+
const request = spec.buildRequests(validBidRequests);
90+
it('sends bid request to our endpoint via POST', function () {
91+
expect(request.method).to.equal('POST');
92+
});
93+
it('sends bid request to our endpoint via POST', function () {
94+
expect(request.method).to.equal('POST');
95+
});
96+
97+
it('sends bid request to our endpoint at the correct URL', function () {
98+
expect(request.url).to.equal(ENDPOINT_URL);
99+
});
100+
it('sends bid request to our endpoint at the correct URL', function () {
101+
expect(request.url).to.equal(ENDPOINT_URL);
102+
});
103+
104+
it('transforms sizes into an array of strings. Pairs of concatenated sizes joined with an x', function () {
105+
expect(request.data[0].sizes.toString()).to.equal('300x250,300x300');
106+
});
107+
it('transforms sizes into an array of strings. Pairs of concatenated sizes joined with an x', function () {
108+
expect(request.data[1].sizes.toString()).to.equal('300x250');
109+
});
110+
111+
it('includes bidId, siteId, and placementId in payload', function () {
112+
expect(request.data[0].bidId).to.equal('23beaa6af6cdde');
113+
expect(request.data[0].siteId).to.equal('testSiteId');
114+
expect(request.data[0].placementId).to.equal('testPlacementId');
115+
});
116+
it('includes bidId, siteId, and placementId in payload', function () {
117+
expect(request.data[1].bidId).to.equal('25beaa6af6cdde');
118+
expect(request.data[1].siteId).to.equal('testSiteId2');
119+
expect(request.data[1].placementId).to.equal('testPlacementId2');
120+
});
121+
});
122+
123+
describe('interpretResponse', function () {
124+
let serverResponse = {
125+
body: [{
126+
'bidId': 'bid-request-id',
127+
'ttl': 120,
128+
'netRevenue': true,
129+
'size': '300x200',
130+
'currency': 'USD',
131+
'adUrl': 'https://www.clicktripz.com/n3/crane/v0/render?t=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjoiaHR0cHM6XC9cL3d3dy5jbGlja3RyaXB6LmNvbVwvY2xpY2sucGhwP2NhbXBhaWduSUQ9MTkxNTYmcHJlQ2hlY2tlZD0xJnB1Ymxpc2hlcklEPTM2MCZzZWFyY2hLZXk9N2M5MzQ0NzhlM2M1NTc3Y2EyN2ZmN2Y1NTg5N2NkMzkmc2VhcmNoRGlzcGxheVR5cGU9MSZkaXNwbGF5VHlwZT00JmNyZWF0aXZlVHlwZT1zaW5nbGUmaXNQb3BVbmRlcj0wJnBvc2l0aW9uPTEmdHlwZT0xJmNpdHk9TWFkcmlkJTJDK1NwYWluJmNoZWNrSW5EYXRlPTAzJTJGMDElMkYyMDIwJmNoZWNrT3V0RGF0ZT0wMyUyRjA1JTJGMjAyMCZndWVzdHM9MiZyb29tcz0xIn0.WBDGYr1qfkSvOuK02VpMW3iAua1E02jjDGDViFc2kaE',
132+
'creativeId': '25ef9876abc5681f153',
133+
'cpm': 50
134+
}]
135+
};
136+
it('should get the correct bid response', function () {
137+
let expectedResponse = [{
138+
'requestId': 'bid-request-id',
139+
'cpm': 50,
140+
'netRevenue': true,
141+
'width': '300',
142+
'height': '200',
143+
'creativeId': '25ef9876abc5681f153',
144+
'currency': 'USD',
145+
'adUrl': 'https://www.clicktripz.com/n3/crane/v0/render?t=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJwYXlsb2FkIjoiaHR0cHM6XC9cL3d3dy5jbGlja3RyaXB6LmNvbVwvY2xpY2sucGhwP2NhbXBhaWduSUQ9MTkxNTYmcHJlQ2hlY2tlZD0xJnB1Ymxpc2hlcklEPTM2MCZzZWFyY2hLZXk9N2M5MzQ0NzhlM2M1NTc3Y2EyN2ZmN2Y1NTg5N2NkMzkmc2VhcmNoRGlzcGxheVR5cGU9MSZkaXNwbGF5VHlwZT00JmNyZWF0aXZlVHlwZT1zaW5nbGUmaXNQb3BVbmRlcj0wJnBvc2l0aW9uPTEmdHlwZT0xJmNpdHk9TWFkcmlkJTJDK1NwYWluJmNoZWNrSW5EYXRlPTAzJTJGMDElMkYyMDIwJmNoZWNrT3V0RGF0ZT0wMyUyRjA1JTJGMjAyMCZndWVzdHM9MiZyb29tcz0xIn0.WBDGYr1qfkSvOuK02VpMW3iAua1E02jjDGDViFc2kaE',
146+
'ttl': 120
147+
}];
148+
let result = spec.interpretResponse(serverResponse);
149+
expect(result).to.deep.equal(expectedResponse);
150+
});
151+
});
152+
});

0 commit comments

Comments
 (0)