Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Request Factories Laravel Package

worksome/request-factories

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require worksome/request-factories
    

    No additional configuration is required—just use the RequestFactory facade or helper methods.

  2. First Use Case: Replace verbose test assertions with a focused factory for a single request field.

    use Worksome\RequestFactories\Facades\RequestFactory;
    
    it('validates phone number format', function () {
        $request = RequestFactory::create('App\Http\Requests\StoreUserRequest')
            ->with('phone', '+375 154 767 1088');
    
        $response = $this->post('/users', $request->toArray());
        $response->assertValid();
    });
    
  3. Where to Look First:

    • README for basic usage.
    • RequestFactory facade methods (create(), with(), toArray()).
    • Example tests in the package’s tests/ directory for advanced patterns.

Implementation Patterns

Core Workflow

  1. Factory Creation:

    $request = RequestFactory::create(StoreUserRequest::class);
    
    • Pass the fully qualified FormRequest class name.
    • Supports dependency injection for custom factories.
  2. Field Overrides:

    $request->with('email', 'test@example.com')
            ->with('accepts_terms_and_conditions', true);
    
    • Override only the fields you need to test.
    • Preserves default values for other fields (if any).
  3. File Uploads:

    $request->withFile('profile_picture', UploadedFile::fake()->image('avatar.png'));
    
    • Use withFile() for UploadedFile instances.
  4. Assertions:

    $request->assertValid(); // Validates the request
    $request->assertInvalid(); // Fails validation
    $request->assertSessionHasErrors(['field' => 'message']); // Custom error checks
    

Integration Tips

  • Pest/PHPUnit Agnostic: Works seamlessly in both testing frameworks.

  • Mocking Dependencies:

    $request = RequestFactory::create(StoreUserRequest::class)
        ->withMock(UserRepository::class, $mockUserRepo);
    
    • Useful for testing request logic that depends on external services.
  • Dynamic Routes:

    $request = RequestFactory::create(UpdateUserRequest::class)
        ->withRouteParams(['user' => $user->id]);
    
    • Inject route parameters for dynamic routes.
  • Reusable Factories:

    $factory = RequestFactory::create(StoreUserRequest::class)
        ->withDefaults(['company' => 'Worksome']);
    
    $factory->with('email', 'new@example.com');
    
    • Chain withDefaults() for common test setups.

Gotchas and Tips

Pitfalls

  1. Missing Default Values:

    • If your FormRequest relies on merge() or mergeWith() in its constructor, these won’t carry over to the factory.
    • Fix: Manually set defaults in the factory or extend the RequestFactory class.
  2. Route Binding Conflicts:

    • If your request expects route-bound models (e.g., UpdateUserRequest with user param), ensure withRouteParams() is used.
    • Fix:
      $request->withRouteParams(['user' => $user]);
      
  3. Validation Rule Overrides:

    • The factory doesn’t override validation rules—only input data.
    • Fix: Use assertValid() or assertInvalid() to test rule-specific behavior.
  4. File Upload Handling:

    • withFile() requires a UploadedFile instance. Using raw strings (e.g., 'path/to/file') won’t work.
    • Fix:
      use Illuminate\Http\UploadedFile;
      $request->withFile('avatar', UploadedFile::fake()->image('test.png'));
      

Debugging Tips

  • Inspect Raw Input:

    dd($request->toArray());
    
    • Verify the factory’s output matches expectations.
  • Validation Errors:

    • Use assertSessionHasErrors() to debug failed validations:
      $request->assertInvalid();
      $this->assertSessionHasErrors(['email' => 'required']);
      
  • Custom Factories:

    • Extend Worksome\RequestFactories\RequestFactory to add domain-specific methods:
      class UserRequestFactory extends RequestFactory
      {
          public function withValidUserData(): static
          {
              return $this
                  ->with('email', 'test@example.com')
                  ->with('password', 'password');
          }
      }
      

Extension Points

  1. Custom Factory Classes:

    • Register a custom factory in config/request-factories.php:
      'factories' => [
          App\Http\Requests\StoreUserRequest::class => App\Factories\UserRequestFactory::class,
      ],
      
    • Override default behavior (e.g., auto-populate common fields).
  2. Middleware Simulation:

    • The package doesn’t natively support middleware, but you can manually add it:
      $request = RequestFactory::create(StoreUserRequest::class);
      $request->prepareForValidation($this->app->make('router')->getCurrentRoute()->gatherMiddleware());
      
  3. Testing Authenticated Requests:

    • Use Laravel’s actingAs() helper alongside the factory:
      $this->actingAs($user)
           ->post('/users', RequestFactory::create(StoreUserRequest::class)->toArray());
      
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
codifyo/ts-generator-bundle
andydefer/laravel-cluster
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky
spatie/mailcoach-vapor