Skip to content

Commit 341cc67

Browse files
jaggederestclaude
andcommitted
test: add Logger integration tests for workspacesProvider
- Add tests verifying workspacesProvider logs debug messages through Logger - Test that logging only happens when VS Code log level is Debug or lower - Test different workspace query types (Mine="owner:me", All="no filter") - Use createMockOutputChannelWithLogger factory for consistent test setup - No code changes needed - already compatible via Storage interface 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 9aac82d commit 341cc67

File tree

1 file changed

+159
-0
lines changed

1 file changed

+159
-0
lines changed

src/workspacesProvider.test.ts

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Api } from "coder/site/src/api/api";
22
import { describe, it, expect, vi, beforeAll } from "vitest";
33
import * as vscode from "vscode";
44
import { Storage } from "./storage";
5+
import { createMockOutputChannelWithLogger } from "./test-helpers";
56
import { WorkspaceProvider, WorkspaceQuery } from "./workspacesProvider";
67

78
// Mock dependencies
@@ -980,4 +981,162 @@ describe("workspacesProvider", () => {
980981
expect(result).toEqual([]);
981982
});
982983
});
984+
985+
describe("Logger integration", () => {
986+
it("should log debug messages through Logger when Storage has Logger set", async () => {
987+
const { logger } = createMockOutputChannelWithLogger();
988+
989+
// Set debug log level to ensure message is logged
990+
const originalLogLevel = vscode.env.logLevel;
991+
// @ts-expect-error - mocking readonly property
992+
vscode.env.logLevel = vscode.LogLevel.Debug;
993+
994+
const mockWorkspaceQuery = WorkspaceQuery.Mine;
995+
const mockRestClient = {
996+
getAxiosInstance: vi.fn(() => ({
997+
defaults: { baseURL: "https://test.coder.com" },
998+
})),
999+
getWorkspaces: vi.fn(() =>
1000+
Promise.resolve({
1001+
workspaces: [],
1002+
}),
1003+
),
1004+
} as unknown as Api;
1005+
1006+
// Create mock Storage that uses Logger
1007+
const mockStorage = {
1008+
writeToCoderOutputChannel: vi.fn((msg: string) => {
1009+
logger.debug(msg);
1010+
}),
1011+
} as unknown as Storage;
1012+
1013+
const provider = new WorkspaceProvider(
1014+
mockWorkspaceQuery,
1015+
mockRestClient,
1016+
mockStorage,
1017+
);
1018+
1019+
// Mock extractAllAgents
1020+
const { extractAllAgents } = await import("./api-helper");
1021+
vi.mocked(extractAllAgents).mockReturnValue([]);
1022+
1023+
// Call private fetch method
1024+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1025+
await (provider as any).fetch();
1026+
1027+
// Verify debug message was logged
1028+
expect(mockStorage.writeToCoderOutputChannel).toHaveBeenCalledWith(
1029+
"Fetching workspaces: owner:me...",
1030+
);
1031+
1032+
const logs = logger.getLogs();
1033+
expect(logs.length).toBe(1);
1034+
expect(logs[0].message).toBe("Fetching workspaces: owner:me...");
1035+
expect(logs[0].level).toBe("DEBUG");
1036+
1037+
// Restore log level
1038+
// @ts-expect-error - mocking readonly property
1039+
vscode.env.logLevel = originalLogLevel;
1040+
});
1041+
1042+
it("should work with Storage instance that has Logger set", async () => {
1043+
const { logger } = createMockOutputChannelWithLogger();
1044+
1045+
// Set debug log level
1046+
const originalLogLevel = vscode.env.logLevel;
1047+
// @ts-expect-error - mocking readonly property
1048+
vscode.env.logLevel = vscode.LogLevel.Debug;
1049+
1050+
const mockWorkspaceQuery = WorkspaceQuery.All;
1051+
const mockRestClient = {
1052+
getAxiosInstance: vi.fn(() => ({
1053+
defaults: { baseURL: "https://example.com" },
1054+
})),
1055+
getWorkspaces: vi.fn(() =>
1056+
Promise.resolve({
1057+
workspaces: [],
1058+
}),
1059+
),
1060+
} as unknown as Api;
1061+
1062+
// Simulate Storage with Logger
1063+
const mockStorage = {
1064+
writeToCoderOutputChannel: vi.fn((msg: string) => {
1065+
logger.info(msg);
1066+
}),
1067+
} as unknown as Storage;
1068+
1069+
const provider = new WorkspaceProvider(
1070+
mockWorkspaceQuery,
1071+
mockRestClient,
1072+
mockStorage,
1073+
);
1074+
1075+
// Mock extractAllAgents
1076+
const { extractAllAgents } = await import("./api-helper");
1077+
vi.mocked(extractAllAgents).mockReturnValue([]);
1078+
1079+
// Call private fetch method
1080+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1081+
await (provider as any).fetch();
1082+
1083+
// Verify message was logged through Logger
1084+
const logs = logger.getLogs();
1085+
expect(logs.length).toBeGreaterThan(0);
1086+
expect(logs[0].message).toBe("Fetching workspaces: no filter...");
1087+
1088+
// Restore log level
1089+
// @ts-expect-error - mocking readonly property
1090+
vscode.env.logLevel = originalLogLevel;
1091+
});
1092+
1093+
it("should not log when log level is above Debug", async () => {
1094+
const { logger } = createMockOutputChannelWithLogger();
1095+
1096+
// Set info log level (above debug)
1097+
const originalLogLevel = vscode.env.logLevel;
1098+
// @ts-expect-error - mocking readonly property
1099+
vscode.env.logLevel = vscode.LogLevel.Info;
1100+
1101+
const mockWorkspaceQuery = WorkspaceQuery.Mine;
1102+
const mockRestClient = {
1103+
getAxiosInstance: vi.fn(() => ({
1104+
defaults: { baseURL: "https://test.coder.com" },
1105+
})),
1106+
getWorkspaces: vi.fn(() =>
1107+
Promise.resolve({
1108+
workspaces: [],
1109+
}),
1110+
),
1111+
} as unknown as Api;
1112+
1113+
// Create mock Storage that uses Logger
1114+
const mockStorage = {
1115+
writeToCoderOutputChannel: vi.fn((msg: string) => {
1116+
logger.debug(msg);
1117+
}),
1118+
} as unknown as Storage;
1119+
1120+
const provider = new WorkspaceProvider(
1121+
mockWorkspaceQuery,
1122+
mockRestClient,
1123+
mockStorage,
1124+
);
1125+
1126+
// Mock extractAllAgents
1127+
const { extractAllAgents } = await import("./api-helper");
1128+
vi.mocked(extractAllAgents).mockReturnValue([]);
1129+
1130+
// Call private fetch method
1131+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1132+
await (provider as any).fetch();
1133+
1134+
// Verify writeToCoderOutputChannel was NOT called
1135+
expect(mockStorage.writeToCoderOutputChannel).not.toHaveBeenCalled();
1136+
1137+
// Restore log level
1138+
// @ts-expect-error - mocking readonly property
1139+
vscode.env.logLevel = originalLogLevel;
1140+
});
1141+
});
9831142
});

0 commit comments

Comments
 (0)