101 lines
3.9 KiB
PHP
101 lines
3.9 KiB
PHP
<?php
|
|
|
|
namespace Tests\Feature\Http\Admin;
|
|
|
|
use App\Models\Medium;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Illuminate\Http\UploadedFile;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Inertia\Testing\AssertableInertia as Assert;
|
|
use Tests\Concerns\InteractsWithAdmin;
|
|
use Tests\TestCase;
|
|
|
|
class MediumControllerTest extends TestCase
|
|
{
|
|
use InteractsWithAdmin, RefreshDatabase;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
|
|
Storage::fake('public');
|
|
Storage::fake('private');
|
|
}
|
|
|
|
public function test_guest_is_redirected(): void
|
|
{
|
|
$this->get('/admin/medium')->assertRedirect(route('login'));
|
|
}
|
|
|
|
public function test_admin_without_permission_is_forbidden(): void
|
|
{
|
|
$admin = $this->adminWithoutPermissions();
|
|
$medium = Medium::factory()->create();
|
|
|
|
$this->actingAs($admin)->get('/admin/medium')->assertForbidden();
|
|
$this->actingAs($admin)->post('/admin/medium')->assertForbidden();
|
|
$this->actingAs($admin)->delete("/admin/medium/{$medium->id}")->assertForbidden();
|
|
$this->actingAs($admin)->get('/admin/get-medium')->assertForbidden();
|
|
$this->actingAs($admin)->get("/admin/medium/{$medium->id}/download")->assertForbidden();
|
|
$this->actingAs($admin)->get("/admin/medium/{$medium->id}/serve")->assertForbidden();
|
|
}
|
|
|
|
public function test_index_renders_paginated_media(): void
|
|
{
|
|
Medium::factory()->count(2)->create();
|
|
|
|
$this->actingAs($this->adminWithAllPermissions())->get('/admin/medium')->assertOk()->assertInertia(fn (Assert $page) => $page->component('Medium')->has('medium.data', 2));
|
|
}
|
|
|
|
public function test_store_uploads_public_file_into_media_directory(): void
|
|
{
|
|
$this->actingAs($this->adminWithAllPermissions())->postJson('/admin/medium', ['file' => UploadedFile::fake()->image('pic.png')])
|
|
->assertOk()
|
|
->assertJsonPath('disk', 'public');
|
|
|
|
$medium = Medium::first();
|
|
$this->assertStringStartsWith('media/', $medium->path);
|
|
Storage::disk('public')->assertExists($medium->path);
|
|
}
|
|
|
|
public function test_store_validates_file(): void
|
|
{
|
|
$this->actingAs($this->adminWithAllPermissions())->postJson('/admin/medium', [])->assertUnprocessable()->assertJsonValidationErrors('file');
|
|
}
|
|
|
|
public function test_destroy_removes_file_and_record(): void
|
|
{
|
|
$medium = Medium::factory()->public()->create(['path' => 'media/a.png']);
|
|
Storage::disk('public')->put('media/a.png', 'x');
|
|
|
|
$this->actingAs($this->adminWithAllPermissions())->from('/admin/medium')->delete("/admin/medium/{$medium->id}")->assertRedirect('/admin/medium')->assertSessionHas('success');
|
|
|
|
Storage::disk('public')->assertMissing('media/a.png');
|
|
$this->assertDatabaseMissing('media', ['id' => $medium->id]);
|
|
}
|
|
|
|
public function test_get_medium_returns_paginated_json(): void
|
|
{
|
|
Medium::factory()->count(3)->create();
|
|
|
|
$this->actingAs($this->adminWithAllPermissions())->getJson('/admin/get-medium')->assertOk()->assertJsonCount(3, 'data');
|
|
}
|
|
|
|
public function test_download_and_serve_private_file(): void
|
|
{
|
|
$medium = Medium::factory()->private()->create(['path' => 'documents/f.txt', 'filename' => 'f.txt', 'mime_type' => 'text/plain']);
|
|
Storage::disk('private')->put('documents/f.txt', 'body');
|
|
$admin = $this->adminWithAllPermissions();
|
|
|
|
$this->actingAs($admin)->get("/admin/medium/{$medium->id}/download")->assertOk()->assertDownload('f.txt');
|
|
$this->actingAs($admin)->get("/admin/medium/{$medium->id}/serve")->assertOk()->assertHeader('Content-Type', 'text/plain; charset=UTF-8')->assertSee('body', false);
|
|
}
|
|
|
|
public function test_download_public_file_is_not_found(): void
|
|
{
|
|
$medium = Medium::factory()->public()->create();
|
|
|
|
$this->actingAs($this->adminWithAllPermissions())->get("/admin/medium/{$medium->id}/download")->assertNotFound();
|
|
}
|
|
}
|