@@ -35,6 +35,20 @@ vi.mock("../../../src/lib/api-client.js", async (importOriginal) => {
3535
3636// biome-ignore lint/performance/noNamespaceImport: needed for spyOn mocking
3737import * as apiClient from "../../../src/lib/api-client.js" ;
38+
39+ vi . mock ( "../../../src/lib/browser.js" , async ( importOriginal ) => {
40+ const actual =
41+ await importOriginal < typeof import ( "../../../src/lib/browser.js" ) > ( ) ;
42+ return Object . fromEntries (
43+ Object . entries ( actual ) . map ( ( [ k , v ] ) => [
44+ k ,
45+ typeof v === "function" ? vi . fn ( v ) : v ,
46+ ] )
47+ ) ;
48+ } ) ;
49+
50+ // biome-ignore lint/performance/noNamespaceImport: needed for spyOn mocking
51+ import * as browser from "../../../src/lib/browser.js" ;
3852import { ContextError } from "../../../src/lib/errors.js" ;
3953
4054vi . mock ( "../../../src/lib/polling.js" , async ( importOriginal ) => {
@@ -141,9 +155,13 @@ describe("logsCommand.func", () => {
141155 let resolveOrgSpy : ReturnType < typeof spyOn > ;
142156 let resolveOrgOnlyTargetSpy : ReturnType < typeof spyOn > ;
143157 let withProgressSpy : ReturnType < typeof spyOn > ;
158+ let openInBrowserSpy : ReturnType < typeof spyOn > ;
144159
145160 beforeEach ( ( ) => {
146161 listTraceLogsSpy = vi . spyOn ( apiClient , "listTraceLogs" ) ;
162+ openInBrowserSpy = vi
163+ . spyOn ( browser , "openInBrowser" )
164+ . mockResolvedValue ( undefined ) ;
147165 resolveOrgSpy = vi . spyOn ( resolveTarget , "resolveOrg" ) ;
148166 resolveOrgOnlyTargetSpy = vi
149167 . spyOn ( resolveTarget , "resolveOrgOnlyTarget" )
@@ -163,6 +181,7 @@ describe("logsCommand.func", () => {
163181 resolveOrgSpy . mockRestore ( ) ;
164182 resolveOrgOnlyTargetSpy . mockRestore ( ) ;
165183 withProgressSpy . mockRestore ( ) ;
184+ openInBrowserSpy . mockRestore ( ) ;
166185 } ) ;
167186
168187 describe ( "JSON output mode" , ( ) => {
@@ -511,23 +530,22 @@ describe("logsCommand.func", () => {
511530
512531 const { context } = createMockContext ( ) ;
513532 const func = await logsCommand . loader ( ) ;
514- // --web would call openInBrowser which needs a real browser; catch any error
515- try {
516- await func . call (
517- context ,
518- {
519- json : false ,
520- web : true ,
521- period : parsePeriod ( "14d" ) ,
522- limit : 100 ,
523- sort : "newest" ,
524- } ,
525- TRACE_ID
526- ) ;
527- } catch {
528- // openInBrowser may throw in test environment — that's OK
529- }
533+ await func . call (
534+ context ,
535+ {
536+ json : false ,
537+ web : true ,
538+ period : parsePeriod ( "14d" ) ,
539+ limit : 100 ,
540+ sort : "newest" ,
541+ } ,
542+ TRACE_ID
543+ ) ;
530544
545+ expect ( openInBrowserSpy ) . toHaveBeenCalledWith (
546+ expect . stringContaining ( TRACE_ID ) ,
547+ "trace"
548+ ) ;
531549 expect ( listTraceLogsSpy ) . not . toHaveBeenCalled ( ) ;
532550 } ) ;
533551 } ) ;
0 commit comments