From d3e8d6a40ebb405c857331a50560c861c3e90996 Mon Sep 17 00:00:00 2001 From: Bart Jaskulski <bartek.jaskulski@wpdesk.net> Date: Mon, 12 Dec 2022 15:09:49 +0100 Subject: [PATCH] fix: only include migrators from `AbstractMigration` Signed-off-by: Bart Jaskulski <bartek.jaskulski@wpdesk.net> --- src/Finder/GlobFinder.php | 11 ++++++- .../Tests/Finder/GlobFinderTest.php | 31 +++++++++++++++++++ .../fixtures/migrations/Borked_Version_01.php | 14 +++++++++ tests/fixtures/migrations/Version_02.php | 9 ++++++ 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 tests/WPDesk/Migrations/Tests/Finder/GlobFinderTest.php create mode 100644 tests/fixtures/migrations/Borked_Version_01.php create mode 100644 tests/fixtures/migrations/Version_02.php diff --git a/src/Finder/GlobFinder.php b/src/Finder/GlobFinder.php index 8994e79..a1ba300 100644 --- a/src/Finder/GlobFinder.php +++ b/src/Finder/GlobFinder.php @@ -10,6 +10,10 @@ final class GlobFinder implements MigrationFinder { public function find_migrations( string $directory ): array { $dir = realpath( $directory ); + if ( $dir === false ) { + return []; + } + $files = glob( rtrim( $dir, '/' ) . '/Version*.php' ); if ( $files === false ) { $files = []; @@ -46,7 +50,7 @@ final class GlobFinder implements MigrationFinder { /** * @param string[] $included_files - * @return \ReflectionClass[] + * @return \ReflectionClass<AbstractMigration>[] * @throws \ReflectionException */ private function load_migration_classes( array $included_files ): array { @@ -54,10 +58,15 @@ final class GlobFinder implements MigrationFinder { foreach ( get_declared_classes() as $class ) { $r = new \ReflectionClass( $class ); + if ( ! $r->isSubclassOf( AbstractMigration::class ) ) { + continue; + } + if ( in_array( $r->getFileName(), $included_files, true ) ) { $classes[] = $r; } } + return $classes; } } diff --git a/tests/WPDesk/Migrations/Tests/Finder/GlobFinderTest.php b/tests/WPDesk/Migrations/Tests/Finder/GlobFinderTest.php new file mode 100644 index 0000000..765f4a5 --- /dev/null +++ b/tests/WPDesk/Migrations/Tests/Finder/GlobFinderTest.php @@ -0,0 +1,31 @@ +<?php + +namespace WPDesk\Migrations\Tests\Finder; + +use WPDesk\Migrations\Finder\GlobFinder; +use PHPUnit\Framework\TestCase; + +class GlobFinderTest extends TestCase { + + public function test_skip_unexpected_classes() { + $finder = new GlobFinder(); + $migrations = $finder->find_migrations(__DIR__ . '/../../../../fixtures/migrations'); + + self::assertCount(2, $migrations); + self::assertContains( + 'WPDesk\Migrations\Tests\fixtures\migrations\Version_10', + $migrations + ); + + self::assertContains( + 'WPDesk\Migrations\Tests\fixtures\migrations\Version_11', + $migrations + ); + + self::assertNotContains( + 'WPDesk\Migrations\Tests\fixtures\migrations\Borked_Version_01', + $migrations + ); + } + +} diff --git a/tests/fixtures/migrations/Borked_Version_01.php b/tests/fixtures/migrations/Borked_Version_01.php new file mode 100644 index 0000000..35f45e2 --- /dev/null +++ b/tests/fixtures/migrations/Borked_Version_01.php @@ -0,0 +1,14 @@ +<?php +declare( strict_types=1 ); + +namespace WPDesk\Migrations\Tests\fixtures\migrations; + +use WPDesk\Migrations\AbstractMigration; + +/** Invalid name */ +class Borked_Version_01 extends AbstractMigration { + + public function up(): bool { + return true; + } +} diff --git a/tests/fixtures/migrations/Version_02.php b/tests/fixtures/migrations/Version_02.php new file mode 100644 index 0000000..a06b484 --- /dev/null +++ b/tests/fixtures/migrations/Version_02.php @@ -0,0 +1,9 @@ +<?php +declare( strict_types=1 ); + +namespace WPDesk\Migrations\Tests\fixtures\migrations; + +/** Not extending abstract migration */ +class Version_02 { + +} -- GitLab