diff --git a/src/Finder/GlobFinder.php b/src/Finder/GlobFinder.php index 8994e792346f9f40c6178634235835dfb5edd678..a1ba30049adaa6364cd5d5afd3d5bb00ea019889 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 0000000000000000000000000000000000000000..765f4a5fbdb7f51efd32213c8cbe8438fe9b1582 --- /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 0000000000000000000000000000000000000000..35f45e2422bb349c41939f8b590df5f7e5b36e7f --- /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 0000000000000000000000000000000000000000..a06b48443f0b9f31a48840f82dab1a6163d82161 --- /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 { + +}