FileServiceTest.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace Tests\Unit\Services;
  3. use App\Models\User;
  4. use App\Services\FileService;
  5. use Illuminate\Foundation\Testing\RefreshDatabase;
  6. use Illuminate\Http\UploadedFile;
  7. use Illuminate\Support\Facades\Storage;
  8. use Tests\TestCase;
  9. class FileServiceTest extends TestCase
  10. {
  11. use RefreshDatabase;
  12. public function test_save_uploaded_file_supports_unicode_and_quotes_filename(): void
  13. {
  14. Storage::fake('public');
  15. $user = User::factory()->create();
  16. $this->actingAs($user);
  17. $filename = "Файл «отчет» 'смена' \"v3\".pdf";
  18. $uploaded = UploadedFile::fake()->create($filename, 64, 'application/pdf');
  19. $saved = app(FileService::class)->saveUploadedFile('tests/uploads', $uploaded);
  20. $this->assertEquals($filename, $saved->original_name);
  21. $this->assertEquals('tests/uploads/' . $filename, $saved->path);
  22. $this->assertEquals(url('/storage/tests/uploads/' . $filename), $saved->link);
  23. Storage::disk('public')->assertExists($saved->path);
  24. }
  25. public function test_save_uploaded_file_sanitizes_dangerous_name_parts(): void
  26. {
  27. Storage::fake('public');
  28. $user = User::factory()->create();
  29. $this->actingAs($user);
  30. $uploaded = UploadedFile::fake()->create('../../evil/..\\..\\doc?.pdf', 64, 'application/pdf');
  31. $saved = app(FileService::class)->saveUploadedFile('tests/uploads', $uploaded);
  32. $this->assertEquals('doc?.pdf', $saved->original_name);
  33. $this->assertEquals('tests/uploads/doc_.pdf', $saved->path);
  34. $this->assertStringNotContainsString('..', $saved->path);
  35. Storage::disk('public')->assertExists($saved->path);
  36. }
  37. public function test_save_uploaded_file_avoids_overwrite_for_duplicate_names(): void
  38. {
  39. Storage::fake('public');
  40. $user = User::factory()->create();
  41. $this->actingAs($user);
  42. $firstUpload = UploadedFile::fake()->create('одинаковое имя.pdf', 64, 'application/pdf');
  43. $secondUpload = UploadedFile::fake()->create('одинаковое имя.pdf', 64, 'application/pdf');
  44. $first = app(FileService::class)->saveUploadedFile('tests/uploads', $firstUpload);
  45. $second = app(FileService::class)->saveUploadedFile('tests/uploads', $secondUpload);
  46. $this->assertEquals('tests/uploads/одинаковое имя.pdf', $first->path);
  47. $this->assertEquals('tests/uploads/одинаковое имя (1).pdf', $second->path);
  48. Storage::disk('public')->assertExists($first->path);
  49. Storage::disk('public')->assertExists($second->path);
  50. }
  51. public function test_save_uploaded_file_uses_fallback_when_basename_is_empty(): void
  52. {
  53. Storage::fake('public');
  54. $user = User::factory()->create();
  55. $this->actingAs($user);
  56. $uploaded = UploadedFile::fake()->create('.pdf', 64, 'application/pdf');
  57. $saved = app(FileService::class)->saveUploadedFile('tests/uploads', $uploaded);
  58. $this->assertEquals('.pdf', $saved->original_name);
  59. $this->assertEquals('tests/uploads/file.pdf', $saved->path);
  60. Storage::disk('public')->assertExists($saved->path);
  61. }
  62. }