Files

60 lines
2.0 KiB
PHP

<?php
namespace Tests\Feature\Http\Client;
use App\Enums\MediaCollectionEnum;
use App\Models\Document;
use App\Models\Medium;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
class MediaControllerTest extends TestCase
{
use RefreshDatabase;
protected function privateMediumFor(Document $document): Medium
{
Storage::fake('private');
$medium = Medium::factory()->private()->create(['path' => 'documents/scan.jpg', 'filename' => 'scan.jpg']);
Storage::disk('private')->put($medium->path, 'content');
$document->media()->attach($medium->id, ['collection' => MediaCollectionEnum::Primary->value]);
return $medium;
}
public function test_download_requires_authentication(): void
{
$this->get(route('dashboard.media.download', Medium::factory()->create()))->assertRedirect(route('login'));
}
public function test_requester_can_download_document_file(): void
{
$document = Document::factory()->create();
$medium = $this->privateMediumFor($document);
$this->actingAs($document->requester)->get(route('dashboard.media.download', $medium))
->assertOk()
->assertDownload('scan.jpg');
}
public function test_unrelated_user_is_forbidden(): void
{
$document = Document::factory()->create();
$medium = $this->privateMediumFor($document);
$this->actingAs(User::factory()->create())->get(route('dashboard.media.download', $medium))->assertForbidden();
}
public function test_missing_file_returns_not_found(): void
{
Storage::fake('private');
$document = Document::factory()->create();
$medium = Medium::factory()->private()->create(['path' => 'documents/missing.jpg']);
$document->media()->attach($medium->id, ['collection' => MediaCollectionEnum::Primary->value]);
$this->actingAs($document->requester)->get(route('dashboard.media.download', $medium))->assertNotFound();
}
}