From 03885543c252d4ac1c19d01de743536e0fd9ee7f Mon Sep 17 00:00:00 2001 From: thomashii Date: Mon, 16 May 2022 13:04:21 +0800 Subject: [PATCH] Fixed failed test cases --- packages/orm/angel_orm_mysql/CHANGELOG.md | 6 +- packages/orm/angel_orm_mysql/README.md | 8 +- .../angel_orm_mysql/lib/src/orm_mysql.dart | 15 ++++ .../orm/angel_orm_mysql/test/all_test.dart | 27 ++++--- packages/orm/angel_orm_mysql/test/common.dart | 78 +++++++++++++++---- .../test/migrations/author.sql | 2 +- .../angel_orm_mysql/test/migrations/book.sql | 2 +- .../angel_orm_mysql/test/migrations/car.sql | 2 +- .../angel_orm_mysql/test/migrations/foot.sql | 2 +- .../angel_orm_mysql/test/migrations/fruit.sql | 2 +- .../test/migrations/has_car.sql | 2 +- .../test/migrations/has_map.sql | 2 +- .../angel_orm_mysql/test/migrations/leg.sql | 2 +- .../angel_orm_mysql/test/migrations/numba.sql | 2 +- .../angel_orm_mysql/test/migrations/role.sql | 2 +- .../angel_orm_mysql/test/migrations/song.sql | 2 +- .../angel_orm_mysql/test/migrations/tree.sql | 2 +- .../test/migrations/unorthodox.sql | 2 +- .../angel_orm_mysql/test/migrations/user.sql | 2 +- .../test/migrations/user_role.sql | 2 +- .../test/migrations/weird_join.sql | 6 +- .../orm/angel_orm_mysql/test/orm_debug.dart | 2 +- .../lib/src/many_to_many_test.dart | 3 +- 23 files changed, 125 insertions(+), 50 deletions(-) diff --git a/packages/orm/angel_orm_mysql/CHANGELOG.md b/packages/orm/angel_orm_mysql/CHANGELOG.md index 36c22dfc..f47ce61e 100644 --- a/packages/orm/angel_orm_mysql/CHANGELOG.md +++ b/packages/orm/angel_orm_mysql/CHANGELOG.md @@ -2,8 +2,10 @@ ## 6.0.0-beta.3 -* Updated transaction for `MariaDbExecutor` -* Updated transaction for `MySqlExecutor` +* Fixed transaction for `MariaDbExecutor` +* Fixed transaction for `MySqlExecutor` +* Fixed error for non `id` primary key +* Changed test cases to use tables instead of temporary tables to overcome limitations ## 6.0.0-beta.2 diff --git a/packages/orm/angel_orm_mysql/README.md b/packages/orm/angel_orm_mysql/README.md index 79dc1e4e..038358cd 100644 --- a/packages/orm/angel_orm_mysql/README.md +++ b/packages/orm/angel_orm_mysql/README.md @@ -7,7 +7,7 @@ This package contains the SQL Executor required by Angel3 ORM to work with MySQL and MariaDB respectively. In order to better support the differences in MySQL and MariaDb underlying protocols, two different drives have to be used. For MariaDb 10.2.x, `mysql1` driver provides the best results, while `mysql_client` driver handles MySQL 8.x.x without issues. -* MariaDbExecutor (stable) +* MariaDbExecutor (beta) * MySqlExecutor (beta) ## Supported database version @@ -51,3 +51,9 @@ This package contains the SQL Executor required by Angel3 ORM to work with MySQL await connection.connect(timeoutMs: 10000); var executor = MySqlExecutor(connection, logger: logger); ``` + +## Known limitation + +* UTC time is not supported +* Blob is not supported + \ No newline at end of file diff --git a/packages/orm/angel_orm_mysql/lib/src/orm_mysql.dart b/packages/orm/angel_orm_mysql/lib/src/orm_mysql.dart index 937279c3..773e5bc3 100644 --- a/packages/orm/angel_orm_mysql/lib/src/orm_mysql.dart +++ b/packages/orm/angel_orm_mysql/lib/src/orm_mysql.dart @@ -22,6 +22,8 @@ class MySqlExecutor extends QueryExecutor { return _connection.close(); } + MySQLConnection get rawConnection => _connection; + /* Future _startTransaction() { if (_connection is Transaction) { @@ -115,6 +117,8 @@ class MySqlExecutor extends QueryExecutor { query = query.replaceAll("?", ":id"); substitutionValues.clear(); substitutionValues['id'] = result.lastInsertID; + } else { + query = _convertSQL(query, substitutionValues); } } else if (query.startsWith("UPDATE")) { await _connection.execute(query, substitutionValues); @@ -133,6 +137,17 @@ class MySqlExecutor extends QueryExecutor { }); } + String _convertSQL(String query, Map substitutionValues) { + var newQuery = query; + for (var k in substitutionValues.keys) { + var fromPattern = '.$k = ?'; + var toPattern = '.$k = :$k'; + newQuery = newQuery.replaceFirst(fromPattern, toPattern); + } + + return newQuery; + } + @override Future transaction(FutureOr Function(QueryExecutor) f) async { logger.warning("Transaction"); diff --git a/packages/orm/angel_orm_mysql/test/all_test.dart b/packages/orm/angel_orm_mysql/test/all_test.dart index 57849fd9..14b9fcdb 100644 --- a/packages/orm/angel_orm_mysql/test/all_test.dart +++ b/packages/orm/angel_orm_mysql/test/all_test.dart @@ -11,23 +11,28 @@ void main() { }); group('mysql', () { - group('belongsTo', - () => belongsToTests(my(['author', 'book']), close: closeMy)); + group( + 'belongsTo', + () => belongsToTests(createTables(['author', 'book']), + close: dropTables)); group( 'edgeCase', - () => edgeCaseTests(my(['unorthodox', 'weird_join', 'song', 'numba']), - close: closeMy)); + () => edgeCaseTests( + createTables(['unorthodox', 'weird_join', 'song', 'numba']), + close: dropTables)); group('enumAndNested', - () => enumAndNestedTests(my(['has_car']), close: closeMy)); - group('hasMany', () => hasManyTests(my(['tree', 'fruit']), close: closeMy)); + () => enumAndNestedTests(createTables(['has_car']), close: dropTables)); + group('hasMany', + () => hasManyTests(createTables(['tree', 'fruit']), close: dropTables)); // NOTE: MySQL/MariaDB do not support jsonb data type - //group('hasMap', () => hasMapTests(my(['has_map']), close: closeMy)); + //group('hasMap', () => hasMapTests(createTables(['has_maps']), close: dropTables)); // NOTE: mysql1 driver do not support CAST(); - //group('hasOne', () => hasOneTests(my(['leg', 'foot']), close: closeMy)); + //group('hasOne', () => hasOneTests(createTables(['legs', 'feet']), close: dropTables)); group( 'manyToMany', - () => - manyToManyTests(my(['user', 'role', 'user_role']), close: closeMy)); - group('standalone', () => standaloneTests(my(['car']), close: closeMy)); + () => manyToManyTests(createTables(['user', 'role', 'user_role']), + close: dropTables)); + group('standalone', + () => standaloneTests(createTables(['car']), close: dropTables)); }); } diff --git a/packages/orm/angel_orm_mysql/test/common.dart b/packages/orm/angel_orm_mysql/test/common.dart index 3c342b49..488cff55 100644 --- a/packages/orm/angel_orm_mysql/test/common.dart +++ b/packages/orm/angel_orm_mysql/test/common.dart @@ -6,15 +6,47 @@ import 'package:logging/logging.dart'; import 'package:mysql1/mysql1.dart'; import 'package:mysql_client/mysql_client.dart'; -FutureOr Function() my(Iterable schemas) { - return () => connectToMySql(schemas); +List tmpTables = []; + +FutureOr Function() createTables(List schemas) { + // For MySQL + return () => _connectToMySql(schemas); + + // For MariaDB + // return () => _connectToMariaDb(tables); } -Future closeMy(QueryExecutor executor) => - (executor as MySqlExecutor).close(); +// For MySQL +Future dropTables(QueryExecutor executor) async { + var sqlExecutor = (executor as MySqlExecutor); + for (var tableName in tmpTables.reversed) { + await sqlExecutor.rawConnection.execute('drop table $tableName;'); + } + return sqlExecutor.close(); +} -// Executor for MariaDB 10.2.x -Future connectToMariaDb(Iterable schemas) async { +// For MariaDB +/* Future dropTables(QueryExecutor executor) { + var sqlExecutor = (executor as MariaDbExecutor); + for (var tableName in tmpTables.reversed) { + sqlExecutor.query(tableName, 'DROP TABLE $tableName', {}); + } + return sqlExecutor.close(); +} */ + +String extractTableName(String createQuery) { + var start = createQuery.indexOf('EXISTS'); + var end = createQuery.indexOf('('); + + if (start == -1 || end == -1) { + return ''; + } + + return createQuery.substring(start + 6, end).trim(); +} + +// Executor for MariaDB +Future _connectToMariaDb(List schemas) async { var settings = ConnectionSettings( host: 'localhost', port: 3306, @@ -23,7 +55,9 @@ Future connectToMariaDb(Iterable schemas) async { password: 'Test123*'); var connection = await MySqlConnection.connect(settings); - var logger = Logger('orm_mysql'); + var logger = Logger('orm_mariadb'); + + tmpTables.clear(); for (var s in schemas) { // MySQL driver does not support multiple sql queries @@ -34,6 +68,11 @@ Future connectToMariaDb(Iterable schemas) async { if (q.trim().isNotEmpty) { //await connection.execute(q); await connection.query(q); + + var tableName = extractTableName(q); + if (tableName != '') { + tmpTables.add(tableName); + } } } } @@ -41,20 +80,22 @@ Future connectToMariaDb(Iterable schemas) async { return MariaDbExecutor(connection, logger: logger); } -// Executor for MySQL 8.x.x -Future connectToMySql(Iterable schemas) async { +// Executor for MySQL +Future _connectToMySql(List schemas) async { var connection = await MySQLConnection.createConnection( - databaseName: 'orm_test', - port: 3306, - host: "localhost", - userName: Platform.environment['MYSQL_USERNAME'] ?? 'test', - password: Platform.environment['MYSQL_PASSWORD'] ?? 'Test123*', - ); + databaseName: 'orm_test', + port: 3306, + host: "localhost", + userName: Platform.environment['MYSQL_USERNAME'] ?? 'test', + password: Platform.environment['MYSQL_PASSWORD'] ?? 'Test123*', + secure: false); - await connection.connect(); + await connection.connect(timeoutMs: 10000); var logger = Logger('orm_mysql'); + tmpTables.clear(); + for (var s in schemas) { // MySQL driver does not support multiple sql queries var data = await File('test/migrations/$s.sql').readAsString(); @@ -63,6 +104,11 @@ Future connectToMySql(Iterable schemas) async { //print("Table: [$q]"); if (q.trim().isNotEmpty) { await connection.execute(q); + + var tableName = extractTableName(q); + if (tableName != '') { + tmpTables.add(tableName); + } } } } diff --git a/packages/orm/angel_orm_mysql/test/migrations/author.sql b/packages/orm/angel_orm_mysql/test/migrations/author.sql index 7ae6477a..b862b90f 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/author.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/author.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE authors ( +CREATE TABLE IF NOT EXISTS authors ( id serial PRIMARY KEY, name varchar(255) UNIQUE NOT NULL, created_at timestamp, diff --git a/packages/orm/angel_orm_mysql/test/migrations/book.sql b/packages/orm/angel_orm_mysql/test/migrations/book.sql index 1cc39baa..f893c9ef 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/book.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/book.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE books ( +CREATE TABLE IF NOT EXISTS books ( id serial PRIMARY KEY, author_id int NOT NULL, partner_author_id int, diff --git a/packages/orm/angel_orm_mysql/test/migrations/car.sql b/packages/orm/angel_orm_mysql/test/migrations/car.sql index c27b953e..80058dfb 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/car.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/car.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE cars ( +CREATE TABLE IF NOT EXISTS cars ( id serial PRIMARY KEY, make varchar(255) NOT NULL, description TEXT NOT NULL, diff --git a/packages/orm/angel_orm_mysql/test/migrations/foot.sql b/packages/orm/angel_orm_mysql/test/migrations/foot.sql index d25733e0..54486289 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/foot.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/foot.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE feet ( +CREATE TABLE IF NOT EXISTS feet ( id serial PRIMARY KEY, leg_id int NOT NULL, n_toes int NOT NULL, diff --git a/packages/orm/angel_orm_mysql/test/migrations/fruit.sql b/packages/orm/angel_orm_mysql/test/migrations/fruit.sql index 88f12969..901f03cb 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/fruit.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/fruit.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE fruits ( +CREATE TABLE IF NOT EXISTS fruits ( id serial, tree_id int, common_name varchar(255), diff --git a/packages/orm/angel_orm_mysql/test/migrations/has_car.sql b/packages/orm/angel_orm_mysql/test/migrations/has_car.sql index d4b47b42..24319fcd 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/has_car.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/has_car.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE has_cars ( +CREATE TABLE IF NOT EXISTS has_cars ( id serial PRIMARY KEY, type int not null, created_at timestamp, diff --git a/packages/orm/angel_orm_mysql/test/migrations/has_map.sql b/packages/orm/angel_orm_mysql/test/migrations/has_map.sql index 046b8145..b0861fbf 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/has_map.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/has_map.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE has_maps ( +CREATE TABLE IF NOT EXISTS has_maps ( id serial PRIMARY KEY, value jsonb not null, list jsonb not null, diff --git a/packages/orm/angel_orm_mysql/test/migrations/leg.sql b/packages/orm/angel_orm_mysql/test/migrations/leg.sql index 46b19092..77308a3e 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/leg.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/leg.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE legs ( +CREATE TABLE IF NOT EXISTS legs ( id serial PRIMARY KEY, name varchar(255) NOT NULL, created_at timestamp, diff --git a/packages/orm/angel_orm_mysql/test/migrations/numba.sql b/packages/orm/angel_orm_mysql/test/migrations/numba.sql index 41fe7c4d..c7b23a35 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/numba.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/numba.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE numbas ( +CREATE TABLE IF NOT EXISTS numbas ( i int NOT NULL UNIQUE, parent int, created_at TIMESTAMP, diff --git a/packages/orm/angel_orm_mysql/test/migrations/role.sql b/packages/orm/angel_orm_mysql/test/migrations/role.sql index 7eeeb950..3c9e3413 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/role.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/role.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE roles ( +CREATE TABLE IF NOT EXISTS roles ( id serial PRIMARY KEY, name varchar(255), created_at timestamp, diff --git a/packages/orm/angel_orm_mysql/test/migrations/song.sql b/packages/orm/angel_orm_mysql/test/migrations/song.sql index 98e0ebb2..11435b01 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/song.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/song.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE songs ( +CREATE TABLE IF NOT EXISTS songs ( id serial, weird_join_id int, title varchar(255), diff --git a/packages/orm/angel_orm_mysql/test/migrations/tree.sql b/packages/orm/angel_orm_mysql/test/migrations/tree.sql index 08ec4d84..c9fc19cf 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/tree.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/tree.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE trees ( +CREATE TABLE IF NOT EXISTS trees ( id serial, rings smallint UNIQUE, created_at timestamp, diff --git a/packages/orm/angel_orm_mysql/test/migrations/unorthodox.sql b/packages/orm/angel_orm_mysql/test/migrations/unorthodox.sql index 24eaa397..40d50e6c 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/unorthodox.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/unorthodox.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE unorthodoxes ( +CREATE TABLE IF NOT EXISTS unorthodoxes ( name varchar(255) NOT NULL UNIQUE, PRIMARY KEY(name) ); \ No newline at end of file diff --git a/packages/orm/angel_orm_mysql/test/migrations/user.sql b/packages/orm/angel_orm_mysql/test/migrations/user.sql index 9b95b734..3248b483 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/user.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/user.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE users ( +CREATE TABLE IF NOT EXISTS users ( id serial PRIMARY KEY, username varchar(255), password varchar(255), diff --git a/packages/orm/angel_orm_mysql/test/migrations/user_role.sql b/packages/orm/angel_orm_mysql/test/migrations/user_role.sql index cc03240c..43a74d50 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/user_role.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/user_role.sql @@ -1,4 +1,4 @@ -CREATE TEMPORARY TABLE role_users ( +CREATE TABLE IF NOT EXISTS role_users ( id serial PRIMARY KEY, user_id int NOT NULL, role_id int NOT NULL, diff --git a/packages/orm/angel_orm_mysql/test/migrations/weird_join.sql b/packages/orm/angel_orm_mysql/test/migrations/weird_join.sql index 9e4ceee6..81bb1f5b 100644 --- a/packages/orm/angel_orm_mysql/test/migrations/weird_join.sql +++ b/packages/orm/angel_orm_mysql/test/migrations/weird_join.sql @@ -1,15 +1,15 @@ -CREATE TEMPORARY TABLE weird_joins ( +CREATE TABLE IF NOT EXISTS weird_joins ( id serial, join_name varchar(255), PRIMARY KEY(id) ); -CREATE TEMPORARY TABLE foos ( +CREATE TABLE IF NOT EXISTS foos ( bar varchar(255) not null UNIQUE, PRIMARY KEY(bar) ); -CREATE TEMPORARY TABLE foo_pivots ( +CREATE TABLE IF NOT EXISTS foo_pivots ( weird_join_id int, foo_bar varchar(255) ); diff --git a/packages/orm/angel_orm_mysql/test/orm_debug.dart b/packages/orm/angel_orm_mysql/test/orm_debug.dart index 7ceeadf9..ed5c6e8e 100644 --- a/packages/orm/angel_orm_mysql/test/orm_debug.dart +++ b/packages/orm/angel_orm_mysql/test/orm_debug.dart @@ -14,7 +14,7 @@ void main() async { // if (rec.stackTrace != null) print(rec.stackTrace); //}); - belongsToTests(my(['author', 'book']), close: closeMy); + belongsToTests(createTables(['author', 'book']), close: dropTables); //hasOneTests(my(['leg', 'foot']), close: closeMy); //standaloneTests(my(['car']), close: closeMy); diff --git a/packages/orm/angel_orm_test/lib/src/many_to_many_test.dart b/packages/orm/angel_orm_test/lib/src/many_to_many_test.dart index 5146eda5..04a138c9 100644 --- a/packages/orm/angel_orm_test/lib/src/many_to_many_test.dart +++ b/packages/orm/angel_orm_test/lib/src/many_to_many_test.dart @@ -61,7 +61,8 @@ void manyToManyTests(FutureOr Function() createExecutor, ..username = 'thosakwe' ..password = 'Hahahahayoureallythoughtiwasstupidenoughtotypethishere' ..email = 'thosakwe AT gmail.com'; - thosakwe = (await thosakweQuery.insert(executor)).value; + var result = await thosakweQuery.insert(executor); + thosakwe = result.value; print('=== THOSAKWE: ${thosakwe?.toJson()}'); // Allow thosakwe to publish...