pf-library-test-writer

Create unit tests for PatternFly components by mocking child components.

10|26|Updated Jul 8, 2025
One-click install
npx skills add https://github.com/patternfly/ai-helpers --skill pf-library-test-writer
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: pf-library-test-writer
Source: https://github.com/patternfly/ai-helpers/tree/main/plugins/react/skills/pf-library-test-writer
Command: npx skills add https://github.com/patternfly/ai-helpers --skill pf-library-test-writer

SYSTEM DOCUMENTATION & REQUIREMENTS

Write unit tests for components and features within PatternFly ecosystem libraries (patternfly-react, patternfly-chatbot, patternfly-virtual-assistant, and other JS/TS-based PatternFly libraries). Unlike unit-test-generator which tests at the network boundary, this skill mocks child components for unit isolation of individual library components.

These conventions are based on the PatternFly testing wiki: https://github.com/patternfly/patternfly-react/wiki/React-Testing-Library-Basics,-Best-Practices,-and-Guidelines

Input

The user will provide a component file path, component code, or describe a new feature. Read the component source before writing tests.

Test File Structure

import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { ComponentName } from '../ComponentName';

File Organization

  • Separate test file per exported component. Do not create monolithic test files.
  • Name the file ComponentName.test.tsx next to the source file.
Button/
├── Button.tsx
├── Button.test.tsx
├── ButtonVariant.tsx
└── ButtonVariant.test.tsx

Mocking Child Components

Default to mocking child components for unit testing prop-passing behavior:

jest.mock('../RandomHeader', () => () => <h1>Header text</h1>);

With props:

jest.mock('../Header', () => ({
  Header: ({ children, ...props }) => <h1 {...props}>{children}</h1>
}));

Test Nesting

  • Do NOT wrap all tests in a describe() that just names the component.
  • Do use describe() to group tests that share setup.
  • Use test() outside describe(), it() inside describe().
test('renders with default props', () => { ... });
test('applies custom className', () => { ... });

describe('when disabled', () => {
  it('has disabled attribute', () => { ... });
  it('does not fire onClick', () => { ... });
});

Snapshots

  • DO use snapshots for component structure and element ordering.
  • DO NOT use snapshots to verify CSS classes. Use toHaveClass instead.
// Structure -- snapshot is appropriate
const { asFragment } = render(<MyLayout />);
expect(asFragment()).toMatchSnapshot();

// Classes -- use toHaveClass, not snapshot
expect(screen.getByRole('button')).toHaveClass('pf-m-primary');

Coverage Checklist

Cover these for every component:

  1. Default rendering -- renders with only required props
  2. Prop variations -- each prop value produces expected output
  3. Custom className -- merges with internal classes
  4. Spread props -- extra props forwarded to root element
  5. Children -- renders children correctly
  6. Callbacks -- event handlers fire with correct arguments (and don't fire when they shouldn't)
  7. Conditional rendering -- elements show/hide based on props
  8. Accessibility -- ARIA roles, labels, keyboard interaction
  9. Snapshot -- structure verification where appropriate (NOT for classes)

Output

Output the complete test file ready to save. Name it ComponentName.test.tsx.

Frequently Asked Questions about pf-library-test-writer

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I write unit tests for PatternFly React components in TypeScript?▼

To write unit tests for PatternFly React components, mock child components for isolation, use Testing Library for rendering, and save files as ComponentName.test.tsx next to the source file.

How should I mock child components when unit testing PatternFly libraries?▼

Mock child components in unit testing using jest.mock to isolate individual library components, allowing you to verify prop-passing behavior without rendering nested child dependencies.

Does this unit testing approach work with patternfly-chatbot and patternfly-virtual-assistant?▼

Yes, this unit testing approach applies to patternfly-chatbot and patternfly-virtual-assistant, as well as other JS/TS-based PatternFly libraries, by following standard React Testing Library conventions.

When should I use snapshots versus toHaveClass in React Testing Library?▼

Use snapshots to verify component structure and element ordering, but use toHaveClass instead of snapshots to verify CSS classes like pf-m-primary during React component unit testing.

What is the difference between component unit isolation and network boundary testing?▼

Component unit isolation mocks child components to test individual library components independently, whereas network boundary testing validates integration points without mocking internal component hierarchies.

What coverage checklist should I follow when testing PatternFly components?▼

A thorough coverage checklist for testing PatternFly components includes default rendering, prop variations, custom className merging, spread props, callback firing, conditional rendering, and accessibility verification.