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.