Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Advertly: New Bidder Adapter Submission #4496

Merged
merged 40 commits into from
Jan 2, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
63dfc1b
Add files via upload
Advertly Sep 26, 2019
dec2a7f
Add files via upload
Advertly Sep 26, 2019
15564fc
Delete advertlyBidAdapter.js
Advertly Sep 26, 2019
6d2bed6
Delete advertlyBidAdapter.md
Advertly Sep 26, 2019
f522044
Delete advertlyBidAdapter_spec.js
Advertly Sep 26, 2019
aefefff
Advertly Adapter
Advertly Oct 10, 2019
62d884a
Update advertlyBidAdapter.md
Advertly Oct 10, 2019
3e29911
Update advertlyBidAdapter_spec.js
Advertly Oct 10, 2019
1fec691
Update advertlyBidAdapter.md
Advertly Oct 11, 2019
995929f
Update advertlyBidAdapter_spec.js
Advertly Oct 11, 2019
097d70a
Update advertlyBidAdapter.js
Advertly Oct 31, 2019
c6013e2
Update advertlyBidAdapter_spec.js
Advertly Oct 31, 2019
3e8b8e3
Update advertlyBidAdapter_spec.js
Advertly Oct 31, 2019
7e884f6
Update advertlyBidAdapter.js
Advertly Oct 31, 2019
268b307
Update Advertly
Advertly Nov 25, 2019
d92f1dd
Advertly Bidder Adapter Files
Advertly Nov 25, 2019
9b3de3d
Updated with create the new object
Advertly Dec 4, 2019
93b830e
Updated with create the new object
Advertly Dec 4, 2019
10d3cee
Updated with create the new object
Advertly Dec 4, 2019
8bf8519
Updated with create the new object
Advertly Dec 4, 2019
4bde92d
Updated with create the new object
Advertly Dec 4, 2019
e09433e
Updated with create the new object
Advertly Dec 4, 2019
a1076fe
Updated with create the new object
Advertly Dec 4, 2019
49c66d3
Update with new changes
Advertly Dec 5, 2019
2d9ad1c
Update with new changes
Advertly Dec 5, 2019
7bc7384
update with new changes
Advertly Dec 5, 2019
eea4595
Update with new Changes
Advertly Dec 5, 2019
26ea6f0
update advertly
Advertly Dec 10, 2019
9f01e01
New updates
Advertly Dec 10, 2019
3b54673
update advertly
Advertly Dec 10, 2019
557c812
update advertly
Advertly Dec 10, 2019
832069a
update advertly
Advertly Dec 10, 2019
2882515
update advertly
Advertly Dec 16, 2019
ee4ca8d
Update advertlyBidAdapter.js
Advertly Dec 16, 2019
d2bfd73
Update advertlyBidAdapter.js
Advertly Dec 16, 2019
6206f2c
Update advertlyBidAdapter.js
Advertly Dec 17, 2019
e035ef3
updated advertly
Advertly Dec 26, 2019
908a4e7
updated advertly
Advertly Dec 26, 2019
55fc245
update advertly
Advertly Dec 26, 2019
8fe4a85
update advertly
Advertly Dec 26, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file modified integrationExamples/gpt/hello_world.html
100644 → 100755
Empty file.
127 changes: 127 additions & 0 deletions modules/advertlyBidAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import { registerBidder } from '../src/adapters/bidderFactory';
import { config } from '../src/config';
import * as utils from '../src/utils';
import {BANNER, VIDEO} from '../src/mediaTypes';
import { ajax } from '../src/ajax';
import {Renderer} from '../src/Renderer';

const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
const BIDDER_CODE = 'advertly';
const DOMAIN = 'https://api.advertly.com/';
const RENDERER_URL = '//acdn.adnxs.com/video/outstream/ANOutstreamVideo.js';

function isBidRequestValid(bid) {
return (typeof bid.params !== 'undefined' && parseInt(utils.getValue(bid.params, 'publisherId')) > 0);
}

function buildRequests(validBidRequests) {
return {
method: 'POST',
url: DOMAIN + 'www/admin/plugins/Prebid/getAd.php',
options: {
withCredentials: false,
crossOrigin: true
},
data: validBidRequests,
};
}

function interpretResponse(serverResponse, request) {
const response = serverResponse.body;
const bidResponses = [];
var bidRequestResponses = [];
utils._each(response, function(bidAd) {
let bnd = {};
Object.assign(bnd, bidAd);
bnd.adResponse = {
content: bidAd.vastXml,
height: bidAd.height,
width: bidAd.width
};
bnd.ttl = config.getConfig('_bidderTimeout')
bnd.renderer = bidAd.context === 'outstream' ? createRenderer(bidAd, RENDERER_URL) : undefined;
bidResponses.push(bnd);
});

bidRequestResponses.push({
function: 'saveResponses',
request: request,
response: bidResponses
});
sendResponseToServer(bidRequestResponses);
return bidResponses;
}

function outstreamRender(bidAd) {
bidAd.renderer.push(() => {
window.ANOutstreamVideo.renderAd({
sizes: [bidAd.width, bidAd.height],
width: bidAd.width,
height: bidAd.height,
targetId: bidAd.adUnitCode,
adResponse: bidAd.adResponse,
rendererOptions: {
showVolume: false,
allowFullscreen: false
}
});
});
}

function createRenderer(bidAd, url) {
const renderer = Renderer.install({
id: bidAd.adUnitCode,
url: url,
loaded: false,
config: {'player_height': bidAd.height, 'player_width': bidAd.width},
adUnitCode: bidAd.adUnitCode
});
try {
renderer.setRender(outstreamRender);
} catch (err) {
utils.logWarn('Prebid Error calling setRender on renderer', err);
}
return renderer;
}

function onBidWon(bid) {
let wonBids = [];
wonBids.push(bid);
wonBids[0].function = 'onBidWon';
sendResponseToServer(wonBids);
}

function onTimeout(details) {
details.unshift({ 'function': 'onTimeout' });
sendResponseToServer(details);
}

function sendResponseToServer(data) {
ajax(DOMAIN + 'www/admin/plugins/Prebid/tracking/track.php', null, JSON.stringify(data), {
withCredentials: false,
method: 'POST',
crossOrigin: true
});
}

function getUserSyncs(syncOptions) {
if (syncOptions.iframeEnabled) {
return [{
type: 'iframe',
url: DOMAIN + 'www/admin/plugins/Prebid/userSync.php'
}];
}
}

export const spec = {
code: BIDDER_CODE,
supportedMediaTypes: SUPPORTED_AD_TYPES,
isBidRequestValid,
buildRequests,
interpretResponse,
getUserSyncs,
onBidWon,
onTimeout
};

registerBidder(spec);
50 changes: 50 additions & 0 deletions modules/advertlyBidAdapter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Overview

```
Module Name: Advertly Bid Adapter
Module Type: Bidder Adapter
Maintainer : support@advertly.com
```

# Description

Connects to Advertly Ad Server for bids.

advertly bid adapter supports Banner and Video.

# Test Parameters
```
var adUnits = [
//bannner object
{
code: 'banner-ad-slot',
mediaTypes: {
banner: {
sizes: [[300, 250], [300,600]],
}
},
bids: [{
bidder: 'advertly',
params: {
publisherId: 2
}
}]

},
//video object
{
code: 'video-ad-slot',
mediaTypes: {
video: {
context: 'instream',
playerSize: [640, 480],
},
},
bids: [{
bidder: "advertly",
params: {
publisherId: 2
}
}]
}];
```
159 changes: 159 additions & 0 deletions test/spec/modules/advertlyBidAdapter_spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
import { expect } from 'chai';
import { spec } from 'modules/advertlyBidAdapter';

const ENDPOINT = 'https://api.advertly.com/www/admin/plugins/Prebid/getAd.php';

describe('The Advertly bidding adapter', function () {
describe('isBidRequestValid', function () {
it('should return false when given an invalid bid', function () {
const bid = {
bidder: 'advertly',
};
const isValid = spec.isBidRequestValid(bid);
expect(isValid).to.equal(false);
});

it('should return true when given a publisherId in bid', function () {
const bid = {
bidder: 'advertly',
params: {
publisherId: 2
},
};
const isValid = spec.isBidRequestValid(bid);
expect(isValid).to.equal(true);
});
});

describe('buildRequests', function () {
const bidRequests = [{
'bidder': 'advertly',
'params': {
'publisherId': 2
},
'adUnitCode': 'adunit-code',
'sizes': [
[300, 250],
[300, 600]
]
}];

const request = spec.buildRequests(bidRequests);

it('sends bid request to our endpoint via POST', function () {
expect(request.method).to.equal('POST');
});

it('check endpoint url', function () {
expect(request.url).to.equal(ENDPOINT)
});

it('sets the proper banner object', function () {
expect(bidRequests[0].params.publisherId).to.equal(2);
})
});
const response = {
body: [
{
'requestId': '2ee937f15015c6',
'cpm': '0.2000',
'width': 300,
'height': 600,
'creativeId': '4',
'currency': 'USD',
'netRevenue': true,
'ad': 'ads.html',
'mediaType': 'banner'
},
{
'requestId': '3e1af92622bdc',
'cpm': '0.2000',
'creativeId': '4',
'context': 'outstream',
'currency': 'USD',
'netRevenue': true,
'vastUrl': 'tezt.xml',
'width': 640,
'height': 480,
'mediaType': 'video'
}]
};

const request = [
{
'bidder': 'advertly',
'params': {
'publisherId': 2
},
'mediaTypes': {
'banner': {
'sizes': [
[300, 600]
]
}
},
'bidId': '2ee937f15015c6',
'src': 'client',
},
{
'bidder': 'advertly',
'params': {
'publisherId': 2
},
'mediaTypes': {
'video': {
'context': 'outstream',
'playerSize': [
[640, 480]
]
}
},
'bidId': '3e1af92622bdc',
'src': 'client',
}
];

describe('interpretResponse', function () {
it('return empty array when no ad found', function () {
const response = {};
const request = { bidRequests: [] };
const bids = spec.interpretResponse(response, request);
expect(bids).to.have.lengthOf(0);
});

it('check response for banner and video', function () {
const bids = spec.interpretResponse(response, request);
expect(bids).to.have.lengthOf(2);
expect(bids[0].requestId).to.equal('2ee937f15015c6');
expect(bids[0].cpm).to.equal('0.2000');
expect(bids[1].cpm).to.equal('0.2000');
expect(bids[0].width).to.equal(300);
expect(bids[0].height).to.equal(600);
expect(bids[1].vastUrl).to.not.equal('');
expect(bids[0].ad).to.not.equal('');
expect(bids[1].adResponse).to.not.equal('');
expect(bids[1].renderer).not.to.be.an('undefined');
});
});

describe('On winning bid', function () {
const bids = spec.interpretResponse(response, request);
spec.onBidWon(bids);
});

describe('On bid Time out', function () {
const bids = spec.interpretResponse(response, request);
spec.onTimeout(bids);
});

describe('user sync', function () {
it('to check the user sync iframe', function () {
let syncs = spec.getUserSyncs({
iframeEnabled: true
});
expect(syncs).to.not.be.an('undefined');
expect(syncs).to.have.lengthOf(1);
expect(syncs[0].type).to.equal('iframe');
});
});
});