Skip to content

Commit 1b23e73

Browse files
s-moffettshakkernerd
authored andcommitted
Issue 89661: add unit test
1 parent 54db3f9 commit 1b23e73

1 file changed

Lines changed: 47 additions & 0 deletions

File tree

ui/src/ui/views/skills.test.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,53 @@ describe("renderSkills", () => {
106106
}
107107
});
108108

109+
it("does not transfer toggle state when a skill leaves the disabled tab", async () => {
110+
const container = document.createElement("div");
111+
document.body.append(container);
112+
dialogRestores.push(() => container.remove());
113+
114+
const passwordSkill = createSkill({ skillKey: "1password", name: "1Password", disabled: true });
115+
const appleNotesSkill = createSkill({
116+
skillKey: "apple-notes",
117+
name: "Apple Notes",
118+
disabled: true,
119+
});
120+
const report: SkillStatusReport = {
121+
workspaceDir: "/tmp/workspace",
122+
managedSkillsDir: "/tmp/skills",
123+
skills: [passwordSkill, appleNotesSkill],
124+
};
125+
126+
render(renderSkills(createProps({ report, statusFilter: "disabled" })), container);
127+
await Promise.resolve();
128+
129+
const toggles = container.querySelectorAll<HTMLInputElement>(".skill-toggle");
130+
expect(toggles).toHaveLength(2);
131+
expect(toggles[0].checked).toBe(false);
132+
expect(toggles[1].checked).toBe(false);
133+
134+
// Simulate the user clicking the 1password toggle before the re-render propagates.
135+
// Without repeat(), Lit's dirty-check skips re-setting `.checked = false` on the reused
136+
// DOM node, so apple-notes inherits this stale user-driven state.
137+
toggles[0].checked = true;
138+
139+
const updatedReport: SkillStatusReport = {
140+
workspaceDir: "/tmp/workspace",
141+
managedSkillsDir: "/tmp/skills",
142+
skills: [{ ...passwordSkill, disabled: false }, appleNotesSkill],
143+
};
144+
145+
render(
146+
renderSkills(createProps({ report: updatedReport, statusFilter: "disabled" })),
147+
container,
148+
);
149+
await Promise.resolve();
150+
151+
const updatedToggles = container.querySelectorAll<HTMLInputElement>(".skill-toggle");
152+
expect(updatedToggles).toHaveLength(1);
153+
expect(updatedToggles[0].checked).toBe(false);
154+
});
155+
109156
it("defers detail dialog opening until the dialog is connected", async () => {
110157
const container = document.createElement("div");
111158
const showModal = vi.fn(function (this: HTMLDialogElement) {

0 commit comments

Comments
 (0)