From 314d4a8d85881fd14e7bd33e78f77b82ebfa042a Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Wed, 31 May 2023 19:24:12 +0530 Subject: [PATCH 1/2] WIP --- .../m200000_000000_change_table_fruits.php | 19 +++++++++++ ...erated_for_string_varchar_datatype_149.php | 13 ++++++++ ...rated_for_string_varchar_datatype_149.yaml | 28 ++++++++++++++++ tests/unit/IssueFixTest.php | 32 +++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/app/migrations_pgsql_db/m200000_000000_change_table_fruits.php create mode 100644 tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.php create mode 100644 tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.yaml diff --git a/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/app/migrations_pgsql_db/m200000_000000_change_table_fruits.php b/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/app/migrations_pgsql_db/m200000_000000_change_table_fruits.php new file mode 100644 index 00000000..2905aec3 --- /dev/null +++ b/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/app/migrations_pgsql_db/m200000_000000_change_table_fruits.php @@ -0,0 +1,19 @@ +db->createCommand('ALTER TABLE {{%fruits}} ADD COLUMN test_emails json NOT NULL')->execute(); + $this->alterColumn('{{%fruits}}', 'name', $this->text()->notNull()); + } + + public function down() + { + $this->alterColumn('{{%fruits}}', 'name', $this->string(255)->null()->defaultValue(null)); + $this->dropColumn('{{%fruits}}', 'test_emails'); + } +} diff --git a/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.php b/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.php new file mode 100644 index 00000000..469508cf --- /dev/null +++ b/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.php @@ -0,0 +1,13 @@ + '@specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.yaml', + 'generateUrls' => false, + 'generateModels' => false, + 'excludeModels' => [ + 'Error', + ], + 'generateControllers' => false, + 'generateMigrations' => true, + 'generateModelFaker' => false, +]; diff --git a/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.yaml b/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.yaml new file mode 100644 index 00000000..46fbbd6d --- /dev/null +++ b/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.yaml @@ -0,0 +1,28 @@ +openapi: "3.0.0" +info: + version: 1.0.0 + title: Fix https://github.com/cebe/yii2-openapi/issues/149 wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149 +paths: + /: + get: + summary: List + operationId: list + responses: + '200': + description: The information + +components: + schemas: + Fruit: + type: object + description: A table to fix \#149 + required: + - id + - name + properties: + id: + type: integer + name: + type: string + example: desc + maxLength: 150 diff --git a/tests/unit/IssueFixTest.php b/tests/unit/IssueFixTest.php index 6d601f37..c164c9cd 100644 --- a/tests/unit/IssueFixTest.php +++ b/tests/unit/IssueFixTest.php @@ -221,4 +221,36 @@ public function testModelNameMoreThanOnceInFakerIssue148() ]); $this->checkFiles($actualFiles, $expectedFiles); } + + // https://github.com/cebe/yii2-openapi/issues/149 + // wrongMigrationForPgsqlForStringVarcharDatatype + // wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype + public function testWrongMigrationForPgsqlForStringVarcharDatatype149() + { + $testFile = Yii::getAlias("@specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.php"); + $this->runGenerator($testFile, 'pgsql'); + $actualFiles = FileHelper::findFiles(Yii::getAlias('@app'), [ + 'recursive' => true, + ]); + + // $expectedFiles = FileHelper::findFiles(Yii::getAlias("@specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/app"), [ + // 'recursive' => true, + // ]); + // $this->checkFiles($actualFiles, $expectedFiles); + // $this->runActualMigrations('pgsql', 1); + // $this->deleteTables(); + } + + private function createTableForWrongMigrationForPgsqlForStringVarcharDatatype149() + { + Yii::$app->db->createCommand()->createTable('{{%fruits}}', [ + 'id' => 'pk', + 'vat_percent' => 'string 8', // TODO WIP resume from here + ])->execute(); + } + + private function deleteTablesForWrongMigrationForPgsqlForStringVarcharDatatype149() + { + Yii::$app->db->createCommand('DROP TABLE IF EXISTS {{%fruits}}')->execute(); + } } From f564b16cc05364c1f9d3a7fab12b6504fc28b40c Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Thu, 1 Jun 2023 15:38:38 +0530 Subject: [PATCH 2/2] Fix https://github.com/cebe/yii2-openapi/issues/149 --- src/lib/migrations/BaseMigrationBuilder.php | 8 ++++++++ src/lib/migrations/MysqlMigrationBuilder.php | 3 +++ .../migrations/PostgresMigrationBuilder.php | 3 +++ .../m200000_000000_change_table_v2_posts.php | 4 ++-- ...00000_000003_change_table_v2_categories.php | 4 ++-- ...m200000_000005_change_table_v2_comments.php | 4 ++-- .../m200000_000000_change_table_fruits.php | 12 ++++++------ ...erated_for_string_varchar_datatype_149.yaml | 2 +- tests/unit/IssueFixTest.php | 18 +++++++++++------- 9 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/lib/migrations/BaseMigrationBuilder.php b/src/lib/migrations/BaseMigrationBuilder.php index 58bec637..67336341 100644 --- a/src/lib/migrations/BaseMigrationBuilder.php +++ b/src/lib/migrations/BaseMigrationBuilder.php @@ -568,4 +568,12 @@ public function modifyDesiredFromDbInContextOfDesired(ColumnSchema $desired, Col $desiredFromDb->dbType = 'timestamp'; } } + + public function modifyDesiredInContextOfDesiredFromDb(ColumnSchema $desired, ColumnSchema $desiredFromDb): void + { + if (property_exists($desired, 'xDbType') && is_string($desired->xDbType) && !empty($desired->xDbType)) { + return; + } + $desired->dbType = $desiredFromDb->dbType; + } } diff --git a/src/lib/migrations/MysqlMigrationBuilder.php b/src/lib/migrations/MysqlMigrationBuilder.php index 65665df9..42354df3 100644 --- a/src/lib/migrations/MysqlMigrationBuilder.php +++ b/src/lib/migrations/MysqlMigrationBuilder.php @@ -47,6 +47,9 @@ protected function compareColumns(ColumnSchema $current, ColumnSchema $desired): // Why this is needed? Often manually created ColumnSchem instance have dbType 'varchar' with size 255 and ColumnSchema fetched from db have 'varchar(255)'. So varchar !== varchar(255). such normal mistake was leading to errors. So desired column is saved in temporary table and it is fetched from that temp. table and then compared with current ColumnSchema $desiredFromDb = $this->tmpSaveNewCol($tableAlias, $desired); + + $this->modifyDesiredInContextOfDesiredFromDb($desired, $desiredFromDb); + $this->modifyDesired($desiredFromDb); $this->modifyDesiredInContextOfCurrent($current, $desiredFromDb); $this->modifyDesiredFromDbInContextOfDesired($desired, $desiredFromDb); diff --git a/src/lib/migrations/PostgresMigrationBuilder.php b/src/lib/migrations/PostgresMigrationBuilder.php index cf170ec3..01a1cbfd 100644 --- a/src/lib/migrations/PostgresMigrationBuilder.php +++ b/src/lib/migrations/PostgresMigrationBuilder.php @@ -118,6 +118,9 @@ protected function compareColumns(ColumnSchema $current, ColumnSchema $desired): // for docs, please see MysqlMigrationBuilder file $desiredFromDb = $this->tmpSaveNewCol($tableAlias, $desired); + + $this->modifyDesiredInContextOfDesiredFromDb($desired, $desiredFromDb); + $this->modifyDesired($desiredFromDb); $this->modifyDesiredInContextOfCurrent($current, $desiredFromDb); $this->modifyDesiredFromDbInContextOfDesired($desired, $desiredFromDb); diff --git a/tests/specs/blog_v2/migrations_pgsql_db/m200000_000000_change_table_v2_posts.php b/tests/specs/blog_v2/migrations_pgsql_db/m200000_000000_change_table_v2_posts.php index f0612015..5188983b 100644 --- a/tests/specs/blog_v2/migrations_pgsql_db/m200000_000000_change_table_v2_posts.php +++ b/tests/specs/blog_v2/migrations_pgsql_db/m200000_000000_change_table_v2_posts.php @@ -11,9 +11,9 @@ public function safeUp() $this->execute('CREATE TYPE "enum_itt_v2_posts_lang" AS ENUM(\'ru\', \'eng\')'); $this->addColumn('{{%v2_posts}}', 'lang', '"enum_itt_v2_posts_lang" NULL DEFAULT \'ru\''); $this->dropColumn('{{%v2_posts}}', 'uid'); - $this->alterColumn('{{%v2_posts}}', 'category_id', 'bigint NOT NULL USING "category_id"::bigint'); + $this->alterColumn('{{%v2_posts}}', 'category_id', 'int8 NOT NULL USING "category_id"::int8'); $this->alterColumn('{{%v2_posts}}', 'active', "DROP DEFAULT"); - $this->alterColumn('{{%v2_posts}}', 'created_by_id', 'bigint NULL USING "created_by_id"::bigint'); + $this->alterColumn('{{%v2_posts}}', 'created_by_id', 'int8 NULL USING "created_by_id"::int8'); $this->dropIndex('v2_posts_slug_key', '{{%v2_posts}}'); } diff --git a/tests/specs/blog_v2/migrations_pgsql_db/m200000_000003_change_table_v2_categories.php b/tests/specs/blog_v2/migrations_pgsql_db/m200000_000003_change_table_v2_categories.php index 5ebffced..5f934936 100644 --- a/tests/specs/blog_v2/migrations_pgsql_db/m200000_000003_change_table_v2_categories.php +++ b/tests/specs/blog_v2/migrations_pgsql_db/m200000_000003_change_table_v2_categories.php @@ -8,7 +8,7 @@ class m200000_000003_change_table_v2_categories extends \yii\db\Migration public function safeUp() { $this->addColumn('{{%v2_categories}}', 'cover', $this->text()->notNull()); - $this->alterColumn('{{%v2_categories}}', 'title', 'string(100) NOT NULL USING "title"::string'); + $this->alterColumn('{{%v2_categories}}', 'title', $this->string(100)->notNull()); $this->alterColumn('{{%v2_categories}}', 'active', "DROP DEFAULT"); $this->dropIndex('v2_categories_title_key', '{{%v2_categories}}'); $this->createIndex('v2_categories_title_index', '{{%v2_categories}}', 'title', false); @@ -18,7 +18,7 @@ public function safeDown() { $this->dropIndex('v2_categories_title_index', '{{%v2_categories}}'); $this->createIndex('v2_categories_title_key', '{{%v2_categories}}', 'title', true); - $this->alterColumn('{{%v2_categories}}', 'title', 'varchar(255) NOT NULL USING "title"::varchar'); + $this->alterColumn('{{%v2_categories}}', 'title', $this->string(255)->notNull()); $this->dropColumn('{{%v2_categories}}', 'cover'); $this->alterColumn('{{%v2_categories}}', 'active', "SET DEFAULT 'f'"); } diff --git a/tests/specs/blog_v2/migrations_pgsql_db/m200000_000005_change_table_v2_comments.php b/tests/specs/blog_v2/migrations_pgsql_db/m200000_000005_change_table_v2_comments.php index 592af74e..99a896c6 100644 --- a/tests/specs/blog_v2/migrations_pgsql_db/m200000_000005_change_table_v2_comments.php +++ b/tests/specs/blog_v2/migrations_pgsql_db/m200000_000005_change_table_v2_comments.php @@ -13,10 +13,10 @@ public function safeUp() $this->dropColumn('{{%v2_comments}}', 'author_id'); $this->alterColumn('{{%v2_comments}}', 'message', 'text NOT NULL USING "message"::text'); $this->alterColumn('{{%v2_comments}}', 'message', "DROP DEFAULT"); - $this->alterColumn('{{%v2_comments}}', 'meta_data', 'string(300) NULL USING "meta_data"::string'); + $this->alterColumn('{{%v2_comments}}', 'meta_data', 'varchar(300) NULL USING "meta_data"::varchar'); $this->alterColumn('{{%v2_comments}}', 'meta_data', "DROP NOT NULL"); $this->alterColumn('{{%v2_comments}}', 'meta_data', "SET DEFAULT ''"); - $this->alterColumn('{{%v2_comments}}', 'created_at', 'datetime NOT NULL USING "created_at"::datetime'); + $this->alterColumn('{{%v2_comments}}', 'created_at', 'timestamp NOT NULL USING "created_at"::timestamp'); $this->addForeignKey('fk_v2_comments_post_id_v2_posts_id', '{{%v2_comments}}', 'post_id', '{{%v2_posts}}', 'id'); $this->addForeignKey('fk_v2_comments_user_id_v2_users_id', '{{%v2_comments}}', 'user_id', '{{%v2_users}}', 'id'); } diff --git a/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/app/migrations_pgsql_db/m200000_000000_change_table_fruits.php b/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/app/migrations_pgsql_db/m200000_000000_change_table_fruits.php index 2905aec3..574730fe 100644 --- a/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/app/migrations_pgsql_db/m200000_000000_change_table_fruits.php +++ b/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/app/migrations_pgsql_db/m200000_000000_change_table_fruits.php @@ -5,15 +5,15 @@ */ class m200000_000000_change_table_fruits extends \yii\db\Migration { - public function up() + public function safeUp() { - $this->db->createCommand('ALTER TABLE {{%fruits}} ADD COLUMN test_emails json NOT NULL')->execute(); - $this->alterColumn('{{%fruits}}', 'name', $this->text()->notNull()); + $this->alterColumn('{{%fruits}}', 'name', $this->string(151)->notNull()); + $this->alterColumn('{{%fruits}}', 'name', "SET NOT NULL"); } - public function down() + public function safeDown() { - $this->alterColumn('{{%fruits}}', 'name', $this->string(255)->null()->defaultValue(null)); - $this->dropColumn('{{%fruits}}', 'test_emails'); + $this->alterColumn('{{%fruits}}', 'name', $this->string(150)->null()); + $this->alterColumn('{{%fruits}}', 'name', "DROP NOT NULL"); } } diff --git a/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.yaml b/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.yaml index 46fbbd6d..cb140f53 100644 --- a/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.yaml +++ b/tests/specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.yaml @@ -25,4 +25,4 @@ components: name: type: string example: desc - maxLength: 150 + maxLength: 151 diff --git a/tests/unit/IssueFixTest.php b/tests/unit/IssueFixTest.php index c164c9cd..b8048f3c 100644 --- a/tests/unit/IssueFixTest.php +++ b/tests/unit/IssueFixTest.php @@ -64,6 +64,7 @@ private function deleteTables() $this->deleteTablesForNoSyntaxError107(); $this->deleteTableForQuoteInAlterColumn(); $this->deleteTableForTimestampIssue143(); + $this->deleteTablesForWrongMigrationForPgsqlForStringVarcharDatatype149(); } private function deleteTablesForFloatIssue() @@ -227,25 +228,28 @@ public function testModelNameMoreThanOnceInFakerIssue148() // wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype public function testWrongMigrationForPgsqlForStringVarcharDatatype149() { + $this->changeDbToPgsql(); + $this->deleteTablesForWrongMigrationForPgsqlForStringVarcharDatatype149(); + $this->createTableForWrongMigrationForPgsqlForStringVarcharDatatype149(); $testFile = Yii::getAlias("@specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149.php"); $this->runGenerator($testFile, 'pgsql'); $actualFiles = FileHelper::findFiles(Yii::getAlias('@app'), [ 'recursive' => true, ]); - // $expectedFiles = FileHelper::findFiles(Yii::getAlias("@specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/app"), [ - // 'recursive' => true, - // ]); - // $this->checkFiles($actualFiles, $expectedFiles); - // $this->runActualMigrations('pgsql', 1); - // $this->deleteTables(); + $expectedFiles = FileHelper::findFiles(Yii::getAlias("@specs/issue_fix/wrong_migration_for_pgsql_is_generated_for_string_varchar_datatype_149/app"), [ + 'recursive' => true, + ]); + $this->checkFiles($actualFiles, $expectedFiles); + $this->runActualMigrations('pgsql', 1); + $this->deleteTables(); } private function createTableForWrongMigrationForPgsqlForStringVarcharDatatype149() { Yii::$app->db->createCommand()->createTable('{{%fruits}}', [ 'id' => 'pk', - 'vat_percent' => 'string 8', // TODO WIP resume from here + 'name' => 'string(150)', # not null ])->execute(); }