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:
2026-08-02 19:39:27 +08:00
parent 7c0af54897
commit 602ed6a671
203 changed files with 8338 additions and 81 deletions
+128
View File
@@ -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();
});
});
});