Skip to content

Commit 914fda3

Browse files
committed
test: add missing test cases for config-manager and ui-items
Coverage analysis revealed missing tests in: - ui-items.ts: icon parsing logic (~spin removal, iconPath setting) - config-manager.ts: LOCAL scope error handling, getRawButtonsForTarget, getButtonsForTarget default case Improved coverage: ui-items.ts 88% → 100%, config-manager.ts 82% → 100%
1 parent d16f7d5 commit 914fda3

File tree

2 files changed

+211
-0
lines changed

2 files changed

+211
-0
lines changed

src/internal/managers/config-manager.spec.ts

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,21 @@ describe("ConfigManager", () => {
9797

9898
expect(result).toBe(vscode.ConfigurationTarget.Global);
9999
});
100+
101+
it("should throw error for LOCAL scope", () => {
102+
const mockConfig = createMockConfig();
103+
mockConfig.get.mockReturnValue(CONFIGURATION_TARGETS.LOCAL);
104+
vi.spyOn(vscode.workspace, "getConfiguration").mockReturnValue(
105+
mockConfig as unknown as vscode.WorkspaceConfiguration
106+
);
107+
108+
const mockConfigWriter = createMockConfigWriter();
109+
const configManager = ConfigManager.create({ configWriter: mockConfigWriter });
110+
111+
expect(() => configManager.getVSCodeConfigurationTarget()).toThrow(
112+
"LOCAL scope uses workspaceState, not VS Code ConfigurationTarget"
113+
);
114+
});
100115
});
101116

102117
describe("getConfigDataForWebview", () => {
@@ -390,4 +405,157 @@ describe("ConfigManager", () => {
390405
expect(mockLocalStorage.getButtons).toHaveBeenCalled();
391406
});
392407
});
408+
409+
describe("getRawButtonsForTarget", () => {
410+
it("should return empty array when getRawButtonsFromScope is not available", () => {
411+
const mockConfigReader = {
412+
getButtons: vi.fn(),
413+
getButtonsFromScope: vi.fn(),
414+
};
415+
416+
const mockConfig = createMockConfig();
417+
mockConfig.get.mockReturnValue(CONFIGURATION_TARGETS.WORKSPACE);
418+
vi.spyOn(vscode.workspace, "getConfiguration").mockReturnValue(
419+
mockConfig as unknown as vscode.WorkspaceConfiguration
420+
);
421+
422+
const mockConfigWriter = createMockConfigWriter();
423+
const configManager = ConfigManager.create({ configWriter: mockConfigWriter });
424+
const result = configManager.getRawButtonsForTarget(
425+
CONFIGURATION_TARGETS.WORKSPACE,
426+
mockConfigReader
427+
);
428+
429+
expect(result).toEqual([]);
430+
});
431+
432+
it("should return raw buttons from workspace scope", () => {
433+
const rawButtons = [{ command: "echo raw", name: "Raw Button" }];
434+
const mockConfigReader = {
435+
getButtons: vi.fn(),
436+
getButtonsFromScope: vi.fn(),
437+
getRawButtonsFromScope: vi.fn().mockReturnValue(rawButtons),
438+
};
439+
440+
const mockConfig = createMockConfig();
441+
mockConfig.get.mockReturnValue(CONFIGURATION_TARGETS.WORKSPACE);
442+
vi.spyOn(vscode.workspace, "getConfiguration").mockReturnValue(
443+
mockConfig as unknown as vscode.WorkspaceConfiguration
444+
);
445+
446+
const mockConfigWriter = createMockConfigWriter();
447+
const configManager = ConfigManager.create({ configWriter: mockConfigWriter });
448+
const result = configManager.getRawButtonsForTarget(
449+
CONFIGURATION_TARGETS.WORKSPACE,
450+
mockConfigReader
451+
);
452+
453+
expect(result).toEqual(rawButtons);
454+
expect(mockConfigReader.getRawButtonsFromScope).toHaveBeenCalledWith(
455+
vscode.ConfigurationTarget.Workspace
456+
);
457+
});
458+
459+
it("should return raw buttons from global scope", () => {
460+
const rawButtons = [{ command: "echo global", name: "Global Button" }];
461+
const mockConfigReader = {
462+
getButtons: vi.fn(),
463+
getButtonsFromScope: vi.fn(),
464+
getRawButtonsFromScope: vi.fn().mockReturnValue(rawButtons),
465+
};
466+
467+
const mockConfig = createMockConfig();
468+
mockConfig.get.mockReturnValue(CONFIGURATION_TARGETS.GLOBAL);
469+
vi.spyOn(vscode.workspace, "getConfiguration").mockReturnValue(
470+
mockConfig as unknown as vscode.WorkspaceConfiguration
471+
);
472+
473+
const mockConfigWriter = createMockConfigWriter();
474+
const configManager = ConfigManager.create({ configWriter: mockConfigWriter });
475+
const result = configManager.getRawButtonsForTarget(
476+
CONFIGURATION_TARGETS.GLOBAL,
477+
mockConfigReader
478+
);
479+
480+
expect(result).toEqual(rawButtons);
481+
expect(mockConfigReader.getRawButtonsFromScope).toHaveBeenCalledWith(
482+
vscode.ConfigurationTarget.Global
483+
);
484+
});
485+
486+
it("should return local storage buttons for LOCAL scope", () => {
487+
const localButtons = [{ command: "echo local", id: "local-btn", name: "Local Button" }];
488+
const mockLocalStorage = createMockLocalStorage();
489+
(mockLocalStorage.getButtons as vi.Mock).mockReturnValue(localButtons);
490+
491+
const mockConfigReader = {
492+
getButtons: vi.fn(),
493+
getButtonsFromScope: vi.fn(),
494+
getRawButtonsFromScope: vi.fn(),
495+
};
496+
497+
const mockConfig = createMockConfig();
498+
mockConfig.get.mockReturnValue(CONFIGURATION_TARGETS.LOCAL);
499+
vi.spyOn(vscode.workspace, "getConfiguration").mockReturnValue(
500+
mockConfig as unknown as vscode.WorkspaceConfiguration
501+
);
502+
503+
const mockConfigWriter = createMockConfigWriter();
504+
const configManager = ConfigManager.create({
505+
configWriter: mockConfigWriter,
506+
localStorage: mockLocalStorage,
507+
});
508+
const result = configManager.getRawButtonsForTarget(
509+
CONFIGURATION_TARGETS.LOCAL,
510+
mockConfigReader
511+
);
512+
513+
expect(result).toEqual(localButtons);
514+
});
515+
516+
it("should return empty array for unknown target", () => {
517+
const mockConfigReader = {
518+
getButtons: vi.fn(),
519+
getButtonsFromScope: vi.fn(),
520+
getRawButtonsFromScope: vi.fn(),
521+
};
522+
523+
const mockConfig = createMockConfig();
524+
vi.spyOn(vscode.workspace, "getConfiguration").mockReturnValue(
525+
mockConfig as unknown as vscode.WorkspaceConfiguration
526+
);
527+
528+
const mockConfigWriter = createMockConfigWriter();
529+
const configManager = ConfigManager.create({ configWriter: mockConfigWriter });
530+
const result = configManager.getRawButtonsForTarget(
531+
"unknown" as typeof CONFIGURATION_TARGETS.WORKSPACE,
532+
mockConfigReader
533+
);
534+
535+
expect(result).toEqual([]);
536+
});
537+
});
538+
539+
describe("getButtonsForTarget", () => {
540+
it("should return empty array for unknown target", () => {
541+
const mockConfigReader = {
542+
getButtons: vi.fn(),
543+
getButtonsFromScope: vi.fn(),
544+
};
545+
546+
const mockConfig = createMockConfig();
547+
vi.spyOn(vscode.workspace, "getConfiguration").mockReturnValue(
548+
mockConfig as unknown as vscode.WorkspaceConfiguration
549+
);
550+
551+
const mockConfigWriter = createMockConfigWriter();
552+
const configManager = ConfigManager.create({ configWriter: mockConfigWriter });
553+
const result = configManager.getButtonsForTarget(
554+
"unknown" as typeof CONFIGURATION_TARGETS.WORKSPACE,
555+
mockConfigReader
556+
);
557+
558+
expect(result).toEqual([]);
559+
});
560+
});
393561
});

src/internal/utils/ui-items.spec.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,29 @@ describe("ui-items", () => {
155155

156156
expect(item.buttonName).toBe("Test");
157157
});
158+
159+
it("should parse icon from label and set iconPath", () => {
160+
const item = new CommandTreeItem("$(terminal) Run", "echo test");
161+
162+
expect(item.label).toBe("Run");
163+
expect(item.iconPath).toBeInstanceOf(vscode.ThemeIcon);
164+
expect((item.iconPath as vscode.ThemeIcon).id).toBe("terminal");
165+
});
166+
167+
it("should strip ~spin suffix from icon name", () => {
168+
const item = new CommandTreeItem("$(sync~spin) Loading", "echo test");
169+
170+
expect(item.label).toBe("Loading");
171+
expect(item.iconPath).toBeInstanceOf(vscode.ThemeIcon);
172+
expect((item.iconPath as vscode.ThemeIcon).id).toBe("sync");
173+
});
174+
175+
it("should use icon name as display label when label is empty after icon", () => {
176+
const item = new CommandTreeItem("$(terminal)", "echo test");
177+
178+
expect(item.label).toBe("terminal");
179+
expect(item.iconPath).toBeInstanceOf(vscode.ThemeIcon);
180+
});
158181
});
159182

160183
describe("GroupTreeItem", () => {
@@ -172,6 +195,26 @@ describe("ui-items", () => {
172195
expect(item.contextValue).toBe("group");
173196
expect(item.collapsibleState).toBe(vscode.TreeItemCollapsibleState.Collapsed);
174197
});
198+
199+
it("should parse icon from label", () => {
200+
const commands: ButtonConfig[] = [{ command: "cmd1", id: "cmd-1", name: "Command 1" }];
201+
202+
const item = new GroupTreeItem("$(folder-opened) Open Folders", commands);
203+
204+
expect(item.label).toBe("Open Folders");
205+
expect(item.iconPath).toBeInstanceOf(vscode.ThemeIcon);
206+
expect((item.iconPath as vscode.ThemeIcon).id).toBe("folder-opened");
207+
});
208+
209+
it("should use default folder icon when no icon specified", () => {
210+
const commands: ButtonConfig[] = [{ command: "cmd1", id: "cmd-1", name: "Command 1" }];
211+
212+
const item = new GroupTreeItem("Plain Group", commands);
213+
214+
expect(item.label).toBe("Plain Group");
215+
expect(item.iconPath).toBeInstanceOf(vscode.ThemeIcon);
216+
expect((item.iconPath as vscode.ThemeIcon).id).toBe("folder");
217+
});
175218
});
176219

177220
describe("createTreeItem", () => {

0 commit comments

Comments
 (0)