@@ -14,6 +14,7 @@ import {
1414createMockAxiosInstance ,
1515createMockConfiguration ,
1616createMockTreeView ,
17+ createMockUri ,
1718} from "./test-helpers" ;
1819
1920// Setup all mocks
@@ -116,12 +117,33 @@ beforeEach(() => {
116117vi . clearAllMocks ( ) ;
117118} ) ;
118119
120+ // Test helper functions
121+ const setupVSCodeMocks = async ( ) => {
122+ const vscode = await import ( "vscode" ) ;
123+ return vscode ;
124+ } ;
125+
126+ const createAuthTestContext = ( ) => {
127+ const mockStorage = createMockStorage ( { writeToCoderOutputChannel :vi . fn ( ) } ) ;
128+ const mockMyWorkspacesProvider = createMockWorkspaceProvider ( {
129+ fetchAndRefresh :vi . fn ( ) ,
130+ } ) ;
131+ const mockAllWorkspacesProvider = createMockWorkspaceProvider ( {
132+ fetchAndRefresh :vi . fn ( ) ,
133+ } ) ;
134+ return {
135+ mockStorage,
136+ mockMyWorkspacesProvider,
137+ mockAllWorkspacesProvider,
138+ } ;
139+ } ;
140+
119141describe ( "extension" , ( ) => {
120142describe ( "setupRemoteSSHExtension" , ( ) => {
121143it . each ( [
122144[ "ms-vscode-remote.remote-ssh" , "ms-vscode-remote.remote-ssh" , false ] ,
123145] ) ( "should handle %s" , async ( _ , extensionId , shouldShowError ) => {
124- const vscode = await import ( "vscode" ) ;
146+ const vscode = await setupVSCodeMocks ( ) ;
125147const mockExtension = extensionId
126148?createMockRemoteSSHExtension ( { extensionPath :"/path/to/extension" } )
127149:undefined ;
@@ -150,7 +172,7 @@ describe("extension", () => {
150172
151173describe ( "initializeInfrastructure" , ( ) => {
152174it ( "should create storage and logger with verbose setting from config" , async ( ) => {
153- const vscode = await import ( "vscode" ) ;
175+ const vscode = await setupVSCodeMocks ( ) ;
154176const Storage = ( await import ( "./storage" ) ) . Storage ;
155177const Logger = ( await import ( "./logger" ) ) . Logger ;
156178
@@ -165,17 +187,13 @@ describe("extension", () => {
165187} ) ;
166188
167189// Track Storage and Logger creation
168- // eslint-disable-next-line @typescript-eslint/no-explicit-any
169- let storageInstance :any ;
170- // eslint-disable-next-line @typescript-eslint/no-explicit-any
171- let loggerInstance :any ;
172- // eslint-disable-next-line @typescript-eslint/no-explicit-any
173- vi . mocked ( Storage ) . mockImplementation ( ( ...args :any [ ] ) => {
190+ let storageInstance :unknown ;
191+ let loggerInstance :unknown ;
192+ vi . mocked ( Storage ) . mockImplementation ( ( ...args :unknown [ ] ) => {
174193storageInstance = { args, setLogger :vi . fn ( ) } ;
175194return storageInstance as never ;
176195} ) ;
177- // eslint-disable-next-line @typescript-eslint/no-explicit-any
178- vi . mocked ( Logger ) . mockImplementation ( ( ...args :any [ ] ) => {
196+ vi . mocked ( Logger ) . mockImplementation ( ( ...args :unknown [ ] ) => {
179197loggerInstance = { args} ;
180198return loggerInstance as never ;
181199} ) ;
@@ -316,17 +334,15 @@ describe("extension", () => {
316334} ) ;
317335
318336describe ( "registerUriHandler" , ( ) => {
319- // eslint-disable-next-line @typescript-eslint/no-explicit-any
320- let registeredHandler :any ;
337+ let registeredHandler :vscodeActual . UriHandler ;
321338
322339const setupUriHandler = async ( ) => {
323340const { needToken} = await import ( "./api" ) ;
324341const { toSafeHost} = await import ( "./util" ) ;
325- const vscode = await import ( "vscode" ) ;
342+ const vscode = await setupVSCodeMocks ( ) ;
326343
327344vi . mocked ( vscode . window . registerUriHandler ) . mockImplementation (
328- // eslint-disable-next-line @typescript-eslint/no-explicit-any
329- ( handler :any ) => {
345+ ( handler :vscodeActual . UriHandler ) => {
330346registeredHandler = handler ;
331347return { dispose :vi . fn ( ) } ;
332348} ,
@@ -335,7 +351,8 @@ describe("extension", () => {
335351return { needToken, toSafeHost} ;
336352} ;
337353
338- it . each ( [
354+ // Test data for URI handler tests
355+ const uriHandlerTestCases = [
339356{
340357name :"/open path with all parameters" ,
341358path :"/open" ,
@@ -370,7 +387,9 @@ describe("extension", () => {
370387"/workspace" ,
371388] ,
372389} ,
373- ] ) (
390+ ] ;
391+
392+ it . each ( uriHandlerTestCases ) (
374393"should handle $name" ,
375394async ( { path, query, mockUrl, oldUrl, hasToken, expectedCommand} ) => {
376395const vscode = await import ( "vscode" ) ;
@@ -394,7 +413,7 @@ describe("extension", () => {
394413mockRestClient as never ,
395414mockStorage as never ,
396415) ;
397- await registeredHandler . handleUri ( { path, query} ) ;
416+ await registeredHandler . handleUri ( createMockUri ( ` ${ path } ? ${ query } ` ) ) ;
398417
399418expect ( mockCommands . maybeAskUrl ) . toHaveBeenCalledWith ( mockUrl , oldUrl ) ;
400419expect ( mockRestClient . setHost ) . toHaveBeenCalledWith ( mockUrl ) ;
@@ -429,7 +448,7 @@ describe("extension", () => {
429448mocks . storage as never ,
430449) ;
431450await expect (
432- registeredHandler . handleUri ( { path : "/unknown" , query : "" } ) ,
451+ registeredHandler . handleUri ( createMockUri ( "/unknown?" ) ) ,
433452) . rejects . toThrow ( "Unknown path /unknown" ) ;
434453} ) ;
435454
@@ -458,7 +477,7 @@ describe("extension", () => {
458477mocks . storage as never ,
459478) ;
460479await expect (
461- registeredHandler . handleUri ( { path, query} ) ,
480+ registeredHandler . handleUri ( createMockUri ( ` ${ path } ? ${ query } ` ) ) ,
462481) . rejects . toThrow ( error ) ;
463482} ) ;
464483} ) ;
@@ -571,21 +590,6 @@ describe("extension", () => {
571590vi . clearAllMocks ( ) ;
572591} ) ;
573592
574- const createAuthTestSetup = ( ) => {
575- const mockStorage = { writeToCoderOutputChannel :vi . fn ( ) } ;
576- const mockMyWorkspacesProvider = createMockWorkspaceProvider ( {
577- fetchAndRefresh :vi . fn ( ) ,
578- } ) ;
579- const mockAllWorkspacesProvider = createMockWorkspaceProvider ( {
580- fetchAndRefresh :vi . fn ( ) ,
581- } ) ;
582- return {
583- mockStorage,
584- mockMyWorkspacesProvider,
585- mockAllWorkspacesProvider,
586- } ;
587- } ;
588-
589593it . each ( [
590594[
591595"valid member authentication" ,
@@ -600,7 +604,7 @@ describe("extension", () => {
600604mockStorage,
601605mockMyWorkspacesProvider,
602606mockAllWorkspacesProvider,
603- } = createAuthTestSetup ( ) ;
607+ } = createAuthTestContext ( ) ;
604608
605609const mockRestClient = {
606610getAxiosInstance :vi