Skip to content

Commit

Permalink
Merge pull request #18 from smartadserver/video-params
Browse files Browse the repository at this point in the history
Support additional video params
  • Loading branch information
krzysztofequativ authored Dec 11, 2023
2 parents 62a184d + dd0e886 commit 000f8e1
Show file tree
Hide file tree
Showing 2 changed files with 145 additions and 8 deletions.
45 changes: 39 additions & 6 deletions modules/smartadserverBidAdapter.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { deepAccess, deepClone, logError, isFn, isPlainObject } from '../src/utils.js';
import { deepAccess, deepClone, isArrayOfNums, isFn, isInteger, isPlainObject, logError } from '../src/utils.js';
import { BANNER, VIDEO } from '../src/mediaTypes.js';
import { config } from '../src/config.js';
import { registerBidder } from '../src/adapters/bidderFactory.js';
Expand Down Expand Up @@ -59,16 +59,49 @@ export const spec = {
*/
fillPayloadForVideoBidRequest: function(payload, videoMediaType, videoParams) {
const playerSize = videoMediaType.playerSize[0];
payload.isVideo = videoMediaType.context === 'instream';
const map = {
maxbitrate: 'vbrmax',
maxduration: 'vdmax',
minbitrate: 'vbrmin',
minduration: 'vdmin',
placement: 'vpt',
plcmt: 'vplcmt',
skip: 'skip'
};

payload.mediaType = VIDEO;
payload.isVideo = videoMediaType.context === 'instream';
payload.videoData = {};

for (const [key, value] of Object.entries(map)) {
payload.videoData = {
...payload.videoData,
...this.getValuableProperty(value, videoMediaType[key])
};
}

payload.videoData = {
videoProtocol: this.getProtocolForVideoBidRequest(videoMediaType, videoParams),
playerWidth: playerSize[0],
playerHeight: playerSize[1],
adBreak: this.getStartDelayForVideoBidRequest(videoMediaType, videoParams)
...payload.videoData,
...this.getValuableProperty('playerWidth', playerSize[0]),
...this.getValuableProperty('playerHeight', playerSize[1]),
...this.getValuableProperty('adBreak', this.getStartDelayForVideoBidRequest(videoMediaType, videoParams)),
...this.getValuableProperty('videoProtocol', this.getProtocolForVideoBidRequest(videoMediaType, videoParams)),
...(isArrayOfNums(videoMediaType.api) && videoMediaType.api.length ? { iabframeworks: videoMediaType.api.toString() } : {}),
...(isArrayOfNums(videoMediaType.playbackmethod) && videoMediaType.playbackmethod.length ? { vpmt: videoMediaType.playbackmethod } : {})
};
},

/**
* Gets a property object if the value not falsy
* @param {string} property
* @param {number} value
* @returns object with the property or empty
*/
getValuableProperty: function(property, value) {
return typeof property === 'string' && isInteger(value) && value
? { [property]: value } : {};
},

/**
* Gets the protocols from either videoParams or VideoMediaType
* @param {*} videoMediaType
Expand Down
108 changes: 106 additions & 2 deletions test/spec/modules/smartadserverBidAdapter_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -786,7 +786,7 @@ describe('Smart bid adapter tests', function () {
expect(request[0]).to.have.property('method').and.to.equal('POST');
const requestContent = JSON.parse(request[0].data);
expect(requestContent).to.have.property('videoData');
expect(requestContent.videoData).to.have.property('videoProtocol').and.to.equal(null);
expect(requestContent.videoData).not.to.have.property('videoProtocol').eq(true);
expect(requestContent.videoData).to.have.property('adBreak').and.to.equal(2);
});

Expand Down Expand Up @@ -833,6 +833,73 @@ describe('Smart bid adapter tests', function () {
expect(requestContent.videoData).to.have.property('videoProtocol').and.to.equal(6);
expect(requestContent.videoData).to.have.property('adBreak').and.to.equal(3);
});

it('should pass additional parameters', function () {
const request = spec.buildRequests([{
bidder: 'smartadserver',
mediaTypes: {
video: {
context: 'instream',
api: [1, 2, 3],
maxbitrate: 50,
minbitrate: 20,
maxduration: 30,
minduration: 5,
placement: 3,
playbackmethod: [2, 4],
playerSize: [[640, 480]],
plcmt: 1,
skip: 0
}
},
params: {
siteId: '123'
}
}]);
const requestContent = JSON.parse(request[0].data);

expect(requestContent.videoData).to.have.property('iabframeworks').and.to.equal('1,2,3');
expect(requestContent.videoData).not.to.have.property('skip');
expect(requestContent.videoData).to.have.property('vbrmax').and.to.equal(50);
expect(requestContent.videoData).to.have.property('vbrmin').and.to.equal(20);
expect(requestContent.videoData).to.have.property('vdmax').and.to.equal(30);
expect(requestContent.videoData).to.have.property('vdmin').and.to.equal(5);
expect(requestContent.videoData).to.have.property('vplcmt').and.to.equal(1);
expect(requestContent.videoData).to.have.property('vpmt').and.to.have.lengthOf(2);
expect(requestContent.videoData.vpmt[0]).to.equal(2);
expect(requestContent.videoData.vpmt[1]).to.equal(4);
expect(requestContent.videoData).to.have.property('vpt').and.to.equal(3);
});

it('should not pass not valuable parameters', function () {
const request = spec.buildRequests([{
bidder: 'smartadserver',
mediaTypes: {
video: {
context: 'instream',
maxbitrate: 20,
minbitrate: null,
maxduration: 0,
playbackmethod: [],
playerSize: [[640, 480]],
plcmt: 1
}
},
params: {
siteId: '123'
}
}]);
const requestContent = JSON.parse(request[0].data);

expect(requestContent.videoData).not.to.have.property('iabframeworks');
expect(requestContent.videoData).to.have.property('vbrmax').and.to.equal(20);
expect(requestContent.videoData).not.to.have.property('vbrmin');
expect(requestContent.videoData).not.to.have.property('vdmax');
expect(requestContent.videoData).not.to.have.property('vdmin');
expect(requestContent.videoData).to.have.property('vplcmt').and.to.equal(1);
expect(requestContent.videoData).not.to.have.property('vpmt');
expect(requestContent.videoData).not.to.have.property('vpt');
});
});
});

Expand Down Expand Up @@ -1029,7 +1096,7 @@ describe('Smart bid adapter tests', function () {
expect(request[0]).to.have.property('method').and.to.equal('POST');
const requestContent = JSON.parse(request[0].data);
expect(requestContent).to.have.property('videoData');
expect(requestContent.videoData).to.have.property('videoProtocol').and.to.equal(null);
expect(requestContent.videoData).not.to.have.property('videoProtocol').eq(true);
expect(requestContent.videoData).to.have.property('adBreak').and.to.equal(2);
});

Expand Down Expand Up @@ -1393,4 +1460,41 @@ describe('Smart bid adapter tests', function () {
expect(requestContent).to.have.property('gpid').and.to.equal(gpid);
});
});

describe('#getValuableProperty method', function () {
it('should return an object when calling with a number value', () => {
const obj = spec.getValuableProperty('prop', 3);
expect(obj).to.deep.equal({ prop: 3 });
});

it('should return an empty object when calling with a string value', () => {
const obj = spec.getValuableProperty('prop', 'str');
expect(obj).to.deep.equal({});
});

it('should return an empty object when calling with a number property', () => {
const obj = spec.getValuableProperty(7, 'str');
expect(obj).to.deep.equal({});
});

it('should return an empty object when calling with a null value', () => {
const obj = spec.getValuableProperty('prop', null);
expect(obj).to.deep.equal({});
});

it('should return an empty object when calling with an object value', () => {
const obj = spec.getValuableProperty('prop', {});
expect(obj).to.deep.equal({});
});

it('should return an empty object when calling with a 0 value', () => {
const obj = spec.getValuableProperty('prop', 0);
expect(obj).to.deep.equal({});
});

it('should return an empty object when calling without the value argument', () => {
const obj = spec.getValuableProperty('prop');
expect(obj).to.deep.equal({});
});
});
});

0 comments on commit 000f8e1

Please sign in to comment.