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