create-functional-test
Create functional test for HTTP controllers and LiveComponents. Use when testing web endpoints, form submissions, API responses, or LiveComponent interactions. Tests make HTTP requests and verify responses/DOM.
When & Why to Use This Skill
This Claude skill automates the generation of comprehensive functional tests for HTTP controllers and LiveComponents. It streamlines the quality assurance process by scaffolding standardized test cases that include database state management via Foundry, HTTP request simulation, and DOM-based assertions. By enforcing best practices like using specific base test cases and optimized client handling, it ensures high-performance testing cycles and robust web endpoint validation.
Use Cases
- API Endpoint Validation: Automatically create tests to verify that RESTful routes (GET, POST, PUT, DELETE) return expected status codes and correct payload structures.
- Form Submission Testing: Simulate user interactions with web forms to ensure data is correctly processed, persisted in the database, and triggers the right redirects.
- LiveComponent Integration: Verify the reactive behavior of UI components by asserting DOM changes and state updates after specific user interactions.
- Regression Testing: Rapidly generate a suite of functional tests for existing controllers to ensure that new code changes do not break core business logic or web accessibility.
| name | create-functional-test |
|---|---|
| description | Create functional test for HTTP controllers and LiveComponents. Use when testing web endpoints, form submissions, API responses, or LiveComponent interactions. Tests make HTTP requests and verify responses/DOM. |
Create Functional Test
Generate functional test for HTTP controllers and LiveComponents.
When to Use
- HTTP endpoints (GET/POST/PUT/DELETE)
- Form submissions
- LiveComponents
- API responses
Inputs/Outputs
| Input | Example | Output |
|---|---|---|
| controller_class | GetArticlesController | BC/Tests/Adapters/Controller/.../ControllerNameTest.php |
| route | /admin/articles | - |
| method | GET, POST | - |
| fixtures | ['ArticleFactory' => 5] | - |
Process
| Step | Action |
|---|---|
| Create | Use template: test-functional.php.tpl |
| Run | php bin/phpunit path/to/Test.php |
| Validate | make cs-fixer && make stan && make ta |
Structure
Functional Test (extends BaseFunctionalTestCase):
final class ControllerNameTest extends BaseFunctionalTestCase {
use Factories;
public function testMethodName(): void {
// Setup with Foundry (auto-persists)
EntityFactory::createOne(['name' => 'Test']);
// Request (use $this->client, NOT static::createClient())
$this->client->request('GET', '/route');
// Assertions
self::assertResponseIsSuccessful();
self::assertSelectorExists('.element');
}
}
See: docs/GLOSSARY.md#functional-test for detailed definition
Rules
Setup:
- Use Foundry (NOT DataBuilder)
- Foundry auto-persists and commits
- NO manual
repository->save()or$em->flush()
Assertions:
- HTTP:
assertResponseIsSuccessful(),assertResponseRedirects(),assertResponseStatusCodeSame(404) - DOM:
assertSelectorExists('.class'),assertSelectorTextContains('h1', 'Title'),assertSelectorCount(3, '.item')
CRITICAL:
- Use
$this->client(NOTstatic::createClient()) - Extends
BaseFunctionalTestCase - Use trait
Factories - Performance: ~550ms/test (DB purge + HTTP request)
Templates
test-functional.php.tpl
Location: .claude/templates/
References
- Functional test definition:
docs/GLOSSARY.md#functional-test - Testing strategy:
docs/testing.md#functional - Base test case:
src/Shared/Tests/BaseFunctionalTestCase.php