From fb30db12a982e0d6d001eff4e1693926b9a77640 Mon Sep 17 00:00:00 2001 From: "ma.matic" Date: Fri, 28 Jun 2019 14:11:27 +0200 Subject: [PATCH 1/4] idLink - integrate new submodule idLinkSystem in to userId module --- integrationExamples/gpt/userId_example.html | 12 +- modules/idLinkSystem.js | 55 +++++++++ modules/userId.js | 3 + modules/userId.md | 22 +++- test/spec/modules/userId_spec.js | 117 +++++++++++++++++++- 5 files changed, 204 insertions(+), 5 deletions(-) create mode 100644 modules/idLinkSystem.js diff --git a/integrationExamples/gpt/userId_example.html b/integrationExamples/gpt/userId_example.html index d64e22e44c76..7f4b649503dc 100644 --- a/integrationExamples/gpt/userId_example.html +++ b/integrationExamples/gpt/userId_example.html @@ -140,7 +140,7 @@ name: "unifiedid", expires: 30 }, - + }, { name: "pubCommonId", storage: { @@ -152,6 +152,16 @@ // foo: '9879878907987', // bar:'93939' // } + }, { + name: 'idLink', + params: { + pid: '14' + }, + storage: { + type: 'cookie', + name: 'idl_env', + expires: 60 + } }], syncDelay: 5000 } diff --git a/modules/idLinkSystem.js b/modules/idLinkSystem.js new file mode 100644 index 000000000000..18ccd1ca9829 --- /dev/null +++ b/modules/idLinkSystem.js @@ -0,0 +1,55 @@ +/** + * This module adds idLink to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/idLinkSubmodule + * @requires module:modules/userId + */ + +import * as utils from '../src/utils.js' +import {ajax} from '../src/ajax.js'; + +/** @type {Submodule} */ +export const idLinkSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: 'idLink', + /** + * decode the stored id value for passing to bid requests + * @function + * @param {string} value + * @returns {{idl_env:string}} + */ + decode(value) { + return { 'idl_env': value } + }, + /** + * performs action to obtain id and return a value in the callback's response argument + * @function + * @param {SubmoduleParams} [configParams] + * @returns {function(callback:function)} + */ + getId(configParams) { + if (!configParams || typeof configParams.pid !== 'string') { + utils.logError('ID Link - idLink submodule requires partner id to be defined'); + return; + } + // use protocol relative urls for http or https + const url = `https://api.rlcdn.com/api/identity?pid=${configParams.pid}&rt=envelope`; + + return function (callback) { + ajax(url, response => { + let responseObj; + if (response) { + try { + responseObj = JSON.parse(response); + } catch (error) { + utils.logError(error); + } + } + callback(responseObj.envelope); + }, undefined, { method: 'GET' }); + } + } +}; diff --git a/modules/userId.js b/modules/userId.js index ae06dfc40274..7bb8cf92615d 100644 --- a/modules/userId.js +++ b/modules/userId.js @@ -50,6 +50,7 @@ * @typedef {Object} SubmoduleParams * @property {(string|undefined)} partner - partner url param value * @property {(string|undefined)} url - webservice request url used to load Id data + * @property {(string|undefined)} pid - placement id url param value */ /** @@ -76,6 +77,7 @@ import {gdprDataHandler} from '../src/adapterManager.js'; import {unifiedIdSubmodule} from './unifiedIdSystem.js'; import {pubCommonIdSubmodule} from './pubCommonIdSystem.js'; import CONSTANTS from '../src/constants.json'; +import {idLinkSubmodule} from './idLinkSystem.js'; const MODULE_NAME = 'User ID'; const COOKIE = 'cookie'; @@ -422,3 +424,4 @@ init(config); // add submodules after init has been called attachIdSystem(pubCommonIdSubmodule); attachIdSystem(unifiedIdSubmodule); +attachIdSystem(idLinkSubmodule); diff --git a/modules/userId.md b/modules/userId.md index 782e7782554e..cb64a5b07e22 100644 --- a/modules/userId.md +++ b/modules/userId.md @@ -1,6 +1,6 @@ ## User ID Example Configuration -Example showing `cookie` storage for user id data for both submodules +Example showing `cookie` storage for user id data for available submodules ``` pbjs.setConfig({ userSync: { @@ -22,6 +22,16 @@ pbjs.setConfig({ name: "_pubcid", expires: 60 } + }, { + name: 'idLink', + params: { + pid: '14' + }, + storage: { + type: 'cookie', + name: 'idl_env', + expires: 60 + } }], syncDelay: 5000 } @@ -50,6 +60,16 @@ pbjs.setConfig({ name: "pubcid", expires: 60 } + }, { + name: 'idLink', + params: { + pid: '14' + }, + storage: { + type: 'html5', + name: 'idl_env', + expires: 60 + } }], syncDelay: 5000 } diff --git a/test/spec/modules/userId_spec.js b/test/spec/modules/userId_spec.js index d0f5e06cdade..7e21444610e9 100644 --- a/test/spec/modules/userId_spec.js +++ b/test/spec/modules/userId_spec.js @@ -9,18 +9,20 @@ import {config} from 'src/config'; import * as utils from 'src/utils'; import {unifiedIdSubmodule} from 'modules/unifiedIdSystem'; import {pubCommonIdSubmodule} from 'modules/pubCommonIdSystem'; +import {idLinkSubmodule} from 'modules/idLinkSystem'; let assert = require('chai').assert; let expect = require('chai').expect; const EXPIRED_COOKIE_DATE = 'Thu, 01 Jan 1970 00:00:01 GMT'; describe('User ID', function() { - function getConfigMock(configArr1, configArr2) { + function getConfigMock(configArr1, configArr2, configArr3) { return { userSync: { syncDelay: 0, userIds: [ (configArr1 && configArr1.length === 3) ? getStorageMock.apply(null, configArr1) : null, - (configArr2 && configArr2.length === 3) ? getStorageMock.apply(null, configArr2) : null + (configArr2 && configArr2.length === 3) ? getStorageMock.apply(null, configArr2) : null, + (configArr3 && configArr3.length === 3) ? getStorageMock.apply(null, configArr3) : null ].filter(i => i)} } } @@ -344,6 +346,46 @@ describe('User ID', function() { }, {adUnits}); }); + it('test hook from idLink html5', function(done) { + // simulate existing browser local storage values + localStorage.setItem('idl_env', 'AiGNC8Z5ONyZKSpIPf'); + localStorage.setItem('idl_env_exp', ''); + + setSubmoduleRegistry([idLinkSubmodule]); + init(config); + config.setConfig(getConfigMock(['idLink', 'idl_env', 'html5'])); + requestBidsHook(function() { + adUnits.forEach(unit => { + unit.bids.forEach(bid => { + expect(bid).to.have.deep.nested.property('userId.idl_env'); + expect(bid.userId.idl_env).to.equal('AiGNC8Z5ONyZKSpIPf'); + }); + }); + localStorage.removeItem('idl_env'); + localStorage.removeItem('idl_env_exp'); + done(); + }, {adUnits}); + }); + + it('test hook from idLink cookie', function(done) { + utils.setCookie('idl_env', 'AiGNC8Z5ONyZKSpIPf', (new Date(Date.now() + 100000).toUTCString())); + + setSubmoduleRegistry([idLinkSubmodule]); + init(config); + config.setConfig(getConfigMock(['idLink', 'idl_env', 'cookie'])); + + requestBidsHook(function() { + adUnits.forEach(unit => { + unit.bids.forEach(bid => { + expect(bid).to.have.deep.nested.property('userId.idl_env'); + expect(bid.userId.idl_env).to.equal('AiGNC8Z5ONyZKSpIPf'); + }); + }); + utils.setCookie('idl_env', '', EXPIRED_COOKIE_DATE); + done(); + }, {adUnits}); + }); + it('test hook when both pubCommonId and unifiedId have data to pass', function(done) { utils.setCookie('pubcid', 'testpubcid', (new Date(Date.now() + 5000).toUTCString())); utils.setCookie('unifiedid', JSON.stringify({'TDID': 'testunifiedid'}), (new Date(Date.now() + 5000).toUTCString())); @@ -369,6 +411,35 @@ describe('User ID', function() { }, {adUnits}); }); + it('IdLink test hook when pubCommonId, unifiedId and IdLink have data to pass', function(done) { + utils.setCookie('pubcid', 'testpubcid', (new Date(Date.now() + 5000).toUTCString())); + utils.setCookie('unifiedid', JSON.stringify({'TDID': 'testunifiedid'}), (new Date(Date.now() + 5000).toUTCString())); + utils.setCookie('idl_env', 'AiGNC8Z5ONyZKSpIPf', (new Date(Date.now() + 5000).toUTCString())); + + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, idLinkSubmodule]); + init(config); + config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'], ['unifiedId', 'unifiedid', 'cookie'], ['idLink', 'idl_env', 'cookie'])); + requestBidsHook(function() { + adUnits.forEach(unit => { + unit.bids.forEach(bid => { + // verify that the PubCommonId id data was copied to bid + expect(bid).to.have.deep.nested.property('userId.pubcid'); + expect(bid.userId.pubcid).to.equal('testpubcid'); + // also check that UnifiedId id data was copied to bid + expect(bid).to.have.deep.nested.property('userId.tdid'); + expect(bid.userId.tdid).to.equal('testunifiedid'); + // check that idLink id data was copied to bid + expect(bid).to.have.deep.nested.property('userId.idl_env'); + expect(bid.userId.idl_env).to.equal('AiGNC8Z5ONyZKSpIPf'); + }); + }); + utils.setCookie('pubcid', '', EXPIRED_COOKIE_DATE); + utils.setCookie('unifiedid', '', EXPIRED_COOKIE_DATE); + utils.setCookie('idl_env', '', EXPIRED_COOKIE_DATE); + done(); + }, {adUnits}); + }); + it('test hook when pubCommonId and unifiedId have their modules added before and after init', function(done) { utils.setCookie('pubcid', 'testpubcid', (new Date(Date.now() + 5000).toUTCString())); utils.setCookie('unifiedid', JSON.stringify({'TDID': 'cookie-value-add-module-variations'}), new Date(Date.now() + 5000).toUTCString()); @@ -402,12 +473,46 @@ describe('User ID', function() { }, {adUnits}); }); + it('test hook when pubCommonId and IdLink have their modules added before and after init', function(done) { + utils.setCookie('pubcid', 'testpubcid', (new Date(Date.now() + 5000).toUTCString())); + utils.setCookie('idl_env', 'AiGNC8Z5ONyZKSpIPf', new Date(Date.now() + 5000).toUTCString()); + + setSubmoduleRegistry([]); + + // attaching before init + attachIdSystem(pubCommonIdSubmodule); + + init(config); + + // attaching after init + attachIdSystem(idLinkSubmodule); + + config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'], ['idLink', 'idl_env', 'cookie'])); + + requestBidsHook(function() { + adUnits.forEach(unit => { + unit.bids.forEach(bid => { + // verify that the PubCommonId id data was copied to bid + expect(bid).to.have.deep.nested.property('userId.pubcid'); + expect(bid.userId.pubcid).to.equal('testpubcid'); + // also check that idLink id data was copied to bid + expect(bid).to.have.deep.nested.property('userId.idl_env'); + expect(bid.userId.idl_env).to.equal('AiGNC8Z5ONyZKSpIPf'); + }); + }); + utils.setCookie('pubcid', '', EXPIRED_COOKIE_DATE); + utils.setCookie('idl_env', '', EXPIRED_COOKIE_DATE); + done(); + }, {adUnits}); + }); + it('should add new id system ', function(done) { utils.setCookie('pubcid', 'testpubcid', (new Date(Date.now() + 5000).toUTCString())); utils.setCookie('unifiedid', JSON.stringify({'TDID': 'cookie-value-add-module-variations'}), new Date(Date.now() + 5000).toUTCString()); + utils.setCookie('idl_env', 'AiGNC8Z5ONyZKSpIPf', new Date(Date.now() + 5000).toUTCString()); utils.setCookie('MOCKID', JSON.stringify({'MOCKID': '123456778'}), new Date(Date.now() + 5000).toUTCString()); - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, idLinkSubmodule]); init(config); config.setConfig({ @@ -417,6 +522,8 @@ describe('User ID', function() { name: 'pubCommonId', storage: { name: 'pubcid', type: 'cookie' } }, { name: 'unifiedId', storage: { name: 'unifiedid', type: 'cookie' } + }, { + name: 'idLink', storage: { name: 'idl_env', type: 'cookie' } }, { name: 'mockId', storage: { name: 'MOCKID', type: 'cookie' } }] @@ -445,6 +552,9 @@ describe('User ID', function() { // check UnifiedId id data was copied to bid expect(bid).to.have.deep.nested.property('userId.tdid'); expect(bid.userId.tdid).to.equal('cookie-value-add-module-variations'); + // also check that idLink id data was copied to bid + expect(bid).to.have.deep.nested.property('userId.idl_env'); + expect(bid.userId.idl_env).to.equal('AiGNC8Z5ONyZKSpIPf'); // check MockId data was copied to bid expect(bid).to.have.deep.nested.property('userId.mid'); expect(bid.userId.mid).to.equal('123456778'); @@ -452,6 +562,7 @@ describe('User ID', function() { }); utils.setCookie('pubcid', '', EXPIRED_COOKIE_DATE); utils.setCookie('unifiedid', '', EXPIRED_COOKIE_DATE); + utils.setCookie('idl_env', '', EXPIRED_COOKIE_DATE); utils.setCookie('MOCKID', '', EXPIRED_COOKIE_DATE); done(); }, {adUnits}); From 9b4205f9bba8a2f47e3b2e473a9cad05df5d473a Mon Sep 17 00:00:00 2001 From: "ma.matic" Date: Mon, 1 Jul 2019 13:56:51 +0200 Subject: [PATCH 2/4] idLink - Fix unit tests --- test/spec/modules/userId_spec.js | 38 ++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/test/spec/modules/userId_spec.js b/test/spec/modules/userId_spec.js index 9a24bbc32f0f..6ae8d9aecbf8 100644 --- a/test/spec/modules/userId_spec.js +++ b/test/spec/modules/userId_spec.js @@ -16,14 +16,15 @@ let expect = require('chai').expect; const EXPIRED_COOKIE_DATE = 'Thu, 01 Jan 1970 00:00:01 GMT'; describe('User ID', function() { - function getConfigMock(configArr1, configArr2, configArr3) { + function getConfigMock(configArr1, configArr2, configArr3, configArr4) { return { userSync: { syncDelay: 0, userIds: [ (configArr1 && configArr1.length === 3) ? getStorageMock.apply(null, configArr1) : null, (configArr2 && configArr2.length === 3) ? getStorageMock.apply(null, configArr2) : null, - (configArr3 && configArr3.length === 3) ? getStorageMock.apply(null, configArr3) : null + (configArr3 && configArr3.length === 3) ? getStorageMock.apply(null, configArr3) : null, + (configArr4 && configArr4.length === 3) ? getStorageMock.apply(null, configArr4) : null ].filter(i => i)} } } @@ -71,7 +72,7 @@ describe('User ID', function() { let pubcid = utils.getCookie('pubcid'); expect(pubcid).to.be.null; // there should be no cookie initially - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); init(config); config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'])); @@ -97,7 +98,7 @@ describe('User ID', function() { let pubcid1; let pubcid2; - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); init(config); config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'])); requestBidsHook((config) => { innerAdUnits1 = config.adUnits }, {adUnits: adUnits1}); @@ -111,7 +112,7 @@ describe('User ID', function() { }); }); - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); init(config); config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'])); requestBidsHook((config) => { innerAdUnits2 = config.adUnits }, {adUnits: adUnits2}); @@ -132,7 +133,7 @@ describe('User ID', function() { let adUnits = [getAdUnitMock()]; let innerAdUnits; - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); init(config); config.setConfig(getConfigMock(['pubCommonId', 'pubcid_alt', 'cookie'])); requestBidsHook((config) => { innerAdUnits = config.adUnits }, {adUnits}); @@ -167,14 +168,14 @@ describe('User ID', function() { }); it('fails initialization if opt out cookie exists', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); init(config); config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'])); expect(utils.logInfo.args[0][0]).to.exist.and.to.equal('User ID - opt-out cookie found, exit module'); }); it('initializes if no opt out cookie exists', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); init(config); config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'])); expect(utils.logInfo.args[0][0]).to.exist.and.to.equal('User ID - usersync config updated for 1 submodules'); @@ -193,7 +194,7 @@ describe('User ID', function() { }); it('handles config with no usersync object', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); init(config); config.setConfig({}); // usersync is undefined, and no logInfo message for 'User ID - usersync config updated' @@ -201,14 +202,14 @@ describe('User ID', function() { }); it('handles config with empty usersync object', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); init(config); config.setConfig({ usersync: {} }); expect(typeof utils.logInfo.args[0]).to.equal('undefined'); }); it('handles config with usersync and userIds that are empty objs', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); init(config); config.setConfig({ usersync: { @@ -219,7 +220,7 @@ describe('User ID', function() { }); it('handles config with usersync and userIds with empty names or that dont match a submodule.name', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); init(config); config.setConfig({ usersync: { @@ -236,15 +237,15 @@ describe('User ID', function() { }); it('config with 1 configurations should create 1 submodules', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); init(config); config.setConfig(getConfigMock(['unifiedId', 'unifiedid', 'cookie'])); expect(utils.logInfo.args[0][0]).to.exist.and.to.equal('User ID - usersync config updated for 1 submodules'); }); - it('config with 3 configurations should result in 3 submodules add', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]); + it('config with 4 configurations should result in 4 submodules add', function () { + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); init(config); config.setConfig({ usersync: { @@ -257,14 +258,17 @@ describe('User ID', function() { }, { name: 'id5Id', storage: { name: 'id5id', type: 'cookie' } + }, { + name: 'idLink', + storage: { name: 'idl_env', type: 'cookie' } }] } }); - expect(utils.logInfo.args[0][0]).to.exist.and.to.equal('User ID - usersync config updated for 3 submodules'); + expect(utils.logInfo.args[0][0]).to.exist.and.to.equal('User ID - usersync config updated for 4 submodules'); }); it('config syncDelay updates module correctly', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); init(config); config.setConfig({ usersync: { From 4e9519ad49e624774fef774d3850e55fda00d6bb Mon Sep 17 00:00:00 2001 From: "ma.matic" Date: Thu, 4 Jul 2019 10:23:11 +0200 Subject: [PATCH 3/4] identityLink - Change submodule name from idLink to identityLink --- integrationExamples/gpt/userId_example.html | 4 +- ...{idLinkSystem.js => identityLinkSystem.js} | 10 ++-- modules/userId.js | 4 +- modules/userId.md | 8 +-- test/spec/modules/userId_spec.js | 60 +++++++++---------- 5 files changed, 43 insertions(+), 43 deletions(-) rename modules/{idLinkSystem.js => identityLinkSystem.js} (84%) diff --git a/integrationExamples/gpt/userId_example.html b/integrationExamples/gpt/userId_example.html index 3daf28f25628..5878d05aecd3 100644 --- a/integrationExamples/gpt/userId_example.html +++ b/integrationExamples/gpt/userId_example.html @@ -163,9 +163,9 @@ // bar:'93939' // } }, { - name: 'idLink', + name: 'identityLink', params: { - pid: '14' + pid: '14' // Set your real identityLink placement ID here }, storage: { type: 'cookie', diff --git a/modules/idLinkSystem.js b/modules/identityLinkSystem.js similarity index 84% rename from modules/idLinkSystem.js rename to modules/identityLinkSystem.js index 18ccd1ca9829..bc79990358d1 100644 --- a/modules/idLinkSystem.js +++ b/modules/identityLinkSystem.js @@ -1,7 +1,7 @@ /** - * This module adds idLink to the User ID module + * This module adds IdentityLink to the User ID module * The {@link module:modules/userId} module is required - * @module modules/idLinkSubmodule + * @module modules/identityLinkSubmodule * @requires module:modules/userId */ @@ -9,12 +9,12 @@ import * as utils from '../src/utils.js' import {ajax} from '../src/ajax.js'; /** @type {Submodule} */ -export const idLinkSubmodule = { +export const identityLinkSubmodule = { /** * used to link submodule with config * @type {string} */ - name: 'idLink', + name: 'identityLink', /** * decode the stored id value for passing to bid requests * @function @@ -32,7 +32,7 @@ export const idLinkSubmodule = { */ getId(configParams) { if (!configParams || typeof configParams.pid !== 'string') { - utils.logError('ID Link - idLink submodule requires partner id to be defined'); + utils.logError('identityLink submodule requires partner id to be defined'); return; } // use protocol relative urls for http or https diff --git a/modules/userId.js b/modules/userId.js index 420c9136aa49..f99dd27f398d 100644 --- a/modules/userId.js +++ b/modules/userId.js @@ -77,7 +77,7 @@ import {gdprDataHandler} from '../src/adapterManager.js'; import {unifiedIdSubmodule} from './unifiedIdSystem.js'; import {pubCommonIdSubmodule} from './pubCommonIdSystem.js'; import CONSTANTS from '../src/constants.json'; -import {idLinkSubmodule} from './idLinkSystem.js'; +import {identityLinkSubmodule} from './identityLinkSystem.js'; const MODULE_NAME = 'User ID'; const COOKIE = 'cookie'; @@ -433,4 +433,4 @@ init(config); // add submodules after init has been called attachIdSystem(pubCommonIdSubmodule); attachIdSystem(unifiedIdSubmodule); -attachIdSystem(idLinkSubmodule); +attachIdSystem(identityLinkSubmodule); diff --git a/modules/userId.md b/modules/userId.md index d1f0cd041b9c..d0486ccebe7f 100644 --- a/modules/userId.md +++ b/modules/userId.md @@ -23,9 +23,9 @@ pbjs.setConfig({ expires: 60 } }, { - name: 'idLink', + name: 'identityLink', params: { - pid: '14' + pid: '999' // Set your real identityLink placement ID here }, storage: { type: 'cookie', @@ -81,9 +81,9 @@ pbjs.setConfig({ expires: 60 } }, { - name: 'idLink', + name: 'identityLink', params: { - pid: '14' + pid: '999' // Set your real identityLink placement ID here }, storage: { type: 'html5', diff --git a/test/spec/modules/userId_spec.js b/test/spec/modules/userId_spec.js index 6ae8d9aecbf8..751a8cf342da 100644 --- a/test/spec/modules/userId_spec.js +++ b/test/spec/modules/userId_spec.js @@ -10,7 +10,7 @@ import * as utils from 'src/utils'; import {unifiedIdSubmodule} from 'modules/unifiedIdSystem'; import {pubCommonIdSubmodule} from 'modules/pubCommonIdSystem'; import {id5IdSubmodule} from 'modules/id5IdSystem'; -import {idLinkSubmodule} from 'modules/idLinkSystem'; +import {identityLinkSubmodule} from 'modules/identityLinkSystem'; let assert = require('chai').assert; let expect = require('chai').expect; const EXPIRED_COOKIE_DATE = 'Thu, 01 Jan 1970 00:00:01 GMT'; @@ -72,7 +72,7 @@ describe('User ID', function() { let pubcid = utils.getCookie('pubcid'); expect(pubcid).to.be.null; // there should be no cookie initially - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'])); @@ -98,7 +98,7 @@ describe('User ID', function() { let pubcid1; let pubcid2; - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'])); requestBidsHook((config) => { innerAdUnits1 = config.adUnits }, {adUnits: adUnits1}); @@ -112,7 +112,7 @@ describe('User ID', function() { }); }); - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'])); requestBidsHook((config) => { innerAdUnits2 = config.adUnits }, {adUnits: adUnits2}); @@ -133,7 +133,7 @@ describe('User ID', function() { let adUnits = [getAdUnitMock()]; let innerAdUnits; - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig(getConfigMock(['pubCommonId', 'pubcid_alt', 'cookie'])); requestBidsHook((config) => { innerAdUnits = config.adUnits }, {adUnits}); @@ -168,14 +168,14 @@ describe('User ID', function() { }); it('fails initialization if opt out cookie exists', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'])); expect(utils.logInfo.args[0][0]).to.exist.and.to.equal('User ID - opt-out cookie found, exit module'); }); it('initializes if no opt out cookie exists', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'])); expect(utils.logInfo.args[0][0]).to.exist.and.to.equal('User ID - usersync config updated for 1 submodules'); @@ -194,7 +194,7 @@ describe('User ID', function() { }); it('handles config with no usersync object', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig({}); // usersync is undefined, and no logInfo message for 'User ID - usersync config updated' @@ -202,14 +202,14 @@ describe('User ID', function() { }); it('handles config with empty usersync object', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig({ usersync: {} }); expect(typeof utils.logInfo.args[0]).to.equal('undefined'); }); it('handles config with usersync and userIds that are empty objs', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig({ usersync: { @@ -220,7 +220,7 @@ describe('User ID', function() { }); it('handles config with usersync and userIds with empty names or that dont match a submodule.name', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig({ usersync: { @@ -237,7 +237,7 @@ describe('User ID', function() { }); it('config with 1 configurations should create 1 submodules', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig(getConfigMock(['unifiedId', 'unifiedid', 'cookie'])); @@ -245,7 +245,7 @@ describe('User ID', function() { }); it('config with 4 configurations should result in 4 submodules add', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig({ usersync: { @@ -259,7 +259,7 @@ describe('User ID', function() { name: 'id5Id', storage: { name: 'id5id', type: 'cookie' } }, { - name: 'idLink', + name: 'identityLink', storage: { name: 'idl_env', type: 'cookie' } }] } @@ -268,7 +268,7 @@ describe('User ID', function() { }); it('config syncDelay updates module correctly', function () { - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig({ usersync: { @@ -354,14 +354,14 @@ describe('User ID', function() { }, {adUnits}); }); - it('test hook from idLink html5', function(done) { + it('test hook from identityLink html5', function(done) { // simulate existing browser local storage values localStorage.setItem('idl_env', 'AiGNC8Z5ONyZKSpIPf'); localStorage.setItem('idl_env_exp', ''); - setSubmoduleRegistry([idLinkSubmodule]); + setSubmoduleRegistry([identityLinkSubmodule]); init(config); - config.setConfig(getConfigMock(['idLink', 'idl_env', 'html5'])); + config.setConfig(getConfigMock(['identityLink', 'idl_env', 'html5'])); requestBidsHook(function() { adUnits.forEach(unit => { unit.bids.forEach(bid => { @@ -375,12 +375,12 @@ describe('User ID', function() { }, {adUnits}); }); - it('test hook from idLink cookie', function(done) { + it('test hook from identityLink cookie', function(done) { utils.setCookie('idl_env', 'AiGNC8Z5ONyZKSpIPf', (new Date(Date.now() + 100000).toUTCString())); - setSubmoduleRegistry([idLinkSubmodule]); + setSubmoduleRegistry([identityLinkSubmodule]); init(config); - config.setConfig(getConfigMock(['idLink', 'idl_env', 'cookie'])); + config.setConfig(getConfigMock(['identityLink', 'idl_env', 'cookie'])); requestBidsHook(function() { adUnits.forEach(unit => { @@ -420,12 +420,12 @@ describe('User ID', function() { utils.setCookie('id5id', JSON.stringify({'ID5ID': 'testid5id'}), (new Date(Date.now() + 5000).toUTCString())); utils.setCookie('idl_env', 'AiGNC8Z5ONyZKSpIPf', (new Date(Date.now() + 5000).toUTCString())); - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'], ['unifiedId', 'unifiedid', 'cookie'], ['id5Id', 'id5id', 'cookie'], - ['idLink', 'idl_env', 'cookie'])); + ['identityLink', 'idl_env', 'cookie'])); requestBidsHook(function() { adUnits.forEach(unit => { @@ -439,7 +439,7 @@ describe('User ID', function() { // also check that Id5Id id data was copied to bid expect(bid).to.have.deep.nested.property('userId.id5id'); expect(bid.userId.id5id).to.equal('testid5id'); - // check that idLink id data was copied to bid + // check that identityLink id data was copied to bid expect(bid).to.have.deep.nested.property('userId.idl_env'); expect(bid.userId.idl_env).to.equal('AiGNC8Z5ONyZKSpIPf'); }); @@ -468,12 +468,12 @@ describe('User ID', function() { // attaching after init attachIdSystem(unifiedIdSubmodule); attachIdSystem(id5IdSubmodule); - attachIdSystem(idLinkSubmodule); + attachIdSystem(identityLinkSubmodule); config.setConfig(getConfigMock(['pubCommonId', 'pubcid', 'cookie'], ['unifiedId', 'unifiedid', 'cookie'], ['id5Id', 'id5id', 'cookie'], - ['idLink', 'idl_env', 'cookie'])); + ['identityLink', 'idl_env', 'cookie'])); requestBidsHook(function() { adUnits.forEach(unit => { @@ -487,7 +487,7 @@ describe('User ID', function() { // also check that Id5Id id data was copied to bid expect(bid).to.have.deep.nested.property('userId.id5id'); expect(bid.userId.id5id).to.equal('testid5id'); - // also check that idLink id data was copied to bid + // also check that identityLink id data was copied to bid expect(bid).to.have.deep.nested.property('userId.idl_env'); expect(bid.userId.idl_env).to.equal('AiGNC8Z5ONyZKSpIPf'); }); @@ -507,7 +507,7 @@ describe('User ID', function() { utils.setCookie('idl_env', 'AiGNC8Z5ONyZKSpIPf', new Date(Date.now() + 5000).toUTCString()); utils.setCookie('MOCKID', JSON.stringify({'MOCKID': '123456778'}), new Date(Date.now() + 5000).toUTCString()); - setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, idLinkSubmodule]); + setSubmoduleRegistry([pubCommonIdSubmodule, unifiedIdSubmodule, id5IdSubmodule, identityLinkSubmodule]); init(config); config.setConfig({ @@ -520,7 +520,7 @@ describe('User ID', function() { }, { name: 'id5Id', storage: { name: 'id5id', type: 'cookie' } }, { - name: 'idLink', storage: { name: 'idl_env', type: 'cookie' } + name: 'identityLink', storage: { name: 'idl_env', type: 'cookie' } }, { name: 'mockId', storage: { name: 'MOCKID', type: 'cookie' } }] @@ -552,7 +552,7 @@ describe('User ID', function() { // also check that Id5Id id data was copied to bid expect(bid).to.have.deep.nested.property('userId.id5id'); expect(bid.userId.id5id).to.equal('testid5id'); - // also check that idLink id data was copied to bid + // also check that identityLink id data was copied to bid expect(bid).to.have.deep.nested.property('userId.idl_env'); expect(bid.userId.idl_env).to.equal('AiGNC8Z5ONyZKSpIPf'); // check MockId data was copied to bid From 9761870925649332575af977806a3ee2b6762ed6 Mon Sep 17 00:00:00 2001 From: "ma.matic" Date: Tue, 23 Jul 2019 08:29:26 +0200 Subject: [PATCH 4/4] Identity Link - Remove identity link to be default submodule --- modules/{userId => }/identityLinkSystem.js | 7 +++++-- modules/userId/index.js | 2 -- test/spec/modules/userId_spec.js | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) rename modules/{userId => }/identityLinkSystem.js (89%) diff --git a/modules/userId/identityLinkSystem.js b/modules/identityLinkSystem.js similarity index 89% rename from modules/userId/identityLinkSystem.js rename to modules/identityLinkSystem.js index cbf21f878ca0..8b8fa491bade 100644 --- a/modules/userId/identityLinkSystem.js +++ b/modules/identityLinkSystem.js @@ -5,8 +5,9 @@ * @requires module:modules/userId */ -import * as utils from '../../src/utils.js' -import {ajax} from '../../src/ajax.js'; +import * as utils from '../src/utils.js' +import {ajax} from '../src/ajax.js'; +import {submodule} from '../src/hook'; /** @type {Submodule} */ export const identityLinkSubmodule = { @@ -53,3 +54,5 @@ export const identityLinkSubmodule = { } } }; + +submodule('userId', identityLinkSubmodule); diff --git a/modules/userId/index.js b/modules/userId/index.js index 4e53b4a8b0ae..98d99f7d333c 100644 --- a/modules/userId/index.js +++ b/modules/userId/index.js @@ -78,7 +78,6 @@ import CONSTANTS from '../../src/constants.json'; import {module} from '../../src/hook'; import {unifiedIdSubmodule} from './unifiedIdSystem.js'; import {pubCommonIdSubmodule} from './pubCommonIdSystem.js'; -import {identityLinkSubmodule} from './identityLinkSystem.js'; const MODULE_NAME = 'User ID'; const COOKIE = 'cookie'; @@ -468,6 +467,5 @@ init(config); // add submodules after init has been called attachIdSystem(pubCommonIdSubmodule); attachIdSystem(unifiedIdSubmodule); -attachIdSystem(identityLinkSubmodule); module('userId', attachIdSystem); diff --git a/test/spec/modules/userId_spec.js b/test/spec/modules/userId_spec.js index 8ae9b1654dd9..b581873089a9 100644 --- a/test/spec/modules/userId_spec.js +++ b/test/spec/modules/userId_spec.js @@ -10,7 +10,7 @@ import * as utils from 'src/utils'; import {unifiedIdSubmodule} from 'modules/userId/unifiedIdSystem'; import {pubCommonIdSubmodule} from 'modules/userId/pubCommonIdSystem'; import {id5IdSubmodule} from 'modules/id5IdSystem'; -import {identityLinkSubmodule} from 'modules/userId/identityLinkSystem'; +import {identityLinkSubmodule} from 'modules/identityLinkSystem'; let assert = require('chai').assert; let expect = require('chai').expect; const EXPIRED_COOKIE_DATE = 'Thu, 01 Jan 1970 00:00:01 GMT';