Skip to content

Commit

Permalink
Fix mapping data (prebid#5271)
Browse files Browse the repository at this point in the history
* update mapping data refresh logic

* add unit tests

* put parsing in try catch block

* refactor

Co-authored-by: sumit sharma <sumit.sharma1@SYNPUNLT9114TFL.appnexus.com>
Co-authored-by: sumit sharma <sumit.sharma1@SYNPUNLT9114TFL.SYNAPPNXS.local>
  • Loading branch information
3 people authored and iggyfisk committed Jun 22, 2020
1 parent c251243 commit 763a4c4
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 77 deletions.
35 changes: 20 additions & 15 deletions modules/categoryTranslation.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,23 +68,28 @@ export function getAdserverCategoryHook(fn, adUnitCode, bid) {
export function initTranslation(url, localStorageKey) {
setupBeforeHookFnOnce(addBidResponse, getAdserverCategoryHook, 50);
let mappingData = storage.getDataFromLocalStorage(localStorageKey);
if (!mappingData || timestamp() < mappingData.lastUpdated + refreshInDays * 24 * 60 * 60 * 1000) {
ajax(url,
{
success: (response) => {
try {
response = JSON.parse(response);
response['lastUpdated'] = timestamp();
storage.setDataInLocalStorage(localStorageKey, JSON.stringify(response));
} catch (error) {
logError('Failed to parse translation mapping file');
try {
mappingData = mappingData ? JSON.parse(mappingData) : undefined;
if (!mappingData || timestamp() > mappingData.lastUpdated + refreshInDays * 24 * 60 * 60 * 1000) {
ajax(url,
{
success: (response) => {
try {
response = JSON.parse(response);
response['lastUpdated'] = timestamp();
storage.setDataInLocalStorage(localStorageKey, JSON.stringify(response));
} catch (error) {
logError('Failed to parse translation mapping file');
}
},
error: () => {
logError('Failed to load brand category translation file.')
}
},
error: () => {
logError('Failed to load brand category translation file.')
}
},
);
);
}
} catch (error) {
logError('Failed to parse translation mapping file');
}
}

Expand Down
39 changes: 22 additions & 17 deletions src/adapters/bidderFactory.js
Original file line number Diff line number Diff line change
Expand Up @@ -382,26 +382,31 @@ export function preloadBidderMappingFile(fn, adUnits) {
let refreshInDays = (info.refreshInDays) ? info.refreshInDays : DEFAULT_REFRESHIN_DAYS;
let key = (info.localStorageKey) ? info.localStorageKey : bidderSpec.getSpec().code;
let mappingData = storage.getDataFromLocalStorage(key);
if (!mappingData || timestamp() < mappingData.lastUpdated + refreshInDays * 24 * 60 * 60 * 1000) {
ajax(info.url,
{
success: (response) => {
try {
response = JSON.parse(response);
let mapping = {
lastUpdated: timestamp(),
mapping: response.mapping
try {
mappingData = mappingData ? JSON.parse(mappingData) : undefined;
if (!mappingData || timestamp() > mappingData.lastUpdated + refreshInDays * 24 * 60 * 60 * 1000) {
ajax(info.url,
{
success: (response) => {
try {
response = JSON.parse(response);
let mapping = {
lastUpdated: timestamp(),
mapping: response.mapping
}
storage.setDataInLocalStorage(key, JSON.stringify(mapping));
} catch (error) {
logError(`Failed to parse ${bidder} bidder translation mapping file`);
}
storage.setDataInLocalStorage(key, JSON.stringify(mapping));
} catch (error) {
logError(`Failed to parse ${bidder} bidder translation mapping file`);
},
error: () => {
logError(`Failed to load ${bidder} bidder translation file`)
}
},
error: () => {
logError(`Failed to load ${bidder} bidder translation file`)
}
},
);
);
}
} catch (error) {
logError(`Failed to parse ${bidder} bidder translation mapping file`);
}
}
});
Expand Down
15 changes: 14 additions & 1 deletion test/spec/modules/categoryTranslation_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,14 +77,27 @@ describe('category translation', function () {
clock.restore();
});

it('should make ajax call to update mapping file if data found in localstorage is expired', function () {
let clock = sinon.useFakeTimers(utils.timestamp());
getLocalStorageStub.returns(JSON.stringify({
lastUpdated: utils.timestamp() - 2 * 24 * 60 * 60 * 1000,
mapping: {
'iab-1': '1'
}
}));
initTranslation();
expect(fakeTranslationServer.requests.length).to.equal(1);
clock.restore();
});

it('should use default mapping file if publisher has not defined in config', function () {
getLocalStorageStub.returns(null);
initTranslation('http://sample.com', 'somekey');
expect(fakeTranslationServer.requests.length).to.equal(1);
expect(fakeTranslationServer.requests[0].url).to.equal('http://sample.com');
});

it('should use publisher defined defined mapping file', function () {
it('should use publisher defined mapping file', function () {
config.setConfig({
'brandCategoryTranslation': {
'translationFile': 'http://sample.com'
Expand Down
96 changes: 52 additions & 44 deletions test/spec/unit/core/bidderFactory_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -841,42 +841,32 @@ describe('preload mapping url hook', function() {
let fakeTranslationServer;
let getLocalStorageStub;
let adapterManagerStub;
let adUnits = [{
code: 'midroll_1',
mediaTypes: {
video: {
context: 'adpod'
}
},
bids: [
{
bidder: 'sampleBidder1',
params: {
placementId: 14542875,
}
}
]
}];

beforeEach(function () {
fakeTranslationServer = server;
getLocalStorageStub = sinon.stub(storage, 'getDataFromLocalStorage');
adapterManagerStub = sinon.stub(adapterManager, 'getBidAdapter');
});

afterEach(function() {
getLocalStorageStub.restore();
adapterManagerStub.restore();
config.resetConfig();
});

it('should preload mapping url file', function() {
config.setConfig({
'adpod': {
'brandCategoryExclusion': true
}
});
let adUnits = [{
code: 'midroll_1',
mediaTypes: {
video: {
context: 'adpod'
}
},
bids: [
{
bidder: 'sampleBidder1',
params: {
placementId: 14542875,
}
}
]
}];
getLocalStorageStub.returns(null);
adapterManagerStub.withArgs('sampleBidder1').returns({
getSpec: function() {
return {
Expand All @@ -890,16 +880,21 @@ describe('preload mapping url hook', function() {
}
}
});
});

afterEach(function() {
getLocalStorageStub.restore();
adapterManagerStub.restore();
config.resetConfig();
});

it('should preload mapping url file', function() {
getLocalStorageStub.returns(null);
preloadBidderMappingFile(sinon.spy(), adUnits);
expect(fakeTranslationServer.requests.length).to.equal(1);
});

it('should preload mapping url file for all bidders', function() {
config.setConfig({
'adpod': {
'brandCategoryExclusion': true
}
});
let adUnits = [{
code: 'midroll_1',
mediaTypes: {
Expand All @@ -923,19 +918,6 @@ describe('preload mapping url hook', function() {
]
}];
getLocalStorageStub.returns(null);
adapterManagerStub.withArgs('sampleBidder1').returns({
getSpec: function() {
return {
'getMappingFileInfo': function() {
return {
url: 'http://sample.com',
refreshInDays: 7,
key: `sampleBidder1MappingFile`
}
}
}
}
});
adapterManagerStub.withArgs('sampleBidder2').returns({
getSpec: function() {
return {
Expand All @@ -960,4 +942,30 @@ describe('preload mapping url hook', function() {
preloadBidderMappingFile(sinon.spy(), adUnits);
expect(fakeTranslationServer.requests.length).to.equal(2);
});

it('should make ajax call to update mapping file if data found in localstorage is expired', function() {
let clock = sinon.useFakeTimers(utils.timestamp());
getLocalStorageStub.returns(JSON.stringify({
lastUpdated: utils.timestamp() - 8 * 24 * 60 * 60 * 1000,
mapping: {
'iab-1': '1'
}
}));
preloadBidderMappingFile(sinon.spy(), adUnits);
expect(fakeTranslationServer.requests.length).to.equal(1);
clock.restore();
});

it('should not make ajax call to update mapping file if data found in localstorage and is not expired', function () {
let clock = sinon.useFakeTimers(utils.timestamp());
getLocalStorageStub.returns(JSON.stringify({
lastUpdated: utils.timestamp(),
mapping: {
'iab-1': '1'
}
}));
preloadBidderMappingFile(sinon.spy(), adUnits);
expect(fakeTranslationServer.requests.length).to.equal(0);
clock.restore();
});
});

0 comments on commit 763a4c4

Please sign in to comment.