| name | testing |
| description | Write and manage tests using TDD with Pest (PHP), Vitest (React), and Playwright (E2E). Use when writing feature tests, unit tests, component tests, or improving test coverage. EXCLUSIVE to testing-expert agent. |
| allowed-tools | Read, Edit, Bash, Grep, Glob, Write |
Testing
Exclusive to: testing-expert agent
Validation Loop (MANDATORY)
After writing or modifying tests, always verify:
composer test # PHP tests pass
npm run test # JS tests pass (if applicable)
TDD Feedback Loop:
- Write test → Verify it FAILS (Red)
- Implement minimal code → Verify it PASSES (Green)
- Refactor → Verify it still PASSES
- Repeat for edge cases
Instructions (TDD Workflow)
| Step | Action | Verification |
|---|---|---|
| 1 | Write failing test | composer test --filter=NewTest → FAILS |
| 2 | Implement minimal code | composer test --filter=NewTest → PASSES |
| 3 | Refactor | composer test → ALL PASS |
| 4 | Add edge cases | Repeat steps 1-3 |
Pest Patterns (Laravel)
Feature Test
test('user can create post', function () {
$user = User::factory()->create();
$this->actingAs($user)
->post('/posts', ['title' => 'Test'])
->assertRedirect('/posts');
$this->assertDatabaseHas('posts', ['title' => 'Test']);
});
Unit Test
test('generates slug from title', function () {
expect((new SlugGenerator)->generate('Hello World'))
->toBe('hello-world');
});
Vitest Patterns (React)
describe('PostForm', () => {
it('submits with valid data', async () => {
const onSubmit = vi.fn();
render(<PostForm onSubmit={onSubmit} />);
await userEvent.type(screen.getByLabelText(/title/i), 'Test');
await userEvent.click(screen.getByRole('button', { name: /submit/i }));
expect(onSubmit).toHaveBeenCalled();
});
});
Test Commands
# Laravel
composer test
php artisan test --filter=PostTest
php artisan test --coverage
# React
npm run test
npm run test:watch
npm run test:coverage
Examples
- "Write tests for PostController"
- "Add unit tests for this service"
- "Fix failing test"