Skip to content

Commit a334cc3

Browse files
authored
feat: Added better sub logging utils (#1581)
1 parent eb8151f commit a334cc3

38 files changed

+243
-183
lines changed

Diff for: functional_tests/feature-flags.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import '../src/__tests__/helpers/mock-logger'
2+
13
import { createPosthogInstance } from '../src/__tests__/helpers/posthog-instance'
24
import { waitFor } from '@testing-library/dom'
35
import { getRequests, resetRequests } from './mock-server'

Diff for: functional_tests/identify.test.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
import '../src/__tests__/helpers/mock-logger'
2+
13
import 'regenerator-runtime/runtime'
24
import { waitFor } from '@testing-library/dom'
35
import { getRequests } from './mock-server'
46
import { createPosthogInstance } from '../src/__tests__/helpers/posthog-instance'
57
import { logger } from '../src/utils/logger'
68
import { uuidv7 } from '../src/uuidv7'
79
import { PostHog } from '../src/posthog-core'
8-
jest.mock('../src/utils/logger')
910

1011
describe('FunctionalTests / Identify', () => {
1112
let token: string

Diff for: src/__tests__/consent.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import './helpers/mock-logger'
2+
13
import { PostHog } from '../posthog-core'
24
import { defaultPostHog } from './helpers/posthog-instance'
35
import { uuidv7 } from '../uuidv7'

Diff for: src/__tests__/decide.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,10 @@ describe('Decide', () => {
212212
subject(undefined as unknown as DecideResponse)
213213

214214
expect(posthog.featureFlags.receivedFeatureFlags).toHaveBeenCalledWith({}, true)
215-
expect(console.error).toHaveBeenCalledWith('[PostHog.js]', 'Failed to fetch feature flags from PostHog.')
215+
expect(console.error).toHaveBeenCalledWith(
216+
'[PostHog.js] [Decide]',
217+
'Failed to fetch feature flags from PostHog.'
218+
)
216219
})
217220

218221
it('Make sure receivedFeatureFlags is not called if advanced_disable_feature_flags_on_first_load is set', () => {

Diff for: src/__tests__/extensions/web-vitals.test.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
import '../helpers/mock-logger'
2+
13
import { createPosthogInstance } from '../helpers/posthog-instance'
24
import { uuidv7 } from '../../uuidv7'
35
import { PostHog } from '../../posthog-core'
46
import { DecideResponse, PerformanceCaptureConfig, SupportedWebVitalsMetrics } from '../../types'
57
import { assignableWindow } from '../../utils/globals'
68
import { DEFAULT_FLUSH_TO_CAPTURE_TIMEOUT_MILLISECONDS, FIFTEEN_MINUTES_IN_MILLIS } from '../../extensions/web-vitals'
79

8-
jest.mock('../../utils/logger')
910
jest.useFakeTimers()
1011

1112
describe('web vitals', () => {

Diff for: src/__tests__/featureflags.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,15 @@ describe('featureflags', () => {
8787
expect(featureFlags.getFlags()).toEqual([])
8888
expect(featureFlags.isFeatureEnabled('beta-feature')).toEqual(undefined)
8989
expect(window.console.warn).toHaveBeenCalledWith(
90-
'[PostHog.js]',
90+
'[PostHog.js] [FeatureFlags]',
9191
'isFeatureEnabled for key "beta-feature" failed. Feature flags didn\'t load in time.'
9292
)
9393

9494
mockWarn.mockClear()
9595

9696
expect(featureFlags.getFeatureFlag('beta-feature')).toEqual(undefined)
9797
expect(window.console.warn).toHaveBeenCalledWith(
98-
'[PostHog.js]',
98+
'[PostHog.js] [FeatureFlags]',
9999
'getFeatureFlag for key "beta-feature" failed. Feature flags didn\'t load in time.'
100100
)
101101
})
@@ -246,7 +246,7 @@ describe('featureflags', () => {
246246
'alpha-feature-2': true,
247247
})
248248
expect(window.console.warn).toHaveBeenCalledWith(
249-
'[PostHog.js]',
249+
'[PostHog.js] [FeatureFlags]',
250250
' Overriding feature flags!',
251251
expect.any(Object)
252252
)

Diff for: src/__tests__/heatmaps.test.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import './helpers/mock-logger'
2+
13
import { createPosthogInstance } from './helpers/posthog-instance'
24
import { uuidv7 } from '../uuidv7'
35
import { PostHog } from '../posthog-core'
@@ -7,7 +9,6 @@ import { beforeEach, expect } from '@jest/globals'
79
import { HEATMAPS_ENABLED_SERVER_SIDE } from '../constants'
810
import { Heatmaps } from '../heatmaps'
911

10-
jest.mock('../utils/logger')
1112
jest.useFakeTimers()
1213

1314
describe('heatmaps', () => {

Diff for: src/__tests__/helpers/mock-logger.ts

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { Logger } from '../../utils/logger'
2+
3+
jest.mock('../../utils/logger', () => {
4+
const mockLogger: Logger = {
5+
_log: jest.fn(),
6+
critical: jest.fn(),
7+
uninitializedWarning: jest.fn(),
8+
info: jest.fn(),
9+
warn: jest.fn(),
10+
error: jest.fn(),
11+
createLogger: () => {
12+
return mockLogger
13+
},
14+
}
15+
return {
16+
logger: mockLogger,
17+
createLogger: mockLogger.createLogger,
18+
}
19+
})
20+
21+
import { logger } from '../../utils/logger'
22+
import { isFunction } from '../../utils/type-utils'
23+
24+
export const clearLoggerMocks = () => {
25+
Object.values(logger).forEach((mock: any) => {
26+
if (isFunction(mock.mockClear)) {
27+
mock.mockClear()
28+
}
29+
})
30+
}
31+
32+
export const mockLogger: jest.Mocked<Logger> = logger as any

Diff for: src/__tests__/identify.test.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
import { mockLogger } from './helpers/mock-logger'
2+
13
import { createPosthogInstance } from './helpers/posthog-instance'
2-
import { logger } from '../utils/logger'
34
import { uuidv7 } from '../uuidv7'
4-
jest.mock('../utils/logger')
55

66
describe('identify', () => {
77
// Note that there are other tests for identify in posthog-core.identify.js
@@ -19,8 +19,8 @@ describe('identify', () => {
1919

2020
// assert
2121
expect(posthog.persistence!.properties()['$user_id']).toEqual(distinctId)
22-
expect(jest.mocked(logger).error).toBeCalledTimes(0)
23-
expect(jest.mocked(logger).warn).toBeCalledTimes(0)
22+
expect(mockLogger.error).toBeCalledTimes(0)
23+
expect(mockLogger.warn).toBeCalledTimes(0)
2424
})
2525

2626
it('should convert a numeric distinct_id to a string', async () => {
@@ -35,8 +35,8 @@ describe('identify', () => {
3535

3636
// assert
3737
expect(posthog.persistence!.properties()['$user_id']).toEqual(distinctIdString)
38-
expect(jest.mocked(logger).error).toBeCalledTimes(0)
39-
expect(jest.mocked(logger).warn).toBeCalledTimes(1)
38+
expect(mockLogger.error).toBeCalledTimes(0)
39+
expect(mockLogger.warn).toBeCalledTimes(1)
4040
})
4141

4242
it('should send $is_identified = true with the identify event and following events', async () => {

Diff for: src/__tests__/personProcessing.test.ts

+13-14
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1+
import { mockLogger } from './helpers/mock-logger'
2+
13
import { createPosthogInstance } from './helpers/posthog-instance'
24
import { uuidv7 } from '../uuidv7'
3-
import { logger } from '../utils/logger'
45
import { INITIAL_CAMPAIGN_PARAMS, INITIAL_REFERRER_INFO } from '../constants'
56
import { RemoteConfig } from '../types'
67

7-
jest.mock('../utils/logger')
8-
98
const INITIAL_CAMPAIGN_PARAMS_NULL = {
109
$initial_current_url: null,
1110
$initial_dclid: null,
@@ -156,8 +155,8 @@ describe('person processing', () => {
156155
posthog.identify(distinctId)
157156

158157
// assert
159-
expect(jest.mocked(logger).error).toBeCalledTimes(1)
160-
expect(jest.mocked(logger).error).toHaveBeenCalledWith(
158+
expect(mockLogger.error).toBeCalledTimes(1)
159+
expect(mockLogger.error).toHaveBeenCalledWith(
161160
'posthog.identify was called, but process_person is set to "never". This call will be ignored.'
162161
)
163162
expect(beforeSendMock).toBeCalledTimes(0)
@@ -172,7 +171,7 @@ describe('person processing', () => {
172171
posthog.identify(distinctId)
173172
posthog.capture('custom event after identify')
174173
// assert
175-
expect(jest.mocked(logger).error).toBeCalledTimes(0)
174+
expect(mockLogger.error).toBeCalledTimes(0)
176175
const eventBeforeIdentify = beforeSendMock.mock.calls[0]
177176
expect(eventBeforeIdentify[0].properties.$process_person_profile).toEqual(false)
178177
const identifyCall = beforeSendMock.mock.calls[1]
@@ -191,7 +190,7 @@ describe('person processing', () => {
191190
posthog.identify(distinctId)
192191
posthog.capture('custom event after identify')
193192
// assert
194-
expect(jest.mocked(logger).error).toBeCalledTimes(0)
193+
expect(mockLogger.error).toBeCalledTimes(0)
195194
const eventBeforeIdentify = beforeSendMock.mock.calls[0]
196195
expect(eventBeforeIdentify[0].properties.$process_person_profile).toEqual(true)
197196
const identifyCall = beforeSendMock.mock.calls[1]
@@ -503,8 +502,8 @@ describe('person processing', () => {
503502
posthog.capture('custom event after group')
504503

505504
// assert
506-
expect(jest.mocked(logger).error).toBeCalledTimes(1)
507-
expect(jest.mocked(logger).error).toHaveBeenCalledWith(
505+
expect(mockLogger.error).toBeCalledTimes(1)
506+
expect(mockLogger.error).toHaveBeenCalledWith(
508507
'posthog.group was called, but process_person is set to "never". This call will be ignored.'
509508
)
510509

@@ -526,8 +525,8 @@ describe('person processing', () => {
526525

527526
// assert
528527
expect(beforeSendMock).toBeCalledTimes(0)
529-
expect(jest.mocked(logger).error).toBeCalledTimes(1)
530-
expect(jest.mocked(logger).error).toHaveBeenCalledWith(
528+
expect(mockLogger.error).toBeCalledTimes(1)
529+
expect(mockLogger.error).toHaveBeenCalledWith(
531530
'posthog.setPersonProperties was called, but process_person is set to "never". This call will be ignored.'
532531
)
533532
})
@@ -593,8 +592,8 @@ describe('person processing', () => {
593592

594593
// assert
595594
expect(beforeSendMock).toBeCalledTimes(0)
596-
expect(jest.mocked(logger).error).toBeCalledTimes(1)
597-
expect(jest.mocked(logger).error).toHaveBeenCalledWith(
595+
expect(mockLogger.error).toBeCalledTimes(1)
596+
expect(mockLogger.error).toHaveBeenCalledWith(
598597
'posthog.alias was called, but process_person is set to "never". This call will be ignored.'
599598
)
600599
})
@@ -644,7 +643,7 @@ describe('person processing', () => {
644643

645644
// assert
646645
expect(beforeSendMock).toBeCalledTimes(0)
647-
expect(jest.mocked(logger).error).toBeCalledTimes(0)
646+
expect(mockLogger.error).toBeCalledTimes(0)
648647
})
649648
})
650649

Diff for: src/__tests__/posthog-core.beforeSend.test.ts

+5-8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1+
import { mockLogger } from './helpers/mock-logger'
2+
13
import { uuidv7 } from '../uuidv7'
24
import { defaultPostHog } from './helpers/posthog-instance'
3-
import { logger } from '../utils/logger'
45
import { CaptureResult, knownUnsafeEditableEvent, PostHogConfig } from '../types'
56
import { PostHog } from '../posthog-core'
67

7-
jest.mock('../utils/logger')
8-
98
const rejectingEventFn = () => {
109
return null
1110
}
@@ -53,9 +52,7 @@ describe('posthog core - before send', () => {
5352

5453
expect(capturedData).toBeUndefined()
5554
expect(posthog._send_request).not.toHaveBeenCalled()
56-
expect(jest.mocked(logger).info).toHaveBeenCalledWith(
57-
`Event '${eventName}' was rejected in beforeSend function`
58-
)
55+
expect(mockLogger.info).toHaveBeenCalledWith(`Event '${eventName}' was rejected in beforeSend function`)
5956
})
6057

6158
it('can edit an event', () => {
@@ -156,7 +153,7 @@ describe('posthog core - before send', () => {
156153
method: 'POST',
157154
url: 'https://us.i.posthog.com/e/',
158155
})
159-
expect(jest.mocked(logger).warn).toHaveBeenCalledWith(
156+
expect(mockLogger.warn).toHaveBeenCalledWith(
160157
`Event '${eventName}' has no properties after beforeSend function, this is likely an error.`
161158
)
162159
})
@@ -172,7 +169,7 @@ describe('posthog core - before send', () => {
172169

173170
posthog.capture(randomUnsafeEditableEvent, {}, {})
174171

175-
expect(jest.mocked(logger).warn).toHaveBeenCalledWith(
172+
expect(mockLogger.warn).toHaveBeenCalledWith(
176173
`Event '${randomUnsafeEditableEvent}' was rejected in beforeSend function. This can cause unexpected behavior.`
177174
)
178175
})

Diff for: src/__tests__/posthog-core.ts

+7-14
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import { mockLogger } from './helpers/mock-logger'
2+
13
import { Info } from '../utils/event-utils'
24
import { document, window } from '../utils/globals'
35
import { uuidv7 } from '../uuidv7'
46
import * as globals from '../utils/globals'
57
import { ENABLE_PERSON_PROCESSING, USER_STATE } from '../constants'
68
import { createPosthogInstance, defaultPostHog } from './helpers/posthog-instance'
7-
import { logger } from '../utils/logger'
89
import { PostHogConfig, RemoteConfig } from '../types'
910
import { PostHog } from '../posthog-core'
1011
import { PostHogPersistence } from '../posthog-persistence'
@@ -119,24 +120,22 @@ describe('posthog core', () => {
119120

120121
const posthog = posthogWith(defaultConfig, defaultOverrides)
121122
posthog._addCaptureHook(hook)
122-
jest.spyOn(logger, 'error').mockImplementation()
123123

124124
expect(() => posthog.capture(undefined)).not.toThrow()
125125
expect(hook).not.toHaveBeenCalled()
126-
expect(logger.error).toHaveBeenCalledWith('No event name provided to posthog.capture')
126+
expect(mockLogger.error).toHaveBeenCalledWith('No event name provided to posthog.capture')
127127
})
128128

129129
it('errors with object event name', () => {
130130
const hook = jest.fn()
131-
jest.spyOn(logger, 'error').mockImplementation()
132131

133132
const posthog = posthogWith(defaultConfig, defaultOverrides)
134133
posthog._addCaptureHook(hook)
135134

136135
// @ts-expect-error - testing invalid input
137136
expect(() => posthog.capture({ event: 'object as name' })).not.toThrow()
138137
expect(hook).not.toHaveBeenCalled()
139-
expect(logger.error).toHaveBeenCalledWith('No event name provided to posthog.capture')
138+
expect(mockLogger.error).toHaveBeenCalledWith('No event name provided to posthog.capture')
140139
})
141140

142141
it('respects opt_out_useragent_filter (default: false)', () => {
@@ -746,8 +745,6 @@ describe('posthog core', () => {
746745
})
747746

748747
it('does nothing when empty', () => {
749-
jest.spyOn(logger, 'warn').mockImplementation()
750-
751748
const posthog = posthogWith({
752749
bootstrap: {},
753750
persistence: 'memory',
@@ -756,7 +753,7 @@ describe('posthog core', () => {
756753
expect(posthog.get_distinct_id()).not.toBe('abcd')
757754
expect(posthog.get_distinct_id()).not.toEqual(undefined)
758755
expect(posthog.getFeatureFlag('multivariant')).toBe(undefined)
759-
expect(logger.warn).toHaveBeenCalledWith(
756+
expect(mockLogger.warn).toHaveBeenCalledWith(
760757
expect.stringContaining('getFeatureFlag for key "multivariant" failed')
761758
)
762759
expect(posthog.getFeatureFlag('disabled')).toBe(undefined)
@@ -902,11 +899,9 @@ describe('posthog core', () => {
902899

903900
describe('skipped init()', () => {
904901
it('capture() does not throw', () => {
905-
jest.spyOn(logger, 'error').mockImplementation()
906-
907902
expect(() => defaultPostHog().capture('$pageview')).not.toThrow()
908903

909-
expect(logger.error).toHaveBeenCalledWith('You must initialize PostHog before calling posthog.capture')
904+
expect(mockLogger.uninitializedWarning).toHaveBeenCalledWith('posthog.capture')
910905
})
911906
})
912907

@@ -1112,8 +1107,6 @@ describe('posthog core', () => {
11121107
})
11131108

11141109
it('handles loaded config option throwing gracefully', () => {
1115-
jest.spyOn(logger, 'critical').mockImplementation()
1116-
11171110
const posthog = posthogWith(
11181111
{
11191112
loaded: () => {
@@ -1133,7 +1126,7 @@ describe('posthog core', () => {
11331126

11341127
posthog._loaded()
11351128

1136-
expect(logger.critical).toHaveBeenCalledWith('`loaded` function failed', expect.anything())
1129+
expect(mockLogger.critical).toHaveBeenCalledWith('`loaded` function failed', expect.anything())
11371130
})
11381131

11391132
describe('/decide', () => {

0 commit comments

Comments
 (0)