From 7919dbf587baf5c5f9e7adc37e2168ed679ef719 Mon Sep 17 00:00:00 2001 From: Contributte AI Date: Sat, 7 Feb 2026 20:45:14 +0000 Subject: [PATCH 1/6] CI: use PHP 8.2 base, add PHP 8.4+8.5 tests, remove kodiak --- .github/.kodiak.toml | 10 ---------- .github/workflows/tests.yml | 22 ++++++++++++++-------- 2 files changed, 14 insertions(+), 18 deletions(-) delete mode 100644 .github/.kodiak.toml diff --git a/.github/.kodiak.toml b/.github/.kodiak.toml deleted file mode 100644 index 60c34b6..0000000 --- a/.github/.kodiak.toml +++ /dev/null @@ -1,10 +0,0 @@ -version = 1 - -[merge] -automerge_label = "automerge" -blacklist_title_regex = "^WIP.*" -blacklist_labels = ["WIP"] -method = "rebase" -delete_branch_on_merge = true -notify_on_conflict = true -optimistic_updates = false diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a574bd1..7d85dd5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -5,33 +5,39 @@ on: workflow_dispatch: push: - branches: [ "*" ] + branches: ["*"] schedule: - cron: "0 8 * * 1" jobs: - test83: + test85: name: "Nette Tester" uses: contributte/.github/.github/workflows/nette-tester.yml@master with: - php: "8.3" + php: "8.5" - test82: + test84: name: "Nette Tester" uses: contributte/.github/.github/workflows/nette-tester.yml@master with: - php: "8.2" + php: "8.4" - test81: + test83: name: "Nette Tester" uses: contributte/.github/.github/workflows/nette-tester.yml@master with: - php: "8.1" + php: "8.3" + + test82: + name: "Nette Tester" + uses: contributte/.github/.github/workflows/nette-tester.yml@master + with: + php: "8.2" testlower: name: "Nette Tester" uses: contributte/.github/.github/workflows/nette-tester.yml@master with: - php: "8.1" + php: "8.2" composer: "composer update --no-interaction --no-progress --prefer-dist --prefer-stable --prefer-lowest" From 0245d3ef29f8e03881d0e7541207c6e461fa6e64 Mon Sep 17 00:00:00 2001 From: Contributte AI Date: Sat, 7 Feb 2026 20:45:31 +0000 Subject: [PATCH 2/6] Tests: migrate from Codeception to Nette Tester --- codeception.yml | 15 - tests/Cases/Functional/LocalStorageTest.phpt | 294 ++++++++++++++++++ tests/Cases/Functional/TransactionTest.phpt | 170 ++++++++++ tests/Cases/Unit/FilterTest.phpt | 48 +++ tests/Cases/Unit/ImageTest.phpt | 43 +++ tests/Cases/Unit/NetteDITest.phpt | 36 +++ tests/Cases/Unit/PersistentImageTest.phpt | 16 + tests/Cases/Unit/ScopeTest.phpt | 105 +++++++ tests/Cases/Unit/StringUploaderTest.phpt | 19 ++ tests/Fixtures/FileTestCase.php | 55 ++++ .../Filter/ImagineThumbnailFilter.php | 2 +- .../Filter/ThumbnailFilter.php | 2 +- tests/{_data => Fixtures}/image.jpg | Bin tests/_output/.gitignore | 2 - tests/_support/AcceptanceTester.php | 31 -- tests/_support/FunctionalTester.php | 31 -- tests/_support/Helper/Acceptance.php | 13 - tests/_support/Helper/Functional.php | 13 - tests/_support/Helper/Unit.php | 13 - tests/_support/UnitTester.php | 31 -- tests/_support/_generated/.gitignore | 2 - tests/acceptance/.gitkeep | 0 tests/bootstrap.php | 10 + tests/functional.suite.yml | 13 - tests/functional/LocalStorageTest.php | 208 ------------- tests/functional/TransactionTest.php | 123 -------- tests/src/.gitignore | 1 - tests/src/FileTestCase.php | 51 --- tests/unit.suite.yml | 10 - tests/unit/FilterTest.php | 53 ---- tests/unit/ImageTest.php | 46 --- tests/unit/NetteDITest.php | 53 ---- tests/unit/PersistentImageTest.php | 19 -- tests/unit/ScopeTest.php | 121 ------- tests/unit/StringUploaderTest.php | 17 - 35 files changed, 798 insertions(+), 868 deletions(-) delete mode 100644 codeception.yml create mode 100644 tests/Cases/Functional/LocalStorageTest.phpt create mode 100644 tests/Cases/Functional/TransactionTest.phpt create mode 100644 tests/Cases/Unit/FilterTest.phpt create mode 100644 tests/Cases/Unit/ImageTest.phpt create mode 100644 tests/Cases/Unit/NetteDITest.phpt create mode 100644 tests/Cases/Unit/PersistentImageTest.phpt create mode 100644 tests/Cases/Unit/ScopeTest.phpt create mode 100644 tests/Cases/Unit/StringUploaderTest.phpt create mode 100644 tests/Fixtures/FileTestCase.php rename tests/{src => Fixtures}/Filter/ImagineThumbnailFilter.php (93%) rename tests/{src => Fixtures}/Filter/ThumbnailFilter.php (93%) rename tests/{_data => Fixtures}/image.jpg (100%) delete mode 100644 tests/_output/.gitignore delete mode 100644 tests/_support/AcceptanceTester.php delete mode 100644 tests/_support/FunctionalTester.php delete mode 100644 tests/_support/Helper/Acceptance.php delete mode 100644 tests/_support/Helper/Functional.php delete mode 100644 tests/_support/Helper/Unit.php delete mode 100644 tests/_support/UnitTester.php delete mode 100644 tests/_support/_generated/.gitignore delete mode 100644 tests/acceptance/.gitkeep create mode 100644 tests/bootstrap.php delete mode 100644 tests/functional.suite.yml delete mode 100644 tests/functional/LocalStorageTest.php delete mode 100644 tests/functional/TransactionTest.php delete mode 100644 tests/src/.gitignore delete mode 100644 tests/src/FileTestCase.php delete mode 100644 tests/unit.suite.yml delete mode 100644 tests/unit/FilterTest.php delete mode 100644 tests/unit/ImageTest.php delete mode 100644 tests/unit/NetteDITest.php delete mode 100644 tests/unit/PersistentImageTest.php delete mode 100644 tests/unit/ScopeTest.php delete mode 100644 tests/unit/StringUploaderTest.php diff --git a/codeception.yml b/codeception.yml deleted file mode 100644 index 98c12a2..0000000 --- a/codeception.yml +++ /dev/null @@ -1,15 +0,0 @@ -namespace: Tests -paths: - tests: tests - output: tests/_output - data: tests/_data - support: tests/_support - envs: tests/_envs -actor_suffix: Tester -coverage: - enabled: true - include: - - ./src/* -extensions: - enabled: - - Codeception\Extension\RunFailed diff --git a/tests/Cases/Functional/LocalStorageTest.phpt b/tests/Cases/Functional/LocalStorageTest.phpt new file mode 100644 index 0000000..5a59209 --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.phpt @@ -0,0 +1,294 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $persistent = $storage->persist($image); + + $case->assertTempFileExists('media/name.jpg'); + Assert::type(PersistentImageInterface::class, $persistent); + Assert::same('name.jpg', $persistent->getId()); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg', new Scope('namespace', 'scope')); + $persistent = $storage->persist($image); + + $case->assertTempFileExists('media/namespace/scope/name.jpg'); + Assert::type(PersistentImageInterface::class, $persistent); + Assert::same('namespace/scope/name.jpg', $persistent->getId()); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $persistent = $storage->persist($image); + + $case->assertTempFileExists('media/name.jpg'); + + $storage->remove($persistent); + $case->assertTempFileNotExists('media/name.jpg'); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg', new Scope('namespace', 'scope')); + $persistent = $storage->persist($image); + + $case->assertTempFileExists('media/namespace/scope/name.jpg'); + + $storage->remove($persistent); + $case->assertTempFileNotExists('media/name.jpg'); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $linkGenerator = $result->getLinkGenerator(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $persistent = $storage->persist($image); + + Assert::same('/media/name.jpg', $linkGenerator->link($persistent)); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $image = $image->withFilter(new ThumbnailFilter()); + + $storage->persist($image); + + $case->assertTempFileExists('media/name.jpg'); + $size = getimagesize($case->getAbsolutePath('media/name.jpg')); + Assert::same(15, $size[0]); + Assert::same(15, $size[1]); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $persistent = $storage->persist($image); + + $storage->persist($persistent->withFilter(new ThumbnailFilter())); + + $case->assertTempFileExists('media/name.jpg'); + $case->assertTempFileExists('cache/_thumbnail/name.jpg'); + $size = getimagesize($case->getAbsolutePath('cache/_thumbnail/name.jpg')); + Assert::same(15, $size[0]); + Assert::same(15, $size[1]); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $persistent = $storage->persist($image); + + $storage->persist($persistent->withFilter(new ThumbnailFilter())); + + $case->assertTempFileExists('media/name.jpg'); + $case->assertTempFileExists('cache/_thumbnail/name.jpg'); + + $storage->remove($persistent); + + $case->assertTempFileNotExists('media/name.jpg'); + $case->assertTempFileNotExists('cache/_thumbnail/name.jpg'); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $linkGenerator = $result->getLinkGenerator(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $persistent = $storage->persist($image); + + $link = $linkGenerator->link($persistent->withFilter(new ThumbnailFilter())); + + Assert::same('/cache/_thumbnail/name.jpg', $link); + $case->assertTempFileExists('media/name.jpg'); + $case->assertTempFileExists('cache/_thumbnail/name.jpg'); + $size = getimagesize($case->getAbsolutePath('cache/_thumbnail/name.jpg')); + Assert::same(15, $size[0]); + Assert::same(15, $size[1]); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $linkGenerator = $result->getLinkGenerator(); + + $persistent = new PersistentImage('image.jpg'); + $link = $linkGenerator->link($persistent->withFilter(new ThumbnailFilter())); + + Assert::null($link); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $linkGenerator = $result->getLinkGenerator(); + + $persistent = new PersistentImage('image.jpg'); + $link = $linkGenerator->link($persistent); + + Assert::null($link); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $fileFactory = new FileFactory(new LocalFilesystem($case->getAbsolutePath()), new PathInfoFactory()); + + $linkGenerator = new LinkGenerator($storage, $fileFactory, new ScopeDefaultImageResolver([ + 'foo' => 'noimage/foo.png', + ])); + + $storage->persist( + (new StorableImage(new FilePathUploader($case->imageJpg), 'foo.png')) + ->withScope(new Scope('noimage')) + ); + + Assert::null($linkGenerator->link(new PersistentImage('bar.png'))); + Assert::null($linkGenerator->link(new EmptyImage())); + Assert::same('/media/noimage/foo.png', $linkGenerator->link(new PersistentImage('foo/bar.png'))); + Assert::same('/media/noimage/foo.png', $linkGenerator->link(new EmptyImage(new Scope('foo')))); + Assert::same('/media/noimage/foo.png', $linkGenerator->link(new EmptyImage(), ['scope' => 'foo'])); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $fileFactory = new FileFactory(new LocalFilesystem($case->getAbsolutePath()), new PathInfoFactory()); + + $linkGenerator = new LinkGenerator($storage, $fileFactory, new ScopeDefaultImageResolver([ + 'foo' => 'noimage/foo.png', + ])); + + Assert::null($linkGenerator->link(new PersistentImage('foo/bar.png'))); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/TransactionTest.phpt b/tests/Cases/Functional/TransactionTest.phpt new file mode 100644 index 0000000..70756f1 --- /dev/null +++ b/tests/Cases/Functional/TransactionTest.phpt @@ -0,0 +1,170 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $transaction->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + + $case->assertTempFileNotExists('media/image.jpg'); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $transaction->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + + $transaction->commit(); + + $case->assertTempFileExists('media/image.jpg'); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $image = $storage->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + $case->assertTempFileExists('media/image.jpg'); + + $transaction->remove($image); + + $case->assertTempFileExists('media/image.jpg'); + + $transaction->commit(); + + $case->assertTempFileNotExists('media/image.jpg'); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $image = $storage->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + $case->assertTempFileExists('media/image.jpg'); + + $transaction->remove($image); + + $case->assertTempFileExists('media/image.jpg'); + + $transaction->commit(); + + $case->assertTempFileNotExists('media/image.jpg'); + + $transaction->rollback(); + + $case->assertTempFileExists('media/image.jpg'); + Assert::same(file_get_contents($case->imageJpg), file_get_contents($case->getAbsolutePath('media/image.jpg'))); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $transaction->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + + $transaction->commit(); + + $case->assertTempFileExists('media/image.jpg'); + + $transaction->rollback(); + + $case->assertTempFileNotExists('media/image.jpg'); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $image = $transaction->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + $transaction->remove($image); + + $transaction->commit(); + + Assert::true($image->isEmpty()); + + $case->assertTempFileNotExists('media/image.jpg'); + + $case->cleanup(); +}); + +Toolkit::test(static function (): void { + $case = new FileTestCase(); + + $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $persistent = $storage->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + $image = $transaction->remove($persistent); + $transaction->persist($image); + + $transaction->commit(); + + $case->assertTempFileExists('media/image.jpg'); + + $case->cleanup(); +}); diff --git a/tests/Cases/Unit/FilterTest.phpt b/tests/Cases/Unit/FilterTest.phpt new file mode 100644 index 0000000..c45295d --- /dev/null +++ b/tests/Cases/Unit/FilterTest.phpt @@ -0,0 +1,48 @@ +imageJpg), + 'name.jpg' + ); + $image = $image->withFilter(new ImagineThumbnailFilter()); + + $fileFactory = new FileFactory(new LocalFilesystem($case->getAbsolutePath()), new PathInfoFactory()); + + $content = $processor->process( + $fileFactory->create($image), + $fileFactory->create($image->getOriginal()), + new Context() + ); + + $size = getimagesizefromstring($content); + Assert::same(15, $size[0]); + Assert::same(15, $size[1]); + + $case->cleanup(); +}); diff --git a/tests/Cases/Unit/ImageTest.phpt b/tests/Cases/Unit/ImageTest.phpt new file mode 100644 index 0000000..7e1a99d --- /dev/null +++ b/tests/Cases/Unit/ImageTest.phpt @@ -0,0 +1,43 @@ +getName()); + Assert::same('bar/foo.jpg', $image->getId()); + Assert::same('jpg', $image->getSuffix()); + Assert::same($scope, $image->getScope()); + Assert::notSame($image, $image->withName('bar')); +}); + +Toolkit::test(static function (): void { + $image = new class('foo.jpg') extends Image { + + public function close(): void + { + $this->setClosed(); + } + + }; + + Assert::false($image->isClosed()); + $image->close(); + + Assert::true($image->isClosed()); + + Assert::exception(static function () use ($image): void { + $image->getId(); + }, ClosedImageException::class); +}); diff --git a/tests/Cases/Unit/NetteDITest.phpt b/tests/Cases/Unit/NetteDITest.phpt new file mode 100644 index 0000000..cce7727 --- /dev/null +++ b/tests/Cases/Unit/NetteDITest.phpt @@ -0,0 +1,36 @@ +load(static function (Compiler $compiler) use ($tempDir): void { + $compiler->addConfig([ + 'parameters' => [ + 'wwwDir' => $tempDir . '/www', + ], + ]); + $compiler->addExtension('http', new HttpExtension()); + $compiler->addExtension('imageStorage', new ImageStorageExtension()); + }); + + $container = new $class(); + + Assert::type(LinkGenerator::class, $container->getByType(LinkGeneratorInterface::class)); + Assert::type(FilterProcessorInterface::class, $container->getByType(FilterProcessorInterface::class)); +}); diff --git a/tests/Cases/Unit/PersistentImageTest.phpt b/tests/Cases/Unit/PersistentImageTest.phpt new file mode 100644 index 0000000..eb03103 --- /dev/null +++ b/tests/Cases/Unit/PersistentImageTest.phpt @@ -0,0 +1,16 @@ +getName()); + Assert::same('name', $image->getScope()->toString()); +}); diff --git a/tests/Cases/Unit/ScopeTest.phpt b/tests/Cases/Unit/ScopeTest.phpt new file mode 100644 index 0000000..a9124c4 --- /dev/null +++ b/tests/Cases/Unit/ScopeTest.phpt @@ -0,0 +1,105 @@ +getScopes()); + Assert::same('foo', (string) $scope); +}); + +Toolkit::test(static function (): void { + $scope = new Scope('foo', 'middle', 'bar'); + + Assert::true($scope->startsWith('foo')); + Assert::false($scope->startsWith('bar')); +}); + +Toolkit::test(static function (): void { + $scope = new Scope(); + + Assert::false($scope->startsWith('foo')); +}); + +Toolkit::test(static function (): void { + $scope = new Scope('foo', 'middle', 'bar'); + + Assert::true($scope->endsWith('bar')); + Assert::false($scope->endsWith('foo')); +}); + +Toolkit::test(static function (): void { + $scope = new Scope(); + + Assert::false($scope->endsWith('bar')); +}); + +Toolkit::test(static function (): void { + $scope = new Scope('foo', 'middle', 'bar'); + + Assert::true($scope->contains('foo')); + Assert::true($scope->contains('middle')); + Assert::true($scope->contains('bar')); + Assert::false($scope->contains('not')); +}); + +Toolkit::test(static function (): void { + $scope = new Scope(); + + Assert::false($scope->contains('bar')); +}); + +Toolkit::test(static function (): void { + $scope = new Scope('foo', 'bar'); + + Assert::same(['foo', 'bar'], $scope->getScopes()); + Assert::same('foo/bar', (string) $scope); +}); + +Toolkit::test(static function (): void { + $scope = new Scope('foo'); + $scope = $scope->withAppendedScopes('bar'); + + Assert::same(['foo', 'bar'], $scope->getScopes()); + Assert::same('foo/bar', (string) $scope); +}); + +Toolkit::test(static function (): void { + $scope = new Scope('foo'); + $scope = $scope->withPrependedScopes('bar'); + + Assert::same(['bar', 'foo'], $scope->getScopes()); + Assert::same('bar/foo', (string) $scope); +}); + +Toolkit::test(static function (): void { + $scope = Scope::fromString('bar/foo'); + + Assert::same(['bar', 'foo'], $scope->getScopes()); + Assert::same('bar/foo', (string) $scope); +}); + +Toolkit::test(static function (): void { + Assert::exception(static function (): void { + new Scope(''); + }, InvalidArgumentException::class); +}); + +Toolkit::test(static function (): void { + Assert::exception(static function (): void { + new Scope('bař'); + }, InvalidArgumentException::class); +}); + +Toolkit::test(static function (): void { + Assert::same('foo/', (new Scope('foo'))->toStringWithTrailingSlash()); + Assert::same('', (new Scope())->toStringWithTrailingSlash()); +}); diff --git a/tests/Cases/Unit/StringUploaderTest.phpt b/tests/Cases/Unit/StringUploaderTest.phpt new file mode 100644 index 0000000..fba0986 --- /dev/null +++ b/tests/Cases/Unit/StringUploaderTest.phpt @@ -0,0 +1,19 @@ +imageJpg)); + Assert::same(file_get_contents($case->imageJpg), $uploader->getContent()); + + $case->cleanup(); +}); diff --git a/tests/Fixtures/FileTestCase.php b/tests/Fixtures/FileTestCase.php new file mode 100644 index 0000000..6b2eb54 --- /dev/null +++ b/tests/Fixtures/FileTestCase.php @@ -0,0 +1,55 @@ +path = Environment::getTestDir() . '/'; + $this->imageJpg = Environment::getTestDir() . '/tmp-image.jpg'; + + FileSystem::createDir($this->path); + FileSystem::copy($this->origImageJpg, $this->imageJpg); + } + + public function cleanup(): void + { + FileSystem::delete($this->path); + + if (file_exists($this->imageJpg)) { + FileSystem::delete($this->imageJpg); + } + } + + public function assertTempFileExists(string $relativePath): void + { + Assert::true(file_exists($this->path . ltrim($relativePath, '/'))); + } + + public function assertTempFileNotExists(string $relativePath): void + { + Assert::false(file_exists($this->path . ltrim($relativePath, '/'))); + } + + public function getAbsolutePath(?string $relative = null): string + { + if ($relative === null) { + return $this->path; + } + + return $this->path . ltrim($relative, '/'); + } + +} diff --git a/tests/src/Filter/ImagineThumbnailFilter.php b/tests/Fixtures/Filter/ImagineThumbnailFilter.php similarity index 93% rename from tests/src/Filter/ImagineThumbnailFilter.php rename to tests/Fixtures/Filter/ImagineThumbnailFilter.php index 084cdb3..3385a25 100644 --- a/tests/src/Filter/ImagineThumbnailFilter.php +++ b/tests/Fixtures/Filter/ImagineThumbnailFilter.php @@ -1,6 +1,6 @@ imageJpg), 'name.jpg'); - - $persistent = $this->storage->persist($image); - - $this->assertTempFileExists('media/name.jpg'); - $this->assertInstanceOf(PersistentImageInterface::class, $persistent); - $this->assertSame('name.jpg', $persistent->getId()); - } - - public function testPersistScope(): void - { - $image = new StorableImage(new FilePathUploader($this->imageJpg), 'name.jpg', new Scope('namespace', 'scope')); - - $persistent = $this->storage->persist($image); - - $this->assertTempFileExists('media/namespace/scope/name.jpg'); - $this->assertInstanceOf(PersistentImageInterface::class, $persistent); - $this->assertSame('namespace/scope/name.jpg', $persistent->getId()); - } - - public function testRemove(): void - { - $image = new StorableImage(new FilePathUploader($this->imageJpg), 'name.jpg'); - - $persistent = $this->storage->persist($image); - - $this->assertTempFileExists('media/name.jpg'); - - $this->storage->remove($persistent); - $this->assertTempFileNotExists('media/name.jpg'); - } - - public function testRemoveScope(): void - { - $image = new StorableImage(new FilePathUploader($this->imageJpg), 'name.jpg', new Scope('namespace', 'scope')); - - $persistent = $this->storage->persist($image); - - $this->assertTempFileExists('media/namespace/scope/name.jpg'); - - $this->storage->remove($persistent); - $this->assertTempFileNotExists('media/name.jpg'); - } - - public function testUrl(): void - { - $image = new StorableImage(new FilePathUploader($this->imageJpg), 'name.jpg'); - - $persistent = $this->storage->persist($image); - - $this->assertSame('/media/name.jpg', $this->linkGenerator->link($persistent)); - } - - public function testFiltersWithNewUpload(): void - { - $image = new StorableImage(new FilePathUploader($this->imageJpg), 'name.jpg'); - $image = $image->withFilter(new ThumbnailFilter()); - - $this->storage->persist($image); - - $this->assertTempFileExists('media/name.jpg'); - $size = getimagesize($this->getAbsolutePath('media/name.jpg')); - $this->assertSame(15, $size[0]); - $this->assertSame(15, $size[1]); - } - - public function testFilterExistingImage(): void - { - $image = new StorableImage(new FilePathUploader($this->imageJpg), 'name.jpg'); - $persistent = $this->storage->persist($image); - - $this->storage->persist($persistent->withFilter(new ThumbnailFilter())); - - $this->assertTempFileExists('media/name.jpg'); - $this->assertTempFileExists('cache/_thumbnail/name.jpg'); - $size = getimagesize($this->getAbsolutePath('cache/_thumbnail/name.jpg')); - $this->assertSame(15, $size[0]); - $this->assertSame(15, $size[1]); - } - - public function testFilterImageAndDelete(): void - { - $image = new StorableImage(new FilePathUploader($this->imageJpg), 'name.jpg'); - $persistent = $this->storage->persist($image); - - $this->storage->persist($persistent->withFilter(new ThumbnailFilter())); - - $this->assertTempFileExists('media/name.jpg'); - $this->assertTempFileExists('cache/_thumbnail/name.jpg'); - - $this->storage->remove($persistent); - - $this->assertTempFileNotExists('media/name.jpg'); - $this->assertTempFileNotExists('cache/_thumbnail/name.jpg'); - } - - public function testToUrlWithFilter(): void - { - $image = new StorableImage(new FilePathUploader($this->imageJpg), 'name.jpg'); - $persistent = $this->storage->persist($image); - - $link = $this->linkGenerator->link($persistent->withFilter(new ThumbnailFilter())); - - $this->assertSame('/cache/_thumbnail/name.jpg', $link); - $this->assertTempFileExists('media/name.jpg'); - $this->assertTempFileExists('cache/_thumbnail/name.jpg'); - $size = getimagesize($this->getAbsolutePath('cache/_thumbnail/name.jpg')); - $this->assertSame(15, $size[0]); - $this->assertSame(15, $size[1]); - } - - public function testToUrlWithFilterAndImageNotExists(): void - { - $persistent = new PersistentImage('image.jpg'); - - $link = $this->linkGenerator->link($persistent->withFilter(new ThumbnailFilter())); - - $this->assertNull($link); - } - - public function testToUrlAndImageNotExists(): void - { - $persistent = new PersistentImage('image.jpg'); - - $link = $this->linkGenerator->link($persistent); - - $this->assertNull($link); - } - - public function testScopeDefaultImageResolve(): void - { - $linkGenerator = new LinkGenerator($this->storage, $this->fileFactory, new ScopeDefaultImageResolver([ - 'foo' => 'noimage/foo.png', - ])); - - $this->storage->persist( - $this->createStorable('foo.png') - ->withScope(new Scope('noimage')) - ); - - $this->assertNull($linkGenerator->link(new PersistentImage('bar.png'))); - $this->assertNull($linkGenerator->link(new EmptyImage())); - $this->assertSame('/media/noimage/foo.png', $linkGenerator->link(new PersistentImage('foo/bar.png'))); - $this->assertSame('/media/noimage/foo.png', $linkGenerator->link(new EmptyImage(new Scope('foo')))); - $this->assertSame('/media/noimage/foo.png', $linkGenerator->link(new EmptyImage(), ['scope' => 'foo'])); - } - - public function testScopeDefaultImageResolverRecursion(): void - { - $linkGenerator = new LinkGenerator($this->storage, $this->fileFactory, new ScopeDefaultImageResolver([ - 'foo' => 'noimage/foo.png', - ])); - - $this->assertNull($linkGenerator->link(new PersistentImage('foo/bar.png'))); - } - - protected function _before(): void - { - parent::_before(); - - $builder = new LocalImageStorageBuilder($this->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $this->fileFactory = new FileFactory(new LocalFilesystem($this->getAbsolutePath()), new PathInfoFactory()); - $this->storage = $result->getImageStorage(); - $this->linkGenerator = $result->getLinkGenerator(); - } - - private function createStorable(string $name = 'name.jpg'): StorableImageInterface - { - return new StorableImage(new FilePathUploader($this->imageJpg), $name); - } - -} diff --git a/tests/functional/TransactionTest.php b/tests/functional/TransactionTest.php deleted file mode 100644 index 79ee172..0000000 --- a/tests/functional/TransactionTest.php +++ /dev/null @@ -1,123 +0,0 @@ -transactionFactory->create(); - $transaction->persist(new StorableImage(new FilePathUploader($this->imageJpg), 'image.jpg')); - - $this->assertTempFileNotExists('media/image.jpg'); - } - - public function testCommit(): void - { - $transaction = $this->transactionFactory->create(); - $transaction->persist(new StorableImage(new FilePathUploader($this->imageJpg), 'image.jpg')); - - $transaction->commit(); - - $this->assertTempFileExists('media/image.jpg'); - } - - public function testCommitRemove(): void - { - $transaction = $this->transactionFactory->create(); - $image = $this->storage->persist(new StorableImage(new FilePathUploader($this->imageJpg), 'image.jpg')); - $this->assertTempFileExists('media/image.jpg'); - - $transaction->remove($image); - - $this->assertTempFileExists('media/image.jpg'); - - $transaction->commit(); - - $this->assertTempFileNotExists('media/image.jpg'); - } - - public function testRollbackRemove(): void - { - $transaction = $this->transactionFactory->create(); - $image = $this->storage->persist(new StorableImage(new FilePathUploader($this->imageJpg), 'image.jpg')); - $this->assertTempFileExists('media/image.jpg'); - - $transaction->remove($image); - - $this->assertTempFileExists('media/image.jpg'); - - $transaction->commit(); - - $this->assertTempFileNotExists('media/image.jpg'); - - $transaction->rollback(); - - $this->assertTempFileExists('media/image.jpg'); - $this->assertFileEquals($this->imageJpg, $this->getAbsolutePath('media/image.jpg')); - } - - public function testRollback(): void - { - $transaction = $this->transactionFactory->create(); - $transaction->persist(new StorableImage(new FilePathUploader($this->imageJpg), 'image.jpg')); - - $transaction->commit(); - - $this->assertTempFileExists('media/image.jpg'); - - $transaction->rollback(); - - $this->assertTempFileNotExists('media/image.jpg'); - } - - public function testPersistAndRemoveSameImage(): void - { - $transaction = $this->transactionFactory->create(); - $image = $transaction->persist(new StorableImage(new FilePathUploader($this->imageJpg), 'image.jpg')); - $transaction->remove($image); - - $transaction->commit(); - - $this->assertTrue($image->isEmpty()); - - $this->assertTempFileNotExists('media/image.jpg'); - } - - public function testRemoveAndPersistSameImage(): void - { - $transaction = $this->transactionFactory->create(); - $persistent = $this->storage->persist(new StorableImage(new FilePathUploader($this->imageJpg), 'image.jpg')); - $image = $transaction->remove($persistent); - $transaction->persist($image); - - $transaction->commit(); - - $this->assertTempFileExists('media/image.jpg'); - } - - protected function _before(): void - { - parent::_before(); - - $builder = new LocalImageStorageBuilder($this->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $this->storage = $result->getImageStorage(); - $this->transactionFactory = $result->getTransactionFactory(); - } - -} diff --git a/tests/src/.gitignore b/tests/src/.gitignore deleted file mode 100644 index 82520ca..0000000 --- a/tests/src/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/tmp/ diff --git a/tests/src/FileTestCase.php b/tests/src/FileTestCase.php deleted file mode 100644 index ab4af90..0000000 --- a/tests/src/FileTestCase.php +++ /dev/null @@ -1,51 +0,0 @@ -filesystem = new Filesystem(); - - $this->filesystem->mkdir($this->path = __DIR__ . '/tmp/'); - $this->filesystem->copy($this->origImageJpg, $this->imageJpg); - } - - protected function _after(): void - { - $this->filesystem->remove([__DIR__ . '/tmp', $this->imageJpg]); - } - - protected function assertTempFileExists(string $relativePath): void - { - $this->assertFileExists($this->path . ltrim($relativePath, '/')); - } - - protected function assertTempFileNotExists(string $relativePath): void - { - $this->assertFileNotExists($this->path . ltrim($relativePath, '/')); - } - - protected function getAbsolutePath(?string $relative = null): string - { - if (!$relative) { - return $this->path; - } - - return $this->path . ltrim($relative, '/'); - } - -} diff --git a/tests/unit.suite.yml b/tests/unit.suite.yml deleted file mode 100644 index 60664a8..0000000 --- a/tests/unit.suite.yml +++ /dev/null @@ -1,10 +0,0 @@ -# Codeception Test Suite Configuration -# -# Suite for unit or integration tests. - -actor: UnitTester -modules: - enabled: - - Asserts - - Tests\Helper\Unit - step_decorators: ~ diff --git a/tests/unit/FilterTest.php b/tests/unit/FilterTest.php deleted file mode 100644 index c967ce3..0000000 --- a/tests/unit/FilterTest.php +++ /dev/null @@ -1,53 +0,0 @@ -imageJpg), - 'name.jpg' - ); - $image = $image->withFilter(new ImagineThumbnailFilter()); - - $fileFactory = new FileFactory(new LocalFilesystem($this->getAbsolutePath()), new PathInfoFactory()); - - $content = $this->processor->process( - $fileFactory->create($image), - $fileFactory->create($image->getOriginal()), - new Context() - ); - - $size = getimagesizefromstring($content); - $this->assertSame(15, $size[0]); - $this->assertSame(15, $size[1]); - } - - protected function _before(): void - { - parent::_before(); - - $this->processor = new FilterProcessor( - new ImagineResourceFactory(), - [new ImagineOperationProcessor()], - ); - } - -} diff --git a/tests/unit/ImageTest.php b/tests/unit/ImageTest.php deleted file mode 100644 index 6f94654..0000000 --- a/tests/unit/ImageTest.php +++ /dev/null @@ -1,46 +0,0 @@ -assertSame('foo.jpg', $image->getName()); - $this->assertSame('bar/foo.jpg', $image->getId()); - $this->assertSame('jpg', $image->getSuffix()); - $this->assertSame($scope, $image->getScope()); - $this->assertNotSame($image, $new = $image->withName('bar')); - } - - public function testClose(): void - { - $image = new class('foo.jpg') extends Image { - - public function close(): void - { - $this->setClosed(); - } - - }; - - $this->assertFalse($image->isClosed()); - $image->close(); - - $this->assertTrue($image->isClosed()); - - $this->expectException(ClosedImageException::class); - $image->getId(); - } - -} diff --git a/tests/unit/NetteDITest.php b/tests/unit/NetteDITest.php deleted file mode 100644 index 19291ab..0000000 --- a/tests/unit/NetteDITest.php +++ /dev/null @@ -1,53 +0,0 @@ -assertInstanceOf(LinkGenerator::class, $this->container->getByType(LinkGeneratorInterface::class)); - $this->assertInstanceOf(FilterProcessorInterface::class, $this->container->getByType(FilterProcessorInterface::class)); - } - - protected function _before(): void - { - $this->tempDir = new TemporaryDirectory(__DIR__ . '/_tmp'); - $this->tempDir->delete(); - - $loader = new ContainerLoader($this->tempDir->path('di')); - $class = $loader->load(function (Compiler $compiler): void { - $compiler->addConfig([ - 'parameters' => [ - 'wwwDir' => $this->tempDir->path('www'), - ], - ]); - $compiler->addExtension('http', new HttpExtension()); - $compiler->addExtension('imageStorage', new ImageStorageExtension()); - }); - - $this->container = new $class(); - } - - protected function _after(): void - { - $this->tempDir->delete(); - } - -} diff --git a/tests/unit/PersistentImageTest.php b/tests/unit/PersistentImageTest.php deleted file mode 100644 index 698578c..0000000 --- a/tests/unit/PersistentImageTest.php +++ /dev/null @@ -1,19 +0,0 @@ -assertSame('test.jpg', $image->getName()); - $this->assertSame('name', $image->getScope()->toString()); - } - -} diff --git a/tests/unit/ScopeTest.php b/tests/unit/ScopeTest.php deleted file mode 100644 index 53bedd8..0000000 --- a/tests/unit/ScopeTest.php +++ /dev/null @@ -1,121 +0,0 @@ -assertSame(['foo'], $scope->getScopes()); - $this->assertSame('foo', (string) $scope); - } - - public function testStartsWith(): void - { - $scope = new Scope('foo', 'middle', 'bar'); - - $this->assertTrue($scope->startsWith('foo')); - $this->assertFalse($scope->startsWith('bar')); - } - - public function testStartsWithEmptyArray(): void - { - $scope = new Scope(); - - $this->assertFalse($scope->startsWith('foo')); - } - - public function testEndsWith(): void - { - $scope = new Scope('foo', 'middle', 'bar'); - - $this->assertTrue($scope->endsWith('bar')); - $this->assertFalse($scope->endsWith('foo')); - } - - public function testEndsWithEmptyArray(): void - { - $scope = new Scope(); - - $this->assertFalse($scope->endsWith('bar')); - } - - public function testContains(): void - { - $scope = new Scope('foo', 'middle', 'bar'); - - $this->assertTrue($scope->contains('foo')); - $this->assertTrue($scope->contains('middle')); - $this->assertTrue($scope->contains('bar')); - $this->assertFalse($scope->contains('not')); - } - - public function testContainsWithEmptyArray(): void - { - $scope = new Scope(); - - $this->assertFalse($scope->contains('bar')); - } - - public function testMultiScope(): void - { - $scope = new Scope('foo', 'bar'); - - $this->assertSame(['foo', 'bar'], $scope->getScopes()); - $this->assertSame('foo/bar', (string) $scope); - } - - public function testWithAppendedScope(): void - { - $scope = new Scope('foo'); - $scope = $scope->withAppendedScopes('bar'); - - $this->assertSame(['foo', 'bar'], $scope->getScopes()); - $this->assertSame('foo/bar', (string) $scope); - } - - public function testWithPrependedScope(): void - { - $scope = new Scope('foo'); - $scope = $scope->withPrependedScopes('bar'); - - $this->assertSame(['bar', 'foo'], $scope->getScopes()); - $this->assertSame('bar/foo', (string) $scope); - } - - public function testFromString(): void - { - $scope = Scope::fromString('bar/foo'); - - $this->assertSame(['bar', 'foo'], $scope->getScopes()); - $this->assertSame('bar/foo', (string) $scope); - } - - public function testEmpty(): void - { - $this->expectException(InvalidArgumentException::class); - - new Scope(''); - } - - public function testInvalidChars(): void - { - $this->expectException(InvalidArgumentException::class); - - new Scope('bař'); - } - - public function testTrailingSlash(): void - { - $this->assertSame('foo/', (new Scope('foo'))->toStringWithTrailingSlash()); - $this->assertSame('', (new Scope())->toStringWithTrailingSlash()); - } - -} diff --git a/tests/unit/StringUploaderTest.php b/tests/unit/StringUploaderTest.php deleted file mode 100644 index 35562ef..0000000 --- a/tests/unit/StringUploaderTest.php +++ /dev/null @@ -1,17 +0,0 @@ -imageJpg)); - $this->assertSame(file_get_contents($this->imageJpg), $uploader->getContent()); - } - -} From decd4bfb29264032cd12c6826e5d33543893133b Mon Sep 17 00:00:00 2001 From: Contributte AI Date: Sat, 7 Feb 2026 20:45:47 +0000 Subject: [PATCH 3/6] Config: use PHP 8.2 base, update phpstan and ruleset, fix CS --- Makefile | 9 +-- phpstan.neon | 63 ++++++++++++++++---- ruleset.xml | 10 +--- src/Bridge/Nette/Form/ImageUploadControl.php | 22 +++---- 4 files changed, 66 insertions(+), 38 deletions(-) diff --git a/Makefile b/Makefile index 402ecb8..33bc117 100644 --- a/Makefile +++ b/Makefile @@ -23,15 +23,12 @@ phpstan: .PHONY: tests tests: - vendor/bin/codecept build - vendor/bin/codecept run --debug + vendor/bin/tester -s -p php --colors 1 -C tests/Cases .PHONY: coverage coverage: ifdef GITHUB_ACTION - vendor/bin/codecept build - vendor/bin/codecept run --coverage-xml + vendor/bin/tester -s -p phpdbg --colors 1 -C --coverage coverage.xml --coverage-src src tests/Cases else - vendor/bin/codecept build - vendor/bin/codecept run --coverage-html + vendor/bin/tester -s -p phpdbg --colors 1 -C --coverage coverage.html --coverage-src src tests/Cases endif diff --git a/phpstan.neon b/phpstan.neon index 12c539c..32c128a 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,13 +1,9 @@ includes: - #- vendor/contributte/phpstan/phpstan.neon - - vendor/phpstan/phpstan-deprecation-rules/rules.neon - - vendor/phpstan/phpstan-nette/extension.neon - - vendor/phpstan/phpstan-nette/rules.neon - #- vendor/phpstan/phpstan-strict-rules/rules.neon + - vendor/contributte/phpstan/phpstan.neon parameters: level: 8 - phpVersion: 80100 + phpVersion: 80200 scanDirectories: - src @@ -19,7 +15,56 @@ parameters: - src - .docs + reportUnmatchedIgnoredErrors: false + ignoreErrors: + # Strict rules - pre-existing codebase patterns + - + identifier: booleanNot.exprNotBoolean + - + identifier: booleanAnd.leftNotBoolean + - + identifier: booleanAnd.rightNotBoolean + - + identifier: booleanOr.leftNotBoolean + - + identifier: booleanOr.rightNotBoolean + - + identifier: if.condNotBoolean + - + identifier: elseif.condNotBoolean + - + identifier: ternary.condNotBoolean + - + identifier: ternary.shortNotAllowed + - + identifier: foreach.nonIterable + - + identifier: foreach.valueOverwrite + - + identifier: property.dynamicName + - + identifier: return.type + - + identifier: return.unusedType + - + identifier: function.alreadyNarrowedType + - + identifier: notIdentical.alwaysTrue + - + identifier: constructor.missingParentCall + + # Covariance issues (Doctrine EventSubscriber, Latte Extension) + - + identifier: method.childReturnType + paths: + - src/Bridge/Doctrine/Event/ + - src/Bridge/Nette/Latte/Extension/ + + # Nette Arrays::invoke callable signature + - + message: "#^Parameter \\#1 \\$callbacks of static method Nette\\\\Utils\\\\Arrays\\:\\:invoke\\(\\)#" + - message: """ #^Call to deprecated method getName\\(\\) of class Contributte\\\\Imagist\\\\Bridge\\\\Doctrine\\\\ImageType\\: @@ -59,11 +104,6 @@ parameters: count: 1 path: src/Bridge/Symfony/Serializer/ImagistNormalizer.php - - - message: "#^Method Contributte\\\\Imagist\\\\Bridge\\\\Symfony\\\\Serializer\\\\ImagistNormalizer\\:\\:supportsNormalization\\(\\) has parameter \\$context with no value type specified in iterable type array\\.$#" - count: 1 - path: src/Bridge/Symfony/Serializer/ImagistNormalizer.php - - message: "#^PHPDoc tag @return with type mixed is not subtype of native type array\\|ArrayObject\\|bool\\|float\\|int\\|string\\|null\\.$#" count: 1 @@ -88,4 +128,3 @@ parameters: message: "#^Method Contributte\\\\Imagist\\\\Entity\\\\PromisedImage\\:\\:withScope\\(\\) should return Contributte\\\\Imagist\\\\Entity\\\\PromisedImage but returns Contributte\\\\Imagist\\\\Entity\\\\PersistentImageInterface\\.$#" count: 1 path: src/Entity/PromisedImage.php - diff --git a/ruleset.xml b/ruleset.xml index a785de9..3873aba 100644 --- a/ruleset.xml +++ b/ruleset.xml @@ -1,7 +1,7 @@ - + @@ -12,11 +12,7 @@ - - - - - + @@ -26,5 +22,5 @@ - /tests + /tests/tmp diff --git a/src/Bridge/Nette/Form/ImageUploadControl.php b/src/Bridge/Nette/Form/ImageUploadControl.php index 039c673..94fe3ec 100644 --- a/src/Bridge/Nette/Form/ImageUploadControl.php +++ b/src/Bridge/Nette/Form/ImageUploadControl.php @@ -66,11 +66,7 @@ public static function validateFileSize(ImageUploadControl $control, int|float $ return true; } - if ($file->getSize() > $limit || $file->getError() === UPLOAD_ERR_INI_SIZE) { - return false; - } - - return true; + return $file->getSize() <= $limit && $file->getError() !== UPLOAD_ERR_INI_SIZE; } public function isFilled(): bool @@ -78,14 +74,6 @@ public function isFilled(): bool return $this->value || $this->uploadValue; } - private function isOk(): bool - { - return match (true) { - !$this->uploadValue => false, - default => $this->uploadValue->isOk(), - }; - } - public function loadHttpData(): void { $value = $this->getHttpData(Form::DataFile); @@ -250,4 +238,12 @@ public function setRemove(?ImageRemoveInterface $remove): static return $this; } + private function isOk(): bool + { + return match (true) { + !$this->uploadValue => false, + default => $this->uploadValue->isOk(), + }; + } + } From 85adc5908fc481642758c94bc91c345f4a51c711 Mon Sep 17 00:00:00 2001 From: Contributte AI Date: Sat, 7 Feb 2026 20:46:03 +0000 Subject: [PATCH 4/6] Composer: require PHP 8.2, use contributte/tester, full versions --- composer.json | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index b60a86b..14e03de 100644 --- a/composer.json +++ b/composer.json @@ -6,17 +6,16 @@ "MIT" ], "require": { - "php": ">=8.1", + "php": ">=8.2", "ext-fileinfo": "*", "nette/utils": "^4.0.3", "league/flysystem": "^2.5.0 || ^3.23.0", "psr/event-dispatcher": "^1.0.0" }, "require-dev": { - "codeception/codeception": "^5.0.13", - "codeception/module-asserts": "^3.0.0", - "codeception/module-phpbrowser": "^3.0.1", - "phpunit/php-code-coverage": "^10.1.11", + "contributte/qa": "~0.4.0", + "contributte/tester": "~0.3.0", + "contributte/phpstan": "~0.2.0", "doctrine/annotations": "^1.14.3", "doctrine/dbal": "^3.7.2", "imagine/imagine": "^1.3.5", @@ -25,14 +24,9 @@ "nette/di": "^3.1.8", "nette/forms": "^3.1.14", "nette/http": "^3.2.3", - "nettrine/orm": "^0.8.4", - "contributte/qa": "^0.4", - "contributte/phpunit": "^0.2", - "contributte/phpstan": "^0.1", + "nettrine/orm": "~0.8.4", "ramsey/uuid": "^4.7.5", - "spatie/temporary-directory": "^1.3.0", "symfony/dependency-injection": "^6.4.0 || ^7.0.0", - "symfony/filesystem": "^6.4.0 || ^7.0.0", "symfony/http-foundation": "^6.4.0 || ^7.0.0", "symfony/http-kernel": "^6.4.0 || ^7.0.0", "symfony/serializer": "^6.4.0 || ^7.0.0", @@ -46,9 +40,7 @@ }, "autoload-dev": { "psr-4": { - "Tests\\Testing\\": "tests/src", - "Tests\\Unit\\": "tests/unit", - "Tests\\Functional\\": "tests/functional" + "Tests\\": "tests" } }, "minimum-stability": "dev", From 87415fbd3a040501b0276e84c5953768370eeba3 Mon Sep 17 00:00:00 2001 From: Contributte AI Date: Sun, 8 Feb 2026 15:45:47 +0000 Subject: [PATCH 5/6] Config: add Tracy BlueScreen phpstan ignores --- phpstan.neon | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/phpstan.neon b/phpstan.neon index 32c128a..05ab50b 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -54,6 +54,14 @@ parameters: - identifier: constructor.missingParentCall + # Tracy BlueScreen callable type mismatch + - + identifier: argument.type + path: src/Bridge/Nette/Tracy/ImagistBlueScreen.php + - + identifier: arguments.count + path: src/Bridge/Nette/Tracy/ImagistBlueScreen.php + # Covariance issues (Doctrine EventSubscriber, Latte Extension) - identifier: method.childReturnType From 4ebb429bb8a7170e7d3ae3f383e577a56b725fc5 Mon Sep 17 00:00:00 2001 From: Contributte AI Date: Mon, 9 Feb 2026 13:08:23 +0000 Subject: [PATCH 6/6] Tests: split into per-usecase .phpt files --- .../LocalStorageTest.filterAndDelete.phpt | 37 +++ .../LocalStorageTest.filterExisting.phpt | 36 +++ .../LocalStorageTest.filterNewUpload.phpt | 35 +++ .../Functional/LocalStorageTest.persist.phpt | 32 ++ .../LocalStorageTest.persistScope.phpt | 33 ++ tests/Cases/Functional/LocalStorageTest.phpt | 294 ------------------ .../Functional/LocalStorageTest.remove.phpt | 31 ++ .../LocalStorageTest.removeScope.phpt | 32 ++ .../LocalStorageTest.scopeDefaultImage.phpt | 48 +++ ...torageTest.scopeDefaultImageRecursion.phpt | 35 +++ .../Functional/LocalStorageTest.url.phpt | 30 ++ .../LocalStorageTest.urlNotExists.phpt | 28 ++ .../LocalStorageTest.urlWithFilter.phpt | 38 +++ ...calStorageTest.urlWithFilterNotExists.phpt | 29 ++ .../Functional/TransactionTest.commit.phpt | 30 ++ .../TransactionTest.commitRemove.phpt | 36 +++ .../TransactionTest.persistAndRemoveSame.phpt | 34 ++ tests/Cases/Functional/TransactionTest.phpt | 170 ---------- .../Functional/TransactionTest.preCommit.phpt | 28 ++ .../TransactionTest.removeAndPersistSame.phpt | 33 ++ .../Functional/TransactionTest.rollback.phpt | 34 ++ .../TransactionTest.rollbackRemove.phpt | 42 +++ tests/Cases/Unit/ImageTest.basic.phpt | 22 ++ .../{ImageTest.phpt => ImageTest.close.phpt} | 13 - tests/Cases/Unit/ScopeTest.contains.phpt | 24 ++ tests/Cases/Unit/ScopeTest.empty.phpt | 16 + tests/Cases/Unit/ScopeTest.endsWith.phpt | 22 ++ tests/Cases/Unit/ScopeTest.fromString.phpt | 16 + tests/Cases/Unit/ScopeTest.invalidChars.phpt | 16 + tests/Cases/Unit/ScopeTest.multiScope.phpt | 16 + tests/Cases/Unit/ScopeTest.oneScope.phpt | 16 + tests/Cases/Unit/ScopeTest.phpt | 105 ------- tests/Cases/Unit/ScopeTest.startsWith.phpt | 22 ++ tests/Cases/Unit/ScopeTest.trailingSlash.phpt | 14 + tests/Cases/Unit/ScopeTest.withAppended.phpt | 17 + tests/Cases/Unit/ScopeTest.withPrepended.phpt | 17 + 36 files changed, 899 insertions(+), 582 deletions(-) create mode 100644 tests/Cases/Functional/LocalStorageTest.filterAndDelete.phpt create mode 100644 tests/Cases/Functional/LocalStorageTest.filterExisting.phpt create mode 100644 tests/Cases/Functional/LocalStorageTest.filterNewUpload.phpt create mode 100644 tests/Cases/Functional/LocalStorageTest.persist.phpt create mode 100644 tests/Cases/Functional/LocalStorageTest.persistScope.phpt delete mode 100644 tests/Cases/Functional/LocalStorageTest.phpt create mode 100644 tests/Cases/Functional/LocalStorageTest.remove.phpt create mode 100644 tests/Cases/Functional/LocalStorageTest.removeScope.phpt create mode 100644 tests/Cases/Functional/LocalStorageTest.scopeDefaultImage.phpt create mode 100644 tests/Cases/Functional/LocalStorageTest.scopeDefaultImageRecursion.phpt create mode 100644 tests/Cases/Functional/LocalStorageTest.url.phpt create mode 100644 tests/Cases/Functional/LocalStorageTest.urlNotExists.phpt create mode 100644 tests/Cases/Functional/LocalStorageTest.urlWithFilter.phpt create mode 100644 tests/Cases/Functional/LocalStorageTest.urlWithFilterNotExists.phpt create mode 100644 tests/Cases/Functional/TransactionTest.commit.phpt create mode 100644 tests/Cases/Functional/TransactionTest.commitRemove.phpt create mode 100644 tests/Cases/Functional/TransactionTest.persistAndRemoveSame.phpt delete mode 100644 tests/Cases/Functional/TransactionTest.phpt create mode 100644 tests/Cases/Functional/TransactionTest.preCommit.phpt create mode 100644 tests/Cases/Functional/TransactionTest.removeAndPersistSame.phpt create mode 100644 tests/Cases/Functional/TransactionTest.rollback.phpt create mode 100644 tests/Cases/Functional/TransactionTest.rollbackRemove.phpt create mode 100644 tests/Cases/Unit/ImageTest.basic.phpt rename tests/Cases/Unit/{ImageTest.phpt => ImageTest.close.phpt} (61%) create mode 100644 tests/Cases/Unit/ScopeTest.contains.phpt create mode 100644 tests/Cases/Unit/ScopeTest.empty.phpt create mode 100644 tests/Cases/Unit/ScopeTest.endsWith.phpt create mode 100644 tests/Cases/Unit/ScopeTest.fromString.phpt create mode 100644 tests/Cases/Unit/ScopeTest.invalidChars.phpt create mode 100644 tests/Cases/Unit/ScopeTest.multiScope.phpt create mode 100644 tests/Cases/Unit/ScopeTest.oneScope.phpt delete mode 100644 tests/Cases/Unit/ScopeTest.phpt create mode 100644 tests/Cases/Unit/ScopeTest.startsWith.phpt create mode 100644 tests/Cases/Unit/ScopeTest.trailingSlash.phpt create mode 100644 tests/Cases/Unit/ScopeTest.withAppended.phpt create mode 100644 tests/Cases/Unit/ScopeTest.withPrepended.phpt diff --git a/tests/Cases/Functional/LocalStorageTest.filterAndDelete.phpt b/tests/Cases/Functional/LocalStorageTest.filterAndDelete.phpt new file mode 100644 index 0000000..2422c55 --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.filterAndDelete.phpt @@ -0,0 +1,37 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $persistent = $storage->persist($image); + + $storage->persist($persistent->withFilter(new ThumbnailFilter())); + + $case->assertTempFileExists('media/name.jpg'); + $case->assertTempFileExists('cache/_thumbnail/name.jpg'); + + $storage->remove($persistent); + + $case->assertTempFileNotExists('media/name.jpg'); + $case->assertTempFileNotExists('cache/_thumbnail/name.jpg'); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/LocalStorageTest.filterExisting.phpt b/tests/Cases/Functional/LocalStorageTest.filterExisting.phpt new file mode 100644 index 0000000..86e36a1 --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.filterExisting.phpt @@ -0,0 +1,36 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $persistent = $storage->persist($image); + + $storage->persist($persistent->withFilter(new ThumbnailFilter())); + + $case->assertTempFileExists('media/name.jpg'); + $case->assertTempFileExists('cache/_thumbnail/name.jpg'); + $size = getimagesize($case->getAbsolutePath('cache/_thumbnail/name.jpg')); + Assert::same(15, $size[0]); + Assert::same(15, $size[1]); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/LocalStorageTest.filterNewUpload.phpt b/tests/Cases/Functional/LocalStorageTest.filterNewUpload.phpt new file mode 100644 index 0000000..acd51a8 --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.filterNewUpload.phpt @@ -0,0 +1,35 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $image = $image->withFilter(new ThumbnailFilter()); + + $storage->persist($image); + + $case->assertTempFileExists('media/name.jpg'); + $size = getimagesize($case->getAbsolutePath('media/name.jpg')); + Assert::same(15, $size[0]); + Assert::same(15, $size[1]); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/LocalStorageTest.persist.phpt b/tests/Cases/Functional/LocalStorageTest.persist.phpt new file mode 100644 index 0000000..634c8a3 --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.persist.phpt @@ -0,0 +1,32 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $persistent = $storage->persist($image); + + $case->assertTempFileExists('media/name.jpg'); + Assert::type(PersistentImageInterface::class, $persistent); + Assert::same('name.jpg', $persistent->getId()); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/LocalStorageTest.persistScope.phpt b/tests/Cases/Functional/LocalStorageTest.persistScope.phpt new file mode 100644 index 0000000..ec67c93 --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.persistScope.phpt @@ -0,0 +1,33 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg', new Scope('namespace', 'scope')); + $persistent = $storage->persist($image); + + $case->assertTempFileExists('media/namespace/scope/name.jpg'); + Assert::type(PersistentImageInterface::class, $persistent); + Assert::same('namespace/scope/name.jpg', $persistent->getId()); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/LocalStorageTest.phpt b/tests/Cases/Functional/LocalStorageTest.phpt deleted file mode 100644 index 5a59209..0000000 --- a/tests/Cases/Functional/LocalStorageTest.phpt +++ /dev/null @@ -1,294 +0,0 @@ -getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - - $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); - $persistent = $storage->persist($image); - - $case->assertTempFileExists('media/name.jpg'); - Assert::type(PersistentImageInterface::class, $persistent); - Assert::same('name.jpg', $persistent->getId()); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - - $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg', new Scope('namespace', 'scope')); - $persistent = $storage->persist($image); - - $case->assertTempFileExists('media/namespace/scope/name.jpg'); - Assert::type(PersistentImageInterface::class, $persistent); - Assert::same('namespace/scope/name.jpg', $persistent->getId()); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - - $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); - $persistent = $storage->persist($image); - - $case->assertTempFileExists('media/name.jpg'); - - $storage->remove($persistent); - $case->assertTempFileNotExists('media/name.jpg'); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - - $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg', new Scope('namespace', 'scope')); - $persistent = $storage->persist($image); - - $case->assertTempFileExists('media/namespace/scope/name.jpg'); - - $storage->remove($persistent); - $case->assertTempFileNotExists('media/name.jpg'); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - $linkGenerator = $result->getLinkGenerator(); - - $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); - $persistent = $storage->persist($image); - - Assert::same('/media/name.jpg', $linkGenerator->link($persistent)); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - - $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); - $image = $image->withFilter(new ThumbnailFilter()); - - $storage->persist($image); - - $case->assertTempFileExists('media/name.jpg'); - $size = getimagesize($case->getAbsolutePath('media/name.jpg')); - Assert::same(15, $size[0]); - Assert::same(15, $size[1]); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - - $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); - $persistent = $storage->persist($image); - - $storage->persist($persistent->withFilter(new ThumbnailFilter())); - - $case->assertTempFileExists('media/name.jpg'); - $case->assertTempFileExists('cache/_thumbnail/name.jpg'); - $size = getimagesize($case->getAbsolutePath('cache/_thumbnail/name.jpg')); - Assert::same(15, $size[0]); - Assert::same(15, $size[1]); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - - $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); - $persistent = $storage->persist($image); - - $storage->persist($persistent->withFilter(new ThumbnailFilter())); - - $case->assertTempFileExists('media/name.jpg'); - $case->assertTempFileExists('cache/_thumbnail/name.jpg'); - - $storage->remove($persistent); - - $case->assertTempFileNotExists('media/name.jpg'); - $case->assertTempFileNotExists('cache/_thumbnail/name.jpg'); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - $linkGenerator = $result->getLinkGenerator(); - - $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); - $persistent = $storage->persist($image); - - $link = $linkGenerator->link($persistent->withFilter(new ThumbnailFilter())); - - Assert::same('/cache/_thumbnail/name.jpg', $link); - $case->assertTempFileExists('media/name.jpg'); - $case->assertTempFileExists('cache/_thumbnail/name.jpg'); - $size = getimagesize($case->getAbsolutePath('cache/_thumbnail/name.jpg')); - Assert::same(15, $size[0]); - Assert::same(15, $size[1]); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $linkGenerator = $result->getLinkGenerator(); - - $persistent = new PersistentImage('image.jpg'); - $link = $linkGenerator->link($persistent->withFilter(new ThumbnailFilter())); - - Assert::null($link); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $linkGenerator = $result->getLinkGenerator(); - - $persistent = new PersistentImage('image.jpg'); - $link = $linkGenerator->link($persistent); - - Assert::null($link); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - $fileFactory = new FileFactory(new LocalFilesystem($case->getAbsolutePath()), new PathInfoFactory()); - - $linkGenerator = new LinkGenerator($storage, $fileFactory, new ScopeDefaultImageResolver([ - 'foo' => 'noimage/foo.png', - ])); - - $storage->persist( - (new StorableImage(new FilePathUploader($case->imageJpg), 'foo.png')) - ->withScope(new Scope('noimage')) - ); - - Assert::null($linkGenerator->link(new PersistentImage('bar.png'))); - Assert::null($linkGenerator->link(new EmptyImage())); - Assert::same('/media/noimage/foo.png', $linkGenerator->link(new PersistentImage('foo/bar.png'))); - Assert::same('/media/noimage/foo.png', $linkGenerator->link(new EmptyImage(new Scope('foo')))); - Assert::same('/media/noimage/foo.png', $linkGenerator->link(new EmptyImage(), ['scope' => 'foo'])); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - $fileFactory = new FileFactory(new LocalFilesystem($case->getAbsolutePath()), new PathInfoFactory()); - - $linkGenerator = new LinkGenerator($storage, $fileFactory, new ScopeDefaultImageResolver([ - 'foo' => 'noimage/foo.png', - ])); - - Assert::null($linkGenerator->link(new PersistentImage('foo/bar.png'))); - - $case->cleanup(); -}); diff --git a/tests/Cases/Functional/LocalStorageTest.remove.phpt b/tests/Cases/Functional/LocalStorageTest.remove.phpt new file mode 100644 index 0000000..71d4923 --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.remove.phpt @@ -0,0 +1,31 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $persistent = $storage->persist($image); + + $case->assertTempFileExists('media/name.jpg'); + + $storage->remove($persistent); + $case->assertTempFileNotExists('media/name.jpg'); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/LocalStorageTest.removeScope.phpt b/tests/Cases/Functional/LocalStorageTest.removeScope.phpt new file mode 100644 index 0000000..7034250 --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.removeScope.phpt @@ -0,0 +1,32 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg', new Scope('namespace', 'scope')); + $persistent = $storage->persist($image); + + $case->assertTempFileExists('media/namespace/scope/name.jpg'); + + $storage->remove($persistent); + $case->assertTempFileNotExists('media/name.jpg'); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/LocalStorageTest.scopeDefaultImage.phpt b/tests/Cases/Functional/LocalStorageTest.scopeDefaultImage.phpt new file mode 100644 index 0000000..7e7b98f --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.scopeDefaultImage.phpt @@ -0,0 +1,48 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $fileFactory = new FileFactory(new LocalFilesystem($case->getAbsolutePath()), new PathInfoFactory()); + + $linkGenerator = new LinkGenerator($storage, $fileFactory, new ScopeDefaultImageResolver([ + 'foo' => 'noimage/foo.png', + ])); + + $storage->persist( + (new StorableImage(new FilePathUploader($case->imageJpg), 'foo.png')) + ->withScope(new Scope('noimage')) + ); + + Assert::null($linkGenerator->link(new PersistentImage('bar.png'))); + Assert::null($linkGenerator->link(new EmptyImage())); + Assert::same('/media/noimage/foo.png', $linkGenerator->link(new PersistentImage('foo/bar.png'))); + Assert::same('/media/noimage/foo.png', $linkGenerator->link(new EmptyImage(new Scope('foo')))); + Assert::same('/media/noimage/foo.png', $linkGenerator->link(new EmptyImage(), ['scope' => 'foo'])); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/LocalStorageTest.scopeDefaultImageRecursion.phpt b/tests/Cases/Functional/LocalStorageTest.scopeDefaultImageRecursion.phpt new file mode 100644 index 0000000..fea18a6 --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.scopeDefaultImageRecursion.phpt @@ -0,0 +1,35 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $fileFactory = new FileFactory(new LocalFilesystem($case->getAbsolutePath()), new PathInfoFactory()); + + $linkGenerator = new LinkGenerator($storage, $fileFactory, new ScopeDefaultImageResolver([ + 'foo' => 'noimage/foo.png', + ])); + + Assert::null($linkGenerator->link(new PersistentImage('foo/bar.png'))); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/LocalStorageTest.url.phpt b/tests/Cases/Functional/LocalStorageTest.url.phpt new file mode 100644 index 0000000..e20a875 --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.url.phpt @@ -0,0 +1,30 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $linkGenerator = $result->getLinkGenerator(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $persistent = $storage->persist($image); + + Assert::same('/media/name.jpg', $linkGenerator->link($persistent)); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/LocalStorageTest.urlNotExists.phpt b/tests/Cases/Functional/LocalStorageTest.urlNotExists.phpt new file mode 100644 index 0000000..13a35b0 --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.urlNotExists.phpt @@ -0,0 +1,28 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $linkGenerator = $result->getLinkGenerator(); + + $persistent = new PersistentImage('image.jpg'); + $link = $linkGenerator->link($persistent); + + Assert::null($link); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/LocalStorageTest.urlWithFilter.phpt b/tests/Cases/Functional/LocalStorageTest.urlWithFilter.phpt new file mode 100644 index 0000000..69dc1ae --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.urlWithFilter.phpt @@ -0,0 +1,38 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $linkGenerator = $result->getLinkGenerator(); + + $image = new StorableImage(new FilePathUploader($case->imageJpg), 'name.jpg'); + $persistent = $storage->persist($image); + + $link = $linkGenerator->link($persistent->withFilter(new ThumbnailFilter())); + + Assert::same('/cache/_thumbnail/name.jpg', $link); + $case->assertTempFileExists('media/name.jpg'); + $case->assertTempFileExists('cache/_thumbnail/name.jpg'); + $size = getimagesize($case->getAbsolutePath('cache/_thumbnail/name.jpg')); + Assert::same(15, $size[0]); + Assert::same(15, $size[1]); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/LocalStorageTest.urlWithFilterNotExists.phpt b/tests/Cases/Functional/LocalStorageTest.urlWithFilterNotExists.phpt new file mode 100644 index 0000000..33ed0b1 --- /dev/null +++ b/tests/Cases/Functional/LocalStorageTest.urlWithFilterNotExists.phpt @@ -0,0 +1,29 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $linkGenerator = $result->getLinkGenerator(); + + $persistent = new PersistentImage('image.jpg'); + $link = $linkGenerator->link($persistent->withFilter(new ThumbnailFilter())); + + Assert::null($link); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/TransactionTest.commit.phpt b/tests/Cases/Functional/TransactionTest.commit.phpt new file mode 100644 index 0000000..16c3594 --- /dev/null +++ b/tests/Cases/Functional/TransactionTest.commit.phpt @@ -0,0 +1,30 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $transaction->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + + $transaction->commit(); + + $case->assertTempFileExists('media/image.jpg'); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/TransactionTest.commitRemove.phpt b/tests/Cases/Functional/TransactionTest.commitRemove.phpt new file mode 100644 index 0000000..420ea98 --- /dev/null +++ b/tests/Cases/Functional/TransactionTest.commitRemove.phpt @@ -0,0 +1,36 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $image = $storage->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + $case->assertTempFileExists('media/image.jpg'); + + $transaction->remove($image); + + $case->assertTempFileExists('media/image.jpg'); + + $transaction->commit(); + + $case->assertTempFileNotExists('media/image.jpg'); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/TransactionTest.persistAndRemoveSame.phpt b/tests/Cases/Functional/TransactionTest.persistAndRemoveSame.phpt new file mode 100644 index 0000000..953488d --- /dev/null +++ b/tests/Cases/Functional/TransactionTest.persistAndRemoveSame.phpt @@ -0,0 +1,34 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $image = $transaction->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + $transaction->remove($image); + + $transaction->commit(); + + Assert::true($image->isEmpty()); + + $case->assertTempFileNotExists('media/image.jpg'); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/TransactionTest.phpt b/tests/Cases/Functional/TransactionTest.phpt deleted file mode 100644 index 70756f1..0000000 --- a/tests/Cases/Functional/TransactionTest.phpt +++ /dev/null @@ -1,170 +0,0 @@ -getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $transactionFactory = $result->getTransactionFactory(); - - $transaction = $transactionFactory->create(); - $transaction->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); - - $case->assertTempFileNotExists('media/image.jpg'); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $transactionFactory = $result->getTransactionFactory(); - - $transaction = $transactionFactory->create(); - $transaction->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); - - $transaction->commit(); - - $case->assertTempFileExists('media/image.jpg'); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - $transactionFactory = $result->getTransactionFactory(); - - $transaction = $transactionFactory->create(); - $image = $storage->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); - $case->assertTempFileExists('media/image.jpg'); - - $transaction->remove($image); - - $case->assertTempFileExists('media/image.jpg'); - - $transaction->commit(); - - $case->assertTempFileNotExists('media/image.jpg'); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - $transactionFactory = $result->getTransactionFactory(); - - $transaction = $transactionFactory->create(); - $image = $storage->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); - $case->assertTempFileExists('media/image.jpg'); - - $transaction->remove($image); - - $case->assertTempFileExists('media/image.jpg'); - - $transaction->commit(); - - $case->assertTempFileNotExists('media/image.jpg'); - - $transaction->rollback(); - - $case->assertTempFileExists('media/image.jpg'); - Assert::same(file_get_contents($case->imageJpg), file_get_contents($case->getAbsolutePath('media/image.jpg'))); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $transactionFactory = $result->getTransactionFactory(); - - $transaction = $transactionFactory->create(); - $transaction->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); - - $transaction->commit(); - - $case->assertTempFileExists('media/image.jpg'); - - $transaction->rollback(); - - $case->assertTempFileNotExists('media/image.jpg'); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $transactionFactory = $result->getTransactionFactory(); - - $transaction = $transactionFactory->create(); - $image = $transaction->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); - $transaction->remove($image); - - $transaction->commit(); - - Assert::true($image->isEmpty()); - - $case->assertTempFileNotExists('media/image.jpg'); - - $case->cleanup(); -}); - -Toolkit::test(static function (): void { - $case = new FileTestCase(); - - $builder = new LocalImageStorageBuilder($case->getAbsolutePath()); - $builder->withNetteFilterProcessor(); - $result = $builder->build(); - - $storage = $result->getImageStorage(); - $transactionFactory = $result->getTransactionFactory(); - - $transaction = $transactionFactory->create(); - $persistent = $storage->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); - $image = $transaction->remove($persistent); - $transaction->persist($image); - - $transaction->commit(); - - $case->assertTempFileExists('media/image.jpg'); - - $case->cleanup(); -}); diff --git a/tests/Cases/Functional/TransactionTest.preCommit.phpt b/tests/Cases/Functional/TransactionTest.preCommit.phpt new file mode 100644 index 0000000..994999c --- /dev/null +++ b/tests/Cases/Functional/TransactionTest.preCommit.phpt @@ -0,0 +1,28 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $transaction->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + + $case->assertTempFileNotExists('media/image.jpg'); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/TransactionTest.removeAndPersistSame.phpt b/tests/Cases/Functional/TransactionTest.removeAndPersistSame.phpt new file mode 100644 index 0000000..900004b --- /dev/null +++ b/tests/Cases/Functional/TransactionTest.removeAndPersistSame.phpt @@ -0,0 +1,33 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $persistent = $storage->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + $image = $transaction->remove($persistent); + $transaction->persist($image); + + $transaction->commit(); + + $case->assertTempFileExists('media/image.jpg'); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/TransactionTest.rollback.phpt b/tests/Cases/Functional/TransactionTest.rollback.phpt new file mode 100644 index 0000000..71922af --- /dev/null +++ b/tests/Cases/Functional/TransactionTest.rollback.phpt @@ -0,0 +1,34 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $transaction->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + + $transaction->commit(); + + $case->assertTempFileExists('media/image.jpg'); + + $transaction->rollback(); + + $case->assertTempFileNotExists('media/image.jpg'); + + $case->cleanup(); +}); diff --git a/tests/Cases/Functional/TransactionTest.rollbackRemove.phpt b/tests/Cases/Functional/TransactionTest.rollbackRemove.phpt new file mode 100644 index 0000000..8f88bfe --- /dev/null +++ b/tests/Cases/Functional/TransactionTest.rollbackRemove.phpt @@ -0,0 +1,42 @@ +getAbsolutePath()); + $builder->withNetteFilterProcessor(); + $result = $builder->build(); + + $storage = $result->getImageStorage(); + $transactionFactory = $result->getTransactionFactory(); + + $transaction = $transactionFactory->create(); + $image = $storage->persist(new StorableImage(new FilePathUploader($case->imageJpg), 'image.jpg')); + $case->assertTempFileExists('media/image.jpg'); + + $transaction->remove($image); + + $case->assertTempFileExists('media/image.jpg'); + + $transaction->commit(); + + $case->assertTempFileNotExists('media/image.jpg'); + + $transaction->rollback(); + + $case->assertTempFileExists('media/image.jpg'); + Assert::same(file_get_contents($case->imageJpg), file_get_contents($case->getAbsolutePath('media/image.jpg'))); + + $case->cleanup(); +}); diff --git a/tests/Cases/Unit/ImageTest.basic.phpt b/tests/Cases/Unit/ImageTest.basic.phpt new file mode 100644 index 0000000..be8f7a1 --- /dev/null +++ b/tests/Cases/Unit/ImageTest.basic.phpt @@ -0,0 +1,22 @@ +getName()); + Assert::same('bar/foo.jpg', $image->getId()); + Assert::same('jpg', $image->getSuffix()); + Assert::same($scope, $image->getScope()); + Assert::notSame($image, $image->withName('bar')); +}); diff --git a/tests/Cases/Unit/ImageTest.phpt b/tests/Cases/Unit/ImageTest.close.phpt similarity index 61% rename from tests/Cases/Unit/ImageTest.phpt rename to tests/Cases/Unit/ImageTest.close.phpt index 7e1a99d..32392df 100644 --- a/tests/Cases/Unit/ImageTest.phpt +++ b/tests/Cases/Unit/ImageTest.close.phpt @@ -4,24 +4,11 @@ namespace Tests\Cases\Unit; use Contributte\Imagist\Entity\Image; use Contributte\Imagist\Exceptions\ClosedImageException; -use Contributte\Imagist\Scope\Scope; use Contributte\Tester\Toolkit; use Tester\Assert; require_once __DIR__ . '/../../bootstrap.php'; -Toolkit::test(static function (): void { - $image = new class ('foo.jpg', $scope = new Scope('bar')) extends Image { - - }; - - Assert::same('foo.jpg', $image->getName()); - Assert::same('bar/foo.jpg', $image->getId()); - Assert::same('jpg', $image->getSuffix()); - Assert::same($scope, $image->getScope()); - Assert::notSame($image, $image->withName('bar')); -}); - Toolkit::test(static function (): void { $image = new class('foo.jpg') extends Image { diff --git a/tests/Cases/Unit/ScopeTest.contains.phpt b/tests/Cases/Unit/ScopeTest.contains.phpt new file mode 100644 index 0000000..35bd8f2 --- /dev/null +++ b/tests/Cases/Unit/ScopeTest.contains.phpt @@ -0,0 +1,24 @@ +contains('foo')); + Assert::true($scope->contains('middle')); + Assert::true($scope->contains('bar')); + Assert::false($scope->contains('not')); +}); + +Toolkit::test(static function (): void { + $scope = new Scope(); + + Assert::false($scope->contains('bar')); +}); diff --git a/tests/Cases/Unit/ScopeTest.empty.phpt b/tests/Cases/Unit/ScopeTest.empty.phpt new file mode 100644 index 0000000..c69e9b0 --- /dev/null +++ b/tests/Cases/Unit/ScopeTest.empty.phpt @@ -0,0 +1,16 @@ +endsWith('bar')); + Assert::false($scope->endsWith('foo')); +}); + +Toolkit::test(static function (): void { + $scope = new Scope(); + + Assert::false($scope->endsWith('bar')); +}); diff --git a/tests/Cases/Unit/ScopeTest.fromString.phpt b/tests/Cases/Unit/ScopeTest.fromString.phpt new file mode 100644 index 0000000..ce6d2cf --- /dev/null +++ b/tests/Cases/Unit/ScopeTest.fromString.phpt @@ -0,0 +1,16 @@ +getScopes()); + Assert::same('bar/foo', (string) $scope); +}); diff --git a/tests/Cases/Unit/ScopeTest.invalidChars.phpt b/tests/Cases/Unit/ScopeTest.invalidChars.phpt new file mode 100644 index 0000000..882f796 --- /dev/null +++ b/tests/Cases/Unit/ScopeTest.invalidChars.phpt @@ -0,0 +1,16 @@ +getScopes()); + Assert::same('foo/bar', (string) $scope); +}); diff --git a/tests/Cases/Unit/ScopeTest.oneScope.phpt b/tests/Cases/Unit/ScopeTest.oneScope.phpt new file mode 100644 index 0000000..65055a0 --- /dev/null +++ b/tests/Cases/Unit/ScopeTest.oneScope.phpt @@ -0,0 +1,16 @@ +getScopes()); + Assert::same('foo', (string) $scope); +}); diff --git a/tests/Cases/Unit/ScopeTest.phpt b/tests/Cases/Unit/ScopeTest.phpt deleted file mode 100644 index a9124c4..0000000 --- a/tests/Cases/Unit/ScopeTest.phpt +++ /dev/null @@ -1,105 +0,0 @@ -getScopes()); - Assert::same('foo', (string) $scope); -}); - -Toolkit::test(static function (): void { - $scope = new Scope('foo', 'middle', 'bar'); - - Assert::true($scope->startsWith('foo')); - Assert::false($scope->startsWith('bar')); -}); - -Toolkit::test(static function (): void { - $scope = new Scope(); - - Assert::false($scope->startsWith('foo')); -}); - -Toolkit::test(static function (): void { - $scope = new Scope('foo', 'middle', 'bar'); - - Assert::true($scope->endsWith('bar')); - Assert::false($scope->endsWith('foo')); -}); - -Toolkit::test(static function (): void { - $scope = new Scope(); - - Assert::false($scope->endsWith('bar')); -}); - -Toolkit::test(static function (): void { - $scope = new Scope('foo', 'middle', 'bar'); - - Assert::true($scope->contains('foo')); - Assert::true($scope->contains('middle')); - Assert::true($scope->contains('bar')); - Assert::false($scope->contains('not')); -}); - -Toolkit::test(static function (): void { - $scope = new Scope(); - - Assert::false($scope->contains('bar')); -}); - -Toolkit::test(static function (): void { - $scope = new Scope('foo', 'bar'); - - Assert::same(['foo', 'bar'], $scope->getScopes()); - Assert::same('foo/bar', (string) $scope); -}); - -Toolkit::test(static function (): void { - $scope = new Scope('foo'); - $scope = $scope->withAppendedScopes('bar'); - - Assert::same(['foo', 'bar'], $scope->getScopes()); - Assert::same('foo/bar', (string) $scope); -}); - -Toolkit::test(static function (): void { - $scope = new Scope('foo'); - $scope = $scope->withPrependedScopes('bar'); - - Assert::same(['bar', 'foo'], $scope->getScopes()); - Assert::same('bar/foo', (string) $scope); -}); - -Toolkit::test(static function (): void { - $scope = Scope::fromString('bar/foo'); - - Assert::same(['bar', 'foo'], $scope->getScopes()); - Assert::same('bar/foo', (string) $scope); -}); - -Toolkit::test(static function (): void { - Assert::exception(static function (): void { - new Scope(''); - }, InvalidArgumentException::class); -}); - -Toolkit::test(static function (): void { - Assert::exception(static function (): void { - new Scope('bař'); - }, InvalidArgumentException::class); -}); - -Toolkit::test(static function (): void { - Assert::same('foo/', (new Scope('foo'))->toStringWithTrailingSlash()); - Assert::same('', (new Scope())->toStringWithTrailingSlash()); -}); diff --git a/tests/Cases/Unit/ScopeTest.startsWith.phpt b/tests/Cases/Unit/ScopeTest.startsWith.phpt new file mode 100644 index 0000000..fac5908 --- /dev/null +++ b/tests/Cases/Unit/ScopeTest.startsWith.phpt @@ -0,0 +1,22 @@ +startsWith('foo')); + Assert::false($scope->startsWith('bar')); +}); + +Toolkit::test(static function (): void { + $scope = new Scope(); + + Assert::false($scope->startsWith('foo')); +}); diff --git a/tests/Cases/Unit/ScopeTest.trailingSlash.phpt b/tests/Cases/Unit/ScopeTest.trailingSlash.phpt new file mode 100644 index 0000000..5d838e1 --- /dev/null +++ b/tests/Cases/Unit/ScopeTest.trailingSlash.phpt @@ -0,0 +1,14 @@ +toStringWithTrailingSlash()); + Assert::same('', (new Scope())->toStringWithTrailingSlash()); +}); diff --git a/tests/Cases/Unit/ScopeTest.withAppended.phpt b/tests/Cases/Unit/ScopeTest.withAppended.phpt new file mode 100644 index 0000000..8981590 --- /dev/null +++ b/tests/Cases/Unit/ScopeTest.withAppended.phpt @@ -0,0 +1,17 @@ +withAppendedScopes('bar'); + + Assert::same(['foo', 'bar'], $scope->getScopes()); + Assert::same('foo/bar', (string) $scope); +}); diff --git a/tests/Cases/Unit/ScopeTest.withPrepended.phpt b/tests/Cases/Unit/ScopeTest.withPrepended.phpt new file mode 100644 index 0000000..d5ed704 --- /dev/null +++ b/tests/Cases/Unit/ScopeTest.withPrepended.phpt @@ -0,0 +1,17 @@ +withPrependedScopes('bar'); + + Assert::same(['bar', 'foo'], $scope->getScopes()); + Assert::same('bar/foo', (string) $scope); +});