agentleFS
RecusiveRecusive/Skills/component-test/SKILL.md

component-test

Skill2 starsChanged 8 months agoMITView on GitHub

Generate production-grade Vitest tests from HTML elements captured in DevTools. Two-phase workflow (analysis → generation) with edge case discovery.

2 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

4 rules. About 0 are common, 2 are distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Write test files based on approved plan, including edge case coverage.

    line 35
  2. Distinctive:

    If multiple files match or no match found, request clarification.

    line 52
  3. Very specific:

    Read the target file and its direct dependencies (custom hooks from src/, Zustand stores, contexts).

    line 56
  4. Very specific:

    If flagged, output the specific file:line and suggest a concrete refactor.

    line 155

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Component Test Generator

Generate tests for React components, hooks, and contexts by analyzing source code. This skill locates targets, discovers edge cases, and produces production-grade Vitest tests.

Usage: /component-test then provide one of:

  • HTML element from DevTools
  • Hook name (e.g., useFileOperations)
  • Context name (e.g., ThemeContext)
  • File path (e.g., src/components/FileExplorer/index.tsx)

Technology Stack

  • Testing: Vitest + React Testing Library
  • State: Zustand for state management
  • Backend: Tauri 2 for commands, events, and system APIs
  • Types: TypeScript throughout
  • Routing: React Router or TanStack Router (detect from imports)
  • Possible: ReactFlow, dnd-kit, react-window, Framer Motion

Two-Phase Workflow

Phase 1: Analysis

Identify target, read code, classify, discover edge cases, plan tests. Output analysis and wait for user to reply "proceed".

Phase 2: Generation

Write test files based on approved plan, including edge case coverage.


Phase 1: Analysis Instructions

Step 1: Identify the Test Target

Determine what you're testing based on input:

Input TypeTarget TypeSearch Strategy
HTML elementComponentdata-testid → id → unique text
Hook nameCustom Hookgrep for export function use or export const use
Context nameContext/Providergrep for createContext
File pathDirectRead file directly

If multiple files match or no match found, request clarification.

Step 2: Read and Quote Behavior Code

Read the target file and its direct dependencies (custom hooks from src/, Zustand stores, contexts).

Quote behavior-proving code based on target type:

Target TypeQuote
ComponentuseState, useEffect, store selector, conditional render
HookReturn value, internal state, effect dependencies
ContextDefault value, Provider value computation
ProviderChildren rendering, value memoization

Skip third-party hooks and utility hooks (useDebounce, useLocalStorage).

Step 3: Discover Edge Cases

Read references/edge-case-patterns.md for comprehensive edge case lists by category.

Analyze the code for edge cases. Check all applicable categories:

Data Edge Cases:

  • Empty arrays/objects, null, undefined
  • Single item vs multiple items
  • Maximum lengths, large datasets
  • Special characters (unicode, spaces, path separators)
  • Numeric boundaries (0, negative, MAX_SAFE_INTEGER, NaN)
  • Invalid/malformed data from backend

State Edge Cases:

  • Initial state before data loads
  • Loading states and transitions
  • Error states and recovery
  • Rapid state changes (double-clicks, debounce)
  • Stale state after unmount

Async Edge Cases:

  • Network failures / Tauri command rejections
  • Slow responses (loading indicators, timeouts)
  • Out-of-order responses
  • Retry logic

Interaction Edge Cases:

  • Disabled states
  • Keyboard navigation boundaries
  • Repeated rapid interactions
  • Interaction during loading
  • Touch vs mouse (if applicable)

Accessibility Edge Cases:

  • Focus management (trap, restore, initial)
  • Screen reader announcements
  • Keyboard-only navigation
  • Reduced motion preferences

Router Edge Cases:

  • Direct URL access (deep linking)
  • Back/forward navigation
  • Route params (missing, malformed)
  • Protected route redirects
  • Concurrent navigation

Drag and Drop Edge Cases:

  • Drop on invalid target
  • Cancel mid-drag (Escape)
  • Drag outside container
  • Keyboard drag mode

Virtualization Edge Cases:

  • Scroll to specific item
  • Dynamic item heights
  • Empty list, single item
  • Rapid scrolling

Animation Edge Cases:

  • Reduced motion preference
  • Animation interrupt
  • Unmount during animation

For each edge case found, note the relevant code line that handles it (or mark as unhandled).

Step 4: Check Testability

Flag for refactoring if:

  • Component >400 lines WITH useEffect calling external APIs AND >5 return statements
  • useEffect with no dependency array that calls setState
  • Store action called in render body (outside handler/effect)
  • Imports from >3 different Zustand stores
  • Hook does both data fetching AND UI state management
  • Context Provider has >200 lines of logic

If flagged, output the specific file:line and suggest a concrete refactor.

Step 5: Classify and Select Test Types

Target Classifications:

ClassificationCriteria
PRESENTATIONALNo effects, no stores, no Tauri, props-only
STATEFUL-SIMPLELocal state + effects, no Tauri/stores
STATEFUL-CONNECTEDUses Zustand stores, Tauri, or subscriptions
CUSTOM-HOOKExported hook (not component)
CONTEXT-PROVIDERcreateContext + Provider component
ROUTE-COMPONENTRendered by router, uses route params/navigation
VIRTUALIZEDUses react-window, tanstack-virtual, or similar
DND-COMPONENTUses dnd-kit, react-beautiful-dnd, or similar
ANIMATEDUses Framer Motion, react-spring, or CSS animations

Test Type Selection:

ClassificationDefault TestsAdd When
PRESENTATIONALUNITAdd A11Y if interactive
STATEFUL-SIMPLEUNITAdd INTEGRATION for multi-step flows
STATEFUL-CONNECTEDINTEGRATIONAdd UNIT for complex logic; TYPE SHAPE for Tauri
CUSTOM-HOOKHOOKAlways
CONTEXT-PROVIDERCONTEXTAdd INTEGRATION if Provider has side effects
ROUTE-COMPONENTROUTEAdd INTEGRATION for data loading
VIRTUALIZEDVIRTUALIZATIONAdd INTEGRATION for data
DND-COMPONENTDNDAdd INTEGRATION for state updates
ANIMATEDANIMATIONAdd UNIT for non-animated logic

Additional Test Types (add when applicable):

Test TypeAdd When
A11YInteractive elements, forms, modals, focus management
SNAPSHOTStable UI components, design system components
PERFORMANCEComponents with frequent re-renders, large lists
TAURI-SYSTEMUses dialog, fs, clipboard, shell, or window APIs

Step 6: List Testable Behaviors

Format: [Trigger] → [Expected outcome] → [Pattern: sync/async/cleanup/error/a11y]

Organize into groups:

  1. Core Behaviors — Primary happy-path functionality
  2. Edge Cases — Boundary conditions by category
  3. Accessibility — Focus, ARIA, keyboard navigation
  4. Performance — Render counts, memoization (if applicable)

Mark edge cases with category: [EDGE: data], [EDGE: async], [EDGE: a11y], etc.

Fast Path: For PRESENTATIONAL components <50 lines with ≤3 conditional renders, skip detailed analysis.


Phase 2: Generate Tests

Read references/test-examples.md for code templates and mock patterns for all test types.

File Locations

Test TypeLocation
Unitsrc/components/[path]/__tests__/[Name].unit.test.tsx
Integrationsrc/components/[path]/__tests__/[Name].test.tsx
Hooksrc/hooks/__tests__/[hookName].test.ts
Contextsrc/contexts/__tests__/[Name].test.tsx
A11ysrc/components/[path]/__tests__/[Name].a11y.test.tsx
Routesrc/routes/__tests__/[Name].test.tsx
Type Shapesrc/components/[path]/__tests__/[Name].types.test.tsx
Snapshotsrc/components/[path]/__tests__/[Name].snapshot.test.tsx
Performancesrc/components/[path]/__tests__/[Name].perf.test.tsx

Test Organization

describe('TargetName', () => {
  describe('core functionality', () => {
    // happy path tests
  });

  describe('edge cases: [category]', () => {
    // boundary tests
  });

  describe('accessibility', () => {
    // a11y tests
  });

  describe('performance', () => {
    // render count, memoization tests
  });
});

Validation Pass

Validate each test:

  • Test type matches mocking strategy
  • Classification rules followed
  • Edge cases target specific documented boundaries
  • A11y tests use correct queries and assertions
  • Performance tests have clear thresholds

Classification Enforcement

ClassificationMust UseMust Avoid
PRESENTATIONALgetBy*, sync assertionswaitFor, findBy*, store mocks, Tauri mocks
STATEFUL-SIMPLELocal state testingTauri mocks, race condition tests
STATEFUL-CONNECTEDReal stores, Tauri mocksMocking stores
CUSTOM-HOOKrenderHook, actComponent rendering
CONTEXT-PROVIDERProvider wrapper, useContextDirect state access
ROUTE-COMPONENTMemory router, navigationDirect component render

Required Imports

// Core
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { render, screen, waitFor, within, act, fireEvent } from '@testing-library/react';
import userEvent from '@testing-library/user-event';

// Hooks
import { renderHook } from '@testing-library/react';

// Routing
import { createMemoryRouter, RouterProvider } from 'react-router-dom';

// Accessibility
import { axe, toHaveNoViolations } from 'jest-axe';

// Performance
import { Profiler } from 'react';

Phase 1 Output Format

## Target Identified

[Type]: [Name] at [path]

## Behavior Code

├── file:line — "quoted code" └── file:line — "quoted code"


## Dependencies
- Tauri: [commands/events or "None"]
- Stores: [stores or "None"]
- Contexts: [contexts or "None"]
- Router: [yes/no]

## Edge Cases Identified

| Category | Edge Case | Code Reference | Handled? |
|----------|-----------|----------------|----------|
| [cat] | [description] | [file:line or —] | ✓/? |

## Classification
[TYPE] — [justification]

## Test Types
[list with justification]

## Planned Files
[list with test type]

## Mock Requirements
[structured by category]

## Behaviors

### [TEST TYPE] — Core
1. [trigger] → [outcome] → [pattern]

### [TEST TYPE] — Edge Cases
N. [EDGE: category] [trigger] → [outcome] → [pattern]

### Accessibility (if applicable)
N. [trigger] → [outcome] → [a11y]

---
Phase 1 complete. Reply "proceed" to generate tests.

Phase 2 Output Format

## Validation

[✓/✗ for each test]

## Test Files

### [filename]

```typescript
[full code with organized describe blocks]
```

---

## References

- `references/edge-case-patterns.md` — Comprehensive edge cases by component/category type
- `references/test-examples.md` — Code templates for all test types (unit, integration, hook, context, a11y, router, DnD, virtualization, animation, performance, snapshot, Tauri system)

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.