11import { beforeEach , describe , expect , it , vi } from 'vitest' ;
22
3- const { mockCheckDaemonStatus , mockListSessions, mockConnect, mockClose } = vi . hoisted ( ( ) => ( {
4- mockCheckDaemonStatus : vi . fn ( ) ,
3+ const { mockGetDaemonHealth , mockListSessions, mockConnect, mockClose } = vi . hoisted ( ( ) => ( {
4+ mockGetDaemonHealth : vi . fn ( ) ,
55 mockListSessions : vi . fn ( ) ,
66 mockConnect : vi . fn ( ) ,
77 mockClose : vi . fn ( ) ,
88} ) ) ;
99
10- vi . mock ( './browser/discover.js' , ( ) => ( {
11- checkDaemonStatus : mockCheckDaemonStatus ,
12- } ) ) ;
13-
1410vi . mock ( './browser/daemon-client.js' , ( ) => ( {
11+ getDaemonHealth : mockGetDaemonHealth ,
1512 listSessions : mockListSessions ,
1613} ) ) ;
1714
@@ -113,35 +110,33 @@ describe('doctor report rendering', () => {
113110 expect ( text ) . toContain ( 'Daemon connectivity is unstable.' ) ;
114111 } ) ;
115112
116- it ( 'reports consistent status when live check auto-starts the daemon ' , async ( ) => {
117- // checkDaemonStatus is called twice: once for auto-start check, once for final status.
118- // First call: daemon not running ( triggers auto-start attempt)
119- mockCheckDaemonStatus . mockResolvedValueOnce ( { running : false , extensionConnected : false } ) ;
120- // Auto-start attempt via BrowserBridge.connect fails
113+ it ( 'reports daemon not running when no- live and auto-start fails ' , async ( ) => {
114+ // no-live mode: getDaemonHealth called twice (initial check + final status)
115+ // Initial: stopped → triggers auto-start attempt
116+ mockGetDaemonHealth . mockResolvedValueOnce ( { state : 'stopped' , status : null } ) ;
117+ // Auto-start fails
121118 mockConnect . mockRejectedValueOnce ( new Error ( 'Could not start daemon' ) ) ;
122- // Second call: daemon still not running after failed auto-start
123- mockCheckDaemonStatus . mockResolvedValueOnce ( { running : false , extensionConnected : false } ) ;
119+ // Final: still stopped
120+ mockGetDaemonHealth . mockResolvedValueOnce ( { state : 'stopped' , status : null } ) ;
124121
125122 const report = await runBrowserDoctor ( { live : false } ) ;
126123
127- // Status reflects daemon not running
128124 expect ( report . daemonRunning ) . toBe ( false ) ;
129125 expect ( report . extensionConnected ) . toBe ( false ) ;
130- // checkDaemonStatus called twice (initial + final)
131- expect ( mockCheckDaemonStatus ) . toHaveBeenCalledTimes ( 2 ) ;
132- // Should report daemon not running
126+ expect ( mockGetDaemonHealth ) . toHaveBeenCalledTimes ( 2 ) ;
133127 expect ( report . issues ) . toEqual ( expect . arrayContaining ( [
134128 expect . stringContaining ( 'Daemon is not running' ) ,
135129 ] ) ) ;
136130 } ) ;
137131
138- it ( 'reports flapping when live check succeeds but final status flips disconnected' , async ( ) => {
139- mockCheckDaemonStatus . mockResolvedValueOnce ( { running : true , extensionConnected : false } ) ;
132+ it ( 'reports flapping when live check succeeds but final status shows extension disconnected' , async ( ) => {
133+ // Live check succeeds
140134 mockConnect . mockResolvedValueOnce ( {
141135 evaluate : vi . fn ( ) . mockResolvedValue ( 2 ) ,
142136 } ) ;
143137 mockClose . mockResolvedValueOnce ( undefined ) ;
144- mockCheckDaemonStatus . mockResolvedValueOnce ( { running : true , extensionConnected : false } ) ;
138+ // After live check, getDaemonHealth shows no-extension
139+ mockGetDaemonHealth . mockResolvedValueOnce ( { state : 'no-extension' , status : { extensionConnected : false } } ) ;
145140
146141 const report = await runBrowserDoctor ( { live : true } ) ;
147142
@@ -154,12 +149,13 @@ describe('doctor report rendering', () => {
154149 } ) ;
155150
156151 it ( 'reports daemon flapping when live check succeeds but daemon disappears afterward' , async ( ) => {
157- mockCheckDaemonStatus . mockResolvedValueOnce ( { running : true , extensionConnected : true } ) ;
152+ // Live check succeeds
158153 mockConnect . mockResolvedValueOnce ( {
159154 evaluate : vi . fn ( ) . mockResolvedValue ( 2 ) ,
160155 } ) ;
161156 mockClose . mockResolvedValueOnce ( undefined ) ;
162- mockCheckDaemonStatus . mockResolvedValueOnce ( { running : false , extensionConnected : false } ) ;
157+ // After live check, getDaemonHealth shows stopped
158+ mockGetDaemonHealth . mockResolvedValueOnce ( { state : 'stopped' , status : null } ) ;
163159
164160 const report = await runBrowserDoctor ( { live : true } ) ;
165161
@@ -173,18 +169,31 @@ describe('doctor report rendering', () => {
173169
174170 it ( 'uses the fast default timeout for live connectivity checks' , async ( ) => {
175171 let timeoutSeen : number | undefined ;
176- mockCheckDaemonStatus . mockResolvedValueOnce ( { running : true , extensionConnected : true } ) ;
177172 mockConnect . mockImplementationOnce ( async ( opts ?: { timeout ?: number } ) => {
178173 timeoutSeen = opts ?. timeout ;
179174 return {
180175 evaluate : vi . fn ( ) . mockResolvedValue ( 2 ) ,
181176 } ;
182177 } ) ;
183178 mockClose . mockResolvedValueOnce ( undefined ) ;
184- mockCheckDaemonStatus . mockResolvedValueOnce ( { running : true , extensionConnected : true } ) ;
179+ mockGetDaemonHealth . mockResolvedValueOnce ( { state : 'ready' , status : { extensionConnected : true } } ) ;
185180
186181 await runBrowserDoctor ( { live : true } ) ;
187182
188183 expect ( timeoutSeen ) . toBe ( 8 ) ;
189184 } ) ;
185+
186+ it ( 'skips auto-start in no-live mode when daemon is already running' , async ( ) => {
187+ // no-live mode but daemon already running (no-extension)
188+ mockGetDaemonHealth . mockResolvedValueOnce ( { state : 'no-extension' , status : { extensionConnected : false } } ) ;
189+ // Final status: same
190+ mockGetDaemonHealth . mockResolvedValueOnce ( { state : 'no-extension' , status : { extensionConnected : false } } ) ;
191+
192+ const report = await runBrowserDoctor ( { live : false } ) ;
193+
194+ // Should NOT have tried auto-start since daemon was already running
195+ expect ( mockConnect ) . not . toHaveBeenCalled ( ) ;
196+ expect ( report . daemonRunning ) . toBe ( true ) ;
197+ expect ( report . extensionConnected ) . toBe ( false ) ;
198+ } ) ;
190199} ) ;
0 commit comments