From b7b263d54e2b22eada996f1d43a45dfec376954b Mon Sep 17 00:00:00 2001 From: yyh Date: Sat, 27 Dec 2025 22:12:37 +0800 Subject: [PATCH] chore: remove duplicate tests --- .../goto-anything/command-selector.test.tsx | 326 ------------------ .../goto-anything/match-action.test.ts | 236 ------------- 2 files changed, 562 deletions(-) delete mode 100644 web/__tests__/goto-anything/command-selector.test.tsx delete mode 100644 web/__tests__/goto-anything/match-action.test.ts diff --git a/web/__tests__/goto-anything/command-selector.test.tsx b/web/__tests__/goto-anything/command-selector.test.tsx deleted file mode 100644 index f0168ab3be..0000000000 --- a/web/__tests__/goto-anything/command-selector.test.tsx +++ /dev/null @@ -1,326 +0,0 @@ -import type { ActionItem } from '../../app/components/goto-anything/actions/types' -import { fireEvent, render, screen } from '@testing-library/react' -import * as React from 'react' -import CommandSelector from '../../app/components/goto-anything/command-selector' - -vi.mock('cmdk', () => ({ - Command: { - Group: ({ children, className }: any) =>
{children}
, - Item: ({ children, onSelect, value, className }: any) => ( -
onSelect?.()} - data-value={value} - data-testid={`command-item-${value}`} - > - {children} -
- ), - }, -})) - -describe('CommandSelector', () => { - const mockActions: Record = { - app: { - key: '@app', - shortcut: '@app', - title: 'Search Applications', - description: 'Search apps', - search: vi.fn(), - }, - knowledge: { - key: '@knowledge', - shortcut: '@kb', - title: 'Search Knowledge', - description: 'Search knowledge bases', - search: vi.fn(), - }, - plugin: { - key: '@plugin', - shortcut: '@plugin', - title: 'Search Plugins', - description: 'Search plugins', - search: vi.fn(), - }, - node: { - key: '@node', - shortcut: '@node', - title: 'Search Nodes', - description: 'Search workflow nodes', - search: vi.fn(), - }, - } - - const mockOnCommandSelect = vi.fn() - const mockOnCommandValueChange = vi.fn() - - beforeEach(() => { - vi.clearAllMocks() - }) - - describe('Basic Rendering', () => { - it('should render all actions when no filter is provided', () => { - render( - , - ) - - expect(screen.getByTestId('command-item-@app')).toBeInTheDocument() - expect(screen.getByTestId('command-item-@kb')).toBeInTheDocument() - expect(screen.getByTestId('command-item-@plugin')).toBeInTheDocument() - expect(screen.getByTestId('command-item-@node')).toBeInTheDocument() - }) - - it('should render empty filter as showing all actions', () => { - render( - , - ) - - expect(screen.getByTestId('command-item-@app')).toBeInTheDocument() - expect(screen.getByTestId('command-item-@kb')).toBeInTheDocument() - expect(screen.getByTestId('command-item-@plugin')).toBeInTheDocument() - expect(screen.getByTestId('command-item-@node')).toBeInTheDocument() - }) - }) - - describe('Filtering Functionality', () => { - it('should filter actions based on searchFilter - single match', () => { - render( - , - ) - - expect(screen.queryByTestId('command-item-@app')).not.toBeInTheDocument() - expect(screen.getByTestId('command-item-@kb')).toBeInTheDocument() - expect(screen.queryByTestId('command-item-@plugin')).not.toBeInTheDocument() - expect(screen.queryByTestId('command-item-@node')).not.toBeInTheDocument() - }) - - it('should filter actions with multiple matches', () => { - render( - , - ) - - expect(screen.getByTestId('command-item-@app')).toBeInTheDocument() - expect(screen.queryByTestId('command-item-@kb')).not.toBeInTheDocument() - expect(screen.getByTestId('command-item-@plugin')).toBeInTheDocument() - expect(screen.queryByTestId('command-item-@node')).not.toBeInTheDocument() - }) - - it('should be case-insensitive when filtering', () => { - render( - , - ) - - expect(screen.getByTestId('command-item-@app')).toBeInTheDocument() - expect(screen.queryByTestId('command-item-@kb')).not.toBeInTheDocument() - }) - - it('should match partial strings', () => { - render( - , - ) - - expect(screen.queryByTestId('command-item-@app')).not.toBeInTheDocument() - expect(screen.queryByTestId('command-item-@kb')).not.toBeInTheDocument() - expect(screen.queryByTestId('command-item-@plugin')).not.toBeInTheDocument() - expect(screen.getByTestId('command-item-@node')).toBeInTheDocument() - }) - }) - - describe('Empty State', () => { - it('should show empty state when no matches found', () => { - render( - , - ) - - expect(screen.queryByTestId('command-item-@app')).not.toBeInTheDocument() - expect(screen.queryByTestId('command-item-@kb')).not.toBeInTheDocument() - expect(screen.queryByTestId('command-item-@plugin')).not.toBeInTheDocument() - expect(screen.queryByTestId('command-item-@node')).not.toBeInTheDocument() - - expect(screen.getByText('app.gotoAnything.noMatchingCommands')).toBeInTheDocument() - expect(screen.getByText('app.gotoAnything.tryDifferentSearch')).toBeInTheDocument() - }) - - it('should not show empty state when filter is empty', () => { - render( - , - ) - - expect(screen.queryByText('app.gotoAnything.noMatchingCommands')).not.toBeInTheDocument() - }) - }) - - describe('Selection and Highlight Management', () => { - it('should call onCommandValueChange when filter changes and first item differs', () => { - const { rerender } = render( - , - ) - - rerender( - , - ) - - expect(mockOnCommandValueChange).toHaveBeenCalledWith('@kb') - }) - - it('should not call onCommandValueChange if current value still exists', () => { - const { rerender } = render( - , - ) - - rerender( - , - ) - - expect(mockOnCommandValueChange).not.toHaveBeenCalled() - }) - - it('should handle onCommandSelect callback correctly', () => { - render( - , - ) - - const knowledgeItem = screen.getByTestId('command-item-@kb') - fireEvent.click(knowledgeItem) - - expect(mockOnCommandSelect).toHaveBeenCalledWith('@kb') - }) - }) - - describe('Edge Cases', () => { - it('should handle empty actions object', () => { - render( - , - ) - - expect(screen.getByText('app.gotoAnything.noMatchingCommands')).toBeInTheDocument() - }) - - it('should handle special characters in filter', () => { - render( - , - ) - - expect(screen.getByTestId('command-item-@app')).toBeInTheDocument() - expect(screen.getByTestId('command-item-@kb')).toBeInTheDocument() - expect(screen.getByTestId('command-item-@plugin')).toBeInTheDocument() - expect(screen.getByTestId('command-item-@node')).toBeInTheDocument() - }) - - it('should handle undefined onCommandValueChange gracefully', () => { - const { rerender } = render( - , - ) - - expect(() => { - rerender( - , - ) - }).not.toThrow() - }) - }) - - describe('Backward Compatibility', () => { - it('should work without searchFilter prop (backward compatible)', () => { - render( - , - ) - - expect(screen.getByTestId('command-item-@app')).toBeInTheDocument() - expect(screen.getByTestId('command-item-@kb')).toBeInTheDocument() - expect(screen.getByTestId('command-item-@plugin')).toBeInTheDocument() - expect(screen.getByTestId('command-item-@node')).toBeInTheDocument() - }) - - it('should work without commandValue and onCommandValueChange props', () => { - render( - , - ) - - expect(screen.getByTestId('command-item-@kb')).toBeInTheDocument() - expect(screen.queryByTestId('command-item-@app')).not.toBeInTheDocument() - }) - }) -}) diff --git a/web/__tests__/goto-anything/match-action.test.ts b/web/__tests__/goto-anything/match-action.test.ts deleted file mode 100644 index 66b170d45e..0000000000 --- a/web/__tests__/goto-anything/match-action.test.ts +++ /dev/null @@ -1,236 +0,0 @@ -import type { Mock } from 'vitest' -import type { ActionItem } from '../../app/components/goto-anything/actions/types' - -// Import after mocking to get mocked version -import { matchAction } from '../../app/components/goto-anything/actions' -import { slashCommandRegistry } from '../../app/components/goto-anything/actions/commands/registry' - -// Mock the entire actions module to avoid import issues -vi.mock('../../app/components/goto-anything/actions', () => ({ - matchAction: vi.fn(), -})) - -vi.mock('../../app/components/goto-anything/actions/commands/registry') - -// Implement the actual matchAction logic for testing -const actualMatchAction = (query: string, actions: Record) => { - const result = Object.values(actions).find((action) => { - // Special handling for slash commands - if (action.key === '/') { - // Get all registered commands from the registry - const allCommands = slashCommandRegistry.getAllCommands() - - // Check if query matches any registered command - return allCommands.some((cmd) => { - const cmdPattern = `/${cmd.name}` - - // For direct mode commands, don't match (keep in command selector) - if (cmd.mode === 'direct') - return false - - // For submenu mode commands, match when complete command is entered - return query === cmdPattern || query.startsWith(`${cmdPattern} `) - }) - } - - const reg = new RegExp(`^(${action.key}|${action.shortcut})(?:\\s|$)`) - return reg.test(query) - }) - return result -} - -// Replace mock with actual implementation -;(matchAction as Mock).mockImplementation(actualMatchAction) - -describe('matchAction Logic', () => { - const mockActions: Record = { - app: { - key: '@app', - shortcut: '@a', - title: 'Search Applications', - description: 'Search apps', - search: vi.fn(), - }, - knowledge: { - key: '@knowledge', - shortcut: '@kb', - title: 'Search Knowledge', - description: 'Search knowledge bases', - search: vi.fn(), - }, - slash: { - key: '/', - shortcut: '/', - title: 'Commands', - description: 'Execute commands', - search: vi.fn(), - }, - } - - beforeEach(() => { - vi.clearAllMocks() - ;(slashCommandRegistry.getAllCommands as Mock).mockReturnValue([ - { name: 'docs', mode: 'direct' }, - { name: 'community', mode: 'direct' }, - { name: 'feedback', mode: 'direct' }, - { name: 'account', mode: 'direct' }, - { name: 'theme', mode: 'submenu' }, - { name: 'language', mode: 'submenu' }, - ]) - }) - - describe('@ Actions Matching', () => { - it('should match @app with key', () => { - const result = matchAction('@app', mockActions) - expect(result).toBe(mockActions.app) - }) - - it('should match @app with shortcut', () => { - const result = matchAction('@a', mockActions) - expect(result).toBe(mockActions.app) - }) - - it('should match @knowledge with key', () => { - const result = matchAction('@knowledge', mockActions) - expect(result).toBe(mockActions.knowledge) - }) - - it('should match @knowledge with shortcut @kb', () => { - const result = matchAction('@kb', mockActions) - expect(result).toBe(mockActions.knowledge) - }) - - it('should match with text after action', () => { - const result = matchAction('@app search term', mockActions) - expect(result).toBe(mockActions.app) - }) - - it('should not match partial @ actions', () => { - const result = matchAction('@ap', mockActions) - expect(result).toBeUndefined() - }) - }) - - describe('Slash Commands Matching', () => { - describe('Direct Mode Commands', () => { - it('should not match direct mode commands', () => { - const result = matchAction('/docs', mockActions) - expect(result).toBeUndefined() - }) - - it('should not match direct mode with arguments', () => { - const result = matchAction('/docs something', mockActions) - expect(result).toBeUndefined() - }) - - it('should not match any direct mode command', () => { - expect(matchAction('/community', mockActions)).toBeUndefined() - expect(matchAction('/feedback', mockActions)).toBeUndefined() - expect(matchAction('/account', mockActions)).toBeUndefined() - }) - }) - - describe('Submenu Mode Commands', () => { - it('should match submenu mode commands exactly', () => { - const result = matchAction('/theme', mockActions) - expect(result).toBe(mockActions.slash) - }) - - it('should match submenu mode with arguments', () => { - const result = matchAction('/theme dark', mockActions) - expect(result).toBe(mockActions.slash) - }) - - it('should match all submenu commands', () => { - expect(matchAction('/language', mockActions)).toBe(mockActions.slash) - expect(matchAction('/language en', mockActions)).toBe(mockActions.slash) - }) - }) - - describe('Slash Without Command', () => { - it('should not match single slash', () => { - const result = matchAction('/', mockActions) - expect(result).toBeUndefined() - }) - - it('should not match unregistered commands', () => { - const result = matchAction('/unknown', mockActions) - expect(result).toBeUndefined() - }) - }) - }) - - describe('Edge Cases', () => { - it('should handle empty query', () => { - const result = matchAction('', mockActions) - expect(result).toBeUndefined() - }) - - it('should handle whitespace only', () => { - const result = matchAction(' ', mockActions) - expect(result).toBeUndefined() - }) - - it('should handle regular text without actions', () => { - const result = matchAction('search something', mockActions) - expect(result).toBeUndefined() - }) - - it('should handle special characters', () => { - const result = matchAction('#tag', mockActions) - expect(result).toBeUndefined() - }) - - it('should handle multiple @ or /', () => { - expect(matchAction('@@app', mockActions)).toBeUndefined() - expect(matchAction('//theme', mockActions)).toBeUndefined() - }) - }) - - describe('Mode-based Filtering', () => { - it('should filter direct mode commands from matching', () => { - ;(slashCommandRegistry.getAllCommands as Mock).mockReturnValue([ - { name: 'test', mode: 'direct' }, - ]) - - const result = matchAction('/test', mockActions) - expect(result).toBeUndefined() - }) - - it('should allow submenu mode commands to match', () => { - ;(slashCommandRegistry.getAllCommands as Mock).mockReturnValue([ - { name: 'test', mode: 'submenu' }, - ]) - - const result = matchAction('/test', mockActions) - expect(result).toBe(mockActions.slash) - }) - - it('should treat undefined mode as submenu', () => { - ;(slashCommandRegistry.getAllCommands as Mock).mockReturnValue([ - { name: 'test' }, // No mode specified - ]) - - const result = matchAction('/test', mockActions) - expect(result).toBe(mockActions.slash) - }) - }) - - describe('Registry Integration', () => { - it('should call getAllCommands when matching slash', () => { - matchAction('/theme', mockActions) - expect(slashCommandRegistry.getAllCommands).toHaveBeenCalled() - }) - - it('should not call getAllCommands for @ actions', () => { - matchAction('@app', mockActions) - expect(slashCommandRegistry.getAllCommands).not.toHaveBeenCalled() - }) - - it('should handle empty command list', () => { - ;(slashCommandRegistry.getAllCommands as Mock).mockReturnValue([]) - const result = matchAction('/anything', mockActions) - expect(result).toBeUndefined() - }) - }) -})