summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorton <2773923088@qq。>2026-04-06 14:32:33 +0800
committerNorton <2773923088@qq。>2026-04-06 14:32:33 +0800
commit18fc18761dbefc2ab2fbaf93e1fe433eb0b47b37 (patch)
tree8c5c83f9e45387123e79f3431d1eb1ab66a020ea
parentf247a8c4a863ec430f4a705b5c493d652c8429bd (diff)
A small portion of newly added unit testing code
-rw-r--r--src/components/ui/button.test.tsx36
-rw-r--r--src/components/ui/card.test.tsx24
-rw-r--r--src/components/ui/input.test.tsx16
3 files changed, 76 insertions, 0 deletions
diff --git a/src/components/ui/button.test.tsx b/src/components/ui/button.test.tsx
index f8bd3a9..a15e0a0 100644
--- a/src/components/ui/button.test.tsx
+++ b/src/components/ui/button.test.tsx
@@ -66,4 +66,40 @@ describe('Button', () => {
expect(link).toBeInTheDocument();
expect(link.tagName).toBe('A');
});
+
+ // Test custom className merging
+ test('merges custom className correctly', () => {
+ render(<Button className="my-custom-test-class">Custom Class</Button>);
+ const button = screen.getByText('Custom Class');
+
+ // It should have the newly added class
+ expect(button).toHaveClass('my-custom-test-class');
+ // It should also retain the base classes defined in cva
+ expect(button).toHaveClass('inline-flex', 'items-center');
+ });
+
+ // Test native HTML props forwarding
+ test('passes native HTML attributes correctly', () => {
+ render(
+ <Button type="submit" aria-label="Submit Form" data-testid="submit-btn">
+ Submit
+ </Button>
+ );
+ const button = screen.getByTestId('submit-btn');
+
+ expect(button).toHaveAttribute('type', 'submit');
+ expect(button).toHaveAttribute('aria-label', 'Submit Form');
+ });
+
+ // Optimized: Test buttons with different variants by checking classes
+ test('applies specific classes for different variants', () => {
+ render(<Button variant="destructive">Destructive</Button>);
+ const destructiveButton = screen.getByText('Destructive');
+ // Verify that the specific Tailwind class from cva is applied
+ expect(destructiveButton).toHaveClass('bg-destructive', 'text-white');
+
+ render(<Button variant="outline">Outline</Button>);
+ const outlineButton = screen.getByText('Outline');
+ expect(outlineButton).toHaveClass('border', 'bg-background');
+ });
});
diff --git a/src/components/ui/card.test.tsx b/src/components/ui/card.test.tsx
index aba3d00..0c29c5d 100644
--- a/src/components/ui/card.test.tsx
+++ b/src/components/ui/card.test.tsx
@@ -36,5 +36,29 @@ describe('Card', () => {
expect(screen.getByText('Content')).toHaveAttribute('data-slot', 'card-content');
expect(screen.getByText('Footer')).toHaveAttribute('data-slot', 'card-footer');
});
+
+ test('appends custom class names correctly', () => {
+ render(
+ <Card className="my-custom-card-class">
+ <CardContent className="my-custom-content-class">Content</CardContent>
+ </Card>
+ );
+
+ const cardElement = screen.getByText('Content').parentElement; // 或者直接给 Card 加个 data-testid
+ expect(cardElement).toHaveClass('my-custom-card-class');
+ expect(screen.getByText('Content')).toHaveClass('my-custom-content-class');
+ });
+
+ test('passes standard HTML attributes to the DOM node', () => {
+ render(
+ <Card id="test-card" aria-label="Test Card">
+ <CardContent data-testid="content-id">Content</CardContent>
+ </Card>
+ );
+
+ const cardElement = screen.getByLabelText('Test Card');
+ expect(cardElement).toHaveAttribute('id', 'test-card');
+ expect(screen.getByTestId('content-id')).toBeInTheDocument();
+ });
});
diff --git a/src/components/ui/input.test.tsx b/src/components/ui/input.test.tsx
index aabe76f..036352b 100644
--- a/src/components/ui/input.test.tsx
+++ b/src/components/ui/input.test.tsx
@@ -1,6 +1,8 @@
import { render, screen } from '@testing-library/react';
import { describe, expect, test } from 'vitest';
import { Input } from './input';
+import userEvent from '@testing-library/user-event';
+import { vi } from 'vitest';
describe('Input', () => {
test('renders an input with the expected slot attribute', () => {
@@ -18,5 +20,19 @@ describe('Input', () => {
expect(input).toHaveAttribute('type', 'password');
expect(input).toBeDisabled();
});
+
+ test('handles user typing and triggers onChange event', async () => {
+ const user = userEvent.setup();
+ const handleChange = vi.fn();
+
+ render(<Input aria-label="Username" onChange={handleChange} />);
+ const input = screen.getByLabelText('Username');
+
+ await user.type(input, 'hello world');
+
+ expect(input).toHaveValue('hello world');
+ expect(handleChange).toHaveBeenCalled();
+ expect(handleChange).toHaveBeenCalledTimes(11);
+ });
});