Files
metabuilder/hooks/SnippetToolbar.test.tsx
johndoe6345789 78a54228df feat(hooks): Create centralized hooks npm package
- Added @metabuilder/hooks workspace package at root
- Consolidated 30 React hooks from across codebase into single module
- Implemented conditional exports for tree-shaking support
- Added comprehensive package.json with build/lint/typecheck scripts
- Created README.md documenting hook categories and usage patterns
- Updated root package.json workspaces array to include hooks
- Supports multi-version peer dependencies (React 18/19, Redux 8/9)

Usage:
  import { useDashboardLogic } from '@metabuilder/hooks'
  import { useLoginLogic } from '@metabuilder/hooks/useLoginLogic'

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-23 19:17:17 +00:00

144 lines
3.9 KiB
TypeScript

import React from 'react'
import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { SnippetToolbar } from './SnippetToolbar'
import { SnippetTemplate } from '@/lib/types'
const mockTemplates: SnippetTemplate[] = [
{
id: '1',
title: 'React Hook',
description: 'Custom React hook',
code: 'export const useCustom = () => {}',
language: 'TypeScript',
category: 'react',
hasPreview: true,
},
]
describe('SnippetToolbar', () => {
it('renders search input with proper test id', () => {
render(
<SnippetToolbar
searchQuery=""
onSearchChange={jest.fn()}
selectionMode={false}
onToggleSelectionMode={jest.fn()}
onCreateNew={jest.fn()}
onCreateFromTemplate={jest.fn()}
templates={mockTemplates}
/>
)
expect(screen.getByTestId('snippet-search-input')).toBeInTheDocument()
})
it('renders selection mode button with proper test id', () => {
render(
<SnippetToolbar
searchQuery=""
onSearchChange={jest.fn()}
selectionMode={false}
onToggleSelectionMode={jest.fn()}
onCreateNew={jest.fn()}
onCreateFromTemplate={jest.fn()}
templates={mockTemplates}
/>
)
expect(screen.getByTestId('snippet-selection-mode-btn')).toBeInTheDocument()
})
it('renders create menu trigger with proper test id', () => {
render(
<SnippetToolbar
searchQuery=""
onSearchChange={jest.fn()}
selectionMode={false}
onToggleSelectionMode={jest.fn()}
onCreateNew={jest.fn()}
onCreateFromTemplate={jest.fn()}
templates={mockTemplates}
/>
)
expect(screen.getByTestId('snippet-create-menu-trigger')).toBeInTheDocument()
})
it('has proper aria-label on search input', () => {
render(
<SnippetToolbar
searchQuery=""
onSearchChange={jest.fn()}
selectionMode={false}
onToggleSelectionMode={jest.fn()}
onCreateNew={jest.fn()}
onCreateFromTemplate={jest.fn()}
templates={mockTemplates}
/>
)
const searchInput = screen.getByTestId('snippet-search-input')
expect(searchInput).toHaveAttribute('aria-label', 'Search snippets')
})
it('calls onSearchChange when search input changes', async () => {
const onSearchChange = jest.fn()
const user = userEvent.setup()
render(
<SnippetToolbar
searchQuery=""
onSearchChange={onSearchChange}
selectionMode={false}
onToggleSelectionMode={jest.fn()}
onCreateNew={jest.fn()}
onCreateFromTemplate={jest.fn()}
templates={mockTemplates}
/>
)
const searchInput = screen.getByTestId('snippet-search-input') as HTMLInputElement
await user.type(searchInput, 'test')
expect(onSearchChange).toHaveBeenCalled()
})
it('selection mode button has aria-pressed attribute', () => {
render(
<SnippetToolbar
searchQuery=""
onSearchChange={jest.fn()}
selectionMode={true}
onToggleSelectionMode={jest.fn()}
onCreateNew={jest.fn()}
onCreateFromTemplate={jest.fn()}
templates={mockTemplates}
/>
)
const selectionBtn = screen.getByTestId('snippet-selection-mode-btn')
expect(selectionBtn).toHaveAttribute('aria-pressed', 'true')
})
it('renders blank snippet menu item with proper test id', async () => {
const user = userEvent.setup()
render(
<SnippetToolbar
searchQuery=""
onSearchChange={jest.fn()}
selectionMode={false}
onToggleSelectionMode={jest.fn()}
onCreateNew={jest.fn()}
onCreateFromTemplate={jest.fn()}
templates={mockTemplates}
/>
)
const trigger = screen.getByTestId('snippet-create-menu-trigger')
await user.click(trigger)
expect(screen.getByTestId('snippet-create-blank-item')).toBeInTheDocument()
})
})