From 43fea9bc2d376c2bb3d11e7ed2db67ce66b4a363 Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Thu, 6 May 2021 17:39:59 +0200 Subject: [PATCH] Integration test for RETURNING --- extras/integration_tests/tests/build.yaml | 4 +++- .../tests/lib/database/database.dart | 1 + .../tests/lib/database/database.g.dart | 13 +++++++++++++ .../tests/lib/suite/crud_tests.dart | 12 ++++++++++++ extras/integration_tests/tests/lib/suite/suite.dart | 2 ++ extras/integration_tests/vm/test/vm_test.dart | 7 +++++++ .../web/test/integration_test.dart | 6 ++++++ 7 files changed, 44 insertions(+), 1 deletion(-) diff --git a/extras/integration_tests/tests/build.yaml b/extras/integration_tests/tests/build.yaml index f84aa976..c68a6eaf 100644 --- a/extras/integration_tests/tests/build.yaml +++ b/extras/integration_tests/tests/build.yaml @@ -4,4 +4,6 @@ targets: moor_generator: options: generate_connect_constructor: true - override_hash_and_equals_in_result_sets: true \ No newline at end of file + override_hash_and_equals_in_result_sets: true + sqlite: + version: "3.35" diff --git a/extras/integration_tests/tests/lib/database/database.dart b/extras/integration_tests/tests/lib/database/database.dart index cb09e71f..6f3e1023 100644 --- a/extras/integration_tests/tests/lib/database/database.dart +++ b/extras/integration_tests/tests/lib/database/database.dart @@ -87,6 +87,7 @@ class PreferenceConverter extends TypeConverter { 'userCount': 'SELECT COUNT(id) FROM users', 'settingsFor': 'SELECT preferences FROM users WHERE id = :user', 'usersById': 'SELECT * FROM users WHERE id IN ?', + 'returning': 'INSERT INTO friendships VALUES (?, ?, ?) RETURNING *;', }, ) class Database extends _$Database { diff --git a/extras/integration_tests/tests/lib/database/database.g.dart b/extras/integration_tests/tests/lib/database/database.g.dart index ee624cae..00c44459 100644 --- a/extras/integration_tests/tests/lib/database/database.g.dart +++ b/extras/integration_tests/tests/lib/database/database.g.dart @@ -647,6 +647,19 @@ abstract class _$Database extends GeneratedDatabase { readsFrom: {users}).map(users.mapFromRow); } + Future> returning(int var1, int var2, bool var3) { + return customWriteReturning( + 'INSERT INTO friendships VALUES (?, ?, ?) RETURNING *;', + variables: [ + Variable(var1), + Variable(var2), + Variable(var3) + ], + updates: { + friendships + }).then((rows) => rows.map(friendships.mapFromRow).toList()); + } + @override Iterable get allTables => allSchemaEntities.whereType(); @override diff --git a/extras/integration_tests/tests/lib/suite/crud_tests.dart b/extras/integration_tests/tests/lib/suite/crud_tests.dart index fbdf0e6a..8d1e31f8 100644 --- a/extras/integration_tests/tests/lib/suite/crud_tests.dart +++ b/extras/integration_tests/tests/lib/suite/crud_tests.dart @@ -21,6 +21,18 @@ void crudTests(TestExecutor executor) { await db.close(); }); + test('supports RETURNING', () async { + final db = Database(executor.createConnection()); + final result = await db.returning(1, 2, true); + expect(result, + [Friendship(firstUser: 1, secondUser: 2, reallyGoodFriends: true)]); + + await db.close(); + }, + skip: executor.supportsReturning + ? null + : 'Runner does not support RETURNING'); + test('IN ? expressions can be expanded', () async { // regression test for https://github.com/simolus3/moor/issues/156 final db = Database(executor.createConnection()); diff --git a/extras/integration_tests/tests/lib/suite/suite.dart b/extras/integration_tests/tests/lib/suite/suite.dart index 37e09274..81cec9f5 100644 --- a/extras/integration_tests/tests/lib/suite/suite.dart +++ b/extras/integration_tests/tests/lib/suite/suite.dart @@ -9,6 +9,8 @@ import 'migrations.dart'; abstract class TestExecutor { DatabaseConnection createConnection(); + bool get supportsReturning => false; + /// Delete the data that would be written by the executor. Future deleteData(); } diff --git a/extras/integration_tests/vm/test/vm_test.dart b/extras/integration_tests/vm/test/vm_test.dart index f5ec5596..7c2e2632 100644 --- a/extras/integration_tests/vm/test/vm_test.dart +++ b/extras/integration_tests/vm/test/vm_test.dart @@ -1,6 +1,7 @@ import 'dart:io'; import 'package:moor/ffi.dart'; +import 'package:sqlite3/sqlite3.dart'; import 'package:tests/tests.dart'; import 'package:path/path.dart' show join; @@ -9,6 +10,12 @@ class VmExecutor extends TestExecutor { static String fileName = 'moor-vm-tests-${DateTime.now().toIso8601String()}'; final File file = File(join(Directory.systemTemp.path, fileName)); + @override + bool get supportsReturning { + final version = sqlite3.version; + return version.versionNumber > 3035000; + } + @override DatabaseConnection createConnection() { return DatabaseConnection.fromExecutor(VmDatabase(file)); diff --git a/extras/integration_tests/web/test/integration_test.dart b/extras/integration_tests/web/test/integration_test.dart index 64e3dc66..26222395 100644 --- a/extras/integration_tests/web/test/integration_test.dart +++ b/extras/integration_tests/web/test/integration_test.dart @@ -8,6 +8,9 @@ import 'package:moor/moor_web.dart'; class WebExecutor extends TestExecutor { final String name = 'db'; + @override + bool get supportsReturning => true; + @override DatabaseConnection createConnection() { return DatabaseConnection.fromExecutor(WebDatabase(name)); @@ -21,6 +24,9 @@ class WebExecutor extends TestExecutor { } class WebExecutorIndexedDb extends TestExecutor { + @override + bool get supportsReturning => true; + @override DatabaseConnection createConnection() { return DatabaseConnection.fromExecutor(