diff --git a/app/Service/Import/Importers/TogglDataImporter.php b/app/Service/Import/Importers/TogglDataImporter.php index eacb14a0..07a4bb04 100644 --- a/app/Service/Import/Importers/TogglDataImporter.php +++ b/app/Service/Import/Importers/TogglDataImporter.php @@ -6,6 +6,7 @@ namespace App\Service\Import\Importers; use Exception; use Spatie\TemporaryDirectory\TemporaryDirectory; +use ValueError; use ZipArchive; class TogglDataImporter extends DefaultImporter @@ -20,7 +21,10 @@ class TogglDataImporter extends DefaultImporter $zip = new ZipArchive(); $temporaryDirectory = TemporaryDirectory::make(); file_put_contents($temporaryDirectory->path('import.zip'), $data); - $zip->open($temporaryDirectory->path('import.zip'), ZipArchive::RDONLY); + $res = $zip->open($temporaryDirectory->path('import.zip'), ZipArchive::RDONLY); + if ($res !== true) { + throw new ImportException('Invalid ZIP, error code: '.$res); + } $temporaryDirectory = TemporaryDirectory::make(); $zip->extractTo($temporaryDirectory->path()); $zip->close(); @@ -107,6 +111,8 @@ class TogglDataImporter extends DefaultImporter ], [], (string) $task->id); } } + } catch (ValueError $exception) { + } catch (ImportException $exception) { throw $exception; } catch (Exception $exception) { diff --git a/tests/Unit/Service/Import/Importer/TogglDataImporterTest.php b/tests/Unit/Service/Import/Importer/TogglDataImporterTest.php index 2066dae4..06ebb5c5 100644 --- a/tests/Unit/Service/Import/Importer/TogglDataImporterTest.php +++ b/tests/Unit/Service/Import/Importer/TogglDataImporterTest.php @@ -5,7 +5,9 @@ declare(strict_types=1); namespace Tests\Unit\Service\Import\Importer; use App\Models\Organization; +use App\Service\Import\Importers\ImportException; use App\Service\Import\Importers\TogglDataImporter; +use Exception; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; use Spatie\TemporaryDirectory\TemporaryDirectory; @@ -27,6 +29,25 @@ class TogglDataImporterTest extends ImporterTestAbstract return $zipPath; } + public function test_import_throws_exception_if_data_is_not_zip(): void + { + // Arrange + $organization = Organization::factory()->create(); + $importer = new TogglDataImporter(); + $importer->init($organization); + + // Act + try { + $importer->importData('not a zip'); + } catch (Exception $e) { + $this->assertInstanceOf(ImportException::class, $e); + $this->assertSame('Invalid ZIP, error code: 19', $e->getMessage()); + + return; + } + $this->fail(); + } + public function test_import_of_test_file_succeeds(): void { // Arrange @@ -48,7 +69,6 @@ class TogglDataImporterTest extends ImporterTestAbstract $this->assertSame(1, $report->usersCreated); $this->assertSame(2, $report->projectsCreated); $this->assertSame(1, $report->clientsCreated); - } public function test_import_of_test_file_twice_succeeds(): void