Fake Timeout Exceptions in Laravel

Testing Lab

If you're developing a Laravel app that interacts with external services, it's important to ensure that it can handle timeout exceptions gracefully. Fortunately, testing timeout exceptions in your Laravel app is straightforward using the Laravel HTTP client.

One way to test for timeout exceptions is to use the Http::fake() method in your test. This method allows you to simulate a fake HTTP request and response without actually sending it. You can then make the method throw a new ConnectionException with any message you want.

Here's an example of how to use Http::fake() in your test case:

<?php // ExampleTest.php
 
use Illuminate\Http\Client\ConnectionException;
use Illuminate\Support\Facades\Http;
use Symfony\Component\HttpFoundation\Response;
 
test('return service not available response', function () {
Http::fake(fn() => throw new ConnectionException('Connection timed out'));
 
$response = $this->get('/api/jira/search');
 
$response->assertStatus(Response::HTTP_SERVICE_UNAVAILABLE);
// ... other assertions
});

In the example above, we're testing whether our app can handle a ConnectionException is thrown by the Http::fake()method. We're expecting the response status to be HTTP_SERVICE_UNAVAILABLE, which means that our app is handling the exception correctly.

By testing for timeout exceptions, you can ensure that your Laravel app is robust and can handle unexpected errors gracefully.