prebid.js 9.2.0 → 9.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/33acrossAnalyticsAdapter.js +1 -1
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/BTBidAdapter.js +1 -1
- package/dist/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adagioUtils.js +1 -1
- package/dist/addefendBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/adnuntiusBidAdapter.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adstirBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgAnalyticsAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/agmaAnalyticsAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/chunk-core.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consentManagement.js +1 -0
- package/dist/consentManagementGpp.js +1 -1
- package/dist/consentManagementTcf.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantAnalyticsAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/copper6sspBidAdapter.js +1 -0
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/dailymotionBidAdapter.js +1 -1
- package/dist/dependencies.json +18 -4
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/dxkultureBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/exadsBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/greenbidsAnalyticsAdapter.js +1 -1
- package/dist/greenbidsRtdProvider.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/illuminBidAdapter.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/intentIqIdSystem.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/jixieBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/kimberliteBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/luceadBidAdapter.js +1 -1
- package/dist/mabidderBidAdapter.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/medianetAnalyticsAdapter.js +1 -1
- package/dist/medianetBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/missenaBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/nobidAnalyticsAdapter.js +1 -1
- package/dist/nobidBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +172 -167
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openwebBidAdapter.js +1 -1
- package/dist/openxBidAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/orakiBidAdapter.js +1 -0
- package/dist/orbidderBidAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/pairIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/publirBidAdapter.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/shinezRtbBidAdapter.js +1 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smartyadsBidAdapter.js +1 -1
- package/dist/smartyadsUtils.js +1 -0
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/snigelBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/stnBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/tagorasBidAdapter.js +1 -1
- package/dist/tappxBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/terceptAnalyticsAdapter.js +1 -1
- package/dist/themoneytizerBidAdapter.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/twistDigitalBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/uid2IdSystem.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/unrulyBidAdapter.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/vidazooUtils.js +1 -0
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahooAdsBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/dist/yuktamediaAnalyticsAdapter.js +1 -1
- package/libraries/consentManagement/cmUtils.js +38 -0
- package/libraries/smartyadsUtils/getAdUrlByRegion.js +32 -0
- package/libraries/vidazooUtils/bidderUtils.js +481 -0
- package/libraries/vidazooUtils/constants.js +7 -0
- package/modules/addefendBidAdapter.js +1 -2
- package/modules/adlooxRtdProvider.js +1 -1
- package/modules/adnuntiusBidAdapter.js +1 -0
- package/modules/adxcgAnalyticsAdapter.js +1 -2
- package/modules/consentManagementGpp.js +2 -38
- package/modules/consentManagementTcf.js +7 -38
- package/modules/conversantAnalyticsAdapter.js +1 -2
- package/modules/copper6sspBidAdapter.js +19 -0
- package/modules/copper6sspBidAdapter.md +79 -0
- package/modules/criteoBidAdapter.js +10 -3
- package/modules/id5AnalyticsAdapter.js +1 -2
- package/modules/intentIqIdSystem.js +408 -50
- package/modules/intentIqIdSystem.md +92 -0
- package/modules/liveIntentIdSystem.js +2 -2
- package/modules/mabidderBidAdapter.js +1 -2
- package/modules/medianetAnalyticsAdapter.js +1 -2
- package/modules/medianetBidAdapter.js +1 -1
- package/modules/orakiBidAdapter.js +19 -0
- package/modules/orakiBidAdapter.md +79 -0
- package/modules/orbidderBidAdapter.js +4 -2
- package/modules/pairIdSystem.js +27 -10
- package/modules/pixfutureBidAdapter.js +1 -2
- package/modules/prebidServerBidAdapter/index.js +1 -1
- package/modules/seedtagBidAdapter.js +4 -0
- package/modules/smartadserverBidAdapter.js +3 -0
- package/modules/smartyadsBidAdapter.js +6 -110
- package/modules/snigelBidAdapter.js +1 -2
- package/modules/tappxBidAdapter.js +1 -2
- package/modules/terceptAnalyticsAdapter.js +1 -2
- package/modules/twistDigitalBidAdapter.js +1 -12
- package/modules/userId/index.js +31 -21
- package/modules/vidazooBidAdapter.js +26 -468
- package/modules/yahooAdsBidAdapter.js +4 -1
- package/modules/yuktamediaAnalyticsAdapter.js +1 -2
- package/package.json +1 -1
- package/test/spec/fpd/gdpr_spec.js +24 -2
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +6 -3
- package/test/spec/modules/conversantAnalyticsAdapter_spec.js +1 -1
- package/test/spec/modules/copper6sspBidAdapter_spec.js +514 -0
- package/test/spec/modules/intentIqIdSystem_spec.js +264 -36
- package/test/spec/modules/orakiBidAdapter_spec.js +510 -0
- package/test/spec/modules/seedtagBidAdapter_spec.js +27 -0
- package/test/spec/modules/smartadserverBidAdapter_spec.js +7 -0
- package/test/spec/modules/smartyadsBidAdapter_spec.js +6 -83
- package/test/spec/modules/twistDigitalBidAdapter_spec.js +5 -3
- package/test/spec/modules/userId_spec.js +86 -47
- package/test/spec/modules/vidazooBidAdapter_spec.js +21 -23
- package/test/spec/modules/yahooAdsBidAdapter_spec.js +1 -1
|
@@ -2,31 +2,61 @@ import { expect } from 'chai';
|
|
|
2
2
|
import { intentIqIdSubmodule, storage } from 'modules/intentIqIdSystem.js';
|
|
3
3
|
import * as utils from 'src/utils.js';
|
|
4
4
|
import { server } from 'test/mocks/xhr.js';
|
|
5
|
-
import {
|
|
5
|
+
import { CLIENT_HINTS_KEY, FIRST_PARTY_KEY, decryptData, detectBrowserFromUserAgent, detectBrowserFromUserAgentData, handleClientHints, handleGPPData, readData } from '../../../modules/intentIqIdSystem';
|
|
6
|
+
import { gppDataHandler, uspDataHandler } from '../../../src/consentHandler';
|
|
7
|
+
import { clearAllCookies } from '../../helpers/cookies';
|
|
6
8
|
|
|
7
9
|
const partner = 10;
|
|
8
10
|
const pai = '11';
|
|
9
11
|
const pcid = '12';
|
|
10
|
-
const enableCookieStorage = true;
|
|
11
12
|
const defaultConfigParams = { params: { partner: partner } };
|
|
12
13
|
const paiConfigParams = { params: { partner: partner, pai: pai } };
|
|
13
14
|
const pcidConfigParams = { params: { partner: partner, pcid: pcid } };
|
|
14
|
-
const
|
|
15
|
-
const allConfigParams = { params: { partner: partner, pai: pai, pcid: pcid, enableCookieStorage: enableCookieStorage } };
|
|
15
|
+
const allConfigParams = { params: { partner: partner, pai: pai, pcid: pcid } };
|
|
16
16
|
const responseHeader = { 'Content-Type': 'application/json' }
|
|
17
17
|
|
|
18
|
+
export const testClientHints = {
|
|
19
|
+
architecture: 'x86',
|
|
20
|
+
bitness: '64',
|
|
21
|
+
brands: [
|
|
22
|
+
{
|
|
23
|
+
brand: 'Not(A:Brand',
|
|
24
|
+
version: '24'
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
brand: 'Chromium',
|
|
28
|
+
version: '122'
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
fullVersionList: [
|
|
32
|
+
{
|
|
33
|
+
brand: 'Not(A:Brand',
|
|
34
|
+
version: '24.0.0.0'
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
brand: 'Chromium',
|
|
38
|
+
version: '122.0.6261.128'
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
mobile: false,
|
|
42
|
+
model: '',
|
|
43
|
+
platform: 'Linux',
|
|
44
|
+
platformVersion: '6.5.0',
|
|
45
|
+
wow64: false
|
|
46
|
+
};
|
|
47
|
+
|
|
18
48
|
describe('IntentIQ tests', function () {
|
|
19
49
|
let logErrorStub;
|
|
20
50
|
let testLSValue = {
|
|
21
|
-
'date':
|
|
51
|
+
'date': Date.now(),
|
|
22
52
|
'cttl': 2000,
|
|
23
53
|
'rrtt': 123
|
|
24
54
|
}
|
|
25
55
|
let testLSValueWithData = {
|
|
26
|
-
'date':
|
|
56
|
+
'date': Date.now(),
|
|
27
57
|
'cttl': 9999999999999,
|
|
28
58
|
'rrtt': 123,
|
|
29
|
-
'data': '
|
|
59
|
+
'data': 'U2FsdGVkX18AKRyhEPdiL9kuxSigBrlqLaDJWvwSird2O5TdBW67gX+xbL4nYxHDjdS5G5FpdhtpouZiBFw2FBjyUyobZheM857G5q4BapdiA8z3K6j0W+r0im30Ak2SSn2NBfFwxcCgP/UAF5/ddxIIaeWl1yBMZBO+Gic6us2JUg86paAtp3Sk4unCvg1G+4myYYSKgGi/Vrw51ye/jAGn4AdAbFOCojENhV+Ts/XyVK0AQGdC3wqnQUId9MZpB2VoTA9wgXeYEzjpDDJmcKQ18V3WTKnK/H1FBVZa1vovOj13ZUeuMUZbZL83NFE/PkCrzJjRy14orcdnGbDUaxXUBBulDCr21gNnc0mLbYj7b18OQQ75/GhX80HroxbMEyc5tiECBrE/JsW+2sQ4MwoqePPPj/f5Bf4wJ4z3UphjK6maypoWaXsZCZTp2mJYmsf0XsNHLpt1MUrBeAmy6Bewkb+WEAeVe6/b53DQDlo2LQXpSzDPVucMn3CQOWFv1Bvz5cLIZRD8/NtDjgYzWNXHRRAGhhN19yew0ZyeS09x3UBiwER6A6ppv2qQVGs8QNsif3z7pkhkNoETcXQKyv1xa5X87tLvXkO4FYDQQvXEGInyPuNmkFtsZS5FJl+TYrdyaEiCOwRgkshwCU4s93WrfRUtPHtd4zNiA1LWAKGKeBEK6woeFn1YU1YIqsvx9wXfkCbqNkHTi2mD1Eb85a2niSK9BzDdbxwv6EzZ+f9j6esEVdBUIiYmsUuOfTp/ftOHKjBKi1lbeC5imAzZfV/AKvqS5opAVGp7Y9pq976sYblCrPBQ0PYI+Cm2ZNhG1vKc2Pa0rjwJwvusZp2Wvw9zSbnoZUeBi1O+XGYqGhkqYVvH3rXvrFiSmA7pk5Buz6vPd6YV1d55PVahv/4u3jksEI/ZN8QNshrM0foJ4tE/q4x8EKx22txb6433QQybwFfExdmA/XaPqM0rwqTm4qyK0mbX984A8niQka5T5pPkEfL4ALqlIgJ2Fo7X/s6FRU/sZq72JWKcVET4edebD0w5mjeotsjUz5EGT0jRSWRba0yxe4myNaAyY7Y0NTNY9J9Q0JLDFh9Hb05Ejt0Jeoq4Olv8/zFWObBoQtkQyeeRB8L7XIari/xgl191J6euhe5+8vu3ta3tX+XGk+gqdfip1R11tEYpW/XPsV+6DBEfS/8icDHiwK7sPpAgTx7GuJGL1U3Hbg7P/2zUU6xMSR5In/Oa5i1B9FtayGd+utiqrGJsqg8IyFlAt1B9B11k/wJFnWWevMly+y+Ko75ShF7UzfcNR2s41doov+2DEz/YiKH1qHjVOXjslBTYjceB3xqa8sSPDt/vQDDUIX5CPLyVBZj7AeeB/IKDFjZVovBDH92Xl8JTNILRuDHsWmSwNI1DUzgus6ox4u9Mi439caK6KnpNYso+ksLXNEQCm0m15WV2NC+fjkEwLV6hGNbz'
|
|
30
60
|
}
|
|
31
61
|
let testResponseWithValues = {
|
|
32
62
|
'abPercentage': 90,
|
|
@@ -40,6 +70,10 @@ describe('IntentIQ tests', function () {
|
|
|
40
70
|
}
|
|
41
71
|
|
|
42
72
|
beforeEach(function () {
|
|
73
|
+
localStorage.clear();
|
|
74
|
+
const expiredDate = new Date(0).toUTCString();
|
|
75
|
+
storage.setCookie(FIRST_PARTY_KEY, '', expiredDate, 'Lax');
|
|
76
|
+
storage.setCookie(FIRST_PARTY_KEY + '_' + partner, '', expiredDate, 'Lax');
|
|
43
77
|
logErrorStub = sinon.stub(utils, 'logError');
|
|
44
78
|
});
|
|
45
79
|
|
|
@@ -67,7 +101,7 @@ describe('IntentIQ tests', function () {
|
|
|
67
101
|
expect(submodule).to.be.undefined;
|
|
68
102
|
});
|
|
69
103
|
|
|
70
|
-
it('should not save data in cookie if
|
|
104
|
+
it('should not save data in cookie if relevant type not set', function () {
|
|
71
105
|
let callBackSpy = sinon.spy();
|
|
72
106
|
let submoduleCallback = intentIqIdSubmodule.getId(defaultConfigParams).callback;
|
|
73
107
|
submoduleCallback(callBackSpy);
|
|
@@ -82,9 +116,9 @@ describe('IntentIQ tests', function () {
|
|
|
82
116
|
expect(storage.getCookie('_iiq_fdata_' + partner)).to.equal(null);
|
|
83
117
|
});
|
|
84
118
|
|
|
85
|
-
it('should save data in cookie if
|
|
119
|
+
it('should save data in cookie if storage type is "cookie"', function () {
|
|
86
120
|
let callBackSpy = sinon.spy();
|
|
87
|
-
let submoduleCallback = intentIqIdSubmodule.getId(allConfigParams).callback;
|
|
121
|
+
let submoduleCallback = intentIqIdSubmodule.getId({ ...allConfigParams, enabledStorageTypes: ['cookie'] }).callback;
|
|
88
122
|
submoduleCallback(callBackSpy);
|
|
89
123
|
let request = server.requests[0];
|
|
90
124
|
expect(request.url).to.contain('https://api.intentiq.com/profiles_engine/ProfilesEngineServlet?at=39&mi=10&dpi=10&pt=17&dpn=1&pcid=12&pai=11&iiqidtype=2&iiqpcid=');
|
|
@@ -94,9 +128,10 @@ describe('IntentIQ tests', function () {
|
|
|
94
128
|
JSON.stringify({ pid: 'test_pid', data: 'test_personid', ls: true })
|
|
95
129
|
);
|
|
96
130
|
expect(callBackSpy.calledOnce).to.be.true;
|
|
97
|
-
const cookieValue = storage.getCookie('_iiq_fdata_' + partner)
|
|
98
|
-
expect(cookieValue).to.not.equal(null)
|
|
99
|
-
|
|
131
|
+
const cookieValue = storage.getCookie('_iiq_fdata_' + partner);
|
|
132
|
+
expect(cookieValue).to.not.equal(null);
|
|
133
|
+
const decryptedData = JSON.parse(decryptData(JSON.parse(cookieValue).data));
|
|
134
|
+
expect(decryptedData).to.deep.equal(['test_personid']);
|
|
100
135
|
});
|
|
101
136
|
|
|
102
137
|
it('should call the IntentIQ endpoint with only partner', function () {
|
|
@@ -114,8 +149,6 @@ describe('IntentIQ tests', function () {
|
|
|
114
149
|
});
|
|
115
150
|
|
|
116
151
|
it('should ignore INVALID_ID and invalid responses in decode', function () {
|
|
117
|
-
// let resp = JSON.stringify({'RESULT': 'NA'});
|
|
118
|
-
// expect(intentIqIdSubmodule.decode(resp)).to.equal(undefined);
|
|
119
152
|
expect(intentIqIdSubmodule.decode('INVALID_ID')).to.equal(undefined);
|
|
120
153
|
expect(intentIqIdSubmodule.decode('')).to.equal(undefined);
|
|
121
154
|
expect(intentIqIdSubmodule.decode(undefined)).to.equal(undefined);
|
|
@@ -202,7 +235,7 @@ describe('IntentIQ tests', function () {
|
|
|
202
235
|
JSON.stringify({ pid: 'test_pid', data: 'test_personid', ls: true })
|
|
203
236
|
);
|
|
204
237
|
expect(callBackSpy.calledOnce).to.be.true;
|
|
205
|
-
expect(callBackSpy.args[0][0]).to.
|
|
238
|
+
expect(callBackSpy.args[0][0]).to.deep.equal(['test_personid']);
|
|
206
239
|
});
|
|
207
240
|
|
|
208
241
|
it('dont save result if ls=false', function () {
|
|
@@ -220,21 +253,6 @@ describe('IntentIQ tests', function () {
|
|
|
220
253
|
expect(callBackSpy.args[0][0]).to.be.undefined;
|
|
221
254
|
});
|
|
222
255
|
|
|
223
|
-
it('save result as INVALID_ID on empty data and ls=true ', function () {
|
|
224
|
-
let callBackSpy = sinon.spy();
|
|
225
|
-
let submoduleCallback = intentIqIdSubmodule.getId(allConfigParams).callback;
|
|
226
|
-
submoduleCallback(callBackSpy);
|
|
227
|
-
let request = server.requests[0];
|
|
228
|
-
expect(request.url).to.contain('https://api.intentiq.com/profiles_engine/ProfilesEngineServlet?at=39&mi=10&dpi=10&pt=17&dpn=1&pcid=12&pai=11&iiqidtype=2&iiqpcid=');
|
|
229
|
-
request.respond(
|
|
230
|
-
200,
|
|
231
|
-
responseHeader,
|
|
232
|
-
JSON.stringify({ pid: 'test_pid', data: '', ls: true })
|
|
233
|
-
);
|
|
234
|
-
expect(callBackSpy.calledOnce).to.be.true;
|
|
235
|
-
expect(callBackSpy.args[0][0]).to.be.eq('INVALID_ID');
|
|
236
|
-
});
|
|
237
|
-
|
|
238
256
|
it('send addition parameters if were found in localstorage', function () {
|
|
239
257
|
localStorage.setItem('_iiq_fdata_' + partner, JSON.stringify(testLSValue))
|
|
240
258
|
let callBackSpy = sinon.spy();
|
|
@@ -251,16 +269,226 @@ describe('IntentIQ tests', function () {
|
|
|
251
269
|
JSON.stringify(testResponseWithValues)
|
|
252
270
|
);
|
|
253
271
|
expect(callBackSpy.calledOnce).to.be.true;
|
|
254
|
-
expect(callBackSpy.args[0][0]).to.
|
|
272
|
+
expect(callBackSpy.args[0][0]).to.deep.equal([testResponseWithValues.data]);
|
|
255
273
|
});
|
|
256
274
|
|
|
257
275
|
it('return data stored in local storage ', function () {
|
|
258
|
-
localStorage.setItem('_iiq_fdata_' + partner, JSON.stringify(testLSValueWithData))
|
|
276
|
+
localStorage.setItem('_iiq_fdata_' + partner, JSON.stringify(testLSValueWithData));
|
|
277
|
+
let returnedValue = intentIqIdSubmodule.getId(allConfigParams);
|
|
278
|
+
expect(JSON.stringify(returnedValue.id)).to.equal(decryptData(testLSValueWithData.data));
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
it('should handle browser blacklisting', function () {
|
|
282
|
+
let configParamsWithBlacklist = {
|
|
283
|
+
params: { partner: partner, browserBlackList: 'chrome' }
|
|
284
|
+
};
|
|
285
|
+
sinon.stub(navigator, 'userAgent').value('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');
|
|
286
|
+
let submoduleCallback = intentIqIdSubmodule.getId(configParamsWithBlacklist);
|
|
287
|
+
expect(logErrorStub.calledOnce).to.be.true;
|
|
288
|
+
expect(submoduleCallback).to.be.undefined;
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
it('should handle invalid JSON in readData', function () {
|
|
292
|
+
localStorage.setItem('_iiq_fdata_' + partner, 'invalid_json');
|
|
259
293
|
let callBackSpy = sinon.spy();
|
|
260
|
-
let submoduleCallback = intentIqIdSubmodule.getId(
|
|
294
|
+
let submoduleCallback = intentIqIdSubmodule.getId(defaultConfigParams).callback;
|
|
261
295
|
submoduleCallback(callBackSpy);
|
|
262
|
-
|
|
296
|
+
let request = server.requests[0];
|
|
297
|
+
expect(request.url).to.contain('https://api.intentiq.com/profiles_engine/ProfilesEngineServlet?at=39&mi=10&dpi=10&pt=17&dpn=1&iiqidtype=2&iiqpcid=');
|
|
298
|
+
request.respond(
|
|
299
|
+
200,
|
|
300
|
+
responseHeader,
|
|
301
|
+
JSON.stringify({})
|
|
302
|
+
);
|
|
263
303
|
expect(callBackSpy.calledOnce).to.be.true;
|
|
264
|
-
expect(
|
|
304
|
+
expect(logErrorStub.called).to.be.true;
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
describe('handleGPPData', function () {
|
|
308
|
+
it('should convert array of objects to a single JSON string', function () {
|
|
309
|
+
const input = [
|
|
310
|
+
{ key1: 'value1' },
|
|
311
|
+
{ key2: 'value2' }
|
|
312
|
+
];
|
|
313
|
+
const expectedOutput = JSON.stringify({ key1: 'value1', key2: 'value2' });
|
|
314
|
+
const result = handleGPPData(input);
|
|
315
|
+
expect(result).to.equal(expectedOutput);
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
it('should convert a single object to a JSON string', function () {
|
|
319
|
+
const input = { key1: 'value1', key2: 'value2' };
|
|
320
|
+
const expectedOutput = JSON.stringify(input);
|
|
321
|
+
const result = handleGPPData(input);
|
|
322
|
+
expect(result).to.equal(expectedOutput);
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
it('should handle empty object', function () {
|
|
326
|
+
const input = {};
|
|
327
|
+
const expectedOutput = JSON.stringify(input);
|
|
328
|
+
const result = handleGPPData(input);
|
|
329
|
+
expect(result).to.equal(expectedOutput);
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
it('should handle empty array', function () {
|
|
333
|
+
const input = [];
|
|
334
|
+
const expectedOutput = JSON.stringify({});
|
|
335
|
+
const result = handleGPPData(input);
|
|
336
|
+
expect(result).to.equal(expectedOutput);
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
describe('detectBrowserFromUserAgent', function () {
|
|
341
|
+
it('should detect Chrome browser', function () {
|
|
342
|
+
const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36';
|
|
343
|
+
const result = detectBrowserFromUserAgent(userAgent);
|
|
344
|
+
expect(result).to.equal('chrome');
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
it('should detect Safari browser', function () {
|
|
348
|
+
const userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15';
|
|
349
|
+
const result = detectBrowserFromUserAgent(userAgent);
|
|
350
|
+
expect(result).to.equal('safari');
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it('should detect Firefox browser', function () {
|
|
354
|
+
const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0';
|
|
355
|
+
const result = detectBrowserFromUserAgent(userAgent);
|
|
356
|
+
expect(result).to.equal('firefox');
|
|
357
|
+
});
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
describe('detectBrowserFromUserAgentData', function () {
|
|
361
|
+
it('should detect Microsoft Edge browser', function () {
|
|
362
|
+
const userAgentData = {
|
|
363
|
+
brands: [
|
|
364
|
+
{ brand: 'Microsoft Edge', version: '91' },
|
|
365
|
+
{ brand: 'Chromium', version: '91' }
|
|
366
|
+
]
|
|
367
|
+
};
|
|
368
|
+
const result = detectBrowserFromUserAgentData(userAgentData);
|
|
369
|
+
expect(result).to.equal('edge');
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
it('should detect Chrome browser', function () {
|
|
373
|
+
const userAgentData = {
|
|
374
|
+
brands: [
|
|
375
|
+
{ brand: 'Google Chrome', version: '91' },
|
|
376
|
+
{ brand: 'Chromium', version: '91' }
|
|
377
|
+
]
|
|
378
|
+
};
|
|
379
|
+
const result = detectBrowserFromUserAgentData(userAgentData);
|
|
380
|
+
expect(result).to.equal('chrome');
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
it('should return unknown for unrecognized user agent data', function () {
|
|
384
|
+
const userAgentData = {
|
|
385
|
+
brands: [
|
|
386
|
+
{ brand: 'Unknown Browser', version: '1.0' }
|
|
387
|
+
]
|
|
388
|
+
};
|
|
389
|
+
const result = detectBrowserFromUserAgentData(userAgentData);
|
|
390
|
+
expect(result).to.equal('unknown');
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
describe('IntentIQ consent management within getId', function () {
|
|
395
|
+
let uspDataHandlerStub;
|
|
396
|
+
let gppDataHandlerStub;
|
|
397
|
+
|
|
398
|
+
beforeEach(function () {
|
|
399
|
+
localStorage.clear();
|
|
400
|
+
const expiredDate = new Date(0).toUTCString();
|
|
401
|
+
storage.setCookie(FIRST_PARTY_KEY, '', expiredDate, 'Lax');
|
|
402
|
+
storage.setCookie(FIRST_PARTY_KEY + '_' + partner, '', expiredDate, 'Lax');
|
|
403
|
+
uspDataHandlerStub = sinon.stub(uspDataHandler, 'getConsentData');
|
|
404
|
+
gppDataHandlerStub = sinon.stub(gppDataHandler, 'getConsentData');
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
afterEach(function () {
|
|
408
|
+
uspDataHandlerStub.restore();
|
|
409
|
+
gppDataHandlerStub.restore();
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
it('should set cmpData.us_privacy if uspData exists', function () {
|
|
413
|
+
const uspData = '1NYN';
|
|
414
|
+
uspDataHandlerStub.returns(uspData);
|
|
415
|
+
let callBackSpy = sinon.spy();
|
|
416
|
+
let submoduleCallback = intentIqIdSubmodule.getId(defaultConfigParams).callback;
|
|
417
|
+
submoduleCallback(callBackSpy);
|
|
418
|
+
let request = server.requests[0];
|
|
419
|
+
expect(request.url).to.contain('https://api.intentiq.com/profiles_engine/ProfilesEngineServlet?at=39&mi=10&dpi=10&pt=17&dpn=1&iiqidtype=2&iiqpcid=');
|
|
420
|
+
request.respond(
|
|
421
|
+
200,
|
|
422
|
+
responseHeader,
|
|
423
|
+
JSON.stringify({ pid: 'test_pid', data: 'test_personid', ls: false, isOptedOut: false })
|
|
424
|
+
);
|
|
425
|
+
expect(callBackSpy.calledOnce).to.be.true;
|
|
426
|
+
|
|
427
|
+
// Check the local storage directly to see if cmpData.us_privacy was set correctly
|
|
428
|
+
const firstPartyData = JSON.parse(localStorage.getItem(FIRST_PARTY_KEY));
|
|
429
|
+
expect(firstPartyData.uspapi_value).to.equal(uspData);
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
it('should set cmpData.gpp and cmpData.gpp_sid if gppData exists and has parsedSections with usnat', function () {
|
|
433
|
+
const gppData = {
|
|
434
|
+
parsedSections: {
|
|
435
|
+
usnat: { key1: 'value1', key2: 'value2' }
|
|
436
|
+
},
|
|
437
|
+
applicableSections: ['usnat']
|
|
438
|
+
};
|
|
439
|
+
gppDataHandlerStub.returns(gppData);
|
|
440
|
+
|
|
441
|
+
let callBackSpy = sinon.spy();
|
|
442
|
+
let submoduleCallback = intentIqIdSubmodule.getId(defaultConfigParams).callback;
|
|
443
|
+
submoduleCallback(callBackSpy);
|
|
444
|
+
let request = server.requests[0];
|
|
445
|
+
expect(request.url).to.contain('https://api.intentiq.com/profiles_engine/ProfilesEngineServlet?at=39&mi=10&dpi=10&pt=17&dpn=1&iiqidtype=2&iiqpcid=');
|
|
446
|
+
request.respond(
|
|
447
|
+
200,
|
|
448
|
+
responseHeader,
|
|
449
|
+
JSON.stringify({ pid: 'test_pid', data: 'test_personid', ls: false, isOptedOut: false })
|
|
450
|
+
);
|
|
451
|
+
expect(callBackSpy.calledOnce).to.be.true;
|
|
452
|
+
|
|
453
|
+
const firstPartyData = JSON.parse(localStorage.getItem(FIRST_PARTY_KEY));
|
|
454
|
+
expect(firstPartyData.gpp_value).to.equal(JSON.stringify({ key1: 'value1', key2: 'value2' }));
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
it('should handle gppData without usnat in parsedSections', function () {
|
|
458
|
+
const gppData = {
|
|
459
|
+
parsedSections: {
|
|
460
|
+
euconsent: { key1: 'value1' }
|
|
461
|
+
},
|
|
462
|
+
applicableSections: ['euconsent']
|
|
463
|
+
};
|
|
464
|
+
gppDataHandlerStub.returns(gppData);
|
|
465
|
+
|
|
466
|
+
let callBackSpy = sinon.spy();
|
|
467
|
+
let submoduleCallback = intentIqIdSubmodule.getId(defaultConfigParams).callback;
|
|
468
|
+
submoduleCallback(callBackSpy);
|
|
469
|
+
let request = server.requests[0];
|
|
470
|
+
expect(request.url).to.contain('https://api.intentiq.com/profiles_engine/ProfilesEngineServlet?at=39&mi=10&dpi=10&pt=17&dpn=1&iiqidtype=2&iiqpcid=');
|
|
471
|
+
request.respond(
|
|
472
|
+
200,
|
|
473
|
+
responseHeader,
|
|
474
|
+
JSON.stringify({ pid: 'test_pid', data: 'test_personid', ls: false, isOptedOut: true })
|
|
475
|
+
);
|
|
476
|
+
expect(callBackSpy.calledOnce).to.be.true;
|
|
477
|
+
|
|
478
|
+
const firstPartyData = JSON.parse(localStorage.getItem(FIRST_PARTY_KEY));
|
|
479
|
+
expect(firstPartyData.gpp_value).to.equal('');
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
it('should get and save client hints to storge', async () => {
|
|
484
|
+
// Client hints are async function, thats why async/await is using
|
|
485
|
+
localStorage.clear();
|
|
486
|
+
Object.defineProperty(navigator, 'userAgentData', {
|
|
487
|
+
value: { getHighEntropyValues: async () => testClientHints },
|
|
488
|
+
configurable: true
|
|
489
|
+
});
|
|
490
|
+
await intentIqIdSubmodule.getId(defaultConfigParams);
|
|
491
|
+
const savedClientHints = readData(CLIENT_HINTS_KEY, ['html5']);
|
|
492
|
+
expect(savedClientHints).to.equal(handleClientHints(testClientHints));
|
|
265
493
|
});
|
|
266
494
|
});
|