Skip to content

Commit

Permalink
Rubicon Adapter - support User ID module (prebid#3531)
Browse files Browse the repository at this point in the history
* add initial files

* add local storage and cookie browser support functions

* added additional test cases for functions related to local storage and cookie browser support

* added validate config function and first unit test

* add validate config test

* updated local storage key value to match change to requirements/spec

* updated submodule config key names to match requirements/spec

* added TODO with validation logic breakdown as well as a question on how to handle both 'value' and 'storage' existing in config

* add TODO addressing use-case: Publisher has integrated with OpenID on their own

* fixed comment

* rearranged unit tests for config functions to be grouped correctly

* added logic to valid that a submodule contains a config with a value or storage obj

* removed sinon mock of config.getConfig, replaced with obj literal definition in function arguments

* additional use cases added to validateConfig tests

* refactored init function

* refactored to remove a function and reduce number of iterations of submodules and configs

* add logic to pass config value obj data to adapter, also a small amount of refactoring/formatting cleanup

* added configuration examples to markdown file

* add add request bid hook to the initSubmodules function

* added requestBidBook in preparation to test mock setup/configuration. add test for one storage type active with only one module configured to use that type

* refactored requestBidHook with dependency injection for unit testing

* had to revert revision to use dependency injection in the requestBidHook due to necessary use of prebid global object affecting following tests

* created initial file for integration example

* updated integration using brett's test page.

* updated extendedBidRequestData to be a function expression, which allows watching the first element added to add the bid request hook

* removed redundant constant for enabled submodules within init submodules

* added retrieve storage value and logic to call submodule.getId if stored value does not exist

* added submodule getId fallback when storage value does not exist

* extended addUnit bid requests with universalId data, add logging for invalid config storage type, revised commenting

* add logic to set storage and pass decoded data in getId response handler

* updated initModules unit test mock data to fix broken tests from previous module additions/updates

* updated comments for consistency

* fixed module description comment

* add overrideId interface and implementation to the pubCommonId submodule

* fix to only check for override method value if submodule has a configKey set in the config

* added unit test for submodule override method implementation

* completed the pubCommonId submodule getId implementation; changed pubCommonId submodule default expires value to today + 8 years

* changed openId submodule default expires value to today + 8 years; added final todo comments, pertaining to openId submodule decode and getId methods

* fixed formatting to correct linting errors during building

* update jsdoc comments for IdSubmodule

* added jsdoc comments for overrideId submodule interface method

* changed the overrideId return value conditional to require a valid object, added a todo note to investigate using separate instance callbacks to handle multiple timers for syncDelay/auctionDelay

* add ajax request to openId submodule getId, awaiting values for request params and response structure and format for storage and structure for adding to bid requests

* updated openId submodule getId error logging and callback handling

* fix obj path access for syncDelay, updated example file with pubCommonId configured

* fix for broken unit tests resulting from update of overrideId addition to submodule interface

* replace use of built-in array find method, with import of 'core-js/library/fn/array/find', fixes/updates for integration example for module

* refactored config handling in initSubmodules to accept a plain js object opposed to a prebid Config object (this simplifies testing setup)

* created init method to wrap initSubmodules with config

* refactored module's config to watch/handle changes

* removed overrideId submodule interface, change openId to unifiedId

* update getId and decode uid data structure also updated integration example

* updated object structure for universal ids that is added to bid request, add universalID object handling to rubiconBidAdapter

* updated markdown example configuration

* fix for syncDelay, added auction end listener before setting syncDelay timer

* update to prepare universalID object if adUnits exists

* add gdpr consent data to request bids hook, warn on not found, info if found

* add test for valid gdpr consent string, exits universal id module on fail

* update gdpr consent to check gdprApplies, add cmp code to integration example. update init to use dependency injection

* implemented test for gdpr consent to store locally (purpose #1)

* added consentString decode to check for purpose #1 (user consents to have data stored locally)

* fix initSubmodule function arguments for changed signature

* changed submodule getId method signature to pass a consentData argument

* tests update with dependency container

* update spec to un-comment disabled expect statement

* in-progress DI conversion

* update to fix test missing dependency for utils

* removed getIdCallbackHandler function because it was inlined within initSubmodules. refactored dependencyContainer argument names to dependencies

* add unit test case for configurations that define invalid storage.type values (only cookie or html5 are valid)

* fixes for html5 storage in module and unit tests. temp comment-out for gdpr test in requestBid hook as it's being refactored into getId submodule methods

* fixes for html5 storage in module and unit tests. temp comment-out for gdpr test in requestBid hook as it's being refactored into getId submodule methods

* added opt_out cookie logic to init

* in-progress commit to update getId method signature with initialized consentManagement data

* changed priority to consent management module's value + 1

* updated both submodule getId functions with consent data handling.

* update hasGDPRConsent to remove unnecessary test for consentData obj since it's tested outside of function, removed utils from dependency injection

* update to move local declarations outside if block, added local var for log prefix since it was accessed more than twice

* changed log prefix to build the string locally instead of passing through getIdData obj

* bug fix for request bid hook priority race condition

* removed consentData prop from init dependencies obj, updated jsdoc comments removing consentData prop

* removed consentData prop from init arguments

* update integration example to test gdpr cmpApi type of 'static'

* refactor to combine request bid hooks into single hook, also other opts and formatting changes

* additions/updates to logging, additions/updates to jsdoc comments, various refactoring and formatting updates

* fixed how GDPR purpose 1 permission is checked, removed decode function and read from consentData.vendorConsents.purposeConsents[1] (key value 1 is for "purpose 1")

* fix for hasGDPRConsent functions, changed object prop accessor name from 'consentData.vendorConsent' to 'consentData.vendorData'

* small changes to log messages and code formatting

* changed submodule property configKey to configName for consistency with the submodule config property name

* updated logging message text and small format change

* updated jsdoc comment to reduce line length

* formatting fix and jsdoc update

* reverted changes to support universal id in rubiconBidAdapter, will open a separate PR for the adapter code changes.

* added logging messages to catch statements

* fix unit tests using the document cookie

* fix to extra module name in log message

* changed function return type array to undefined on invalid config

* moved encodeURIComponenent and decodeURIComponenent into setCookie and getCookie

* refactor to resolve issues creating certain unit tests

* add tests for config variations, small fixes for issues found writing tests

* removed debug console.log statements

* removed set initializedSubmodules value in init

* fix to remove test cookie from spec, updated example with submodule config value object

* added tests checking that config submodule props create correct number of submodules

* added test for syncDelay config update

* fixes for LGTM and imports for src are now relative

* formatting fix semicolon

* test reverted to debug circleci failure

* changed request bids hook priority to load after consentManagement

* test to resolve circle ci errors

* test to resolve circle ci errors

* fixed name camel case error

* changed unifiedid decode test property name from pubcid to ttid

* added universal id support to bid adapter

* added unit test for universal id support in bid adapter

* optimized last unit test added

* add initial files

* add local storage and cookie browser support functions

* added additional test cases for functions related to local storage and cookie browser support

* added validate config function and first unit test

* add validate config test

* updated local storage key value to match change to requirements/spec

* updated submodule config key names to match requirements/spec

* added TODO with validation logic breakdown as well as a question on how to handle both 'value' and 'storage' existing in config

* add TODO addressing use-case: Publisher has integrated with OpenID on their own

* fixed comment

* rearranged unit tests for config functions to be grouped correctly

* added logic to valid that a submodule contains a config with a value or storage obj

* removed sinon mock of config.getConfig, replaced with obj literal definition in function arguments

* additional use cases added to validateConfig tests

* refactored init function

* refactored to remove a function and reduce number of iterations of submodules and configs

* add logic to pass config value obj data to adapter, also a small amount of refactoring/formatting cleanup

* added configuration examples to markdown file

* add add request bid hook to the initSubmodules function

* added requestBidBook in preparation to test mock setup/configuration. add test for one storage type active with only one module configured to use that type

* refactored requestBidHook with dependency injection for unit testing

* had to revert revision to use dependency injection in the requestBidHook due to necessary use of prebid global object affecting following tests

* created initial file for integration example

* updated integration using brett's test page.

* updated extendedBidRequestData to be a function expression, which allows watching the first element added to add the bid request hook

* removed redundant constant for enabled submodules within init submodules

* added retrieve storage value and logic to call submodule.getId if stored value does not exist

* added submodule getId fallback when storage value does not exist

* extended addUnit bid requests with universalId data, add logging for invalid config storage type, revised commenting

* add logic to set storage and pass decoded data in getId response handler

* updated initModules unit test mock data to fix broken tests from previous module additions/updates

* updated comments for consistency

* fixed module description comment

* add overrideId interface and implementation to the pubCommonId submodule

* fix to only check for override method value if submodule has a configKey set in the config

* added unit test for submodule override method implementation

* completed the pubCommonId submodule getId implementation; changed pubCommonId submodule default expires value to today + 8 years

* changed openId submodule default expires value to today + 8 years; added final todo comments, pertaining to openId submodule decode and getId methods

* fixed formatting to correct linting errors during building

* update jsdoc comments for IdSubmodule

* added jsdoc comments for overrideId submodule interface method

* changed the overrideId return value conditional to require a valid object, added a todo note to investigate using separate instance callbacks to handle multiple timers for syncDelay/auctionDelay

* add ajax request to openId submodule getId, awaiting values for request params and response structure and format for storage and structure for adding to bid requests

* updated openId submodule getId error logging and callback handling

* fix obj path access for syncDelay, updated example file with pubCommonId configured

* fix for broken unit tests resulting from update of overrideId addition to submodule interface

* replace use of built-in array find method, with import of 'core-js/library/fn/array/find', fixes/updates for integration example for module

* refactored config handling in initSubmodules to accept a plain js object opposed to a prebid Config object (this simplifies testing setup)

* created init method to wrap initSubmodules with config

* refactored module's config to watch/handle changes

* removed overrideId submodule interface, change openId to unifiedId

* update getId and decode uid data structure also updated integration example

* updated object structure for universal ids that is added to bid request, add universalID object handling to rubiconBidAdapter

* updated markdown example configuration

* fix for syncDelay, added auction end listener before setting syncDelay timer

* update to prepare universalID object if adUnits exists

* add gdpr consent data to request bids hook, warn on not found, info if found

* add test for valid gdpr consent string, exits universal id module on fail

* update gdpr consent to check gdprApplies, add cmp code to integration example. update init to use dependency injection

* implemented test for gdpr consent to store locally (purpose #1)

* added consentString decode to check for purpose #1 (user consents to have data stored locally)

* fix initSubmodule function arguments for changed signature

* changed submodule getId method signature to pass a consentData argument

* tests update with dependency container

* update spec to un-comment disabled expect statement

* in-progress DI conversion

* update to fix test missing dependency for utils

* removed getIdCallbackHandler function because it was inlined within initSubmodules. refactored dependencyContainer argument names to dependencies

* add unit test case for configurations that define invalid storage.type values (only cookie or html5 are valid)

* fixes for html5 storage in module and unit tests. temp comment-out for gdpr test in requestBid hook as it's being refactored into getId submodule methods

* fixes for html5 storage in module and unit tests. temp comment-out for gdpr test in requestBid hook as it's being refactored into getId submodule methods

* added opt_out cookie logic to init

* in-progress commit to update getId method signature with initialized consentManagement data

* changed priority to consent management module's value + 1

* updated both submodule getId functions with consent data handling.

* update hasGDPRConsent to remove unnecessary test for consentData obj since it's tested outside of function, removed utils from dependency injection

* update to move local declarations outside if block, added local var for log prefix since it was accessed more than twice

* changed log prefix to build the string locally instead of passing through getIdData obj

* bug fix for request bid hook priority race condition

* removed consentData prop from init dependencies obj, updated jsdoc comments removing consentData prop

* removed consentData prop from init arguments

* update integration example to test gdpr cmpApi type of 'static'

* refactor to combine request bid hooks into single hook, also other opts and formatting changes

* additions/updates to logging, additions/updates to jsdoc comments, various refactoring and formatting updates

* fixed how GDPR purpose 1 permission is checked, removed decode function and read from consentData.vendorConsents.purposeConsents[1] (key value 1 is for "purpose 1")

* fix for hasGDPRConsent functions, changed object prop accessor name from 'consentData.vendorConsent' to 'consentData.vendorData'

* small changes to log messages and code formatting

* changed submodule property configKey to configName for consistency with the submodule config property name

* updated logging message text and small format change

* updated jsdoc comment to reduce line length

* formatting fix and jsdoc update

* reverted changes to support universal id in rubiconBidAdapter, will open a separate PR for the adapter code changes.

* added logging messages to catch statements

* fix unit tests using the document cookie

* fix to extra module name in log message

* changed function return type array to undefined on invalid config

* moved encodeURIComponenent and decodeURIComponenent into setCookie and getCookie

* refactor to resolve issues creating certain unit tests

* add tests for config variations, small fixes for issues found writing tests

* removed debug console.log statements

* removed set initializedSubmodules value in init

* fix to remove test cookie from spec, updated example with submodule config value object

* added tests checking that config submodule props create correct number of submodules

* added test for syncDelay config update

* fixes for LGTM and imports for src are now relative

* formatting fix semicolon

* test reverted to debug circleci failure

* changed request bids hook priority to load after consentManagement

* test to resolve circle ci errors

* test to resolve circle ci errors

* fixed name camel case error

* changed unifiedid decode test property name from pubcid to ttid

* added universal id support to bid adapter

* added unit test for universal id support in bid adapter

* optimized last unit test added

* renamed universalID to userId

* removed file from universal id branch
  • Loading branch information
Isaac Dettman committed Apr 4, 2019
1 parent eeddc24 commit edbe587
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 0 deletions.
5 changes: 5 additions & 0 deletions modules/rubiconBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ export const spec = {
const containsTgI = /^tg_i/

const orderedParams = [
'tpid_tdid',
'account_id',
'site_id',
'zone_id',
Expand Down Expand Up @@ -367,6 +368,10 @@ export const spec = {
'rf': _getPageUrl(bidRequest, bidderRequest)
};

if ((bidRequest.userId || {}).tdid) {
data['tpid_tdid'] = bidRequest.userId.tdid;
}

if (bidderRequest.gdprConsent) {
// add 'gdpr' only if 'gdprApplies' is defined
if (typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') {
Expand Down
13 changes: 13 additions & 0 deletions test/spec/modules/rubiconBidAdapter_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -1060,6 +1060,19 @@ describe('the rubicon adapter', function () {
expect(serverRequests).that.is.an('array').of.length(3);
});
});

describe('user id config', function() {
it('should send tpid_tdid when userId defines tdid', function () {
const clonedBid = clone(bidderRequest.bids[0]);
clonedBid.userId = {
tdid: 'abcd-efgh-ijkl-mnop-1234'
};
let [request] = spec.buildRequests([clonedBid], bidderRequest);
let data = parseQuery(request.data);

expect(data['tpid_tdid']).to.equal('abcd-efgh-ijkl-mnop-1234');
});
})
});

describe('for video requests', function () {
Expand Down

0 comments on commit edbe587

Please sign in to comment.