import 'package:sally/sally.dart'; import 'package:sally/src/queries/predicates/predicate.dart'; import 'package:sally/src/queries/table_structure.dart'; import 'package:test_api/test_api.dart'; import 'package:mockito/mockito.dart'; class MockExecutor extends Mock implements QueryExecutor {} class Users extends Table { IntColumn get id => integer().autoIncrement()(); TextColumn get name => text().withLength(min: 6, max: 32)(); BoolColumn get isAwesome => boolean()(); } // Example tables and data classes, these would be generated by sally_generator // in a real project class UserDataObject { final int id; final String name; UserDataObject(this.id, this.name); } class GeneratedUsersTable extends Users with TableStructure { @override Users get asTable => this; @override UserDataObject parse(Map result) { return UserDataObject(result["id"], result["name"]); } @override String get sqlTableName => "users"; IntColumn id = StructuredIntColumn("id"); TextColumn name = StructuredTextColumn("name"); BoolColumn isAwesome = StructuredBoolColumn("is_awesome"); } void main() { GeneratedUsersTable users; MockExecutor executor; setUp(() { users = GeneratedUsersTable(); executor = MockExecutor(); users.executor = executor; when(executor.executeQuery(any, any)).thenAnswer((_) => Future.value([])); }); group("Generates SELECT statements", () { test("generates simple statements", () { users.select().get(); verify(executor.executeQuery("SELECT * FROM users ", any)); }); test("generates limit statements", () { (users.select()..limit(amount: 10)).get(); verify(executor.executeQuery("SELECT * FROM users LIMIT 10 ", any)); }); test("generates like expressions", () { (users.select()..where((u) => u.name.like("Dash%"))).get(); verify(executor .executeQuery("SELECT * FROM users WHERE name LIKE ? ", ["Dash%"])); }); test("generates complex predicates", () { (users.select() ..where( (u) => not(u.name.equals("Dash")).and(u.id.isBiggerThan(12)))) .get(); verify(executor.executeQuery( "SELECT * FROM users WHERE (NOT name = ? ) AND (id > ? ) ", ["Dash", 12])); }); test("generates expressions from boolean fields", () { (users.select()..where((u) => u.isAwesome.isTrue())).get(); verify(executor.executeQuery( "SELECT * FROM users WHERE is_awesome = 1", any)); }); }); group("Generates DELETE statements", () { test("without any constaints", () { users.delete().performDelete(); verify(executor.executeDelete("DELETE FROM users ", argThat(isEmpty))); }); }); }