Skip to content

Commit

Permalink
Colombia Bid Adapter : initial release (prebid#11478)
Browse files Browse the repository at this point in the history
* new Colombia bid Adapter implementation

* new Colombia bid Adapter implementation

* new Colombia bid Adapter implementation

* new Colombia bid Adapter implementation- 'lint' errored Fixed

* new Colombia bid Adapter implementation- Resolved test case issue

* new Colombia bid Adapter implementation- Resolved test case issue

* new Colombia bid Adapter implementation- Resolved test case issue

---------

Co-authored-by: subhashish.singh <subhashish.singh@timesinternet.in>
  • Loading branch information
2 people authored and zkosanovic committed May 28, 2024
1 parent 65a7d47 commit b3d3b7f
Show file tree
Hide file tree
Showing 4 changed files with 294 additions and 1 deletion.
107 changes: 107 additions & 0 deletions modules/colombiaBidAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import * as utils from '../src/utils.js';
import {config} from '../src/config.js';
import {registerBidder} from '../src/adapters/bidderFactory.js';
import { BANNER } from '../src/mediaTypes.js';
const BIDDER_CODE = 'colombia';
const ENDPOINT_URL = 'https://ade.clmbtech.com/cde/prebid.htm';
const HOST_NAME = document.location.protocol + '//' + window.location.host;

export const spec = {
code: BIDDER_CODE,
aliases: ['clmb'],
supportedMediaTypes: [BANNER],
isBidRequestValid: function(bid) {
return !!(bid.params.placementId);
},
buildRequests: function(validBidRequests, bidderRequest) {
if (validBidRequests.length === 0) {
return [];
}
let payloadArr = []
let ctr = 1;
validBidRequests = 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 bidId = bidRequest.bidId;
const referrer = (bidderRequest && bidderRequest.refererInfo && bidderRequest.refererInfo.referer) ? bidderRequest.refererInfo.referer : '';
let mediaTypes = {}
let payload = {
v: 'hb1',
p: placementId,
pos: '~' + ctr,
w: width,
h: height,
cb: cb,
r: referrer,
uid: bidId,
t: 'i',
d: HOST_NAME,
fpc: params.fpc,
_u: window.location.href,
mediaTypes: Object.assign({}, mediaTypes, bidRequest.mediaTypes)
};
if (params.keywords) payload.keywords = params.keywords;
if (params.category) payload.cat = params.category;
if (params.pageType) payload.pgt = params.pageType;
if (params.incognito) payload.ic = params.incognito;
if (params.dsmi) payload.smi = params.dsmi;
if (params.optout) payload.out = params.optout;
if (bidRequest && bidRequest.hasOwnProperty('ortb2Imp') && bidRequest.ortb2Imp.hasOwnProperty('ext')) {
payload.ext = bidRequest.ortb2Imp.ext;
if (bidRequest.ortb2Imp.ext.hasOwnProperty('gpid')) payload.pubAdCode = bidRequest.ortb2Imp.ext.gpid.split('#')[0];
}
payloadArr.push(payload);
ctr++;
});
return [{
method: 'POST',
url: ENDPOINT_URL,
data: payloadArr,
}]
},
interpretResponse: function(serverResponse, bidRequest) {
const bidResponses = [];
const res = serverResponse.body || serverResponse;
if (!res || res.length === 0) {
return bidResponses;
}
try {
res.forEach(response => {
const crid = response.creativeId || 0;
const width = response.width || 0;
const height = response.height || 0;
let cpm = response.cpm || 0;
if (cpm <= 0) {
return bidResponses;
}
if (width !== 0 && height !== 0 && cpm !== 0 && crid !== 0) {
const dealId = response.dealid || '';
const currency = response.currency || 'USD';
const netRevenue = (response.netRevenue === undefined) ? true : response.netRevenue;
const bidResponse = {
requestId: response.requestId,
cpm: cpm.toFixed(2),
width: response.width,
height: response.height,
creativeId: crid,
dealId: dealId,
currency: currency,
netRevenue: netRevenue,
ttl: config.getConfig('_bidderTimeout') || 300,
referrer: bidRequest.data.r,
ad: response.ad
};
bidResponses.push(bidResponse);
}
});
} catch (error) {
utils.logError(error);
}
return bidResponses;
}
}
registerBidder(spec);
31 changes: 31 additions & 0 deletions modules/colombiaBidAdapter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Overview

```
Module Name: COLOMBIA Bidder Adapter
Module Type: Bidder Adapter
Maintainer: colombiaonline@timesinteret.in
```

# Description

Connect to COLOMBIA for bids.

COLOMBIA adapter requires setup and approval from the COLOMBIA team. Please reach out to your account team or colombiaonline@timesinteret.in for more information.

# Test Parameters
```
var adUnits = [{
code: 'test-ad-div',
mediaTypes: {
banner: {
sizes: [[300, 250],[728,90],[320,50]]
}
},
bids: [{
bidder: 'colombia',
params: {
placementId: '540799'
}
}]
}];
```
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

155 changes: 155 additions & 0 deletions test/spec/modules/colombiaBidAdapter_spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
import { expect } from 'chai';
import { spec } from 'modules/colombiaBidAdapter';
import { newBidder } from 'src/adapters/bidderFactory';

const HOST_NAME = document.location.protocol + '//' + window.location.host;
const ENDPOINT = 'https://ade.clmbtech.com/cde/prebid.htm';

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

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

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

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

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

describe('buildRequests', function () {
let bidRequests = [
{
'bidder': 'colombia',
'params': {
placementId: '307466'
},
'adUnitCode': 'adunit-code1',
'sizes': [
[300, 250]
],
'bidId': '23beaa6af6cdde',
'bidderRequestId': '19c0c1efdf37e7',
'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf1',
},
{
'bidder': 'colombia',
'params': {
placementId: '307466'
},
'adUnitCode': 'adunit-code2',
'sizes': [
[300, 250]
],
'bidId': '382091349b149f"',
'bidderRequestId': '"1f9c98192de2511"',
'auctionId': '61466567-d482-4a16-96f0-fe5f25ffbdf1',
}
];
let bidderRequest = {
refererInfo: {
numIframes: 0,
reachedTop: true,
referer: 'http://example.com',
stack: ['http://example.com']
}
};

const request = spec.buildRequests(bidRequests);
it('sends bid request to our endpoint via POST', function () {
expect(request[0].method).to.equal('POST');
});

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

describe('interpretResponse', function () {
let bidRequest = [
{
'method': 'POST',
'url': 'https://ade.clmbtech.com/cde/prebid.htm',
'data': {
'v': 'hb1',
'p': '307466',
'w': '300',
'h': '250',
'cb': 12892917383,
'r': 'http%3A%2F%2Flocalhost%3A9876%2F%3Fid%3D74552836',
'uid': '23beaa6af6cdde',
't': 'i',
}
}
];

let serverResponse = [{
'ad': '<div>This is test case for colombia adapter</div> ',
'cpm': 3.14,
'creativeId': '6b958110-612c-4b03-b6a9-7436c9f746dc-1sk24',
'currency': 'USD',
'requestId': '23beaa6af6cdde',
'width': 728,
'height': 90,
'netRevenue': true,
'ttl': 600,
'dealid': '',
'referrer': 'http%3A%2F%2Flocalhost%3A9876%2F%3Fid%3D74552836'
}];

it('should get the correct bid response', function () {
let expectedResponse = [{
'requestId': '23beaa6af6cdde',
'cpm': 3.14,
'width': 728,
'height': 90,
'creativeId': '6b958110-612c-4b03-b6a9-7436c9f746dc-1sk24',
'dealId': '',
'currency': 'USD',
'netRevenue': true,
'ttl': 300,
'referrer': 'http%3A%2F%2Flocalhost%3A9876%2F%3Fid%3D74552836',
'ad': '<div>This is test case for colombia adapter</div>'
}];
let result = spec.interpretResponse(serverResponse, bidRequest[0]);
expect(Object.keys(result[0])).to.deep.equal(Object.keys(expectedResponse[0]));
});

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

0 comments on commit b3d3b7f

Please sign in to comment.