ImportCommonCatalogServiceTest.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. declare(strict_types=1);
  3. namespace Tests\Unit\Services\Import;
  4. use App\Models\Import;
  5. use App\Models\User;
  6. use App\Services\Export\ExportCommonCatalogService;
  7. use App\Services\Import\ImportCommonCatalogService;
  8. use Illuminate\Foundation\Testing\RefreshDatabase;
  9. use Illuminate\Http\UploadedFile;
  10. use Illuminate\Support\Facades\Storage;
  11. use PhpOffice\PhpSpreadsheet\Cell\DataType;
  12. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  13. use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
  14. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  15. use RuntimeException;
  16. use Tests\TestCase;
  17. class ImportCommonCatalogServiceTest extends TestCase
  18. {
  19. use RefreshDatabase;
  20. protected bool $seed = true;
  21. public function test_import_creates_and_updates_by_article_while_preserving_leading_zeroes(): void
  22. {
  23. Storage::fake('upload');
  24. Storage::fake('public');
  25. $user = User::factory()->create();
  26. $import = $this->createImport($user, 'Оборудование для благоустройства', withImage: true);
  27. $this->assertTrue((new ImportCommonCatalogService($import, $user->id))->handle());
  28. $this->assertDatabaseHas('common_catalog_items', [
  29. 'article' => '0254',
  30. 'calculator_name' => 'Оборудование для благоустройства',
  31. 'places' => 38,
  32. ]);
  33. $item = \App\Models\CommonCatalogItem::query()->firstOrFail();
  34. $this->assertNotNull($item->imageFile);
  35. Storage::disk('public')->assertExists($item->imageFile->path);
  36. $secondImport = $this->createImport($user, 'Обновлённое наименование');
  37. $this->assertTrue((new ImportCommonCatalogService($secondImport, $user->id))->handle());
  38. $this->assertDatabaseCount('common_catalog_items', 1);
  39. $this->assertDatabaseHas('common_catalog_items', [
  40. 'article' => '0254',
  41. 'calculator_name' => 'Обновлённое наименование',
  42. ]);
  43. }
  44. public function test_import_accepts_template_header_with_line_break(): void
  45. {
  46. Storage::fake('upload');
  47. $user = User::factory()->create();
  48. $import = $this->createImport($user, 'Тест', "Единица измерения\nгабаритов");
  49. $this->assertTrue((new ImportCommonCatalogService($import, $user->id))->handle());
  50. $this->assertSame('DONE', $import->refresh()->status);
  51. }
  52. public function test_import_rejects_wrong_headers_with_clear_error(): void
  53. {
  54. Storage::fake('upload');
  55. $user = User::factory()->create();
  56. $import = $this->createImport($user, 'Тест', 'Неверный заголовок');
  57. $this->expectException(RuntimeException::class);
  58. $this->expectExceptionMessage('Некорректные заголовки');
  59. try {
  60. (new ImportCommonCatalogService($import, $user->id))->handle();
  61. } finally {
  62. $this->assertSame('ERROR', $import->refresh()->status);
  63. }
  64. }
  65. private function createImport(
  66. User $user,
  67. string $calculatorName,
  68. string $dimensionHeader = "Единица измерения\nгабаритов",
  69. bool $withImage = false,
  70. ): Import {
  71. $spreadsheet = new Spreadsheet;
  72. $sheet = $spreadsheet->getActiveSheet();
  73. $headers = ExportCommonCatalogService::HEADERS;
  74. $headers[8] = $dimensionHeader;
  75. $sheet->fromArray($headers, null, 'A1');
  76. $sheet->setCellValueExplicit('C3', '0254', DataType::TYPE_STRING);
  77. $sheet->setCellValue('D3', $calculatorName);
  78. $sheet->setCellValue('E3', 'Теневой навес');
  79. $sheet->setCellValue('F3', '9,15 x 3,46 x 3,43 м');
  80. $sheet->setCellValue('G3', 0);
  81. $sheet->setCellValue('I3', 'м');
  82. $sheet->setCellValue('J3', 2153.84);
  83. $sheet->setCellValue('K3', 7.93);
  84. $sheet->setCellValue('L3', 38);
  85. $sheet->setCellValue('N3', '0+');
  86. $sheet->setCellValue('O3', 10);
  87. $sheet->setCellValue('P3', 'шт.');
  88. $sheet->setCellValue('Q3', 'Теневые навесы');
  89. $sheet->setCellValue('R3', 'Наш Двор');
  90. if ($withImage) {
  91. $image = UploadedFile::fake()->image('catalog-item.png', 100, 100);
  92. $drawing = new Drawing;
  93. $drawing->setPath($image->getPathname());
  94. $drawing->setCoordinates('B3');
  95. $drawing->setWorksheet($sheet);
  96. }
  97. $filename = 'common_catalog_'.uniqid().'.xlsx';
  98. $path = Storage::disk('upload')->path($filename);
  99. (new Xlsx($spreadsheet))->save($path);
  100. return Import::query()->create([
  101. 'type' => 'common_catalog',
  102. 'filename' => $filename,
  103. 'status' => 'new',
  104. 'user_id' => $user->id,
  105. ]);
  106. }
  107. }