drift/moor/test/update_test.dart

164 lines
5.0 KiB
Dart
Raw Normal View History

import 'dart:async';
2020-11-18 13:53:27 -08:00
import 'package:mockito/mockito.dart';
2019-03-09 07:37:22 -08:00
import 'package:moor/moor.dart';
2019-09-26 13:52:20 -07:00
import 'package:test/test.dart';
2019-02-14 08:25:41 -08:00
2019-02-17 04:07:27 -08:00
import 'data/tables/todos.dart';
import 'data/utils/mocks.dart';
2019-02-14 08:25:41 -08:00
void main() {
2021-01-20 03:30:59 -08:00
late TodoDb db;
late MockExecutor executor;
late MockStreamQueries streamQueries;
2019-02-14 08:25:41 -08:00
setUp(() {
executor = MockExecutor();
streamQueries = MockStreamQueries();
final connection = createConnection(executor, streamQueries);
db = TodoDb.connect(connection);
2019-02-14 08:25:41 -08:00
});
group('generates update statements', () {
test('for entire table', () async {
2019-06-21 11:29:42 -07:00
await db.update(db.todosTable).write(const TodosTableCompanion(
title: Value('Updated title'),
category: Value(3),
));
2019-02-14 08:25:41 -08:00
verify(executor.runUpdate(
2019-03-05 11:59:10 -08:00
'UPDATE todos SET title = ?, category = ?;', ['Updated title', 3]));
2019-02-14 08:25:41 -08:00
});
test('with a WHERE clause', () async {
2019-02-14 08:25:41 -08:00
await (db.update(db.todosTable)
..where((t) => t.id.isSmallerThanValue(50)))
2019-06-21 11:29:42 -07:00
.write(const TodosTableCompanion(title: Value('Changed title')));
2019-02-14 08:25:41 -08:00
verify(executor.runUpdate(
2019-02-19 02:19:58 -08:00
'UPDATE todos SET title = ? WHERE id < ?;', ['Changed title', 50]));
2019-02-14 08:25:41 -08:00
});
2020-05-04 11:15:23 -07:00
test('with escaped column names', () async {
await db
.update(db.pureDefaults)
.write(const PureDefaultsCompanion(txt: Value('foo')));
verify(executor
.runUpdate('UPDATE pure_defaults SET "insert" = ?;', ['foo']));
2020-05-04 11:15:23 -07:00
});
2019-02-14 08:25:41 -08:00
});
group('generates replace statements', () {
test('regular', () async {
await db.update(db.todosTable).replace(TodoEntry(
id: 3,
title: 'Title',
content: 'Updated content',
// category and targetDate are null
));
verify(executor.runUpdate(
'UPDATE todos SET title = ?, content = ?, '
'target_date = NULL, category = NULL WHERE id = ?;',
['Title', 'Updated content', 3]));
});
test('applies default values', () async {
await db.update(db.users).replace(
UsersCompanion(
id: const Value(3),
name: const Value('Hummingbird'),
profilePicture: Value(Uint8List(0)),
),
);
verify(executor.runUpdate(
'UPDATE users SET name = ?, profile_picture = ?, is_awesome = 1, '
'creation_time = strftime(\'%s\', CURRENT_TIMESTAMP) WHERE id = ?;',
['Hummingbird', Uint8List(0), 3]));
});
});
2019-02-14 08:25:41 -08:00
test('does not update with invalid data', () {
// The length of a title must be between 4 and 16 chars
expect(() async {
2019-06-21 11:29:42 -07:00
await db
.update(db.todosTable)
.write(const TodosTableCompanion(title: Value('lol')));
2019-02-14 08:25:41 -08:00
}, throwsA(const TypeMatcher<InvalidDataException>()));
});
group('Table updates for update statements', () {
2019-02-14 08:25:41 -08:00
test('are issued when data was changed', () async {
when(executor.runUpdate(any, any)).thenAnswer((_) => Future.value(3));
2019-06-21 11:29:42 -07:00
await db.update(db.todosTable).write(const TodosTableCompanion(
content: Value('Updated content'),
2019-03-05 11:59:10 -08:00
));
2019-02-14 08:25:41 -08:00
2020-03-04 13:08:58 -08:00
verify(streamQueries.handleTableUpdates(
{TableUpdate.onTable(db.todosTable, kind: UpdateKind.update)}));
2019-02-14 08:25:41 -08:00
});
test('are not issued when no data was changed', () async {
when(executor.runDelete(any, any)).thenAnswer((_) => Future.value(0));
2019-06-21 11:29:42 -07:00
await db.update(db.todosTable).write(const TodosTableCompanion());
2019-02-14 08:25:41 -08:00
verifyNever(streamQueries.handleTableUpdates(any));
});
});
2020-04-17 12:29:12 -07:00
test('can update with custom companions', () async {
await db.update(db.todosTable).replace(TodosTableCompanion.custom(
id: const Variable(4),
2021-01-20 03:30:59 -08:00
content: db.todosTable.content.dartCast(),
2020-04-17 12:29:12 -07:00
targetDate: db.todosTable.targetDate + const Duration(days: 1),
));
verify(executor.runUpdate(
'UPDATE todos SET content = content, target_date = target_date + ? '
'WHERE id = ?;',
argThat(equals([86400, 4])),
));
});
group('custom updates', () {
test('execute the correct sql', () async {
2019-02-28 13:06:05 -08:00
await db.customUpdate('DELETE FROM users');
verify(executor.runUpdate('DELETE FROM users', []));
});
test('map the variables correctly', () async {
2019-02-28 13:06:05 -08:00
await db.customUpdate(
'DELETE FROM users WHERE name = ? AND birthdate < ?',
variables: [
Variable.withString('Name'),
Variable.withDateTime(
DateTime.fromMillisecondsSinceEpoch(1551297563000))
]);
verify(executor.runUpdate(
'DELETE FROM users WHERE name = ? AND birthdate < ?',
['Name', 1551297563]));
});
test('returns information from executor', () async {
when(executor.runUpdate(any, any)).thenAnswer((_) => Future.value(10));
2019-02-28 13:06:05 -08:00
expect(await db.customUpdate(''), 10);
});
test('informs about updated tables', () async {
2019-03-01 11:23:14 -08:00
await db.customUpdate('', updates: {db.users, db.todosTable});
verify(streamQueries.handleTableUpdates(
{const TableUpdate('users'), const TableUpdate('todos')}));
});
});
2019-02-14 08:25:41 -08:00
}