| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- <?php
- declare(strict_types=1);
- namespace Tests\Unit\Services\Import;
- use App\Models\Import;
- use App\Models\User;
- use App\Services\Export\ExportCommonCatalogService;
- use App\Services\Import\ImportCommonCatalogService;
- use Illuminate\Foundation\Testing\RefreshDatabase;
- use Illuminate\Http\UploadedFile;
- use Illuminate\Support\Facades\Storage;
- use PhpOffice\PhpSpreadsheet\Cell\DataType;
- use PhpOffice\PhpSpreadsheet\Spreadsheet;
- use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
- use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
- use RuntimeException;
- use Tests\TestCase;
- class ImportCommonCatalogServiceTest extends TestCase
- {
- use RefreshDatabase;
- protected bool $seed = true;
- public function test_import_creates_and_updates_by_article_while_preserving_leading_zeroes(): void
- {
- Storage::fake('upload');
- Storage::fake('public');
- $user = User::factory()->create();
- $import = $this->createImport($user, 'Оборудование для благоустройства', withImage: true);
- $this->assertTrue((new ImportCommonCatalogService($import, $user->id))->handle());
- $this->assertDatabaseHas('common_catalog_items', [
- 'article' => '0254',
- 'calculator_name' => 'Оборудование для благоустройства',
- 'places' => 38,
- ]);
- $item = \App\Models\CommonCatalogItem::query()->firstOrFail();
- $this->assertNotNull($item->imageFile);
- Storage::disk('public')->assertExists($item->imageFile->path);
- $secondImport = $this->createImport($user, 'Обновлённое наименование');
- $this->assertTrue((new ImportCommonCatalogService($secondImport, $user->id))->handle());
- $this->assertDatabaseCount('common_catalog_items', 1);
- $this->assertDatabaseHas('common_catalog_items', [
- 'article' => '0254',
- 'calculator_name' => 'Обновлённое наименование',
- ]);
- }
- public function test_import_accepts_template_header_with_line_break(): void
- {
- Storage::fake('upload');
- $user = User::factory()->create();
- $import = $this->createImport($user, 'Тест', "Единица измерения\nгабаритов");
- $this->assertTrue((new ImportCommonCatalogService($import, $user->id))->handle());
- $this->assertSame('DONE', $import->refresh()->status);
- }
- public function test_import_rejects_wrong_headers_with_clear_error(): void
- {
- Storage::fake('upload');
- $user = User::factory()->create();
- $import = $this->createImport($user, 'Тест', 'Неверный заголовок');
- $this->expectException(RuntimeException::class);
- $this->expectExceptionMessage('Некорректные заголовки');
- try {
- (new ImportCommonCatalogService($import, $user->id))->handle();
- } finally {
- $this->assertSame('ERROR', $import->refresh()->status);
- }
- }
- private function createImport(
- User $user,
- string $calculatorName,
- string $dimensionHeader = "Единица измерения\nгабаритов",
- bool $withImage = false,
- ): Import {
- $spreadsheet = new Spreadsheet;
- $sheet = $spreadsheet->getActiveSheet();
- $headers = ExportCommonCatalogService::HEADERS;
- $headers[8] = $dimensionHeader;
- $sheet->fromArray($headers, null, 'A1');
- $sheet->setCellValueExplicit('C3', '0254', DataType::TYPE_STRING);
- $sheet->setCellValue('D3', $calculatorName);
- $sheet->setCellValue('E3', 'Теневой навес');
- $sheet->setCellValue('F3', '9,15 x 3,46 x 3,43 м');
- $sheet->setCellValue('G3', 0);
- $sheet->setCellValue('I3', 'м');
- $sheet->setCellValue('J3', 2153.84);
- $sheet->setCellValue('K3', 7.93);
- $sheet->setCellValue('L3', 38);
- $sheet->setCellValue('N3', '0+');
- $sheet->setCellValue('O3', 10);
- $sheet->setCellValue('P3', 'шт.');
- $sheet->setCellValue('Q3', 'Теневые навесы');
- $sheet->setCellValue('R3', 'Наш Двор');
- if ($withImage) {
- $image = UploadedFile::fake()->image('catalog-item.png', 100, 100);
- $drawing = new Drawing;
- $drawing->setPath($image->getPathname());
- $drawing->setCoordinates('B3');
- $drawing->setWorksheet($sheet);
- }
- $filename = 'common_catalog_'.uniqid().'.xlsx';
- $path = Storage::disk('upload')->path($filename);
- (new Xlsx($spreadsheet))->save($path);
- return Import::query()->create([
- 'type' => 'common_catalog',
- 'filename' => $filename,
- 'status' => 'new',
- 'user_id' => $user->id,
- ]);
- }
- }
|