- Add TTL-specific cache durations: district stats (5min), market report (15min), heatmap (5min) - Add Redis caching to GeoSearch handler with 60s TTL - Add cache invalidation on listing.approved, listing.updated, listing.deactivated, listing.sold events - Invalidate search, geo_search, and all analytics cache prefixes on listing state changes - Update tests for new CacheService dependency in event handler and geo-search handler Co-Authored-By: Paperclip <noreply@paperclip.ing>
61 lines
2.1 KiB
TypeScript
61 lines
2.1 KiB
TypeScript
import { render, screen } from '@testing-library/react';
|
|
import userEvent from '@testing-library/user-event';
|
|
import { describe, expect, it, vi } from 'vitest';
|
|
import { Button } from '../button';
|
|
|
|
describe('Button', () => {
|
|
it('renders with children text', () => {
|
|
render(<Button>Click me</Button>);
|
|
expect(screen.getByRole('button', { name: 'Click me' })).toBeInTheDocument();
|
|
});
|
|
|
|
it('handles click events', async () => {
|
|
const onClick = vi.fn();
|
|
render(<Button onClick={onClick}>Click</Button>);
|
|
await userEvent.click(screen.getByRole('button'));
|
|
expect(onClick).toHaveBeenCalledOnce();
|
|
});
|
|
|
|
it('is disabled when disabled prop is set', () => {
|
|
render(<Button disabled>Disabled</Button>);
|
|
expect(screen.getByRole('button')).toBeDisabled();
|
|
});
|
|
|
|
it('does not fire click when disabled', async () => {
|
|
const onClick = vi.fn();
|
|
render(<Button disabled onClick={onClick}>Disabled</Button>);
|
|
await userEvent.click(screen.getByRole('button'));
|
|
expect(onClick).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('applies variant classes for destructive', () => {
|
|
render(<Button variant="destructive">Delete</Button>);
|
|
expect(screen.getByRole('button')).toHaveClass('bg-destructive');
|
|
});
|
|
|
|
it('applies variant classes for outline', () => {
|
|
render(<Button variant="outline">Outline</Button>);
|
|
expect(screen.getByRole('button')).toHaveClass('border');
|
|
});
|
|
|
|
it('applies size classes for sm', () => {
|
|
render(<Button size="sm">Small</Button>);
|
|
expect(screen.getByRole('button')).toHaveClass('h-9');
|
|
});
|
|
|
|
it('applies size classes for lg', () => {
|
|
render(<Button size="lg">Large</Button>);
|
|
expect(screen.getByRole('button')).toHaveClass('h-11');
|
|
});
|
|
|
|
it('applies custom className', () => {
|
|
render(<Button className="custom-class">Custom</Button>);
|
|
expect(screen.getByRole('button')).toHaveClass('custom-class');
|
|
});
|
|
|
|
it('renders as submit button when type is set', () => {
|
|
render(<Button type="submit">Submit</Button>);
|
|
expect(screen.getByRole('button')).toHaveAttribute('type', 'submit');
|
|
});
|
|
});
|