mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-24 13:54:57 +00:00
- 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>
144 lines
3.9 KiB
TypeScript
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()
|
|
})
|
|
})
|