diff --git a/modules/trustxBidAdapter.js b/modules/trustxBidAdapter.js
index b61a870c2a4..bd5f63e5302 100644
--- a/modules/trustxBidAdapter.js
+++ b/modules/trustxBidAdapter.js
@@ -36,6 +36,8 @@ export const spec = {
buildRequests: function(validBidRequests, bidderRequest) {
const auids = [];
const bidsMap = {};
+ const slotsMapByUid = {};
+ const sizeMap = {};
const bids = validBidRequests || [];
let priceType = 'net';
let reqId;
@@ -45,18 +47,41 @@ export const spec = {
priceType = 'gross';
}
reqId = bid.bidderRequestId;
- if (!bidsMap[bid.params.uid]) {
- bidsMap[bid.params.uid] = [bid];
- auids.push(bid.params.uid);
+ const {params: {uid}, adUnitCode} = bid;
+ auids.push(uid);
+ const sizesId = utils.parseSizesInput(bid.sizes);
+
+ if (!slotsMapByUid[uid]) {
+ slotsMapByUid[uid] = {};
+ }
+ const slotsMap = slotsMapByUid[uid];
+ if (!slotsMap[adUnitCode]) {
+ slotsMap[adUnitCode] = {adUnitCode, bids: [bid], parents: []};
} else {
- bidsMap[bid.params.uid].push(bid);
+ slotsMap[adUnitCode].bids.push(bid);
}
+ const slot = slotsMap[adUnitCode];
+
+ sizesId.forEach((sizeId) => {
+ sizeMap[sizeId] = true;
+ if (!bidsMap[uid]) {
+ bidsMap[uid] = {};
+ }
+
+ if (!bidsMap[uid][sizeId]) {
+ bidsMap[uid][sizeId] = [slot];
+ } else {
+ bidsMap[uid][sizeId].push(slot);
+ }
+ slot.parents.push({parent: bidsMap[uid], key: sizeId, uid});
+ });
});
const payload = {
u: utils.getTopWindowUrl(),
pt: priceType,
auids: auids.join(','),
+ sizes: utils.getKeys(sizeMap).join(','),
r: reqId
};
@@ -138,8 +163,12 @@ function _addBidResponse(serverBid, bidsMap, priceType, bidResponses) {
else {
const awaitingBids = bidsMap[serverBid.auid];
if (awaitingBids) {
- awaitingBids.forEach(bid => {
- const bidResponse = {
+ const sizeId = `${serverBid.w}x${serverBid.h}`;
+ if (awaitingBids[sizeId]) {
+ const slot = awaitingBids[sizeId][0];
+
+ const bid = slot.bids.shift();
+ bidResponses.push({
requestId: bid.bidId, // bid.bidderRequestId,
bidderCode: spec.code,
cpm: serverBid.price,
@@ -151,9 +180,23 @@ function _addBidResponse(serverBid, bidsMap, priceType, bidResponses) {
ttl: TIME_TO_LIVE,
ad: serverBid.adm,
dealId: serverBid.dealid
- };
- bidResponses.push(bidResponse);
- });
+ });
+
+ if (!slot.bids.length) {
+ slot.parents.forEach(({parent, key, uid}) => {
+ const index = parent[key].indexOf(slot);
+ if (index > -1) {
+ parent[key].splice(index, 1);
+ }
+ if (!parent[key].length) {
+ delete parent[key];
+ if (!utils.getKeys(parent).length) {
+ delete bidsMap[uid];
+ }
+ }
+ });
+ }
+ }
} else {
errorMessage = LOG_ERROR_MESS.noPlacementCode + serverBid.auid;
}
diff --git a/test/spec/modules/trustxBidAdapter_spec.js b/test/spec/modules/trustxBidAdapter_spec.js
index 9f2fdca6a99..207d3a068ba 100644
--- a/test/spec/modules/trustxBidAdapter_spec.js
+++ b/test/spec/modules/trustxBidAdapter_spec.js
@@ -65,7 +65,7 @@ describe('TrustXAdapter', function () {
'uid': '43'
},
'adUnitCode': 'adunit-code-2',
- 'sizes': [[728, 90]],
+ 'sizes': [[728, 90], [300, 250]],
'bidId': '3150ccb55da321',
'bidderRequestId': '22edbae2733bf6',
'auctionId': '1d1a030790a475',
@@ -90,16 +90,18 @@ describe('TrustXAdapter', function () {
expect(payload).to.have.property('u').that.is.a('string');
expect(payload).to.have.property('pt', 'net');
expect(payload).to.have.property('auids', '43');
+ expect(payload).to.have.property('sizes', '300x250,300x600');
expect(payload).to.have.property('r', '22edbae2733bf6');
});
- it('auids must not be duplicated', function () {
+ it('sizes must not be duplicated', function () {
const request = spec.buildRequests(bidRequests);
expect(request.data).to.be.an('string');
const payload = parseRequest(request.data);
expect(payload).to.have.property('u').that.is.a('string');
expect(payload).to.have.property('pt', 'net');
- expect(payload).to.have.property('auids', '43,45');
+ expect(payload).to.have.property('auids', '43,43,45');
+ expect(payload).to.have.property('sizes', '300x250,300x600,728x90');
expect(payload).to.have.property('r', '22edbae2733bf6');
});
@@ -110,7 +112,8 @@ describe('TrustXAdapter', function () {
const payload = parseRequest(request.data);
expect(payload).to.have.property('u').that.is.a('string');
expect(payload).to.have.property('pt', 'gross');
- expect(payload).to.have.property('auids', '43,45');
+ expect(payload).to.have.property('auids', '43,43,45');
+ expect(payload).to.have.property('sizes', '300x250,300x600,728x90');
expect(payload).to.have.property('r', '22edbae2733bf6');
delete bidRequests[1].params.priceType;
});
@@ -122,7 +125,8 @@ describe('TrustXAdapter', function () {
const payload = parseRequest(request.data);
expect(payload).to.have.property('u').that.is.a('string');
expect(payload).to.have.property('pt', 'net');
- expect(payload).to.have.property('auids', '43,45');
+ expect(payload).to.have.property('auids', '43,43,45');
+ expect(payload).to.have.property('sizes', '300x250,300x600,728x90');
expect(payload).to.have.property('r', '22edbae2733bf6');
delete bidRequests[1].params.priceType;
});
@@ -155,9 +159,10 @@ describe('TrustXAdapter', function () {
describe('interpretResponse', function () {
const responses = [
{'bid': [{'price': 1.15, 'adm': '
test content 1
', 'auid': 43, 'h': 250, 'w': 300}], 'seat': '1'},
- {'bid': [{'price': 0.5, 'adm': 'test content 2
', 'auid': 44, 'h': 90, 'w': 728}], 'seat': '1'},
+ {'bid': [{'price': 0.5, 'adm': 'test content 2
', 'auid': 44, 'h': 600, 'w': 300}], 'seat': '1'},
+ {'bid': [{'price': 0.15, 'adm': 'test content 3
', 'auid': 43, 'h': 90, 'w': 728}], 'seat': '1'},
{'bid': [{'price': 0, 'auid': 45, 'h': 250, 'w': 300}], 'seat': '1'},
- {'bid': [{'price': 0, 'adm': 'test content 4
', 'h': 250, 'w': 300}], 'seat': '1'},
+ {'bid': [{'price': 0, 'adm': 'test content 5
', 'h': 250, 'w': 300}], 'seat': '1'},
undefined,
{'bid': [], 'seat': '1'},
{'seat': '1'},
@@ -250,26 +255,26 @@ describe('TrustXAdapter', function () {
'ttl': 360,
},
{
- 'requestId': '5703af74d0472a',
- 'cpm': 1.15,
- 'creativeId': 43,
+ 'requestId': '4dff80cc4ee346',
+ 'cpm': 0.5,
+ 'creativeId': 44,
'dealId': undefined,
'width': 300,
- 'height': 250,
- 'ad': 'test content 1
',
+ 'height': 600,
+ 'ad': 'test content 2
',
'bidderCode': 'trustx',
'currency': 'USD',
'netRevenue': true,
'ttl': 360,
},
{
- 'requestId': '4dff80cc4ee346',
- 'cpm': 0.5,
- 'creativeId': 44,
+ 'requestId': '5703af74d0472a',
+ 'cpm': 0.15,
+ 'creativeId': 43,
'dealId': undefined,
'width': 728,
'height': 90,
- 'ad': 'test content 2
',
+ 'ad': 'test content 3
',
'bidderCode': 'trustx',
'currency': 'USD',
'netRevenue': true,
@@ -277,7 +282,7 @@ describe('TrustXAdapter', function () {
}
];
- const result = spec.interpretResponse({'body': {'seatbid': [responses[0], responses[1]]}}, request);
+ const result = spec.interpretResponse({'body': {'seatbid': responses.slice(0, 3)}}, request);
expect(result).to.deep.equal(expectedResponse);
});
@@ -318,8 +323,207 @@ describe('TrustXAdapter', function () {
}
];
const request = spec.buildRequests(bidRequests);
- const result = spec.interpretResponse({'body': {'seatbid': responses.slice(2)}}, request);
+ const result = spec.interpretResponse({'body': {'seatbid': responses.slice(3)}}, request);
expect(result.length).to.equal(0);
});
+
+ it('complicated case', function () {
+ const fullResponse = [
+ {'bid': [{'price': 1.15, 'adm': 'test content 1
', 'auid': 43, 'h': 250, 'w': 300}], 'seat': '1'},
+ {'bid': [{'price': 0.5, 'adm': 'test content 2
', 'auid': 44, 'h': 600, 'w': 300}], 'seat': '1'},
+ {'bid': [{'price': 0.15, 'adm': 'test content 3
', 'auid': 43, 'h': 90, 'w': 728}], 'seat': '1'},
+ {'bid': [{'price': 0.15, 'adm': 'test content 4
', 'auid': 43, 'h': 600, 'w': 300}], 'seat': '1'},
+ {'bid': [{'price': 0.5, 'adm': 'test content 5
', 'auid': 44, 'h': 600, 'w': 350}], 'seat': '1'},
+ ];
+ const bidRequests = [
+ {
+ 'bidder': 'trustx',
+ 'params': {
+ 'uid': '43'
+ },
+ 'adUnitCode': 'adunit-code-1',
+ 'sizes': [[300, 250], [300, 600]],
+ 'bidId': '2164be6358b9',
+ 'bidderRequestId': '106efe3247',
+ 'auctionId': '32a1f276cb87cb8',
+ },
+ {
+ 'bidder': 'trustx',
+ 'params': {
+ 'uid': '43'
+ },
+ 'adUnitCode': 'adunit-code-1',
+ 'sizes': [[300, 250], [300, 600]],
+ 'bidId': '326bde7fbf69',
+ 'bidderRequestId': '106efe3247',
+ 'auctionId': '32a1f276cb87cb8',
+ },
+ {
+ 'bidder': 'trustx',
+ 'params': {
+ 'uid': '44'
+ },
+ 'adUnitCode': 'adunit-code-1',
+ 'sizes': [[300, 250], [300, 600]],
+ 'bidId': '4e111f1b66e4',
+ 'bidderRequestId': '106efe3247',
+ 'auctionId': '32a1f276cb87cb8',
+ },
+ {
+ 'bidder': 'trustx',
+ 'params': {
+ 'uid': '43'
+ },
+ 'adUnitCode': 'adunit-code-2',
+ 'sizes': [[728, 90]],
+ 'bidId': '26d6f897b516',
+ 'bidderRequestId': '106efe3247',
+ 'auctionId': '32a1f276cb87cb8',
+ },
+ {
+ 'bidder': 'trustx',
+ 'params': {
+ 'uid': '44'
+ },
+ 'adUnitCode': 'adunit-code-2',
+ 'sizes': [[728, 90]],
+ 'bidId': '1751cd90161',
+ 'bidderRequestId': '106efe3247',
+ 'auctionId': '32a1f276cb87cb8',
+ }
+ ];
+ const request = spec.buildRequests(bidRequests);
+ const expectedResponse = [
+ {
+ 'requestId': '2164be6358b9',
+ 'cpm': 1.15,
+ 'creativeId': 43,
+ 'dealId': undefined,
+ 'width': 300,
+ 'height': 250,
+ 'ad': 'test content 1
',
+ 'bidderCode': 'trustx',
+ 'currency': 'USD',
+ 'netRevenue': true,
+ 'ttl': 360,
+ },
+ {
+ 'requestId': '4e111f1b66e4',
+ 'cpm': 0.5,
+ 'creativeId': 44,
+ 'dealId': undefined,
+ 'width': 300,
+ 'height': 600,
+ 'ad': 'test content 2
',
+ 'bidderCode': 'trustx',
+ 'currency': 'USD',
+ 'netRevenue': true,
+ 'ttl': 360,
+ },
+ {
+ 'requestId': '26d6f897b516',
+ 'cpm': 0.15,
+ 'creativeId': 43,
+ 'dealId': undefined,
+ 'width': 728,
+ 'height': 90,
+ 'ad': 'test content 3
',
+ 'bidderCode': 'trustx',
+ 'currency': 'USD',
+ 'netRevenue': true,
+ 'ttl': 360,
+ },
+ {
+ 'requestId': '326bde7fbf69',
+ 'cpm': 0.15,
+ 'creativeId': 43,
+ 'dealId': undefined,
+ 'width': 300,
+ 'height': 600,
+ 'ad': 'test content 4
',
+ 'bidderCode': 'trustx',
+ 'currency': 'USD',
+ 'netRevenue': true,
+ 'ttl': 360,
+ }
+ ];
+
+ const result = spec.interpretResponse({'body': {'seatbid': fullResponse}}, request);
+ expect(result).to.deep.equal(expectedResponse);
+ });
+
+ it('dublicate uids and sizes in one slot', function () {
+ const fullResponse = [
+ {'bid': [{'price': 1.15, 'adm': 'test content 1
', 'auid': 43, 'h': 250, 'w': 300}], 'seat': '1'},
+ {'bid': [{'price': 0.5, 'adm': 'test content 2
', 'auid': 43, 'h': 250, 'w': 300}], 'seat': '1'},
+ ];
+ const bidRequests = [
+ {
+ 'bidder': 'trustx',
+ 'params': {
+ 'uid': '43'
+ },
+ 'adUnitCode': 'adunit-code-1',
+ 'sizes': [[300, 250], [300, 600]],
+ 'bidId': '5126e301f4be',
+ 'bidderRequestId': '171c5405a390',
+ 'auctionId': '35bcbc0f7e79c',
+ },
+ {
+ 'bidder': 'trustx',
+ 'params': {
+ 'uid': '43'
+ },
+ 'adUnitCode': 'adunit-code-1',
+ 'sizes': [[300, 250], [300, 600]],
+ 'bidId': '57b2ebe70e16',
+ 'bidderRequestId': '171c5405a390',
+ 'auctionId': '35bcbc0f7e79c',
+ },
+ {
+ 'bidder': 'trustx',
+ 'params': {
+ 'uid': '43'
+ },
+ 'adUnitCode': 'adunit-code-1',
+ 'sizes': [[300, 250], [300, 600]],
+ 'bidId': '225fcd44b18c',
+ 'bidderRequestId': '171c5405a390',
+ 'auctionId': '35bcbc0f7e79c',
+ }
+ ];
+ const request = spec.buildRequests(bidRequests);
+ const expectedResponse = [
+ {
+ 'requestId': '5126e301f4be',
+ 'cpm': 1.15,
+ 'creativeId': 43,
+ 'dealId': undefined,
+ 'width': 300,
+ 'height': 250,
+ 'ad': 'test content 1
',
+ 'bidderCode': 'trustx',
+ 'currency': 'USD',
+ 'netRevenue': true,
+ 'ttl': 360,
+ },
+ {
+ 'requestId': '57b2ebe70e16',
+ 'cpm': 0.5,
+ 'creativeId': 43,
+ 'dealId': undefined,
+ 'width': 300,
+ 'height': 250,
+ 'ad': 'test content 2
',
+ 'bidderCode': 'trustx',
+ 'currency': 'USD',
+ 'netRevenue': true,
+ 'ttl': 360,
+ }
+ ];
+
+ const result = spec.interpretResponse({'body': {'seatbid': fullResponse}}, request);
+ expect(result).to.deep.equal(expectedResponse);
+ });
});
});