From f782b12488a293d7bd06620d08f8d4bee69d51f7 Mon Sep 17 00:00:00 2001 From: Sergey Syomkin Date: Thu, 9 Oct 2025 11:47:09 +0300 Subject: [PATCH 1/2] Add an index duplication error test --- tests/Migrations/MySQL/RendererTest.php | 47 +++++++++++++++++++++++++ tests/bootstrap.php | 18 +++++----- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/tests/Migrations/MySQL/RendererTest.php b/tests/Migrations/MySQL/RendererTest.php index 68a40da..5a76517 100644 --- a/tests/Migrations/MySQL/RendererTest.php +++ b/tests/Migrations/MySQL/RendererTest.php @@ -11,6 +11,12 @@ namespace Cycle\Migrations\Tests\MySQL; +use Cycle\Database\Driver\MySQL\Schema\MySQLIndex; +use Cycle\Database\Schema\Comparator; +use Cycle\Database\Schema\State; +use Cycle\Migrations\Atomizer\Renderer; +use Spiral\Reactor\Partial\Method; + /** * @group driver * @group driver-mysql @@ -18,4 +24,45 @@ class RendererTest extends \Cycle\Migrations\Tests\RendererTest { public const DRIVER = 'mysql'; + + public function testDeclareIndexes(): void + { + $method = new Method('up'); + + $schema = [ + [ + 'Non_unique' => 1, // 1 = обычный индекс, 0 = уникальный + 'Column_name' => 'email', + 'Collation' => 'A', // 'A' = ASC, 'D' = DESC + ], + [ + 'Non_unique' => 0, // уникальный индекс + 'Column_name' => 'username', + 'Collation' => 'A', // сортировка по возрастанию + ], + ]; + + $indexA = MySQLIndex::createInstance('table', 'idx_email_username', $schema); + $initial = new State('test_table'); + $initial->registerIndex($indexA); + + + $indexB = MySQLIndex::createInstance('table', 'idx_email_username', \array_reverse($schema)); + $current = new State('test_table'); + $current->registerIndex($indexB); + + $comparator = new Comparator($initial, $current); + + $renderer = new Renderer(); + + $reflectionMethod = new \ReflectionMethod($renderer, 'declareIndexes'); + $reflectionMethod->setAccessible(true); + + /** + * Method $method, Comparator $comparator + */ + $reflectionMethod->invoke($renderer, $method, $comparator); + + self::assertSame('1', $method->getBody()); + } } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 9121c27..fabecc4 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -11,12 +11,12 @@ use Cycle\Database\Config; -error_reporting(E_ALL | E_STRICT); -ini_set('display_errors', '1'); -mb_internal_encoding('UTF-8'); +\error_reporting(E_ALL | E_STRICT); +\ini_set('display_errors', '1'); +\mb_internal_encoding('UTF-8'); //Composer -require dirname(__DIR__) . '/vendor/autoload.php'; +require \dirname(__DIR__) . '/vendor/autoload.php'; $drivers = [ 'debug' => false, @@ -31,7 +31,7 @@ user: 'root', password: 'YourStrong!Passw0rd', ), - queryCache: true + queryCache: true, ), 'postgres' => new Config\PostgresDriverConfig( connection: new Config\Postgres\TcpConnectionConfig( @@ -53,18 +53,18 @@ user: 'SA', password: 'YourStrong!Passw0rd', ), - queryCache: true + queryCache: true, ), ]; -$db = getenv('DB') ?: null; +$db = \getenv('DB') ?: null; if ($db !== null) { $db = [$db, "$db-mock"]; } \Cycle\Migrations\Tests\BaseTest::$config = [ - 'debug' => getenv('DB_DEBUG') ?: false, + 'debug' => \getenv('DB_DEBUG') ?: false, ] + ( $db === null ? $drivers - : array_intersect_key($drivers, array_flip((array)$db)) + : \array_intersect_key($drivers, \array_flip((array) $db)) ); From 4e67dd4439560602f74c0f2c3cc97004f6d2a07d Mon Sep 17 00:00:00 2001 From: Sergey Syomkin Date: Thu, 9 Oct 2025 12:23:52 +0300 Subject: [PATCH 2/2] Add an index duplication error test --- tests/Migrations/MySQL/RendererTest.php | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/tests/Migrations/MySQL/RendererTest.php b/tests/Migrations/MySQL/RendererTest.php index 5a76517..2e0c512 100644 --- a/tests/Migrations/MySQL/RendererTest.php +++ b/tests/Migrations/MySQL/RendererTest.php @@ -29,25 +29,16 @@ public function testDeclareIndexes(): void { $method = new Method('up'); - $schema = [ - [ - 'Non_unique' => 1, // 1 = обычный индекс, 0 = уникальный - 'Column_name' => 'email', - 'Collation' => 'A', // 'A' = ASC, 'D' = DESC - ], - [ - 'Non_unique' => 0, // уникальный индекс - 'Column_name' => 'username', - 'Collation' => 'A', // сортировка по возрастанию - ], - ]; + $columns = ['email', 'username']; - $indexA = MySQLIndex::createInstance('table', 'idx_email_username', $schema); + $indexA = new MySQLIndex('table', 'idx_email_username'); + $indexA->columns($columns); $initial = new State('test_table'); $initial->registerIndex($indexA); - $indexB = MySQLIndex::createInstance('table', 'idx_email_username', \array_reverse($schema)); + $indexB = new MySQLIndex('table', 'idx_email_username'); + $indexB->columns(\array_reverse($columns)); $current = new State('test_table'); $current->registerIndex($indexB); @@ -63,6 +54,6 @@ public function testDeclareIndexes(): void */ $reflectionMethod->invoke($renderer, $method, $comparator); - self::assertSame('1', $method->getBody()); + self::assertSame('', $method->getBody()); } }