Skip to content
This repository was archived by the owner on Feb 13, 2021. It is now read-only.

Commit f169a85

Browse files
cameronhotchkiesmatthewlane
authored andcommitted
RockYou Adapter: Update for multiple ad unit support (prebid#2198)
* RockYou Adapter: Added RockYou Adapter supporting Prebid 1.0 * RockYou Adapter: Removed extraneous imports, replaced a for loop w/ forEach for variable scoping. * RockYou Adapter: Updated the size handling to allow for multiple size definitions to be handled successfully * RockYou Adapter: Ad Size / Multiple Ad Unit update (#1) RockYou Adapter: * Updated to support size coming from the mediaTypes object, multiple AdUnit support * RockYou Adapter: Readme updates * RockYou Adapter: explicitly pass request.bidId in the response object * RockYou Adapter: Updated sync URL
1 parent c0ff4af commit f169a85

File tree

3 files changed

+129
-82
lines changed

3 files changed

+129
-82
lines changed

modules/rockyouBidAdapter.js

Lines changed: 57 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import { registerBidder } from 'src/adapters/bidderFactory';
66
const BIDDER_CODE = 'rockyou';
77

88
const BASE_REQUEST_PATH = 'https://tas.rockyou.net/servlet/rotator/';
9-
const IFRAME_SYNC_URL = 'https://prebid.tex-sync.rockyou.net/usersync2/tas';
9+
const IFRAME_SYNC_URL = 'https://prebid.tas-sync.rockyou.net/usersync2/prebid';
1010
const VAST_PLAYER_LOCATION = 'https://rya-static.rockyou.com/rya/js/PreBidPlayer.js';
11-
export const ROTATION_ZONE = 'openrtbprod';
11+
export const ROTATION_ZONE = 'prod';
1212

1313
let isBidRequestValid = (bid) => {
1414
return !!bid.params && !!bid.params.placementId;
@@ -52,17 +52,27 @@ let extractValidSize = (bidRequest) => {
5252
let width = null;
5353
let height = null;
5454

55-
if (!utils.isEmpty(bidRequest.sizes)) {
56-
// Ensure the size array is normalized
57-
let conformingSize = utils.parseSizesInput(bidRequest.sizes);
55+
let requestedSizes = [];
56+
let mediaTypes = bidRequest.mediaTypes;
57+
if (mediaTypes && ((mediaTypes.banner && mediaTypes.banner.sizes) || (mediaTypes.video && mediaTypes.video.playerSize))) {
58+
if (mediaTypes.banner) {
59+
requestedSizes = mediaTypes.banner.sizes;
60+
} else {
61+
requestedSizes = [mediaTypes.video.playerSize];
62+
}
63+
} else if (!utils.isEmpty(bidRequest.sizes)) {
64+
requestedSizes = bidRequest.sizes
65+
}
5866

59-
if (!utils.isEmpty(conformingSize) && conformingSize[0] != null) {
60-
// Currently only the first size is utilized
61-
let splitSizes = conformingSize[0].split('x');
67+
// Ensure the size array is normalized
68+
let conformingSize = utils.parseSizesInput(requestedSizes);
6269

63-
width = parseInt(splitSizes[0]);
64-
height = parseInt(splitSizes[1]);
65-
}
70+
if (!utils.isEmpty(conformingSize) && conformingSize[0] != null) {
71+
// Currently only the first size is utilized
72+
let splitSizes = conformingSize[0].split('x');
73+
74+
width = parseInt(splitSizes[0]);
75+
height = parseInt(splitSizes[1]);
6676
}
6777

6878
return {
@@ -109,22 +119,14 @@ let generateImpBody = (bidRequest) => {
109119
};
110120
}
111121

112-
let generatePayload = (bidRequests) => {
122+
let generatePayload = (bidRequest) => {
113123
// Generate the expected OpenRTB payload
114124

115-
let rootBidRequest = bidRequests[0];
116-
117-
let index = 1;
118-
bidRequests.forEach((bidRequest) => {
119-
bidRequest.index = index;
120-
index += 1;
121-
})
122-
123125
let payload = {
124-
id: determineOptimalRequestId(rootBidRequest),
125-
site: buildSiteComponent(rootBidRequest),
126-
device: buildDeviceComponent(rootBidRequest),
127-
imp: bidRequests.map(generateImpBody)
126+
id: determineOptimalRequestId(bidRequest),
127+
site: buildSiteComponent(bidRequest),
128+
device: buildDeviceComponent(bidRequest),
129+
imp: [generateImpBody(bidRequest)]
128130
};
129131

130132
return JSON.stringify(payload);
@@ -165,37 +167,42 @@ let buildRequests = (validBidRequests, requestRoot) => {
165167
let adUnitCode = null;
166168
let rendererOverride = null;
167169

170+
let results = [];
168171
// Due to the nature of how URLs are generated, there must
169172
// be at least one bid request present for this to function
170173
// correctly
171174
if (!utils.isEmpty(validBidRequests)) {
172-
let headBidRequest = validBidRequests[0];
173-
174-
let serverLocations = overridableProperties(headBidRequest);
175-
176-
// requestUrl is the full endpoint w/ relevant adspot paramters
177-
let placementId = determineOptimalPlacementId(headBidRequest);
178-
requestUrl = `${serverLocations.baseRequestPath}${placementId}/0/vo?z=${serverLocations.rotationZone}`;
179-
180-
// requestPayload is the POST body JSON for the OpenRtb request
181-
requestPayload = generatePayload(validBidRequests);
182-
183-
mediaTypes = headBidRequest.mediaTypes;
184-
adUnitCode = headBidRequest.adUnitCode;
185-
rendererOverride = headBidRequest.rendererOverride;
175+
results = validBidRequests.map(
176+
bidRequest => {
177+
let serverLocations = overridableProperties(bidRequest);
178+
179+
// requestUrl is the full endpoint w/ relevant adspot paramters
180+
let placementId = determineOptimalPlacementId(bidRequest);
181+
requestUrl = `${serverLocations.baseRequestPath}${placementId}/0/vo?z=${serverLocations.rotationZone}`;
182+
183+
// requestPayload is the POST body JSON for the OpenRtb request
184+
requestPayload = generatePayload(bidRequest);
185+
186+
mediaTypes = bidRequest.mediaTypes;
187+
adUnitCode = bidRequest.adUnitCode;
188+
rendererOverride = bidRequest.rendererOverride;
189+
190+
return {
191+
method: requestType,
192+
type: requestType,
193+
url: requestUrl,
194+
data: requestPayload,
195+
mediaTypes,
196+
requestId: requestRoot.bidderRequestId,
197+
bidId: bidRequest.bidId,
198+
adUnitCode,
199+
rendererOverride
200+
};
201+
}
202+
);
186203
}
187-
const result = {
188-
method: requestType,
189-
type: requestType,
190-
url: requestUrl,
191-
data: requestPayload,
192-
mediaTypes,
193-
requestId: requestRoot.bidderRequestId,
194-
adUnitCode,
195-
rendererOverride
196-
};
197204

198-
return result;
205+
return results;
199206
};
200207

201208
let outstreamRender = (bid) => {
@@ -308,7 +315,7 @@ let interpretResponse = (serverResponse, request) => {
308315
}
309316

310317
let response = {
311-
requestId: responseBody.id,
318+
requestId: request.bidId,
312319
cpm: bid.price,
313320
width: bidWidth,
314321
height: bidHeight,

modules/rockyouBidAdapter.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,32 +24,33 @@ var adUnits = [
2424
// Banner adUnit
2525
{
2626
code: 'banner-div',
27-
sizes: [[720, 480]],
27+
mediaTypes: {
28+
banner: {
29+
sizes: [[720, 480]]
30+
}
31+
},
2832
29-
// Replace this object to test a new Adapter!
3033
bids: [{
3134
bidder: 'rockyou',
3235
params: {
33-
placementId: '4322'
36+
placementId: '4954'
3437
}
3538
}]
3639
},
3740
3841
// Video (outstream)
3942
{
4043
code: 'video-outstream',
41-
sizes: [[720, 480]],
42-
43-
mediaType: 'video',
4444
mediaTypes: {
4545
video: {
46-
context: 'outstream'
46+
context: 'outstream',
47+
playerSize: [720, 480]
4748
}
4849
},
4950
bids: [{
5051
bidder: 'rockyou',
5152
params: {
52-
placementId: '4307'
53+
placementId: '4957'
5354
}
5455
}]
5556
}

test/spec/modules/rockyouBidAdapter_spec.js

Lines changed: 63 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,14 @@ describe('RockYouAdapter', () => {
3333
},
3434
'adUnitCode': 'div-gpt-ad-1460505748561-0',
3535
'transactionId': 'd7b773de-ceaa-484d-89ca-d9f51b8d61ec',
36-
'sizes': [[320, 50], [300, 250], [300, 600]],
36+
'sizes': [[999, 888]],
3737
'bidderRequestId': '418b37f85e772c',
38-
'auctionId': '18fd8b8b0bd757'
38+
'auctionId': '18fd8b8b0bd757',
39+
'mediaTypes': {
40+
banner: {
41+
'sizes': [[320, 50], [300, 250], [300, 600]]
42+
}
43+
}
3944
};
4045

4146
it('successfully generates a URL', () => {
@@ -49,9 +54,10 @@ describe('RockYouAdapter', () => {
4954
}
5055
];
5156

52-
let result = spec.buildRequests(bidRequests, {
57+
let results = spec.buildRequests(bidRequests, {
5358
bidderRequestId: 'sample'
5459
});
60+
let result = results.pop();
5561

5662
expect(result.url).to.not.be.undefined;
5763
expect(result.url).to.not.be.null;
@@ -66,9 +72,10 @@ describe('RockYouAdapter', () => {
6672
sampleBidRequest
6773
];
6874

69-
let result = spec.buildRequests(bidRequests, {
75+
let results = spec.buildRequests(bidRequests, {
7076
bidderRequestId: 'sample'
7177
});
78+
let result = results.pop();
7279

7380
// Double encoded JSON
7481
let payload = JSON.parse(result.data);
@@ -82,9 +89,10 @@ describe('RockYouAdapter', () => {
8289
sampleBidRequest
8390
];
8491

85-
let result = spec.buildRequests(bidRequests, {
92+
let results = spec.buildRequests(bidRequests, {
8693
bidderRequestId: 'sample'
8794
});
95+
let result = results.pop();
8896

8997
// Double encoded JSON
9098
let payload = JSON.parse(result.data);
@@ -95,33 +103,57 @@ describe('RockYouAdapter', () => {
95103
expect(userData).to.not.be.null;
96104
});
97105

98-
it('generates multiple imp bodies', () => {
106+
it('generates multiple requests with single imp bodies', () => {
107+
const SECOND_PLACEMENT_ID = 'YYYPLACEMENTIDYYY';
108+
let firstBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
109+
let secondBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
110+
secondBidRequest.params.placementId = SECOND_PLACEMENT_ID;
111+
99112
let bidRequests = [
100-
sampleBidRequest,
101-
sampleBidRequest
113+
firstBidRequest,
114+
secondBidRequest
102115
];
103116

104-
let result = spec.buildRequests(bidRequests, {
117+
let results = spec.buildRequests(bidRequests, {
105118
bidderRequestId: 'sample'
106119
});
107120

121+
expect(results instanceof Array).to.be.true;
122+
expect(results.length).to.equal(2);
123+
124+
let firstRequest = results[0];
125+
108126
// Double encoded JSON
109-
let payload = JSON.parse(result.data);
127+
let firstPayload = JSON.parse(firstRequest.data);
110128

111-
expect(payload).to.not.be.null;
112-
expect(payload.imp).to.not.be.null;
113-
expect(payload.imp.length).to.equal(2);
129+
expect(firstPayload).to.not.be.null;
130+
expect(firstPayload.imp).to.not.be.null;
131+
expect(firstPayload.imp.length).to.equal(1);
132+
133+
expect(firstRequest.url).to.not.be.null;
134+
expect(firstRequest.url.indexOf('ZZZPLACEMENTZZZ')).to.be.gt(0);
135+
136+
let secondRequest = results[1];
137+
138+
// Double encoded JSON
139+
let secondPayload = JSON.parse(secondRequest.data);
140+
141+
expect(secondPayload).to.not.be.null;
142+
expect(secondPayload.imp).to.not.be.null;
143+
expect(secondPayload.imp.length).to.equal(1);
144+
145+
expect(secondRequest.url).to.not.be.null;
146+
expect(secondRequest.url.indexOf(SECOND_PLACEMENT_ID)).to.be.gt(0);
114147
});
115148

116149
it('generates a banner request as expected', () => {
117150
// clone the sample for stability
118151
let localBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
119152

120-
localBidRequest.mediaTypes = { banner: {} };
121-
122-
let result = spec.buildRequests([localBidRequest], {
153+
let results = spec.buildRequests([localBidRequest], {
123154
bidderRequestId: 'sample'
124155
});
156+
let result = results.pop();
125157

126158
// Double encoded JSON
127159
let payload = JSON.parse(result.data);
@@ -146,9 +178,10 @@ describe('RockYouAdapter', () => {
146178
localBidRequest.sizes = [320, 50];
147179
localBidRequest.mediaTypes = { banner: {} };
148180

149-
let result = spec.buildRequests([localBidRequest], {
181+
let results = spec.buildRequests([localBidRequest], {
150182
bidderRequestId: 'sample'
151183
});
184+
let result = results.pop();
152185

153186
// Double encoded JSON
154187
let payload = JSON.parse(result.data);
@@ -171,11 +204,13 @@ describe('RockYouAdapter', () => {
171204
// clone the sample for stability
172205
let localBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
173206
localBidRequest.sizes = ['x', 'w'];
174-
localBidRequest.mediaTypes = { banner: {} };
175207

176-
let result = spec.buildRequests([localBidRequest], {
208+
localBidRequest.mediaTypes = { banner: { sizes: ['y', 'z']} };
209+
210+
let results = spec.buildRequests([localBidRequest], {
177211
bidderRequestId: 'sample'
178212
});
213+
let result = results.pop();
179214

180215
// Double encoded JSON
181216
let payload = JSON.parse(result.data);
@@ -198,11 +233,14 @@ describe('RockYouAdapter', () => {
198233
// clone the sample for stability
199234
let localBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
200235

201-
localBidRequest.mediaTypes = { video: {} };
236+
localBidRequest.mediaTypes = { video: {
237+
playerSize: [326, 56]
238+
} };
202239

203-
let result = spec.buildRequests([localBidRequest], {
240+
let results = spec.buildRequests([localBidRequest], {
204241
bidderRequestId: 'sample'
205242
});
243+
let result = results.pop();
206244

207245
// Double encoded JSON
208246
let payload = JSON.parse(result.data);
@@ -217,18 +255,19 @@ describe('RockYouAdapter', () => {
217255

218256
let videoData = firstImp.video;
219257

220-
expect(videoData.w).to.equal(320);
221-
expect(videoData.h).to.equal(50);
258+
expect(videoData.w).to.equal(326);
259+
expect(videoData.h).to.equal(56);
222260
});
223261

224262
it('propagates the mediaTypes object in the built request', () => {
225263
let localBidRequest = JSON.parse(JSON.stringify(sampleBidRequest));
226264

227265
localBidRequest.mediaTypes = { video: {} };
228266

229-
let result = spec.buildRequests([localBidRequest], {
267+
let results = spec.buildRequests([localBidRequest], {
230268
bidderRequestId: 'sample'
231269
});
270+
let result = results.pop();
232271

233272
let mediaTypes = result.mediaTypes;
234273

0 commit comments

Comments
 (0)