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, ]); } }