---
name: tdd-with-pest
description: Apply RED-GREEN-REFACTOR with Pest v4 (PHP 8.3+) for Symfony via the PHPUnit bridge; Foundry factories, WebTestCase, verify failures first
capabilities: [read, search, edit, shell]
tags: [testing, tdd]
# projected by `bun run build` — do not edit by hand
allowed-tools:
  - Read
  - Glob
  - Grep
  - Write
  - Edit
  - Bash
---

# Tdd With Pest (Symfony)

## Use when
- Driving a feature with RED-GREEN-REFACTOR in a project that runs Pest v4 (PHP 8.3+).
- Writing `it()` and `expect()` tests that need the Symfony kernel or an HTTP client.
- Converting existing PHPUnit class tests to Pest syntax with `pest-plugin-drift`.
- Adding a bug-reproducing test to a Pest suite before the fix.

## Default workflow
1. Confirm PHP 8.3+ and Pest v4, then generate `tests/Pest.php` with `./vendor/bin/pest --init`.
2. Bind the bridge classes in `tests/Pest.php`: `uses(KernelTestCase::class, Factories::class, ResetDatabase::class)->in('Integration')` and `uses(WebTestCase::class, ...)->in('Functional')`.
3. RED: write an `it()` test with Foundry v2 factories, run `./vendor/bin/pest --filter` and check it fails for the right reason.
4. GREEN: write the minimal code, then REFACTOR and re-run `./vendor/bin/pest`.
5. Gate the suite with `--parallel` and `--coverage --min=80`.

## Guardrails
- There is no official Symfony Pest plugin: never reference `pestphp/pest-plugin-symfony`, bind `KernelTestCase` or `WebTestCase` through `uses()`.
- Foundry v2 factories return real objects: no `->object()` call.
- Pest test files are anonymous, so use the `Factories` and `ResetDatabase` traits rather than the `#[ResetDatabase]` attribute.
- Chain related checks with `expect()->and()`; keep one concept per test.

## Progressive disclosure
- Use this file for execution posture and risk controls.
- Open references when deep implementation details are needed.

## Output contract
- The failing `./vendor/bin/pest` output (RED), then the passing run.
- `tests/Pest.php` bindings added or changed.
- Test files changed and the commands executed.

## References
- `reference.md`
