create-functional-test

Dev-Int's avatarfrom Dev-Int

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.

⭐0stars🔀0forks📁View on GitHub🕐Updated Jan 3, 2026

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.
namecreate-functional-test
descriptionCreate 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 (NOT static::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