@segment/consent-manager
Version:
Drop-in consent management plugin for analytics.js
280 lines (245 loc) • 7.16 kB
text/typescript
import sinon from 'sinon'
import { WindowWithAJS, Destination, Middleware } from '../../types'
import conditionallyLoadAnalytics from '../../consent-manager-builder/analytics'
describe('analytics', () => {
let wd
beforeEach(() => {
window = {} as WindowWithAJS
wd = window
wd.analytics = {
/*eslint-disable */
track: (_event, _properties, _optionsWithConsent, _callback) => {},
addSourceMiddleware: (_middleware: Middleware) => {}
/*eslint-enable */
}
})
test('loads analytics.js with preferences', () => {
const ajsLoad = sinon.spy()
wd.analytics.load = ajsLoad
const writeKey = '123'
const destinations = [{ id: 'Amplitude' } as Destination]
const destinationPreferences = {
Amplitude: true
}
conditionallyLoadAnalytics({
writeKey,
destinations,
destinationPreferences,
isConsentRequired: true,
categoryPreferences: {}
})
expect(ajsLoad.calledOnce).toBe(true)
expect(ajsLoad.args[0][0]).toBe(writeKey)
expect(ajsLoad.args[0][1]).toMatchObject({
integrations: {
All: false,
Amplitude: true,
'Segment.io': true
}
})
})
test('doesn՚t load analytics.js when there are no preferences', () => {
const ajsLoad = sinon.spy()
wd.analytics.load = ajsLoad
const writeKey = '123'
const destinations = [{ id: 'Amplitude' } as Destination]
const destinationPreferences = null
conditionallyLoadAnalytics({
writeKey,
destinations,
destinationPreferences,
isConsentRequired: true,
categoryPreferences: {}
})
expect(ajsLoad.notCalled).toBe(true)
})
test('doesn՚t load analytics.js when all preferences are false', () => {
const ajsLoad = sinon.spy()
wd.analytics.load = ajsLoad
const writeKey = '123'
const destinations = [{ id: 'Amplitude' } as Destination]
const destinationPreferences = {
Amplitude: false
}
conditionallyLoadAnalytics({
writeKey,
destinations,
destinationPreferences,
isConsentRequired: true,
categoryPreferences: {}
})
expect(ajsLoad.notCalled).toBe(true)
})
test('reloads the page when analytics.js has already been initialised', () => {
wd.analytics.load = function load() {
this.initialized = true
}
jest.spyOn(window.location, 'reload')
const writeKey = '123'
const destinations = [{ id: 'Amplitude' } as Destination]
const destinationPreferences = {
Amplitude: true
}
conditionallyLoadAnalytics({
writeKey,
destinations,
destinationPreferences,
isConsentRequired: true,
categoryPreferences: {}
})
conditionallyLoadAnalytics({
writeKey,
destinations,
destinationPreferences,
isConsentRequired: true,
categoryPreferences: {}
})
expect(window.location.reload).toHaveBeenCalled()
})
test('should allow the reload behvaiour to be disabled', () => {
const reload = sinon.spy()
wd.analytics.load = function load() {
this.initialized = true
}
wd.location = { reload }
const writeKey = '123'
const destinations = [{ id: 'Amplitude' } as Destination]
const destinationPreferences = {
Amplitude: true
}
conditionallyLoadAnalytics({
writeKey,
destinations,
destinationPreferences,
isConsentRequired: true,
categoryPreferences: {}
})
conditionallyLoadAnalytics({
writeKey,
destinations,
destinationPreferences,
isConsentRequired: true,
shouldReload: false,
categoryPreferences: {}
})
expect(reload.calledOnce).toBe(false)
})
test('loads analytics.js normally when consent isn՚t required', () => {
const ajsLoad = sinon.spy()
wd.analytics.load = ajsLoad
const writeKey = '123'
const destinations = [{ id: 'Amplitude' } as Destination]
const destinationPreferences = null
conditionallyLoadAnalytics({
writeKey,
destinations,
destinationPreferences,
isConsentRequired: false,
categoryPreferences: {}
})
expect(ajsLoad.calledOnce).toBe(true)
expect(ajsLoad.args[0][0]).toBe(writeKey)
expect(ajsLoad.args[0][1]).toBeUndefined()
})
test('still applies preferences when consent isn՚t required', () => {
const ajsLoad = sinon.spy()
wd.analytics.load = ajsLoad
const writeKey = '123'
const destinations = [{ id: 'Amplitude' } as Destination]
const destinationPreferences = {
Amplitude: true
}
conditionallyLoadAnalytics({
writeKey,
destinations,
destinationPreferences,
isConsentRequired: false,
categoryPreferences: {}
})
expect(ajsLoad.calledOnce).toBe(true)
expect(ajsLoad.args[0][0]).toBe(writeKey)
expect(ajsLoad.args[0][1]).toMatchObject({
integrations: {
All: false,
Amplitude: true,
'Segment.io': true
}
})
})
test('sets new destinations to false if defaultDestinationBehavior is set to "disable"', () => {
const ajsLoad = sinon.spy()
wd.analytics.load = ajsLoad
const writeKey = '123'
const destinations = [
{ id: 'Amplitude' } as Destination,
{ id: 'Google Analytics' } as Destination
]
const destinationPreferences = {
Amplitude: true
}
conditionallyLoadAnalytics({
writeKey,
destinations,
destinationPreferences,
isConsentRequired: false,
shouldReload: true,
defaultDestinationBehavior: 'disable',
categoryPreferences: {}
})
expect(ajsLoad.args[0][1]).toMatchObject({
integrations: {
All: false,
Amplitude: true,
'Google Analytics': false,
'Segment.io': true
}
})
})
test('sets new destinations to true if defaultDestinationBehavior is set to "enable"', () => {
const ajsLoad = sinon.spy()
wd.analytics.load = ajsLoad
const writeKey = '123'
const destinations = [
{ id: 'Amplitude' } as Destination,
{ id: 'Google Analytics' } as Destination
]
const destinationPreferences = {
Amplitude: true
}
conditionallyLoadAnalytics({
writeKey,
destinations,
destinationPreferences,
isConsentRequired: false,
shouldReload: true,
defaultDestinationBehavior: 'enable',
categoryPreferences: {}
})
expect(ajsLoad.args[0][1]).toMatchObject({
integrations: {
All: false,
Amplitude: true,
'Google Analytics': true,
'Segment.io': true
}
})
})
test('Set devMode on true to disabled analytics load', () => {
const ajsLoad = sinon.spy()
wd.analytics.load = ajsLoad
const writeKey = '123'
const destinations = [{ id: 'Amplitude' } as Destination]
const destinationPreferences = {
Amplitude: true
}
conditionallyLoadAnalytics({
writeKey,
destinations,
destinationPreferences,
isConsentRequired: false,
categoryPreferences: {},
devMode: true
})
expect(ajsLoad.calledOnce).toBe(false)
})
})