@@ -4,17 +4,27 @@ import {mockAndCaptureOutput} from './testing/output.js'
44import * as error from './error.js'
55import { hashString } from '../../public/node/crypto.js'
66import { isLocalEnvironment } from '../../private/node/context/service.js'
7+ import { getLastSeenUserIdAfterAuth } from '../../private/node/session.js'
78import { settings } from '@oclif/core'
89import { beforeEach , describe , expect , test , vi } from 'vitest'
910
1011const onNotify = vi . fn ( )
12+ const capturedEventHandler = vi . fn ( )
1113
1214vi . mock ( 'process' )
1315vi . mock ( '@bugsnag/js' , ( ) => {
1416 return {
1517 default : {
16- notify : ( reportedError : any , args : any , callback : any ) => {
18+ notify : ( reportedError : any , eventHandler : any , callback : any ) => {
1719 onNotify ( reportedError )
20+ // Create a mock event to pass to the event handler
21+ const mockEvent = {
22+ severity : '' ,
23+ unhandled : false ,
24+ setUser : vi . fn ( ) ,
25+ }
26+ eventHandler ( mockEvent )
27+ capturedEventHandler ( mockEvent )
1828 callback ( null )
1929 } ,
2030 isStarted : ( ) => true ,
@@ -25,6 +35,7 @@ vi.mock('./cli.js')
2535vi . mock ( './context/local.js' )
2636vi . mock ( '../../public/node/crypto.js' )
2737vi . mock ( '../../private/node/context/service.js' )
38+ vi . mock ( '../../private/node/session.js' )
2839vi . mock ( '@oclif/core' , ( ) => ( {
2940 settings : {
3041 debug : false ,
@@ -39,8 +50,10 @@ beforeEach(() => {
3950 vi . mocked ( hashString ) . mockReturnValue ( 'hashed-macaddress' )
4051 vi . mocked ( isUnitTest ) . mockReturnValue ( true )
4152 onNotify . mockClear ( )
53+ capturedEventHandler . mockClear ( )
4254 vi . mocked ( settings ) . debug = false
4355 vi . mocked ( isLocalEnvironment ) . mockReturnValue ( false )
56+ vi . mocked ( getLastSeenUserIdAfterAuth ) . mockResolvedValue ( 'test-user-id-123' )
4457} )
4558
4659describe ( 'errorHandler' , async ( ) => {
@@ -159,6 +172,8 @@ describe('skips sending errors to Bugsnag', () => {
159172describe ( 'sends errors to Bugsnag' , ( ) => {
160173 test ( 'processes Error instances as unhandled' , async ( ) => {
161174 const toThrow = new Error ( 'In test' )
175+ capturedEventHandler . mockClear ( )
176+
162177 const res = await sendErrorToBugsnag ( toThrow , 'unexpected_error' )
163178 expect ( res . reported ) . toEqual ( true )
164179 expect ( res . unhandled ) . toEqual ( true )
@@ -207,4 +222,41 @@ describe('sends errors to Bugsnag', () => {
207222 expect ( res . error ) . toEqual ( toThrow )
208223 expect ( mockOutput . debug ( ) ) . toMatch ( 'Error reporting to Bugsnag: Error: Bugsnag is down' )
209224 } )
225+
226+ test ( 'sets user ID from getLastSeenUserIdAfterAuth when reporting to Bugsnag' , async ( ) => {
227+ // Given
228+ capturedEventHandler . mockClear ( )
229+ const testUserId = 'specific-test-user-id'
230+ vi . mocked ( getLastSeenUserIdAfterAuth ) . mockResolvedValue ( testUserId )
231+ const toThrow = new Error ( 'In test' )
232+
233+ // When
234+ const res = await sendErrorToBugsnag ( toThrow , 'unexpected_error' )
235+
236+ // Then
237+ expect ( res . reported ) . toEqual ( true )
238+ expect ( capturedEventHandler ) . toHaveBeenCalled ( )
239+
240+ const mockEvent = capturedEventHandler . mock . calls [ 0 ] [ 0 ]
241+ expect ( mockEvent . setUser ) . toHaveBeenCalledWith ( testUserId )
242+ expect ( mockEvent . severity ) . toEqual ( 'error' )
243+ expect ( mockEvent . unhandled ) . toEqual ( true )
244+ } )
245+
246+ test ( 'handles missing user ID gracefully' , async ( ) => {
247+ // Given
248+ capturedEventHandler . mockClear ( )
249+ vi . mocked ( getLastSeenUserIdAfterAuth ) . mockResolvedValue ( 'unknown' )
250+ const toThrow = new Error ( 'In test' )
251+
252+ // When
253+ const res = await sendErrorToBugsnag ( toThrow , 'unexpected_error' )
254+
255+ // Then
256+ expect ( res . reported ) . toEqual ( true )
257+ expect ( capturedEventHandler ) . toHaveBeenCalled ( )
258+
259+ const mockEvent = capturedEventHandler . mock . calls [ 0 ] [ 0 ]
260+ expect ( mockEvent . setUser ) . toHaveBeenCalledWith ( 'unknown' )
261+ } )
210262} )
0 commit comments