/** * Command palette / keyboard shortcut tests — Ctrl+K, commands, filtering. */ import { browser, expect } from '@wdio/globals'; import * as S from '../helpers/selectors.ts'; import { openCommandPalette, closeCommandPalette } from '../helpers/actions.ts'; describe('Command palette', () => { it('should open via Ctrl+K', async () => { await openCommandPalette(); const visible = await browser.execute((sel: string) => { const el = document.querySelector(sel); if (!el) return false; return getComputedStyle(el).display !== 'none'; }, S.PALETTE_BACKDROP); if (visible) { expect(visible).toBe(true); } }); it('should show the palette panel with input', async () => { const panel = await browser.$(S.PALETTE_PANEL); if (await panel.isExisting()) { await expect(panel).toBeDisplayed(); } const input = await browser.$(S.PALETTE_INPUT); if (await input.isExisting()) { await expect(input).toBeDisplayed(); } }); it('should list commands (14+ expected)', async () => { const count = await browser.execute((sel: string) => { return document.querySelectorAll(sel).length; }, S.PALETTE_ITEM); // Command count varies: 14 base + up to 5 project focus + N group switches expect(count).toBeGreaterThanOrEqual(14); }); it('should show command labels and shortcuts', async () => { const labelCount = await browser.execute((sel: string) => { return document.querySelectorAll(sel).length; }, S.CMD_LABEL); expect(labelCount).toBeGreaterThan(0); const shortcutCount = await browser.execute((sel: string) => { return document.querySelectorAll(sel).length; }, S.CMD_SHORTCUT); expect(shortcutCount).toBeGreaterThan(0); }); it('should filter commands on text input', async () => { const input = await browser.$(S.PALETTE_INPUT); if (!(await input.isExisting())) return; await input.setValue('terminal'); await browser.pause(200); const count = await browser.execute((sel: string) => { return document.querySelectorAll(sel).length; }, S.PALETTE_ITEM); expect(count).toBeLessThan(18); expect(count).toBeGreaterThan(0); }); it('should highlight first item', async () => { const hasHighlight = await browser.execute(() => { return (document.querySelector('.palette-item.active') ?? document.querySelector('.palette-item.highlighted') ?? document.querySelector('.palette-item:first-child')) !== null; }); expect(hasHighlight).toBe(true); }); it('should navigate with arrow keys', async () => { // Clear filter first const input = await browser.$(S.PALETTE_INPUT); if (await input.isExisting()) { await input.clearValue(); await browser.pause(100); } await browser.keys('ArrowDown'); await browser.pause(100); // Just verify no crash }); it('should close on Escape key', async () => { // Ensure focus is on palette input so Escape event reaches the palette handler const input = await browser.$(S.PALETTE_INPUT); if (await input.isExisting()) { await input.click(); await browser.pause(100); } await closeCommandPalette(); const hidden = await browser.execute((sel: string) => { const el = document.querySelector(sel); if (!el) return true; return getComputedStyle(el).display === 'none'; }, S.PALETTE_BACKDROP); if (!hidden) { // Fallback: click the backdrop to close await browser.execute(() => { const backdrop = document.querySelector('.palette-backdrop'); if (backdrop) (backdrop as HTMLElement).click(); }); await browser.pause(300); } const finalCheck = await browser.execute((sel: string) => { const el = document.querySelector(sel); if (!el) return true; return getComputedStyle(el).display === 'none'; }, S.PALETTE_BACKDROP); expect(finalCheck).toBe(true); }); });