Skip to content

Commit

Permalink
PubxAI Rtd module update: Make the endpoint call optional; read from …
Browse files Browse the repository at this point in the history
…local storage. (prebid#12064)

* Made RTD endpoint optional. Read the floors from local storage in case dynamic endpoint is not provided.

* Updated specs to include localStorage tests

* fix import error

* use sessionStorage to fetchfloorData

* updated tests

* Fix the example code in the documentation

* fix unit tests

---------

Co-authored-by: tej656 <tej@pubx.ai>
  • Loading branch information
pnhegde and tej656 committed Jul 31, 2024
1 parent 39fa308 commit 0d021fe
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 25 deletions.
56 changes: 38 additions & 18 deletions modules/pubxaiRtdProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import { ajax } from '../src/ajax.js';
import { config } from '../src/config.js';
import { submodule } from '../src/hook.js';
import { deepAccess } from '../src/utils.js';
import { MODULE_TYPE_RTD } from '../src/activities/modules.js';
import { getStorageManager } from '../src/storageManager.js';
/**
* This RTD module has a dependency on the priceFloors module.
* We utilize the createFloorsDataForAuction function from the priceFloors module to incorporate price floors data into the current auction.
Expand All @@ -16,6 +18,7 @@ export const FloorsApiStatus = Object.freeze({
SUCCESS: 'SUCCESS',
ERROR: 'ERROR',
});
export const storage = getStorageManager({ moduleType: MODULE_TYPE_RTD, moduleName: SUBMODULE_NAME });
export const FLOORS_EVENT_HANDLE = 'floorsApi';
export const FLOORS_END_POINT = 'https://floor.pbxai.com/';
export const FLOOR_PROVIDER = 'PubxFloorProvider';
Expand Down Expand Up @@ -80,31 +83,48 @@ export const setFloorsApiStatus = (status) => {

export const getUrl = (provider) => {
const { pubxId, endpoint } = deepAccess(provider, 'params');
return `${endpoint || FLOORS_END_POINT}?pubxId=${pubxId}&page=${
window.location.href
}`;
if (!endpoint) {
return null; // Indicate that no endpoint is provided
}
return `${endpoint || FLOORS_END_POINT}?pubxId=${pubxId}&page=${window.location.href}`;
};

export const fetchFloorRules = async (provider) => {
return new Promise((resolve, reject) => {
setFloorsApiStatus(FloorsApiStatus.IN_PROGRESS);
ajax(getUrl(provider), {
success: (responseText, response) => {
try {
if (response && response.response) {
const floorsResponse = JSON.parse(response.response);
resolve(floorsResponse);
} else {
resolve(null);
const url = getUrl(provider);
if (url) {
// Fetch from remote endpoint
ajax(url, {
success: (responseText, response) => {
try {
if (response && response.response) {
const floorsResponse = JSON.parse(response.response);
resolve(floorsResponse);
} else {
resolve(null);
}
} catch (error) {
reject(error);
}
} catch (error) {
reject(error);
},
error: (responseText, response) => {
reject(response);
},
});
} else {
// Fetch from local storage
try {
const localData = storage.getDataFromSessionStorage('pubx:dynamicFloors') || window.__pubxDynamicFloors__;
if (localData) {
resolve(JSON.parse(localData));
} else {
resolve(null);
}
},
error: (responseText, response) => {
reject(response);
},
});
} catch (error) {
reject(error);
}
}
});
};

Expand Down
4 changes: 2 additions & 2 deletions modules/pubxaiRtdProvider.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ pbjs.setConfig({
...,
realTimeData: {
auctionDelay: AUCTION_DELAY,
dataProviders: {
dataProviders: [{
name: "pubxai",
waitForIt: true,
params: {
Expand All @@ -42,7 +42,7 @@ pbjs.setConfig({
enforcement: `<enforcement>`, // (optional)
data: `<defaultConfig>` // (optional)
}
}
}]
}
// rest of the config
...,
Expand Down
42 changes: 37 additions & 5 deletions test/spec/modules/pubxaiRtdProvider_spec.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as priceFloors from '../../../modules/priceFloors';
import {
FLOORS_END_POINT,
storage,
FLOORS_EVENT_HANDLE,
FloorsApiStatus,
beforeInit,
Expand Down Expand Up @@ -45,6 +46,7 @@ const resetGlobals = () => {
window.__pubxFloorsConfig__ = undefined;
window.__pubxFloorsApiStatus__ = undefined;
window.__pubxFloorRulesPromise__ = null;
localStorage.removeItem('pubx:dynamicFloors');
};

const fakeServer = (
Expand Down Expand Up @@ -119,7 +121,7 @@ describe('pubxaiRtdProvider', () => {
stub.restore();
});
it('createFloorsDataForAuction called once before and once after __pubxFloorRulesPromise__. Also getBidRequestData executed only once', async () => {
pubxaiSubmodule.getBidRequestData(reqBidsConfigObj, () => {});
pubxaiSubmodule.getBidRequestData(reqBidsConfigObj, () => { });
assert(priceFloors.createFloorsDataForAuction.calledOnce);
await window.__pubxFloorRulesPromise__;
assert(priceFloors.createFloorsDataForAuction.calledTwice);
Expand All @@ -129,14 +131,24 @@ describe('pubxaiRtdProvider', () => {
reqBidsConfigObj.auctionId
)
);
pubxaiSubmodule.getBidRequestData(reqBidsConfigObj, () => {});
pubxaiSubmodule.getBidRequestData(reqBidsConfigObj, () => { });
await window.__pubxFloorRulesPromise__;
assert(priceFloors.createFloorsDataForAuction.calledTwice);
});
});
describe('fetchFloorRules', () => {
const providerConfig = getConfig();
const floorsResponse = getFloorsResponse();
let storageStub;

beforeEach(() => {
storageStub = sinon.stub(storage, 'getDataFromSessionStorage');
});

afterEach(() => {
storageStub.restore();
});

it('success with floors response', (done) => {
const promise = fetchFloorRules(providerConfig);
fakeServer(floorsResponse);
Expand All @@ -145,6 +157,7 @@ describe('pubxaiRtdProvider', () => {
done();
});
});

it('success with no floors response', (done) => {
const promise = fetchFloorRules(providerConfig);
fakeServer(undefined);
Expand All @@ -153,6 +166,7 @@ describe('pubxaiRtdProvider', () => {
done();
});
});

it('API call error', (done) => {
const promise = fetchFloorRules(providerConfig);
fakeServer(undefined, undefined, 404);
Expand All @@ -167,6 +181,7 @@ describe('pubxaiRtdProvider', () => {
done();
});
});

it('Wrong API response', (done) => {
const promise = fetchFloorRules(providerConfig);
fakeServer('floorsResponse');
Expand All @@ -181,6 +196,25 @@ describe('pubxaiRtdProvider', () => {
done();
});
});

it('success with local data response', (done) => {
const localFloorsResponse = getFloorsResponse();
storageStub.withArgs('pubx:dynamicFloors').returns(JSON.stringify(localFloorsResponse));
const promise = fetchFloorRules({ params: {} });
promise.then((res) => {
expect(res).to.deep.equal(localFloorsResponse);
done();
});
});

it('no local data response', (done) => {
storageStub.withArgs('pubx:dynamicFloors').returns(null);
const promise = fetchFloorRules({ params: {} });
promise.then((res) => {
expect(res).to.deep.equal(null);
done();
});
});
});
describe('setPriceFloors', () => {
const providerConfig = getConfig();
Expand Down Expand Up @@ -383,9 +417,7 @@ describe('pubxaiRtdProvider', () => {
expect(FLOORS_END_POINT).to.equal('https://floor.pbxai.com/');
});
it('standard case', () => {
expect(getUrl(provider)).to.equal(
`https://floor.pbxai.com/?pubxId=12345&page=${window.location.href}`
);
expect(getUrl(provider)).to.equal(null);
});
it('custom url provided', () => {
provider.params.endpoint = 'https://custom.floor.com/';
Expand Down

0 comments on commit 0d021fe

Please sign in to comment.