test(hooks): finalize mutation test improvements and release acceptance
- Raise use-swipe-gesture mutation score to 66.13% (target 65%+) - Maintain use-reduced-motion mutation score at 76.32% (target 50%+) - Fix use-reduced-motion.ts ESLint set-state-in-effect warning - Add UJ-10 deep searcher journey (category browse → article read → content discovery) - Add 40 new test files (analytics, detail, sections, ui, lib components) - Update test-strategy-plan.md to v2.0 (sync test count to 1591) - Sync README.md with final release metrics Quality gates: TS 0 errors, ESLint 0 errors, 121 suites / 1591 tests passed
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
// @ts-nocheck
|
||||
import { describe, it, expect } from '@jest/globals';
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import '@testing-library/jest-dom';
|
||||
import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from './accordion';
|
||||
|
||||
describe('Accordion Components', () => {
|
||||
describe('AccordionItem', () => {
|
||||
it('should render item with children', () => {
|
||||
render(
|
||||
<Accordion type="single">
|
||||
<AccordionItem value="item1">Item Content</AccordionItem>
|
||||
</Accordion>
|
||||
);
|
||||
expect(screen.getByText('Item Content')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('should have data-slot attribute', () => {
|
||||
render(
|
||||
<Accordion type="single">
|
||||
<AccordionItem value="item1" data-testid="item">Item</AccordionItem>
|
||||
</Accordion>
|
||||
);
|
||||
expect(screen.getByTestId('item')).toHaveAttribute('data-slot', 'accordion-item');
|
||||
});
|
||||
|
||||
it('should apply custom className', () => {
|
||||
render(
|
||||
<Accordion type="single">
|
||||
<AccordionItem value="item1" className="custom-item">Item</AccordionItem>
|
||||
</Accordion>
|
||||
);
|
||||
expect(screen.getByText('Item')).toHaveClass('custom-item');
|
||||
});
|
||||
});
|
||||
|
||||
describe('AccordionTrigger', () => {
|
||||
it('should render trigger text', () => {
|
||||
render(
|
||||
<Accordion type="single">
|
||||
<AccordionItem value="item1">
|
||||
<AccordionTrigger>点击展开</AccordionTrigger>
|
||||
</AccordionItem>
|
||||
</Accordion>
|
||||
);
|
||||
expect(screen.getByText('点击展开')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('should have data-slot attribute', () => {
|
||||
render(
|
||||
<Accordion type="single">
|
||||
<AccordionItem value="item1">
|
||||
<AccordionTrigger data-testid="trigger">Trigger</AccordionTrigger>
|
||||
</AccordionItem>
|
||||
</Accordion>
|
||||
);
|
||||
expect(screen.getByTestId('trigger')).toHaveAttribute('data-slot', 'accordion-trigger');
|
||||
});
|
||||
|
||||
it('should apply custom className', () => {
|
||||
render(
|
||||
<Accordion type="single">
|
||||
<AccordionItem value="item1">
|
||||
<AccordionTrigger className="custom-trigger">Trigger</AccordionTrigger>
|
||||
</AccordionItem>
|
||||
</Accordion>
|
||||
);
|
||||
expect(screen.getByText('Trigger')).toHaveClass('custom-trigger');
|
||||
});
|
||||
});
|
||||
|
||||
describe('AccordionContent', () => {
|
||||
it('should render content when item is open', () => {
|
||||
render(
|
||||
<Accordion type="single" defaultValue="item1">
|
||||
<AccordionItem value="item1">
|
||||
<AccordionTrigger>标题</AccordionTrigger>
|
||||
<AccordionContent>展开内容</AccordionContent>
|
||||
</AccordionItem>
|
||||
</Accordion>
|
||||
);
|
||||
expect(screen.getByText('展开内容')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('should have data-slot attribute', () => {
|
||||
render(
|
||||
<Accordion type="single" defaultValue="item1">
|
||||
<AccordionItem value="item1">
|
||||
<AccordionContent data-testid="content">Content</AccordionContent>
|
||||
</AccordionItem>
|
||||
</Accordion>
|
||||
);
|
||||
expect(screen.getByTestId('content')).toHaveAttribute('data-slot', 'accordion-content');
|
||||
});
|
||||
|
||||
it('should apply custom className', () => {
|
||||
render(
|
||||
<Accordion type="single" defaultValue="item1">
|
||||
<AccordionItem value="item1">
|
||||
<AccordionContent className="custom-content">Content</AccordionContent>
|
||||
</AccordionItem>
|
||||
</Accordion>
|
||||
);
|
||||
expect(screen.getByText('Content')).toHaveClass('custom-content');
|
||||
});
|
||||
});
|
||||
|
||||
describe('Accordion Composition', () => {
|
||||
it('should render complete accordion structure', () => {
|
||||
render(
|
||||
<Accordion type="single" defaultValue="faq1">
|
||||
<AccordionItem value="faq1">
|
||||
<AccordionTrigger>问题一</AccordionTrigger>
|
||||
<AccordionContent>答案一</AccordionContent>
|
||||
</AccordionItem>
|
||||
<AccordionItem value="faq2">
|
||||
<AccordionTrigger>问题二</AccordionTrigger>
|
||||
<AccordionContent>答案二</AccordionContent>
|
||||
</AccordionItem>
|
||||
</Accordion>
|
||||
);
|
||||
|
||||
expect(screen.getByText('问题一')).toBeInTheDocument();
|
||||
expect(screen.getByText('答案一')).toBeInTheDocument();
|
||||
expect(screen.getByText('问题二')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user