2019-07-05 00:53:19 -07:00
|
|
|
@TestOn('!browser') // todo: Figure out why this doesn't run in js
|
|
|
|
|
|
|
|
/*
|
|
|
|
These tests don't work when compiled to js:
|
|
|
|
|
|
|
|
NoSuchMethodError: method not found: 'beginTransaction$0' (executor.beginTransaction$0 is not a function)
|
|
|
|
package:moor/src/runtime/database.dart 185:45 <fn>
|
|
|
|
org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/async_patch.dart 313:19 _wrapJsFunctionForAsync.closure.$protected
|
|
|
|
org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/async_patch.dart 338:23 _wrapJsFunctionForAsync.<fn>
|
|
|
|
package:stack_trace StackZoneSpecification._registerBinaryCallback.<fn>
|
|
|
|
org-dartlang-sdk:///sdk/lib/_internal/js_runtime/lib/async_patch.dart 242:3 Object._asyncStartSync
|
|
|
|
package:moor/src/runtime/database.dart 185:13 QueryEngine.transaction.<fn>
|
|
|
|
test/data/utils/mocks.dart 22:20 MockExecutor.<fn>
|
|
|
|
package:mockito/src/mock.dart 128:22 MockExecutor.noSuchMethod
|
|
|
|
*/
|
|
|
|
|
2019-09-26 13:52:20 -07:00
|
|
|
import 'package:test/test.dart';
|
2019-06-21 11:29:42 -07:00
|
|
|
import 'package:moor/moor.dart';
|
2019-03-10 04:38:53 -07:00
|
|
|
|
|
|
|
import 'data/tables/todos.dart';
|
|
|
|
import 'data/utils/mocks.dart';
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
TodoDb db;
|
|
|
|
MockExecutor executor;
|
|
|
|
MockStreamQueries streamQueries;
|
|
|
|
|
|
|
|
setUp(() {
|
|
|
|
executor = MockExecutor();
|
|
|
|
streamQueries = MockStreamQueries();
|
|
|
|
db = TodoDb(executor)..streamQueries = streamQueries;
|
|
|
|
});
|
|
|
|
|
|
|
|
test("transactions don't allow creating streams", () {
|
|
|
|
expect(() async {
|
2019-09-13 12:04:15 -07:00
|
|
|
await db.transaction(() async {
|
|
|
|
db.select(db.users).watch();
|
2019-03-10 04:38:53 -07:00
|
|
|
});
|
|
|
|
}, throwsStateError);
|
|
|
|
});
|
|
|
|
|
2019-07-07 04:03:15 -07:00
|
|
|
test('nested transactions use the outer transaction', () async {
|
2019-09-13 12:04:15 -07:00
|
|
|
await db.transaction(() async {
|
|
|
|
await db.transaction(() async {
|
|
|
|
// todo how can we test that these are really equal?
|
2019-03-27 10:20:16 -07:00
|
|
|
});
|
2019-07-07 04:03:15 -07:00
|
|
|
|
|
|
|
// the outer callback has not completed yet, so shouldn't send
|
|
|
|
verifyNever(executor.transactions.send());
|
|
|
|
});
|
|
|
|
|
|
|
|
verify(executor.transactions.send());
|
|
|
|
});
|
|
|
|
|
|
|
|
test('code in callback uses transaction', () async {
|
|
|
|
// notice how we call .select on the database, but it should be called on
|
|
|
|
// transaction executor.
|
2019-09-13 12:04:15 -07:00
|
|
|
await db.transaction(() async {
|
2019-07-07 04:03:15 -07:00
|
|
|
await db.select(db.users).get();
|
|
|
|
});
|
|
|
|
|
|
|
|
verifyNever(executor.runSelect(any, any));
|
|
|
|
verify(executor.transactions.runSelect(any, any));
|
2019-03-27 10:20:16 -07:00
|
|
|
});
|
|
|
|
|
2019-07-23 00:06:02 -07:00
|
|
|
test('transactions rollback after errors', () async {
|
|
|
|
final exception = Exception('oh no');
|
2019-09-13 12:04:15 -07:00
|
|
|
final future = db.transaction(() async {
|
2019-07-23 00:06:02 -07:00
|
|
|
throw exception;
|
|
|
|
});
|
|
|
|
|
|
|
|
await expectLater(future, throwsA(exception));
|
|
|
|
|
|
|
|
verifyNever(executor.transactions.send());
|
|
|
|
verify(executor.transactions.rollback());
|
|
|
|
});
|
|
|
|
|
2019-03-10 04:38:53 -07:00
|
|
|
test('transactions notify about table udpates after completing', () async {
|
2019-03-10 07:08:29 -07:00
|
|
|
when(executor.transactions.runUpdate(any, any))
|
|
|
|
.thenAnswer((_) => Future.value(2));
|
2019-03-10 04:38:53 -07:00
|
|
|
|
2019-09-13 12:04:15 -07:00
|
|
|
await db.transaction(() async {
|
|
|
|
await db
|
2019-06-21 11:29:42 -07:00
|
|
|
.update(db.users)
|
|
|
|
.write(const UsersCompanion(name: Value('Updated name')));
|
2019-03-10 04:38:53 -07:00
|
|
|
|
|
|
|
// Even though we just wrote to users, this only happened inside the
|
|
|
|
// transaction, so the top level stream queries should not be updated.
|
|
|
|
verifyNever(streamQueries.handleTableUpdates(any));
|
|
|
|
});
|
|
|
|
|
|
|
|
// After the transaction completes, the queries should be updated
|
2019-03-20 04:11:57 -07:00
|
|
|
verify(streamQueries.handleTableUpdates({db.users})).called(1);
|
2019-03-10 04:38:53 -07:00
|
|
|
verify(executor.transactions.send());
|
|
|
|
});
|
2019-03-30 06:56:55 -07:00
|
|
|
|
|
|
|
test('the database is opened before starting a transaction', () async {
|
2019-09-13 12:04:15 -07:00
|
|
|
await db.transaction(() async {
|
2019-03-30 06:56:55 -07:00
|
|
|
verify(executor.doWhenOpened(any));
|
|
|
|
});
|
|
|
|
});
|
2019-03-10 07:08:29 -07:00
|
|
|
}
|