@openobserve/browser-core 0.3.2 → 0.3.3
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/cjs/boot/init.js +1 -1
- package/cjs/domain/configuration/endpointBuilder.js +1 -1
- package/cjs/domain/tags.js +1 -1
- package/cjs/domain/telemetry/telemetry.js +1 -1
- package/cjs/domain/telemetry/telemetryEvent.types.d.ts +1 -1
- package/esm/boot/init.js +1 -1
- package/esm/domain/configuration/endpointBuilder.js +1 -1
- package/esm/domain/tags.js +1 -1
- package/esm/domain/telemetry/telemetry.js +1 -1
- package/esm/domain/telemetry/telemetryEvent.types.d.ts +1 -1
- package/package.json +2 -2
- package/src/domain/telemetry/telemetryEvent.types.ts +1 -1
- package/src/boot/displayAlreadyInitializedError.spec.ts +0 -18
- package/src/boot/init.spec.ts +0 -50
- package/src/browser/addEventListener.spec.ts +0 -141
- package/src/browser/cookie.spec.ts +0 -53
- package/src/browser/fetchObservable.spec.ts +0 -334
- package/src/browser/pageMayExitObservable.spec.ts +0 -56
- package/src/browser/xhrObservable.spec.ts +0 -405
- package/src/domain/allowedTrackingOrigins.spec.ts +0 -210
- package/src/domain/bufferedData.spec.ts +0 -34
- package/src/domain/configuration/configuration.spec.ts +0 -236
- package/src/domain/configuration/endpointBuilder.spec.ts +0 -173
- package/src/domain/configuration/transportConfiguration.spec.ts +0 -130
- package/src/domain/connectivity/connectivity.spec.ts +0 -50
- package/src/domain/console/consoleObservable.spec.ts +0 -151
- package/src/domain/context/contextManager.spec.ts +0 -152
- package/src/domain/context/contextUtils.spec.ts +0 -26
- package/src/domain/context/storeContextManager.spec.ts +0 -103
- package/src/domain/contexts/accountContext.spec.ts +0 -99
- package/src/domain/contexts/globalContext.spec.ts +0 -88
- package/src/domain/contexts/userContext.spec.ts +0 -156
- package/src/domain/error/error.spec.ts +0 -294
- package/src/domain/error/trackRuntimeError.spec.ts +0 -343
- package/src/domain/eventRateLimiter/createEventRateLimiter.spec.ts +0 -119
- package/src/domain/extension/extensionUtils.spec.ts +0 -47
- package/src/domain/report/reportObservable.spec.ts +0 -71
- package/src/domain/session/oldCookiesMigration.spec.ts +0 -76
- package/src/domain/session/sessionManager.spec.ts +0 -684
- package/src/domain/session/sessionState.spec.ts +0 -88
- package/src/domain/session/sessionStore.spec.ts +0 -647
- package/src/domain/session/sessionStoreOperations.spec.ts +0 -234
- package/src/domain/session/storeStrategies/sessionInCookie.spec.ts +0 -228
- package/src/domain/session/storeStrategies/sessionInLocalStorage.spec.ts +0 -75
- package/src/domain/synthetics/syntheticsWorkerValues.spec.ts +0 -82
- package/src/domain/tags.spec.ts +0 -74
- package/src/domain/telemetry/telemetry.spec.ts +0 -494
- package/src/domain/trackingConsent.spec.ts +0 -44
- package/src/tools/abstractHooks.spec.ts +0 -76
- package/src/tools/abstractLifeCycle.spec.ts +0 -46
- package/src/tools/boundedBuffer.spec.ts +0 -40
- package/src/tools/catchUserErrors.spec.ts +0 -20
- package/src/tools/encoder.spec.ts +0 -112
- package/src/tools/experimentalFeatures.spec.ts +0 -60
- package/src/tools/getZoneJsOriginalValue.spec.ts +0 -36
- package/src/tools/instrumentMethod.spec.ts +0 -381
- package/src/tools/matchOption.spec.ts +0 -41
- package/src/tools/mergeInto.spec.ts +0 -198
- package/src/tools/monitor.spec.ts +0 -172
- package/src/tools/observable.spec.ts +0 -259
- package/src/tools/queueMicrotask.spec.ts +0 -24
- package/src/tools/readBytesFromStream.spec.ts +0 -62
- package/src/tools/requestIdleCallback.spec.ts +0 -65
- package/src/tools/serialisation/jsonStringify.spec.ts +0 -76
- package/src/tools/serialisation/sanitize.spec.ts +0 -284
- package/src/tools/stackTrace/capturedExceptions.specHelper.ts +0 -316
- package/src/tools/stackTrace/computeStackTrace.spec.ts +0 -1007
- package/src/tools/stackTrace/handlingStack.spec.ts +0 -20
- package/src/tools/taskQueue.spec.ts +0 -60
- package/src/tools/timer.spec.ts +0 -76
- package/src/tools/utils/browserDetection.spec.ts +0 -120
- package/src/tools/utils/byteUtils.spec.ts +0 -29
- package/src/tools/utils/functionUtils.spec.ts +0 -229
- package/src/tools/utils/numberUtils.spec.ts +0 -27
- package/src/tools/utils/stringUtils.spec.ts +0 -74
- package/src/tools/utils/typeUtils.spec.ts +0 -25
- package/src/tools/utils/urlPolyfill.spec.ts +0 -55
- package/src/tools/valueHistory.spec.ts +0 -180
- package/src/transport/batch.spec.ts +0 -261
- package/src/transport/eventBridge.spec.ts +0 -90
- package/src/transport/flushController.spec.ts +0 -267
- package/src/transport/httpRequest.spec.ts +0 -400
- package/src/transport/sendWithRetryStrategy.spec.ts +0 -393
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
import { ignoreConsoleLogs } from '../../../test'
|
|
3
|
-
import { ConsoleApiName } from '../../tools/display'
|
|
4
|
-
import type { Subscription } from '../../tools/observable'
|
|
5
|
-
import type { ErrorConsoleLog } from './consoleObservable'
|
|
6
|
-
import { initConsoleObservable } from './consoleObservable'
|
|
7
|
-
|
|
8
|
-
// prettier: avoid formatting issue
|
|
9
|
-
// cf https://github.com/prettier/prettier/issues/12211
|
|
10
|
-
;[
|
|
11
|
-
{ api: ConsoleApiName.log },
|
|
12
|
-
{ api: ConsoleApiName.info },
|
|
13
|
-
{ api: ConsoleApiName.warn },
|
|
14
|
-
{ api: ConsoleApiName.debug },
|
|
15
|
-
{ api: ConsoleApiName.error },
|
|
16
|
-
].forEach(({ api }) => {
|
|
17
|
-
describe(`console ${api} observable`, () => {
|
|
18
|
-
let consoleSpy: jasmine.Spy
|
|
19
|
-
let consoleSubscription: Subscription
|
|
20
|
-
let notifyLog: jasmine.Spy
|
|
21
|
-
|
|
22
|
-
beforeEach(() => {
|
|
23
|
-
consoleSpy = spyOn(console, api)
|
|
24
|
-
notifyLog = jasmine.createSpy('notifyLog')
|
|
25
|
-
|
|
26
|
-
consoleSubscription = initConsoleObservable([api]).subscribe(notifyLog)
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
afterEach(() => {
|
|
30
|
-
consoleSubscription.unsubscribe()
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
it(`should notify ${api}`, () => {
|
|
34
|
-
console[api]('foo', 'bar')
|
|
35
|
-
|
|
36
|
-
const consoleLog = notifyLog.calls.mostRecent().args[0]
|
|
37
|
-
|
|
38
|
-
expect(consoleLog).toEqual(
|
|
39
|
-
jasmine.objectContaining({
|
|
40
|
-
message: 'foo bar',
|
|
41
|
-
api,
|
|
42
|
-
})
|
|
43
|
-
)
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('should keep original behavior', () => {
|
|
47
|
-
console[api]('foo', 'bar')
|
|
48
|
-
|
|
49
|
-
expect(consoleSpy).toHaveBeenCalledWith('foo', 'bar')
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
it('should format error instance', () => {
|
|
53
|
-
console[api](new TypeError('hello'))
|
|
54
|
-
const consoleLog = notifyLog.calls.mostRecent().args[0]
|
|
55
|
-
expect(consoleLog.message).toBe('TypeError: hello')
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
it('should stringify object parameters', () => {
|
|
59
|
-
console[api]('Hello', { foo: 'bar' })
|
|
60
|
-
const consoleLog = notifyLog.calls.mostRecent().args[0]
|
|
61
|
-
expect(consoleLog.message).toBe('Hello {\n "foo": "bar"\n}')
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
it('should allow multiple callers', () => {
|
|
65
|
-
const notifyOtherCaller = jasmine.createSpy('notifyOtherCaller')
|
|
66
|
-
const instrumentedConsoleApi = console[api]
|
|
67
|
-
const otherConsoleSubscription = initConsoleObservable([api]).subscribe(notifyOtherCaller)
|
|
68
|
-
|
|
69
|
-
console[api]('foo', 'bar')
|
|
70
|
-
|
|
71
|
-
expect(instrumentedConsoleApi).toEqual(console[api])
|
|
72
|
-
expect(notifyLog).toHaveBeenCalledTimes(1)
|
|
73
|
-
expect(notifyOtherCaller).toHaveBeenCalledTimes(1)
|
|
74
|
-
|
|
75
|
-
otherConsoleSubscription.unsubscribe()
|
|
76
|
-
})
|
|
77
|
-
})
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
describe('console error observable', () => {
|
|
81
|
-
let consoleSubscription: Subscription
|
|
82
|
-
let notifyLog: jasmine.Spy<(consoleLog: ErrorConsoleLog) => void>
|
|
83
|
-
|
|
84
|
-
beforeEach(() => {
|
|
85
|
-
ignoreConsoleLogs('error', 'Error: foo')
|
|
86
|
-
ignoreConsoleLogs('error', 'foo bar')
|
|
87
|
-
notifyLog = jasmine.createSpy('notifyLog')
|
|
88
|
-
|
|
89
|
-
consoleSubscription = initConsoleObservable([ConsoleApiName.error]).subscribe(notifyLog)
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
afterEach(() => {
|
|
93
|
-
consoleSubscription.unsubscribe()
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
it('should generate a handling stack', () => {
|
|
97
|
-
function triggerError() {
|
|
98
|
-
console.error('foo', 'bar')
|
|
99
|
-
}
|
|
100
|
-
triggerError()
|
|
101
|
-
const consoleLog = notifyLog.calls.mostRecent().args[0]
|
|
102
|
-
expect(consoleLog.handlingStack).toMatch(/^HandlingStack: console error\s+at triggerError (.|\n)*$/)
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
it('should extract stack from first error', () => {
|
|
106
|
-
console.error(new TypeError('foo'), new TypeError('bar'))
|
|
107
|
-
const stack = notifyLog.calls.mostRecent().args[0].error.stack
|
|
108
|
-
expect(stack).toContain('TypeError: foo')
|
|
109
|
-
})
|
|
110
|
-
|
|
111
|
-
it('should retrieve fingerprint from error', () => {
|
|
112
|
-
interface DatadogError extends Error {
|
|
113
|
-
oo_fingerprint?: string
|
|
114
|
-
}
|
|
115
|
-
const error = new Error('foo')
|
|
116
|
-
; (error as DatadogError).oo_fingerprint = 'my-fingerprint'
|
|
117
|
-
|
|
118
|
-
console.error(error)
|
|
119
|
-
|
|
120
|
-
const consoleLog = notifyLog.calls.mostRecent().args[0]
|
|
121
|
-
expect(consoleLog.error.fingerprint).toBe('my-fingerprint')
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
it('should sanitize error fingerprint', () => {
|
|
125
|
-
const error = new Error('foo')
|
|
126
|
-
; (error as any).oo_fingerprint = 2
|
|
127
|
-
|
|
128
|
-
console.error(error)
|
|
129
|
-
|
|
130
|
-
const consoleLog = notifyLog.calls.mostRecent().args[0]
|
|
131
|
-
expect(consoleLog.error.fingerprint).toBe('2')
|
|
132
|
-
})
|
|
133
|
-
|
|
134
|
-
it('should retrieve context from error', () => {
|
|
135
|
-
interface DatadogError extends Error {
|
|
136
|
-
dd_context?: Record<string, unknown>
|
|
137
|
-
}
|
|
138
|
-
const error = new Error('foo')
|
|
139
|
-
;(error as DatadogError).dd_context = { foo: 'bar' }
|
|
140
|
-
console.error(error)
|
|
141
|
-
const consoleLog = notifyLog.calls.mostRecent().args[0]
|
|
142
|
-
expect(consoleLog.error.context).toEqual({ foo: 'bar' })
|
|
143
|
-
})
|
|
144
|
-
|
|
145
|
-
it('should report original error', () => {
|
|
146
|
-
const error = new Error('foo')
|
|
147
|
-
console.error(error)
|
|
148
|
-
const consoleLog = notifyLog.calls.mostRecent().args[0]
|
|
149
|
-
expect(consoleLog.error.originalError).toBe(error)
|
|
150
|
-
})
|
|
151
|
-
})
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { display } from '../../tools/display'
|
|
2
|
-
import type { PropertiesConfig } from './contextManager'
|
|
3
|
-
import { createContextManager } from './contextManager'
|
|
4
|
-
|
|
5
|
-
function createContextManagerWithDefaults(propertiesConfig?: PropertiesConfig) {
|
|
6
|
-
return createContextManager('test', { propertiesConfig })
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
describe('createContextManager', () => {
|
|
10
|
-
it('starts with an empty context', () => {
|
|
11
|
-
const manager = createContextManagerWithDefaults()
|
|
12
|
-
expect(manager.getContext()).toEqual({})
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
it('updates the context', () => {
|
|
16
|
-
const manager = createContextManagerWithDefaults()
|
|
17
|
-
manager.setContext({ bar: 'foo' })
|
|
18
|
-
|
|
19
|
-
expect(manager.getContext()).toEqual({ bar: 'foo' })
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
it('completely replaces the context', () => {
|
|
23
|
-
const manager = createContextManagerWithDefaults()
|
|
24
|
-
manager.setContext({ a: 'foo' })
|
|
25
|
-
expect(manager.getContext()).toEqual({ a: 'foo' })
|
|
26
|
-
manager.setContext({ b: 'foo' })
|
|
27
|
-
expect(manager.getContext()).toEqual({ b: 'foo' })
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
it('sets a context value', () => {
|
|
31
|
-
const manager = createContextManagerWithDefaults()
|
|
32
|
-
manager.setContextProperty('foo', 'bar')
|
|
33
|
-
expect(manager.getContext()).toEqual({ foo: 'bar' })
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
it('removes a context value', () => {
|
|
37
|
-
const manager = createContextManagerWithDefaults()
|
|
38
|
-
manager.setContext({ a: 'foo', b: 'bar' })
|
|
39
|
-
manager.removeContextProperty('a')
|
|
40
|
-
expect(manager.getContext()).toEqual({ b: 'bar' })
|
|
41
|
-
manager.removeContextProperty('b')
|
|
42
|
-
expect(manager.getContext()).toEqual({})
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
it('should get a clone of the context from getContext', () => {
|
|
46
|
-
const manager = createContextManagerWithDefaults()
|
|
47
|
-
expect(manager.getContext()).toEqual(manager.getContext())
|
|
48
|
-
expect(manager.getContext()).not.toBe(manager.getContext())
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it('should set a clone of context via setContext', () => {
|
|
52
|
-
const nestedObject = { foo: 'bar' }
|
|
53
|
-
const context = { nested: nestedObject }
|
|
54
|
-
const manager = createContextManagerWithDefaults()
|
|
55
|
-
manager.setContext(context)
|
|
56
|
-
expect(manager.getContext().nested).toEqual(nestedObject)
|
|
57
|
-
expect(manager.getContext().nested).not.toBe(nestedObject)
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
it('should set a clone of the property via setContextProperty', () => {
|
|
61
|
-
const nestedObject = { foo: 'bar' }
|
|
62
|
-
const manager = createContextManagerWithDefaults()
|
|
63
|
-
manager.setContextProperty('nested', nestedObject)
|
|
64
|
-
expect(manager.getContext().nested).toEqual(nestedObject)
|
|
65
|
-
expect(manager.getContext().nested).not.toBe(nestedObject)
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
it('should clear context object via clearContext', () => {
|
|
69
|
-
const context = { foo: 'bar' }
|
|
70
|
-
const manager = createContextManagerWithDefaults()
|
|
71
|
-
manager.setContext(context)
|
|
72
|
-
expect(manager.getContext()).toEqual(context)
|
|
73
|
-
manager.clearContext()
|
|
74
|
-
expect(manager.getContext()).toEqual({})
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
it('should prevent setting non object values', () => {
|
|
78
|
-
spyOn(display, 'error')
|
|
79
|
-
const manager = createContextManagerWithDefaults()
|
|
80
|
-
manager.setContext(null as any)
|
|
81
|
-
expect(manager.getContext()).toEqual({})
|
|
82
|
-
manager.setContext(undefined as any)
|
|
83
|
-
expect(manager.getContext()).toEqual({})
|
|
84
|
-
manager.setContext(2 as any)
|
|
85
|
-
expect(manager.getContext()).toEqual({})
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
describe('type enforcement', () => {
|
|
89
|
-
const NULLISH_VALUES = [undefined, null, '']
|
|
90
|
-
|
|
91
|
-
it('should enforce specified type on properties', () => {
|
|
92
|
-
const manager = createContextManagerWithDefaults({
|
|
93
|
-
id: { type: 'string' },
|
|
94
|
-
name: { type: 'string' },
|
|
95
|
-
email: { type: 'string' },
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
manager.setContext({ id: 42, name: true, email: {} })
|
|
99
|
-
|
|
100
|
-
expect(manager.getContext()).toEqual({ id: '42', name: 'true', email: '[object Object]' })
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
it('should not enforce specified type on null or undefined properties', () => {
|
|
104
|
-
const manager = createContextManagerWithDefaults({
|
|
105
|
-
id: { type: 'string' },
|
|
106
|
-
name: { type: 'string' },
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
manager.setContext({ id: undefined, name: null })
|
|
110
|
-
expect(manager.getContext()).toEqual({ id: undefined, name: null })
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
NULLISH_VALUES.forEach((value) => {
|
|
114
|
-
it(`should warn when required property is ${value}`, () => {
|
|
115
|
-
const displaySpy = spyOn(display, 'warn')
|
|
116
|
-
|
|
117
|
-
const manager = createContextManagerWithDefaults({
|
|
118
|
-
id: { required: true },
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
manager.setContext({ id: value })
|
|
122
|
-
|
|
123
|
-
expect(displaySpy).toHaveBeenCalledOnceWith(
|
|
124
|
-
'The property id of test is required; context will not be sent to the intake.'
|
|
125
|
-
)
|
|
126
|
-
})
|
|
127
|
-
})
|
|
128
|
-
})
|
|
129
|
-
|
|
130
|
-
describe('changeObservable', () => {
|
|
131
|
-
it('should notify on context changes', () => {
|
|
132
|
-
const changeSpy = jasmine.createSpy('change')
|
|
133
|
-
const manager = createContextManagerWithDefaults()
|
|
134
|
-
manager.changeObservable.subscribe(changeSpy)
|
|
135
|
-
|
|
136
|
-
manager.getContext()
|
|
137
|
-
expect(changeSpy).not.toHaveBeenCalled()
|
|
138
|
-
|
|
139
|
-
manager.setContext({ foo: 'bar' })
|
|
140
|
-
expect(changeSpy).toHaveBeenCalledTimes(1)
|
|
141
|
-
|
|
142
|
-
manager.setContextProperty('qux', 'qix')
|
|
143
|
-
expect(changeSpy).toHaveBeenCalledTimes(2)
|
|
144
|
-
|
|
145
|
-
manager.removeContextProperty('qux')
|
|
146
|
-
expect(changeSpy).toHaveBeenCalledTimes(3)
|
|
147
|
-
|
|
148
|
-
manager.clearContext()
|
|
149
|
-
expect(changeSpy).toHaveBeenCalledTimes(4)
|
|
150
|
-
})
|
|
151
|
-
})
|
|
152
|
-
})
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { display } from '../../tools/display'
|
|
2
|
-
import type { Context } from '../../tools/serialisation/context'
|
|
3
|
-
import type { Account } from '../contexts/accountContext'
|
|
4
|
-
import type { User } from '../contexts/userContext'
|
|
5
|
-
import { checkContext } from './contextUtils'
|
|
6
|
-
|
|
7
|
-
describe('checkContext function', () => {
|
|
8
|
-
it('should only accept valid objects', () => {
|
|
9
|
-
spyOn(display, 'error')
|
|
10
|
-
|
|
11
|
-
const obj: any = { id: 42, name: true, email: null } // Valid, even though not sanitized
|
|
12
|
-
const user: User = { id: '42', name: 'John', email: 'john@doe.com' }
|
|
13
|
-
const account: Account = { id: '42', name: 'Groupe' }
|
|
14
|
-
const undefUser: any = undefined
|
|
15
|
-
const nullUser: any = null
|
|
16
|
-
const invalidUser: any = 42
|
|
17
|
-
|
|
18
|
-
expect(checkContext(obj)).toBe(true)
|
|
19
|
-
expect(checkContext(user as Context)).toBe(true)
|
|
20
|
-
expect(checkContext(account as Context)).toBe(true)
|
|
21
|
-
expect(checkContext(undefUser)).toBe(false)
|
|
22
|
-
expect(checkContext(nullUser)).toBe(false)
|
|
23
|
-
expect(checkContext(invalidUser)).toBe(false)
|
|
24
|
-
expect(display.error).toHaveBeenCalledTimes(3)
|
|
25
|
-
})
|
|
26
|
-
})
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import type { Configuration } from '../configuration'
|
|
2
|
-
import { createNewEvent } from '../../../test'
|
|
3
|
-
import { DOM_EVENT } from '../../browser/addEventListener'
|
|
4
|
-
import type { Context } from '../../tools/serialisation/context'
|
|
5
|
-
import { storeContextManager, buildStorageKey, removeStorageListeners } from './storeContextManager'
|
|
6
|
-
import { CustomerDataType } from './contextConstants'
|
|
7
|
-
import { createContextManager } from './contextManager'
|
|
8
|
-
|
|
9
|
-
describe('storeContextManager', () => {
|
|
10
|
-
const PRODUCT_KEY = 'fake'
|
|
11
|
-
const CUSTOMER_DATA_TYPE = CustomerDataType.User
|
|
12
|
-
const STORAGE_KEY = buildStorageKey(PRODUCT_KEY, CUSTOMER_DATA_TYPE)
|
|
13
|
-
|
|
14
|
-
let configuration: Configuration
|
|
15
|
-
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
configuration = {} as Configuration
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
afterEach(() => {
|
|
21
|
-
localStorage.clear()
|
|
22
|
-
removeStorageListeners()
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
it('should synchronize with local storage at start', () => {
|
|
26
|
-
localStorage.setItem(STORAGE_KEY, '{"bar":"foo"}')
|
|
27
|
-
|
|
28
|
-
const manager = createStoredContextManager()
|
|
29
|
-
|
|
30
|
-
expect(manager.getContext()).toEqual({ bar: 'foo' })
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
it('should synchronize with local storage on storage events', () => {
|
|
34
|
-
const manager = createStoredContextManager()
|
|
35
|
-
|
|
36
|
-
localStorage.setItem(STORAGE_KEY, '{"bar":"foo"}')
|
|
37
|
-
expect(manager.getContext()).toEqual({})
|
|
38
|
-
|
|
39
|
-
window.dispatchEvent(createNewEvent(DOM_EVENT.STORAGE, { key: 'unknown' }))
|
|
40
|
-
expect(manager.getContext()).toEqual({})
|
|
41
|
-
|
|
42
|
-
window.dispatchEvent(createNewEvent(DOM_EVENT.STORAGE, { key: STORAGE_KEY }))
|
|
43
|
-
expect(manager.getContext()).toEqual({ bar: 'foo' })
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('should update local storage on context updates', () => {
|
|
47
|
-
const manager = createStoredContextManager()
|
|
48
|
-
expect(localStorage.getItem(STORAGE_KEY)).toBe(null)
|
|
49
|
-
|
|
50
|
-
manager.setContext({ bar: 'foo' })
|
|
51
|
-
expect(localStorage.getItem(STORAGE_KEY)).toBe('{"bar":"foo"}')
|
|
52
|
-
|
|
53
|
-
manager.setContextProperty('qux', 'qix')
|
|
54
|
-
expect(localStorage.getItem(STORAGE_KEY)).toBe('{"bar":"foo","qux":"qix"}')
|
|
55
|
-
|
|
56
|
-
manager.removeContextProperty('qux')
|
|
57
|
-
expect(localStorage.getItem(STORAGE_KEY)).toBe('{"bar":"foo"}')
|
|
58
|
-
|
|
59
|
-
manager.clearContext()
|
|
60
|
-
expect(localStorage.getItem(STORAGE_KEY)).toBe('{}')
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
it('merges local storage data with initial context', () => {
|
|
64
|
-
localStorage.setItem(STORAGE_KEY, '{"bar":"foo"}')
|
|
65
|
-
const manager = createStoredContextManager({ initialContext: { qux: 'qix' } })
|
|
66
|
-
|
|
67
|
-
expect(manager.getContext()).toEqual({ bar: 'foo', qux: 'qix' })
|
|
68
|
-
expect(localStorage.getItem(STORAGE_KEY)).toBe('{"bar":"foo","qux":"qix"}')
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
it('should store different product data in different storage key', () => {
|
|
72
|
-
createStoredContextManager({ initialContext: { bar: 'foo' }, productKey: 'p1' })
|
|
73
|
-
createStoredContextManager({ initialContext: { qux: 'qix' }, productKey: 'p2' })
|
|
74
|
-
|
|
75
|
-
expect(localStorage.getItem(buildStorageKey('p1', CUSTOMER_DATA_TYPE))).toBe('{"bar":"foo"}')
|
|
76
|
-
expect(localStorage.getItem(buildStorageKey('p2', CUSTOMER_DATA_TYPE))).toBe('{"qux":"qix"}')
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
it('should store different data type in different storage key', () => {
|
|
80
|
-
createStoredContextManager({ initialContext: { bar: 'foo' }, customerDataType: CustomerDataType.User })
|
|
81
|
-
createStoredContextManager({ initialContext: { qux: 'qix' }, customerDataType: CustomerDataType.GlobalContext })
|
|
82
|
-
|
|
83
|
-
expect(localStorage.getItem(buildStorageKey(PRODUCT_KEY, CustomerDataType.User))).toBe('{"bar":"foo"}')
|
|
84
|
-
expect(localStorage.getItem(buildStorageKey(PRODUCT_KEY, CustomerDataType.GlobalContext))).toBe('{"qux":"qix"}')
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
function createStoredContextManager({
|
|
88
|
-
initialContext,
|
|
89
|
-
productKey = PRODUCT_KEY,
|
|
90
|
-
customerDataType = CUSTOMER_DATA_TYPE,
|
|
91
|
-
}: {
|
|
92
|
-
initialContext?: Context
|
|
93
|
-
productKey?: string
|
|
94
|
-
customerDataType?: CustomerDataType
|
|
95
|
-
} = {}) {
|
|
96
|
-
const manager = createContextManager('test')
|
|
97
|
-
if (initialContext) {
|
|
98
|
-
manager.setContext(initialContext)
|
|
99
|
-
}
|
|
100
|
-
storeContextManager(configuration, manager, productKey, customerDataType)
|
|
101
|
-
return manager
|
|
102
|
-
}
|
|
103
|
-
})
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import type { Hooks } from '../../../test'
|
|
2
|
-
import { createHooks, registerCleanupTask } from '../../../test'
|
|
3
|
-
import { mockRumConfiguration } from '../../../../rum-core/test'
|
|
4
|
-
import type { ContextManager } from '../context/contextManager'
|
|
5
|
-
import { display } from '../../tools/display'
|
|
6
|
-
import type { RelativeTime } from '../../tools/utils/timeUtils'
|
|
7
|
-
import { HookNames } from '../../tools/abstractHooks'
|
|
8
|
-
import { removeStorageListeners } from '../context/storeContextManager'
|
|
9
|
-
import { startAccountContext } from './accountContext'
|
|
10
|
-
|
|
11
|
-
describe('account context', () => {
|
|
12
|
-
let accountContext: ContextManager
|
|
13
|
-
let displaySpy: jasmine.Spy
|
|
14
|
-
let hooks: Hooks
|
|
15
|
-
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
hooks = createHooks()
|
|
18
|
-
displaySpy = spyOn(display, 'warn')
|
|
19
|
-
|
|
20
|
-
accountContext = startAccountContext(hooks, mockRumConfiguration(), 'some_product_key')
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
it('should warn when the account.id is missing', () => {
|
|
24
|
-
accountContext.setContext({ foo: 'bar' })
|
|
25
|
-
expect(displaySpy).toHaveBeenCalled()
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
it('should sanitize predefined properties', () => {
|
|
29
|
-
accountContext.setContext({ id: false, name: 2 })
|
|
30
|
-
expect(accountContext.getContext()).toEqual({
|
|
31
|
-
id: 'false',
|
|
32
|
-
name: '2',
|
|
33
|
-
})
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
describe('assemble hook', () => {
|
|
37
|
-
it('should set the account', () => {
|
|
38
|
-
accountContext.setContext({ id: '123', foo: 'bar' })
|
|
39
|
-
|
|
40
|
-
const defaultRumEventAttributes = hooks.triggerHook(HookNames.Assemble, {
|
|
41
|
-
startTime: 0 as RelativeTime,
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
expect(defaultRumEventAttributes).toEqual({
|
|
45
|
-
account: {
|
|
46
|
-
id: '123',
|
|
47
|
-
foo: 'bar',
|
|
48
|
-
},
|
|
49
|
-
})
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
it('should not set the account when account.id is undefined', () => {
|
|
53
|
-
accountContext.setContext({ foo: 'bar' })
|
|
54
|
-
const defaultRumEventAttributes = hooks.triggerHook(HookNames.Assemble, {
|
|
55
|
-
eventType: 'view',
|
|
56
|
-
startTime: 0 as RelativeTime,
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
expect(defaultRumEventAttributes).toBeUndefined()
|
|
60
|
-
})
|
|
61
|
-
})
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
describe('account context across pages', () => {
|
|
65
|
-
let accountContext: ContextManager
|
|
66
|
-
let hooks: Hooks
|
|
67
|
-
beforeEach(() => {
|
|
68
|
-
hooks = createHooks()
|
|
69
|
-
|
|
70
|
-
registerCleanupTask(() => {
|
|
71
|
-
localStorage.clear()
|
|
72
|
-
removeStorageListeners()
|
|
73
|
-
})
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
it('when disabled, should store contexts only in memory', () => {
|
|
77
|
-
accountContext = startAccountContext(
|
|
78
|
-
hooks,
|
|
79
|
-
mockRumConfiguration({ storeContextsAcrossPages: false }),
|
|
80
|
-
'some_product_key'
|
|
81
|
-
)
|
|
82
|
-
accountContext.setContext({ id: '123' })
|
|
83
|
-
|
|
84
|
-
expect(accountContext.getContext()).toEqual({ id: '123' })
|
|
85
|
-
expect(localStorage.getItem('_oo_c_rum_4')).toBeNull()
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
it('when enabled, should maintain the account in local storage', () => {
|
|
89
|
-
accountContext = startAccountContext(
|
|
90
|
-
hooks,
|
|
91
|
-
mockRumConfiguration({ storeContextsAcrossPages: true }),
|
|
92
|
-
'some_product_key'
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
accountContext.setContext({ id: 'foo', qux: 'qix' })
|
|
96
|
-
expect(accountContext.getContext()).toEqual({ id: 'foo', qux: 'qix' })
|
|
97
|
-
expect(localStorage.getItem('_oo_c_some_product_key_4')).toBe('{"id":"foo","qux":"qix"}')
|
|
98
|
-
})
|
|
99
|
-
})
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import type { Hooks } from '../../../test'
|
|
2
|
-
import type { LogsConfiguration } from '../../../../logs/src/domain/configuration'
|
|
3
|
-
import type { ContextManager } from '../context/contextManager'
|
|
4
|
-
import { HookNames } from '../../tools/abstractHooks'
|
|
5
|
-
import type { RelativeTime } from '../../tools/utils/timeUtils'
|
|
6
|
-
import { createHooks, registerCleanupTask } from '../../../test'
|
|
7
|
-
import { removeStorageListeners } from '../context/storeContextManager'
|
|
8
|
-
import type { Configuration } from '../configuration'
|
|
9
|
-
import { startGlobalContext } from './globalContext'
|
|
10
|
-
|
|
11
|
-
describe('logs global context', () => {
|
|
12
|
-
let globalContext: ContextManager
|
|
13
|
-
let hooks: Hooks
|
|
14
|
-
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
hooks = createHooks()
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
describe('assemble hook', () => {
|
|
20
|
-
it('should set the context in context in `context` namespace when specified', () => {
|
|
21
|
-
const contextNamespace = true
|
|
22
|
-
globalContext = startGlobalContext(hooks, {} as LogsConfiguration, 'some_product_key', contextNamespace)
|
|
23
|
-
|
|
24
|
-
globalContext.setContext({ id: '123', foo: 'bar' })
|
|
25
|
-
const event = hooks.triggerHook(HookNames.Assemble, { startTime: 0 as RelativeTime })
|
|
26
|
-
|
|
27
|
-
expect(event).toEqual({
|
|
28
|
-
context: {
|
|
29
|
-
id: '123',
|
|
30
|
-
foo: 'bar',
|
|
31
|
-
},
|
|
32
|
-
})
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
it('should set the context in root namespace when specified', () => {
|
|
36
|
-
const contextNamespace = false
|
|
37
|
-
globalContext = startGlobalContext(hooks, {} as LogsConfiguration, 'some_product_key', contextNamespace)
|
|
38
|
-
|
|
39
|
-
globalContext.setContext({ id: '123', foo: 'bar' })
|
|
40
|
-
const event = hooks.triggerHook(HookNames.Assemble, { startTime: 0 as RelativeTime })
|
|
41
|
-
|
|
42
|
-
expect(event).toEqual({
|
|
43
|
-
id: '123',
|
|
44
|
-
foo: 'bar',
|
|
45
|
-
})
|
|
46
|
-
})
|
|
47
|
-
})
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
describe('global context across pages', () => {
|
|
51
|
-
let globalContext: ContextManager
|
|
52
|
-
let hooks: Hooks
|
|
53
|
-
|
|
54
|
-
beforeEach(() => {
|
|
55
|
-
hooks = createHooks()
|
|
56
|
-
|
|
57
|
-
registerCleanupTask(() => {
|
|
58
|
-
localStorage.clear()
|
|
59
|
-
removeStorageListeners()
|
|
60
|
-
})
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
it('when disabled, should store contexts only in memory', () => {
|
|
64
|
-
globalContext = startGlobalContext(
|
|
65
|
-
hooks,
|
|
66
|
-
{ storeContextsAcrossPages: false } as Configuration,
|
|
67
|
-
'some_product_key',
|
|
68
|
-
false
|
|
69
|
-
)
|
|
70
|
-
globalContext.setContext({ id: '123' })
|
|
71
|
-
|
|
72
|
-
expect(globalContext.getContext()).toEqual({ id: '123' })
|
|
73
|
-
expect(localStorage.getItem('_oo_c_some_product_key_2')).toBeNull()
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
it('when enabled, should maintain the global context in local storage', () => {
|
|
77
|
-
globalContext = startGlobalContext(
|
|
78
|
-
hooks,
|
|
79
|
-
{ storeContextsAcrossPages: true } as Configuration,
|
|
80
|
-
'some_product_key',
|
|
81
|
-
false
|
|
82
|
-
)
|
|
83
|
-
|
|
84
|
-
globalContext.setContext({ id: 'foo', qux: 'qix' })
|
|
85
|
-
expect(globalContext.getContext()).toEqual({ id: 'foo', qux: 'qix' })
|
|
86
|
-
expect(localStorage.getItem('_oo_c_some_product_key_2')).toBe('{"id":"foo","qux":"qix"}')
|
|
87
|
-
})
|
|
88
|
-
})
|