- Fix os module mock pattern for Vitest v4 in proxy-ide-config tests - Fix enterprise oauth_client_key expectations in cloudHandler-sync and token-manager-parity tests - Fix proxy-controller integration test argument expectations - Add missing proxy-parity JSON fixtures (OpenAI tools, Anthropic tool-use, Gemini SSE) - Add reasoning_content mapping to convertClaudeToOpenAIResponse - Fix google-api service test env var cache leak with resetModules + dynamic imports - Fix proxy-metrics timer tests by calling onModuleInit in beforeEach - Fix locale-sensitive number formatting in StatCard tests - Add missing test files to version control (components, hooks, ipc, mocks, server, utils) - Fix CI workflows: testing.yaml (use vitest run, add type-check job, npm cache), lint.yaml and format.yaml (add npm cache, concurrency, fix job names)
73 lines
2.6 KiB
TypeScript
73 lines
2.6 KiB
TypeScript
import React from 'react';
|
|
import { screen, fireEvent } from '@testing-library/react';
|
|
import { renderWithProviders } from '@/tests/unit/test-utils';
|
|
import { Button, buttonVariants } from '@/components/ui/button';
|
|
|
|
describe('Button', () => {
|
|
it('renders with default variant and size', () => {
|
|
renderWithProviders(<Button>Click me</Button>);
|
|
const button = screen.getByRole('button', { name: /click me/i });
|
|
expect(button).toBeInTheDocument();
|
|
expect(button).toHaveAttribute('data-slot', 'button');
|
|
});
|
|
|
|
it('renders all variant styles', () => {
|
|
const variants = ['default', 'destructive', 'outline', 'secondary', 'ghost', 'link'] as const;
|
|
variants.forEach((variant) => {
|
|
const { container } = renderWithProviders(
|
|
<Button variant={variant}>{variant}</Button>,
|
|
);
|
|
expect(container.querySelector('button')).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
it('renders all size styles', () => {
|
|
const sizes = ['default', 'sm', 'lg', 'icon'] as const;
|
|
sizes.forEach((size) => {
|
|
const { container } = renderWithProviders(
|
|
<Button size={size}>{size}</Button>,
|
|
);
|
|
expect(container.querySelector('button')).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
it('handles click events', () => {
|
|
const handleClick = vi.fn();
|
|
renderWithProviders(<Button onClick={handleClick}>Click me</Button>);
|
|
fireEvent.click(screen.getByRole('button'));
|
|
expect(handleClick).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it('supports disabled state', () => {
|
|
renderWithProviders(<Button disabled>Disabled</Button>);
|
|
expect(screen.getByRole('button')).toBeDisabled();
|
|
});
|
|
|
|
it('renders as child element when asChild is true', () => {
|
|
renderWithProviders(
|
|
<Button asChild>
|
|
<a href="/test">Link Button</a>
|
|
</Button>,
|
|
);
|
|
const link = screen.getByRole('link', { name: /link button/i });
|
|
expect(link).toBeInTheDocument();
|
|
expect(link).toHaveAttribute('href', '/test');
|
|
});
|
|
|
|
it('applies custom className', () => {
|
|
renderWithProviders(<Button className="custom-class">Styled</Button>);
|
|
expect(screen.getByRole('button')).toHaveClass('custom-class');
|
|
});
|
|
|
|
it('buttonVariants function returns expected classes for default variant', () => {
|
|
const classes = buttonVariants({ variant: 'default', size: 'default' });
|
|
expect(classes).toContain('bg-primary');
|
|
expect(classes).toContain('text-primary-foreground');
|
|
});
|
|
|
|
it('buttonVariants function returns expected classes for destructive variant', () => {
|
|
const classes = buttonVariants({ variant: 'destructive' });
|
|
expect(classes).toContain('bg-destructive');
|
|
});
|
|
});
|