Skip to content

Commit 7cf6b86

Browse files
committed
Do not throw if native response contains assets that were not requested
1 parent e332251 commit 7cf6b86

File tree

2 files changed

+61
-18
lines changed

2 files changed

+61
-18
lines changed

src/native.js

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -677,40 +677,47 @@ export function legacyPropertiesToOrtbNative(legacyNative) {
677677
}
678678

679679
export function toOrtbNativeResponse(legacyResponse, ortbRequest) {
680-
// copy the request, so we don't pollute it with response data below
681-
ortbRequest = deepClone(ortbRequest);
682-
683680
const ortbResponse = {
684681
...legacyPropertiesToOrtbNative(legacyResponse),
685682
assets: []
686683
};
684+
685+
function useRequestAsset(predicate, fn) {
686+
let asset = ortbRequest.assets.find(predicate);
687+
if (asset != null) {
688+
asset = deepClone(asset);
689+
fn(asset);
690+
ortbResponse.assets.push(asset);
691+
}
692+
}
693+
687694
Object.keys(legacyResponse).filter(key => !!legacyResponse[key]).forEach(key => {
688695
const value = legacyResponse[key];
689696
switch (key) {
690697
// process titles
691698
case 'title':
692-
const titleAsset = ortbRequest.assets.find(asset => asset.title != null);
693-
titleAsset.title = {
694-
text: value
695-
};
696-
ortbResponse.assets.push(titleAsset);
699+
useRequestAsset(asset => asset.title != null, titleAsset => {
700+
titleAsset.title = {
701+
text: value
702+
};
703+
})
697704
break;
698705
case 'image':
699706
case 'icon':
700707
const imageType = key === 'image' ? NATIVE_IMAGE_TYPES.MAIN : NATIVE_IMAGE_TYPES.ICON;
701-
const imageAsset = ortbRequest.assets.find(asset => asset.img != null && asset.img.type == imageType);
702-
imageAsset.img = {
703-
url: value
704-
};
705-
ortbResponse.assets.push(imageAsset);
708+
useRequestAsset(asset => asset.img != null && asset.img.type === imageType, imageAsset => {
709+
imageAsset.img = {
710+
url: value
711+
};
712+
})
706713
break;
707714
default:
708715
if (key in PREBID_NATIVE_DATA_KEYS_TO_ORTB) {
709-
const dataAsset = ortbRequest.assets.find(asset => asset.data != null && asset.data.type === NATIVE_ASSET_TYPES[PREBID_NATIVE_DATA_KEYS_TO_ORTB[key]]);
710-
dataAsset.data = {
711-
value
712-
};
713-
ortbResponse.assets.push(dataAsset);
716+
useRequestAsset(asset => asset.data != null && asset.data.type === NATIVE_ASSET_TYPES[PREBID_NATIVE_DATA_KEYS_TO_ORTB[key]], dataAsset => {
717+
dataAsset.data = {
718+
value
719+
};
720+
})
714721
}
715722
break;
716723
}

test/spec/native_spec.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,3 +1082,39 @@ describe('fireClickTrackers', () => {
10821082
urls.forEach(url => sinon.assert.calledWith(fetchURL, url));
10831083
})
10841084
})
1085+
1086+
describe('toOrtbNativeResponse', () => {
1087+
it('should work when there are unrequested assets in the response', () => {
1088+
const legacyResponse = {
1089+
'title': 'vtitle',
1090+
'body': 'vbody'
1091+
}
1092+
const request = toOrtbNativeRequest({
1093+
title: {
1094+
required: 'true'
1095+
},
1096+
1097+
});
1098+
const ortbResponse = toOrtbNativeResponse(legacyResponse, request);
1099+
expect(ortbResponse.assets.length).to.eql(1);
1100+
});
1101+
1102+
it('should not modify the request', () => {
1103+
const legacyResponse = {
1104+
title: 'vtitle'
1105+
}
1106+
const request = toOrtbNativeRequest({
1107+
title: {
1108+
required: true
1109+
}
1110+
});
1111+
const requestCopy = JSON.parse(JSON.stringify(request));
1112+
const response = toOrtbNativeResponse(legacyResponse, request);
1113+
expect(request).to.eql(requestCopy);
1114+
sinon.assert.match(response.assets[0], {
1115+
title: {
1116+
text: 'vtitle'
1117+
}
1118+
})
1119+
})
1120+
})

0 commit comments

Comments
 (0)