| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- <?php
- namespace Tests\Unit\Services;
- use App\Models\User;
- use App\Services\FileService;
- use Illuminate\Foundation\Testing\RefreshDatabase;
- use Illuminate\Http\UploadedFile;
- use Illuminate\Support\Facades\Storage;
- use Tests\TestCase;
- class FileServiceTest extends TestCase
- {
- use RefreshDatabase;
- public function test_save_uploaded_file_supports_unicode_and_quotes_filename(): void
- {
- Storage::fake('public');
- $user = User::factory()->create();
- $this->actingAs($user);
- $filename = "Файл «отчет» 'смена' \"v3\".pdf";
- $uploaded = UploadedFile::fake()->create($filename, 64, 'application/pdf');
- $saved = app(FileService::class)->saveUploadedFile('tests/uploads', $uploaded);
- $this->assertEquals($filename, $saved->original_name);
- $this->assertEquals('tests/uploads/' . $filename, $saved->path);
- $this->assertEquals(url('/storage/tests/uploads/' . $filename), $saved->link);
- Storage::disk('public')->assertExists($saved->path);
- }
- public function test_save_uploaded_file_sanitizes_dangerous_name_parts(): void
- {
- Storage::fake('public');
- $user = User::factory()->create();
- $this->actingAs($user);
- $uploaded = UploadedFile::fake()->create('../../evil/..\\..\\doc?.pdf', 64, 'application/pdf');
- $saved = app(FileService::class)->saveUploadedFile('tests/uploads', $uploaded);
- $this->assertEquals('doc?.pdf', $saved->original_name);
- $this->assertEquals('tests/uploads/doc_.pdf', $saved->path);
- $this->assertStringNotContainsString('..', $saved->path);
- Storage::disk('public')->assertExists($saved->path);
- }
- public function test_save_uploaded_file_avoids_overwrite_for_duplicate_names(): void
- {
- Storage::fake('public');
- $user = User::factory()->create();
- $this->actingAs($user);
- $firstUpload = UploadedFile::fake()->create('одинаковое имя.pdf', 64, 'application/pdf');
- $secondUpload = UploadedFile::fake()->create('одинаковое имя.pdf', 64, 'application/pdf');
- $first = app(FileService::class)->saveUploadedFile('tests/uploads', $firstUpload);
- $second = app(FileService::class)->saveUploadedFile('tests/uploads', $secondUpload);
- $this->assertEquals('tests/uploads/одинаковое имя.pdf', $first->path);
- $this->assertEquals('tests/uploads/одинаковое имя (1).pdf', $second->path);
- Storage::disk('public')->assertExists($first->path);
- Storage::disk('public')->assertExists($second->path);
- }
- public function test_save_uploaded_file_uses_fallback_when_basename_is_empty(): void
- {
- Storage::fake('public');
- $user = User::factory()->create();
- $this->actingAs($user);
- $uploaded = UploadedFile::fake()->create('.pdf', 64, 'application/pdf');
- $saved = app(FileService::class)->saveUploadedFile('tests/uploads', $uploaded);
- $this->assertEquals('.pdf', $saved->original_name);
- $this->assertEquals('tests/uploads/file.pdf', $saved->path);
- Storage::disk('public')->assertExists($saved->path);
- }
- }
|