Files
radicall/tests/Feature/Http/Admin/MediumControllerTest.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();
}
}