import { aTable } from '@liam-hq/schema' import { cleanup, render, screen, within } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { ReactFlowProvider } from '@xyflow/react' import { NuqsTestingAdapter } from 'nuqs/adapters/testing' import type { ReactNode } from 'react' import { afterEach, describe, expect, it } from 'vitest' import { SchemaProvider, type SchemaProviderValue, UserEditingProvider, } from '../../../../../stores' import { CommandPalette } from './CommandPalette' import { CommandPaletteProvider } from './CommandPaletteProvider' import { CommandPaletteTriggerButton } from './CommandPaletteTriggerButton' afterEach(() => { cleanup() }) const schema: SchemaProviderValue = { current: { tables: { users: aTable({ name: 'users' }), posts: aTable({ name: 'posts' }), follows: aTable({ name: 'follows' }), user_settings: aTable({ name: 'user_settings' }), }, enums: {}, extensions: {}, }, } const wrapper = ({ children }: { children: ReactNode }) => ( {children} ) const prepareCommandPalette = async () => { const user = userEvent.setup() render(, { wrapper }) await user.keyboard('{Meta>}k{/Meta}') const dialog = await screen.findByRole('dialog', { name: 'Command Palette', }) return { user, elements: { dialog }, } } it('displays nothing by default', () => { render(, { wrapper }) expect(screen.queryByRole('dialog')).not.toBeInTheDocument() }) describe('dialog opening interactions', () => { it('opens the dialog with typing ⌘K', async () => { const user = userEvent.setup() render(, { wrapper }) await user.keyboard('{Meta>}k{/Meta}') expect( screen.getByRole('dialog', { name: 'Command Palette' }), ).toBeInTheDocument() }) it('opens the dialog with typing ctrl+K', async () => { const user = userEvent.setup() render(, { wrapper }) await user.keyboard('{Control>}k{/Control}') expect( screen.getByRole('dialog', { name: 'Command Palette' }), ).toBeInTheDocument() }) it('opens the dialog with clicking the trigger button', async () => { const user = userEvent.setup() render( <> , { wrapper }, ) await user.click( screen.getByRole('button', { name: 'Open command palette to search features', }), ) expect( screen.getByRole('dialog', { name: 'Command Palette' }), ).toBeInTheDocument() }) }) describe('dialog closing interaction', () => { it('closes dialog by pressing ESC key', async () => { const { user, elements: { dialog }, } = await prepareCommandPalette() await user.keyboard('{Escape}') expect(dialog).not.toBeInTheDocument() }) it('closes dialog by clicking ESC button', async () => { const { user, elements: { dialog }, } = await prepareCommandPalette() await user.click(within(dialog).getByRole('button', { name: 'ESC' })) expect(dialog).not.toBeInTheDocument() }) })