@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.
Files changed (83) hide show
  1. package/cjs/boot/init.js +1 -1
  2. package/cjs/domain/configuration/endpointBuilder.js +1 -1
  3. package/cjs/domain/tags.js +1 -1
  4. package/cjs/domain/telemetry/telemetry.js +1 -1
  5. package/cjs/domain/telemetry/telemetryEvent.types.d.ts +1 -1
  6. package/esm/boot/init.js +1 -1
  7. package/esm/domain/configuration/endpointBuilder.js +1 -1
  8. package/esm/domain/tags.js +1 -1
  9. package/esm/domain/telemetry/telemetry.js +1 -1
  10. package/esm/domain/telemetry/telemetryEvent.types.d.ts +1 -1
  11. package/package.json +2 -2
  12. package/src/domain/telemetry/telemetryEvent.types.ts +1 -1
  13. package/src/boot/displayAlreadyInitializedError.spec.ts +0 -18
  14. package/src/boot/init.spec.ts +0 -50
  15. package/src/browser/addEventListener.spec.ts +0 -141
  16. package/src/browser/cookie.spec.ts +0 -53
  17. package/src/browser/fetchObservable.spec.ts +0 -334
  18. package/src/browser/pageMayExitObservable.spec.ts +0 -56
  19. package/src/browser/xhrObservable.spec.ts +0 -405
  20. package/src/domain/allowedTrackingOrigins.spec.ts +0 -210
  21. package/src/domain/bufferedData.spec.ts +0 -34
  22. package/src/domain/configuration/configuration.spec.ts +0 -236
  23. package/src/domain/configuration/endpointBuilder.spec.ts +0 -173
  24. package/src/domain/configuration/transportConfiguration.spec.ts +0 -130
  25. package/src/domain/connectivity/connectivity.spec.ts +0 -50
  26. package/src/domain/console/consoleObservable.spec.ts +0 -151
  27. package/src/domain/context/contextManager.spec.ts +0 -152
  28. package/src/domain/context/contextUtils.spec.ts +0 -26
  29. package/src/domain/context/storeContextManager.spec.ts +0 -103
  30. package/src/domain/contexts/accountContext.spec.ts +0 -99
  31. package/src/domain/contexts/globalContext.spec.ts +0 -88
  32. package/src/domain/contexts/userContext.spec.ts +0 -156
  33. package/src/domain/error/error.spec.ts +0 -294
  34. package/src/domain/error/trackRuntimeError.spec.ts +0 -343
  35. package/src/domain/eventRateLimiter/createEventRateLimiter.spec.ts +0 -119
  36. package/src/domain/extension/extensionUtils.spec.ts +0 -47
  37. package/src/domain/report/reportObservable.spec.ts +0 -71
  38. package/src/domain/session/oldCookiesMigration.spec.ts +0 -76
  39. package/src/domain/session/sessionManager.spec.ts +0 -684
  40. package/src/domain/session/sessionState.spec.ts +0 -88
  41. package/src/domain/session/sessionStore.spec.ts +0 -647
  42. package/src/domain/session/sessionStoreOperations.spec.ts +0 -234
  43. package/src/domain/session/storeStrategies/sessionInCookie.spec.ts +0 -228
  44. package/src/domain/session/storeStrategies/sessionInLocalStorage.spec.ts +0 -75
  45. package/src/domain/synthetics/syntheticsWorkerValues.spec.ts +0 -82
  46. package/src/domain/tags.spec.ts +0 -74
  47. package/src/domain/telemetry/telemetry.spec.ts +0 -494
  48. package/src/domain/trackingConsent.spec.ts +0 -44
  49. package/src/tools/abstractHooks.spec.ts +0 -76
  50. package/src/tools/abstractLifeCycle.spec.ts +0 -46
  51. package/src/tools/boundedBuffer.spec.ts +0 -40
  52. package/src/tools/catchUserErrors.spec.ts +0 -20
  53. package/src/tools/encoder.spec.ts +0 -112
  54. package/src/tools/experimentalFeatures.spec.ts +0 -60
  55. package/src/tools/getZoneJsOriginalValue.spec.ts +0 -36
  56. package/src/tools/instrumentMethod.spec.ts +0 -381
  57. package/src/tools/matchOption.spec.ts +0 -41
  58. package/src/tools/mergeInto.spec.ts +0 -198
  59. package/src/tools/monitor.spec.ts +0 -172
  60. package/src/tools/observable.spec.ts +0 -259
  61. package/src/tools/queueMicrotask.spec.ts +0 -24
  62. package/src/tools/readBytesFromStream.spec.ts +0 -62
  63. package/src/tools/requestIdleCallback.spec.ts +0 -65
  64. package/src/tools/serialisation/jsonStringify.spec.ts +0 -76
  65. package/src/tools/serialisation/sanitize.spec.ts +0 -284
  66. package/src/tools/stackTrace/capturedExceptions.specHelper.ts +0 -316
  67. package/src/tools/stackTrace/computeStackTrace.spec.ts +0 -1007
  68. package/src/tools/stackTrace/handlingStack.spec.ts +0 -20
  69. package/src/tools/taskQueue.spec.ts +0 -60
  70. package/src/tools/timer.spec.ts +0 -76
  71. package/src/tools/utils/browserDetection.spec.ts +0 -120
  72. package/src/tools/utils/byteUtils.spec.ts +0 -29
  73. package/src/tools/utils/functionUtils.spec.ts +0 -229
  74. package/src/tools/utils/numberUtils.spec.ts +0 -27
  75. package/src/tools/utils/stringUtils.spec.ts +0 -74
  76. package/src/tools/utils/typeUtils.spec.ts +0 -25
  77. package/src/tools/utils/urlPolyfill.spec.ts +0 -55
  78. package/src/tools/valueHistory.spec.ts +0 -180
  79. package/src/transport/batch.spec.ts +0 -261
  80. package/src/transport/eventBridge.spec.ts +0 -90
  81. package/src/transport/flushController.spec.ts +0 -267
  82. package/src/transport/httpRequest.spec.ts +0 -400
  83. 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
- })