Laravel makes it really easy to test if a file was uploaded in phpunit. Lets take a look at what it it takes to test for files.

Lets say that we have a method containing the following code that we want to test.

public function download() {
        // Get the file out of S3
        $file = Storage::disk('s3')
            ->get('/path/to/file.txt');

        // Store the file locally
        Storage::disk('public')
            ->put('/path/to/file.txt', $file);
}

The corresponding test that would provide coverage for that code is the following.

/** @test */
public function remote_file_gets_stored_locally():void 
{        
        Storage::fake('s3');
        Storage::fake('public');

        $file = UploadedFile::fake()->create('/path/to/file.txt', 0);
        Storage::disk('s3')->put('/path/to/file.txt', $file);
        Storage::disk('s3')->assertExists('/path/to/file.txt');

        $getFile = new GetFile();
        $getFile->download();

        Storage::disk('public')->assertExists('/path/to/file.txt');
}

Test a File Transfer From One Disk to Another in Laravel

  1. Fake the disks

    Use the storage facade to fake each disk you need. In this instance its ‘s3’ and ‘public’.

  2. Create a fake file

    Use the UploadedFile::class to fake a file UploadedFile::fake()->create(‘/path/to/file.txt’, 0);

  3. Upload the faked file to the faked disk

    Storage::disk(‘s3’)->put(‘/path/to/file.txt’, $file);

  4. Run the function that downloads the file

    In our instance its
    $getFile = new GetFile();
    $getFile->download();

  5. Assert the file exists in the new location

    Use the storage facade to assert the file exists on the faked local disk

With this process you can write a test in PHPUnit that proves a file gets downloaded from one disk to another in Laravel. You can find more on this topic on the Laravel Documentation https://laravel.com/docs/10.x/filesystem#testing.