drift/moor_generator/test/parser/parser_test.dart

144 lines
4.6 KiB
Dart
Raw Normal View History

2019-02-03 04:56:31 -08:00
import 'package:analyzer/dart/element/element.dart';
2019-03-09 07:37:22 -08:00
import 'package:moor_generator/src/model/specified_column.dart';
import 'package:moor_generator/src/options.dart';
2019-03-09 07:37:22 -08:00
import 'package:moor_generator/src/parser/column_parser.dart';
import 'package:moor_generator/src/parser/table_parser.dart';
import 'package:moor_generator/src/shared_state.dart';
2019-02-03 04:56:31 -08:00
import 'package:test_api/test_api.dart';
import 'package:build_test/build_test.dart';
void main() async {
LibraryElement testLib;
SharedState state;
2019-02-03 04:56:31 -08:00
setUpAll(() async {
testLib = await resolveSource(r'''
library test_parser;
2019-03-09 07:37:22 -08:00
import 'package:moor/moor.dart';
2019-02-03 04:56:31 -08:00
class TableWithCustomName extends Table {
@override
String get tableName => "my-fancy-table"
}
class Users extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get name => text().named("user_name").withLength(min: 6, max: 32)();
TextColumn get onlyMax => text().withLength(max: 100)();
2019-04-01 05:44:44 -07:00
DateTimeColumn get defaults => dateTime().withDefault(currentDate)();
2019-02-03 04:56:31 -08:00
}
class CustomPrimaryKey extends Table {
IntColumn get partA => integer()();
2019-03-14 11:11:26 -07:00
IntColumn get partB => integer().customConstraint('custom')();
@override
Set<Column> get primaryKey => {partA, partB};
}
2019-02-03 04:56:31 -08:00
class WrongName extends Table {
String constructTableName() {
return "my-table-name";
}
@override
String get tableName => constructTableName();
2019-02-03 04:56:31 -08:00
}
''', (r) => r.findLibraryByName('test_parser'));
2019-02-03 04:56:31 -08:00
});
setUp(() {
state = SharedState(const MoorOptions.defaults())
..columnParser = ColumnParser(state)
..tableParser = TableParser(state);
2019-02-03 04:56:31 -08:00
});
group('SQL table name', () {
test('should parse correctly when valid', () {
2019-02-03 04:56:31 -08:00
expect(
TableParser(state)
.parse(testLib.getType('TableWithCustomName'))
2019-02-03 04:56:31 -08:00
.sqlName,
equals('my-fancy-table'));
2019-02-03 04:56:31 -08:00
});
test('should use class name if table name is not specified', () {
expect(TableParser(state).parse(testLib.getType('Users')).sqlName,
equals('users'));
2019-02-03 04:56:31 -08:00
});
test('should not parse for complex methods', () async {
TableParser(state).parse(testLib.getType('WrongName'));
2019-02-03 04:56:31 -08:00
expect(state.errors.errors, isNotEmpty);
2019-02-03 04:56:31 -08:00
});
});
group('Columns', () {
test('should use field name if no name has been set explicitely', () {
final table = TableParser(state).parse(testLib.getType('Users'));
2019-02-03 04:56:31 -08:00
final idColumn =
table.columns.singleWhere((col) => col.name.name == 'id');
2019-02-03 04:56:31 -08:00
expect(idColumn.name, equals(ColumnName.implicitly('id')));
2019-02-03 04:56:31 -08:00
});
test('should use explicit name, if it exists', () {
final table = TableParser(state).parse(testLib.getType('Users'));
2019-02-03 04:56:31 -08:00
final idColumn =
table.columns.singleWhere((col) => col.name.name == 'user_name');
2019-02-03 04:56:31 -08:00
expect(idColumn.name, equals(ColumnName.explicitly('user_name')));
2019-02-03 04:56:31 -08:00
});
test('should parse min and max length for text columns', () {
final table = TableParser(state).parse(testLib.getType('Users'));
2019-02-03 04:56:31 -08:00
final idColumn =
table.columns.singleWhere((col) => col.name.name == 'user_name');
2019-02-03 04:56:31 -08:00
expect(idColumn.features,
contains(LimitingTextLength.withLength(min: 6, max: 32)));
});
test('should only parse max length when relevant', () {
final table = TableParser(state).parse(testLib.getType('Users'));
2019-02-03 04:56:31 -08:00
final idColumn =
2019-02-09 06:23:16 -08:00
table.columns.singleWhere((col) => col.dartGetterName == 'onlyMax');
2019-02-03 04:56:31 -08:00
expect(
idColumn.features, contains(LimitingTextLength.withLength(max: 100)));
});
2019-03-14 11:11:26 -07:00
test('parses custom constraints', () {
final table =
TableParser(state).parse(testLib.getType('CustomPrimaryKey'));
2019-03-14 11:11:26 -07:00
final partA =
table.columns.singleWhere((c) => c.dartGetterName == 'partA');
final partB =
table.columns.singleWhere((c) => c.dartGetterName == 'partB');
expect(partB.customConstraints, 'custom');
expect(partA.customConstraints, isNull);
});
2019-04-01 05:44:44 -07:00
test('parsed default values', () {
final table = TableParser(state).parse(testLib.getType('Users'));
final defaultsColumn =
table.columns.singleWhere((c) => c.name.name == 'defaults');
2019-04-01 05:44:44 -07:00
expect(defaultsColumn.defaultArgument.toString(), 'currentDate');
});
2019-02-03 04:56:31 -08:00
});
test('parses custom primary keys', () {
final table = TableParser(state).parse(testLib.getType('CustomPrimaryKey'));
expect(table.primaryKey, containsAll(table.columns));
2019-03-06 12:43:16 -08:00
expect(table.columns.any((column) => column.hasAI), isFalse);
});
2019-02-03 04:56:31 -08:00
}