File Storage

Upload, store, download

Files are tricky. Fake the disk and test the full flow.

Controller — Upload
// app/Http/Controllers/DocumentController.php
public function store(Request $request)
{
    $request->file('document')->store('documents', 's3');

    // ...
}
Feature Test — assert file is saved
// tests/Feature/Http/Controllers/DocumentController/StoreTest.php
Storage::fake('s3');

$file = UploadedFile::fake()->create('report.pdf', 100);

$this->actingAs($user)
    ->post(route('documents.store'), [
        'document' => $file,
    ]);

Storage::disk('s3')->assertExists('documents/'.$file->hashName());
Controller — Download
// app/Http/Controllers/DocumentController.php
public function show(Document $document)
{
    return Storage::disk('s3')
        ->download($document->path);
}
Feature Test — assert file is downloaded
// tests/Feature/Http/Controllers/DocumentController/ShowTest.php
Storage::fake('s3');

$expectedFilename = "document.pdf";
Storage::disk('s3')->put($expectedFilename, 'fake-content');

$response = $this->actingAs($user)
    ->get(route('documents.show', $document));

$response->assertDownload($expectedFilename);