Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

parrableIdSystem: Consume US Privacy consent data #5197

Merged
merged 9 commits into from
May 11, 2020
Prev Previous commit
Next Next commit
PBID-14: Pass uspString to Parrable as us_privacy query parameter
  • Loading branch information
icflournoy committed Apr 29, 2020
commit 4af9a6f3e85751f9ea04ee93c32077c054e38b30
9 changes: 6 additions & 3 deletions modules/parrableIdSystem.js
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@ import * as utils from '../src/utils.js'
import { ajax } from '../src/ajax.js';
import { submodule } from '../src/hook.js';
import { getRefererInfo } from '../src/refererDetection.js';
import { uspDataHandler } from '../src/adapterManager.js';

const PARRABLE_URL = 'https://h.parrable.com/prebid';

@@ -24,10 +25,11 @@ function isValidConfig(configParams) {
return true;
}

function fetchId(configParams, consentData, currentStoredId) {
function fetchId(configParams, currentStoredId) {
if (!isValidConfig(configParams)) return;

const refererInfo = getRefererInfo();
const uspString = uspDataHandler.getConsentData();

const data = {
eid: currentStoredId || null,
@@ -37,6 +39,7 @@ function fetchId(configParams, consentData, currentStoredId) {

const searchParams = {
data: btoa(JSON.stringify(data)),
us_privacy: uspString,
_rand: Math.random()
};

@@ -88,8 +91,8 @@ export const parrableIdSubmodule = {
* @param {ConsentData} [consentData]
* @returns {function(callback:function)}
*/
getId(configParams, consentData, currentStoredId) {
return fetchId(configParams, consentData, currentStoredId);
getId(configParams, gdprConsentData, currentStoredId) {
return fetchId(configParams, currentStoredId);
}
};

64 changes: 49 additions & 15 deletions test/spec/modules/parrableIdSystem_spec.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { expect } from 'chai';
import { config } from 'src/config.js';
import * as utils from 'src/utils.js';
import { init, requestBidsHook, setSubmoduleRegistry } from 'modules/userId/index.js';
import { parrableIdSubmodule } from 'modules/parrableIdSystem.js';
import { newStorageManager } from 'src/storageManager.js';
import { getRefererInfo } from 'src/refererDetection.js';

import * as consentUsp from 'modules/consentManagementUsp.js';
import { init, requestBidsHook, setSubmoduleRegistry } from 'modules/userId/index.js';
import { parrableIdSubmodule } from 'modules/parrableIdSystem.js';
import { server } from 'test/mocks/xhr';

const storage = newStorageManager();
@@ -52,45 +52,79 @@ describe('Parrable ID System', function() {
}

describe('parrableIdSystem.getId()', function() {
let submoduleCallback;
let callbackSpy = sinon.spy();

beforeEach(function() {
submoduleCallback = parrableIdSubmodule.getId(
P_CONFIG_MOCK.params,
null,
P_COOKIE_EID
).callback;
callbackSpy.reset();
});

it('returns a callback used to refresh the ID', function() {
expect(submoduleCallback).to.be.a('function');
let getIdResponse = parrableIdSubmodule.getId(
P_CONFIG_MOCK.params,
null,
P_COOKIE_EID
);
expect(getIdResponse.callback).to.be.a('function');
});

it('invoked callback creates an xhr request to Parrable with id and telemetry', function() {
submoduleCallback(callbackSpy);
it('callback creates xhr to Parrable that synchronizes the ID', function() {
let getIdCallback = parrableIdSubmodule.getId(
P_CONFIG_MOCK.params,
null,
P_COOKIE_EID
).callback;

getIdCallback(callbackSpy);

let request = server.requests[0];
let queryParams = utils.parseQS(request.url.split('?')[1]);
let data = JSON.parse(atob(queryParams.data));

expect(request.url).to.contain('h.parrable.com/prebid');
expect(queryParams.us_privacy).to.equal('null');
expect(data).to.deep.equal({
eid: P_COOKIE_EID,
trackers: P_CONFIG_MOCK.params.partner.split(','),
url: getRefererInfo().referer
});
});

it('callback responds with updated eid from Parrable backend', function() {
submoduleCallback(callbackSpy);
server.requests[0].respond(200,
{ 'Content-Type': 'text/plain' },
JSON.stringify({ eid: P_XHR_EID })
);

expect(callbackSpy.calledWith(P_XHR_EID)).to.be.true;
});

it('passes the uspString to Parrable', function(done) {
let adUnits = [getAdUnitMock()];
let uspString = '1YNN';
let consentManagementConfig = {
usp: {
cmpApi: 'static',
consentData: {
getUSPData: {
uspString
}
}
}
};

// Outside of tests the consentManagementUsp module is run at priority 50
// in the requestBids hook, where userId runs at 40 (later than 50)
// So when userId module collects userIdSystem callbacks the Usp data
// should be present.
consentUsp.setConsentConfig(consentManagementConfig);
consentUsp.requestBidsHook(function() {
parrableIdSubmodule.getId(
P_CONFIG_MOCK.params,
null,
P_COOKIE_EID
).callback(callbackSpy);
expect(server.requests[0].url).to.contain('us_privacy=' + uspString);
done();
}, { adUnits });
});
});

describe('Parrable ID in Bid Request', function() {