Skip to content

Commit 9a3b37d

Browse files
jaggederestclaude
andcommitted
fix: resolve Uri type errors in extension tests
- Updated createMockUri to properly handle query strings by splitting pathWithQuery parameter - Fixed extension.test.ts to use createMockUri helper instead of inline objects - All tests now pass with proper Uri mock objects that include query property 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent c73c742 commit 9a3b37d

File tree

2 files changed

+45
-40
lines changed

2 files changed

+45
-40
lines changed

src/extension.test.ts

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
createMockAxiosInstance,
1515
createMockConfiguration,
1616
createMockTreeView,
17+
createMockUri,
1718
} from "./test-helpers";
1819

1920
// Setup all mocks
@@ -116,12 +117,33 @@ beforeEach(() => {
116117
vi.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+
119141
describe("extension", () => {
120142
describe("setupRemoteSSHExtension", () => {
121143
it.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();
125147
const mockExtension = extensionId
126148
? createMockRemoteSSHExtension({ extensionPath: "/path/to/extension" })
127149
: undefined;
@@ -150,7 +172,7 @@ describe("extension", () => {
150172

151173
describe("initializeInfrastructure", () => {
152174
it("should create storage and logger with verbose setting from config", async () => {
153-
const vscode = await import("vscode");
175+
const vscode = await setupVSCodeMocks();
154176
const Storage = (await import("./storage")).Storage;
155177
const 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[]) => {
174193
storageInstance = { args, setLogger: vi.fn() };
175194
return 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[]) => {
179197
loggerInstance = { args };
180198
return loggerInstance as never;
181199
});
@@ -316,17 +334,15 @@ describe("extension", () => {
316334
});
317335

318336
describe("registerUriHandler", () => {
319-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
320-
let registeredHandler: any;
337+
let registeredHandler: vscodeActual.UriHandler;
321338

322339
const setupUriHandler = async () => {
323340
const { needToken } = await import("./api");
324341
const { toSafeHost } = await import("./util");
325-
const vscode = await import("vscode");
342+
const vscode = await setupVSCodeMocks();
326343

327344
vi.mocked(vscode.window.registerUriHandler).mockImplementation(
328-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
329-
(handler: any) => {
345+
(handler: vscodeActual.UriHandler) => {
330346
registeredHandler = handler;
331347
return { dispose: vi.fn() };
332348
},
@@ -335,7 +351,8 @@ describe("extension", () => {
335351
return { needToken, toSafeHost };
336352
};
337353

338-
it.each([
354+
// Test data for URI handler tests
355+
const uriHandlerTestCases = [
339356
{
340357
name: "/open path with all parameters",
341358
path: "/open",
@@ -370,7 +387,9 @@ describe("extension", () => {
370387
"/workspace",
371388
],
372389
},
373-
])(
390+
];
391+
392+
it.each(uriHandlerTestCases)(
374393
"should handle $name",
375394
async ({ path, query, mockUrl, oldUrl, hasToken, expectedCommand }) => {
376395
const vscode = await import("vscode");
@@ -394,7 +413,7 @@ describe("extension", () => {
394413
mockRestClient as never,
395414
mockStorage as never,
396415
);
397-
await registeredHandler.handleUri({ path, query });
416+
await registeredHandler.handleUri(createMockUri(`${path}?${query}`));
398417

399418
expect(mockCommands.maybeAskUrl).toHaveBeenCalledWith(mockUrl, oldUrl);
400419
expect(mockRestClient.setHost).toHaveBeenCalledWith(mockUrl);
@@ -429,7 +448,7 @@ describe("extension", () => {
429448
mocks.storage as never,
430449
);
431450
await 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", () => {
458477
mocks.storage as never,
459478
);
460479
await expect(
461-
registeredHandler.handleUri({ path, query }),
480+
registeredHandler.handleUri(createMockUri(`${path}?${query}`)),
462481
).rejects.toThrow(error);
463482
});
464483
});
@@ -571,21 +590,6 @@ describe("extension", () => {
571590
vi.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-
589593
it.each([
590594
[
591595
"valid member authentication",
@@ -600,7 +604,7 @@ describe("extension", () => {
600604
mockStorage,
601605
mockMyWorkspacesProvider,
602606
mockAllWorkspacesProvider,
603-
} = createAuthTestSetup();
607+
} = createAuthTestContext();
604608

605609
const mockRestClient = {
606610
getAxiosInstance: vi

src/test-helpers.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1214,19 +1214,20 @@ export function createMockProxyAgent(
12141214
* Create a mock vscode.Uri
12151215
*/
12161216
export function createMockUri(
1217-
path: string,
1217+
pathWithQuery: string,
12181218
scheme: string = "file",
12191219
): vscode.Uri {
1220+
const [path, query = ""] = pathWithQuery.split("?");
12201221
return {
12211222
scheme,
12221223
path,
12231224
fsPath: path,
12241225
authority: "",
1225-
query: "",
1226+
query,
12261227
fragment: "",
12271228
with: vi.fn(),
1228-
toString: vi.fn(() => `${scheme}://${path}`),
1229-
toJSON: vi.fn(() => ({ scheme, path })),
1229+
toString: vi.fn(() => `${scheme}://${path}${query ? `?${query}` : ""}`),
1230+
toJSON: vi.fn(() => ({ scheme, path, query })),
12301231
} as unknown as vscode.Uri;
12311232
}
12321233

0 commit comments

Comments
 (0)