2019-03-15 04:56:22 -07:00
|
|
|
import 'package:moor/moor.dart';
|
2019-09-26 13:52:20 -07:00
|
|
|
import 'package:test/test.dart';
|
2019-03-15 04:56:22 -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();
|
2019-10-30 11:25:26 -07:00
|
|
|
|
|
|
|
final connection = createConnection(executor, streamQueries);
|
|
|
|
db = TodoDb.connect(connection);
|
2019-03-15 04:56:22 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
test('generates insert statements', () async {
|
2019-06-21 11:29:42 -07:00
|
|
|
await db.into(db.todosTable).insert(const TodosTableCompanion(
|
|
|
|
content: Value('Implement insert statements'),
|
2019-09-29 07:21:09 -07:00
|
|
|
title: Value.absent(),
|
2019-03-15 04:56:22 -07:00
|
|
|
));
|
|
|
|
|
|
|
|
verify(executor.runInsert('INSERT INTO todos (content) VALUES (?)',
|
|
|
|
['Implement insert statements']));
|
|
|
|
});
|
|
|
|
|
2019-06-08 06:04:49 -07:00
|
|
|
test('can insert floating point values', () async {
|
|
|
|
// regression test for https://github.com/simolus3/moor/issues/30
|
2019-07-18 03:02:16 -07:00
|
|
|
await db.into(db.tableWithoutPK).insert(
|
|
|
|
TableWithoutPKData(notReallyAnId: 42, someFloat: 3.1415, custom: null));
|
2019-06-08 06:04:49 -07:00
|
|
|
|
|
|
|
verify(executor.runInsert(
|
|
|
|
'INSERT INTO table_without_p_k '
|
2020-01-21 02:07:05 -08:00
|
|
|
'(not_really_an_id, some_float, custom) VALUES (?, ?, ?)',
|
|
|
|
[42, 3.1415, anything]));
|
2019-06-08 06:04:49 -07:00
|
|
|
});
|
|
|
|
|
2019-03-15 04:56:22 -07:00
|
|
|
test('generates insert or replace statements', () async {
|
2019-04-23 05:04:45 -07:00
|
|
|
await db.into(db.todosTable).insert(
|
2019-10-21 08:14:58 -07:00
|
|
|
TodoEntry(
|
|
|
|
id: 113,
|
|
|
|
content: 'Done',
|
|
|
|
),
|
|
|
|
mode: InsertMode.insertOrReplace);
|
|
|
|
|
|
|
|
verify(executor.runInsert(
|
|
|
|
'INSERT OR REPLACE INTO todos (id, content) VALUES (?, ?)',
|
|
|
|
[113, 'Done']));
|
|
|
|
});
|
|
|
|
|
2019-07-02 13:42:49 -07:00
|
|
|
test('generates DEFAULT VALUES statement when otherwise empty', () async {
|
|
|
|
await db.into(db.pureDefaults).insert(const PureDefaultsCompanion());
|
|
|
|
|
|
|
|
verify(executor.runInsert('INSERT INTO pure_defaults DEFAULT VALUES', []));
|
|
|
|
});
|
|
|
|
|
2019-03-15 04:56:22 -07:00
|
|
|
test('notifies stream queries on inserts', () async {
|
2019-06-21 11:29:42 -07:00
|
|
|
await db.into(db.users).insert(UsersCompanion(
|
|
|
|
name: const Value('User McUserface'),
|
|
|
|
isAwesome: const Value(true),
|
|
|
|
profilePicture: Value(Uint8List(0)),
|
2019-03-15 04:56:22 -07:00
|
|
|
));
|
|
|
|
|
2020-03-04 11:28:31 -08:00
|
|
|
verify(streamQueries.handleTableUpdates(
|
|
|
|
{const TableUpdate('users', kind: UpdateKind.insert)}));
|
2019-03-15 04:56:22 -07:00
|
|
|
});
|
|
|
|
|
2019-09-29 07:21:09 -07:00
|
|
|
test('enforces data integrity', () async {
|
|
|
|
InvalidDataException exception;
|
|
|
|
try {
|
|
|
|
await db.into(db.todosTable).insert(
|
2019-06-21 11:29:42 -07:00
|
|
|
const TodosTableCompanion(
|
|
|
|
// not declared as nullable in table definition
|
|
|
|
content: Value(null),
|
2019-03-15 04:56:22 -07:00
|
|
|
),
|
2019-09-29 07:21:09 -07:00
|
|
|
);
|
|
|
|
fail('inserting invalid data did not throw');
|
|
|
|
} on InvalidDataException catch (e) {
|
|
|
|
exception = e;
|
|
|
|
}
|
|
|
|
|
|
|
|
expect(exception.toString(), startsWith('InvalidDataException'));
|
2019-03-15 04:56:22 -07:00
|
|
|
});
|
2019-04-01 03:27:13 -07:00
|
|
|
|
2020-01-21 02:07:05 -08:00
|
|
|
test("doesn't allow writing null rows", () {
|
|
|
|
expect(
|
|
|
|
() {
|
|
|
|
return db.into(db.todosTable).insert(null);
|
|
|
|
},
|
|
|
|
throwsA(const TypeMatcher<InvalidDataException>().having(
|
|
|
|
(e) => e.message, 'message', contains('Cannot write null row'))),
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('reports auto-increment id', () {
|
2019-04-01 03:27:13 -07:00
|
|
|
when(executor.runInsert(any, any)).thenAnswer((_) => Future.value(42));
|
|
|
|
|
2019-06-21 11:29:42 -07:00
|
|
|
expect(
|
|
|
|
db
|
|
|
|
.into(db.todosTable)
|
|
|
|
.insert(const TodosTableCompanion(content: Value('Bottom text'))),
|
|
|
|
completion(42),
|
|
|
|
);
|
2019-04-01 03:27:13 -07:00
|
|
|
});
|
2019-12-02 12:40:41 -08:00
|
|
|
|
2020-01-21 02:07:05 -08:00
|
|
|
test('evaluates client-default functions', () async {
|
|
|
|
await db.into(db.tableWithoutPK).insert(
|
|
|
|
TableWithoutPKCompanion.insert(notReallyAnId: 3, someFloat: 3.14));
|
|
|
|
|
|
|
|
// the client default generates a uuid
|
|
|
|
final uuidRegex = RegExp(
|
|
|
|
r'[0-9a-f]{8}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{12}');
|
|
|
|
|
|
|
|
verify(executor.runInsert(
|
|
|
|
'INSERT INTO table_without_p_k (not_really_an_id, some_float, custom) '
|
|
|
|
'VALUES (?, ?, ?)',
|
|
|
|
[3, 3.14, matches(uuidRegex)],
|
|
|
|
));
|
|
|
|
});
|
|
|
|
|
2019-12-02 12:40:41 -08:00
|
|
|
test('escaped when column name is keyword', () async {
|
|
|
|
await db
|
|
|
|
.into(db.pureDefaults)
|
|
|
|
.insert(PureDefaultsCompanion.insert(txt: const Value('foo')));
|
|
|
|
|
|
|
|
verify(executor
|
|
|
|
.runInsert('INSERT INTO pure_defaults (`insert`) VALUES (?)', ['foo']));
|
|
|
|
});
|
2019-03-15 04:56:22 -07:00
|
|
|
}
|