Search code examples
phplaravelfile-uploadphpunit

How to test file upload in Laravel


Im trying to test an upload API but it fails every time:

Test Code :

$JSONResponse = $this->call('POST', '/upload', [], [], [
    'photo' => new UploadedFile(base_path('public/uploads/test') . '/34610974.jpg', '34610974.jpg')
]);

$this->assertResponseOk();
$this->seeJsonStructure(['name']);

$response = json_decode($JSONResponse);
$this->assertTrue(file_exists(base_path('public/uploads') . '/' . $response['name']));

file path is /public/uploads/test/34610974.jpg

Here is My Upload code in a controller :

$this->validate($request, [
    'photo' => 'bail|required|image|max:1024'
]);

$name = 'adummyname' . '.' . $request->file('photo')->getClientOriginalExtension();

$request->file('photo')->move('/uploads', $name);

return response()->json(['name' => $name]);

How should I test file upload in Laravel 5.2? How to use call method to upload a file?


Solution

  • When you create an instance of UploadedFile set the last parameter $test to true.

    $file = new UploadedFile($path, $name, filesize($path), 'image/png', null, true);
                                                                               ^^^^
    

    Here is a quick example of a working test. It expects that you have a stub test.png file in tests/stubs folder.

    class UploadTest extends TestCase
    {
        public function test_upload_works()
        {
            $stub = __DIR__.'/stubs/test.png';
            $name = str_random(8).'.png';
            $path = sys_get_temp_dir().'/'.$name;
    
            copy($stub, $path);
    
            $file = new UploadedFile($path, $name, filesize($path), 'image/png', null, true);
            $response = $this->call('POST', '/upload', [], [], ['photo' => $file], ['Accept' => 'application/json']);
    
            $this->assertResponseOk();
            $content = json_decode($response->getContent());
            $this->assertObjectHasAttribute('name', $content);
    
            $uploaded = 'uploads'.DIRECTORY_SEPARATOR.$content->name;
            $this->assertFileExists(public_path($uploaded));
    
            @unlink($uploaded);
        }
    }
    
    ➔ phpunit tests/UploadTest.php
    PHPUnit 4.8.24 by Sebastian Bergmann and contributors.
    
    .
    
    Time: 2.97 seconds, Memory: 14.00Mb
    
    OK (1 test, 3 assertions)