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);