Testing angel_orm
This commit is contained in:
parent
81b2e2e6b2
commit
522f5215e0
9 changed files with 94 additions and 96 deletions
|
@ -34,10 +34,10 @@
|
||||||
* Migrated angel_orm to 3.0.0 (0/0 tests passed)
|
* Migrated angel_orm to 3.0.0 (0/0 tests passed)
|
||||||
* Migrated angel_migration to 3.0.0 (0/0 tests passed)
|
* Migrated angel_migration to 3.0.0 (0/0 tests passed)
|
||||||
* Added inflection2 and migrated to 1.0.0 (28/32 tests passed)
|
* Added inflection2 and migrated to 1.0.0 (28/32 tests passed)
|
||||||
* Updated angel_orm_generator to 4.0.0 (0/0 tests passed)
|
* Migrated angel_orm_generator to 4.0.0 (0/0 tests passed)
|
||||||
* Updated angel_migration_runner to 3.0.0 (0/0 tests passed)
|
* Migrated angel_migration_runner to 3.0.0 (0/0 tests passed)
|
||||||
* Updated angel_orm_test to 1.0.0 (in progress)
|
* Migrated angel_orm_test to 3.0.0 (0/0 tests passed)
|
||||||
* Updated angel_orm_postgres to 2.0.0 (in progress)
|
* Migrated angel_orm_postgres to 3.0.0 (0/0 tests passed)
|
||||||
* Update orm-sdk-2.12.x boilerplate (in progress) <= Milestone 2
|
* Update orm-sdk-2.12.x boilerplate (in progress) <= Milestone 2
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ class PostgreSqlExecutor extends QueryExecutor {
|
||||||
PostgreSQLExecutionContext _connection;
|
PostgreSQLExecutionContext _connection;
|
||||||
|
|
||||||
/// An optional [Logger] to print information to.
|
/// An optional [Logger] to print information to.
|
||||||
final Logger logger;
|
final Logger? logger;
|
||||||
|
|
||||||
PostgreSqlExecutor(this._connection, {this.logger});
|
PostgreSqlExecutor(this._connection, {this.logger});
|
||||||
|
|
||||||
|
@ -27,8 +27,8 @@ class PostgreSqlExecutor extends QueryExecutor {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<List>> query(
|
Future<List<List>> query(
|
||||||
String tableName, String query, Map<String, dynamic> substitutionValues,
|
String tableName, String? query, Map<String, dynamic> substitutionValues,
|
||||||
[List<String> returningFields]) {
|
[List<String>? returningFields]) {
|
||||||
if (returningFields != null) {
|
if (returningFields != null) {
|
||||||
var fields = returningFields.join(', ');
|
var fields = returningFields.join(', ');
|
||||||
var returning = 'RETURNING $fields';
|
var returning = 'RETURNING $fields';
|
||||||
|
@ -37,15 +37,17 @@ class PostgreSqlExecutor extends QueryExecutor {
|
||||||
|
|
||||||
logger?.fine('Query: $query');
|
logger?.fine('Query: $query');
|
||||||
logger?.fine('Values: $substitutionValues');
|
logger?.fine('Values: $substitutionValues');
|
||||||
return _connection.query(query, substitutionValues: substitutionValues);
|
return _connection.query(query!, substitutionValues: substitutionValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<T> transaction<T>(FutureOr<T> Function(QueryExecutor) f) async {
|
Future<T?> transaction<T>(FutureOr<T> Function(QueryExecutor) f) async {
|
||||||
if (_connection is! PostgreSQLConnection) return await f(this);
|
if (_connection is! PostgreSQLConnection) {
|
||||||
|
return await f(this);
|
||||||
|
}
|
||||||
|
|
||||||
var conn = _connection as PostgreSQLConnection;
|
var conn = _connection as PostgreSQLConnection;
|
||||||
T returnValue;
|
T? returnValue;
|
||||||
|
|
||||||
var txResult = await conn.transaction((ctx) async {
|
var txResult = await conn.transaction((ctx) async {
|
||||||
try {
|
try {
|
||||||
|
@ -61,12 +63,12 @@ class PostgreSqlExecutor extends QueryExecutor {
|
||||||
});
|
});
|
||||||
|
|
||||||
if (txResult is PostgreSQLRollback) {
|
if (txResult is PostgreSQLRollback) {
|
||||||
if (txResult.reason == null) {
|
//if (txResult.reason == null) {
|
||||||
throw StateError('The transaction was cancelled.');
|
// throw StateError('The transaction was cancelled.');
|
||||||
} else {
|
//} else {
|
||||||
throw StateError(
|
throw StateError(
|
||||||
'The transaction was cancelled with reason "${txResult.reason}".');
|
'The transaction was cancelled with reason "${txResult.reason}".');
|
||||||
}
|
//}
|
||||||
} else {
|
} else {
|
||||||
return returnValue;
|
return returnValue;
|
||||||
}
|
}
|
||||||
|
@ -84,7 +86,7 @@ class PostgreSqlExecutorPool extends QueryExecutor {
|
||||||
final PostgreSQLConnection Function() connectionFactory;
|
final PostgreSQLConnection Function() connectionFactory;
|
||||||
|
|
||||||
/// An optional [Logger] to print information to.
|
/// An optional [Logger] to print information to.
|
||||||
final Logger logger;
|
final Logger? logger;
|
||||||
|
|
||||||
final List<PostgreSqlExecutor> _connections = [];
|
final List<PostgreSqlExecutor> _connections = [];
|
||||||
int _index = 0;
|
int _index = 0;
|
||||||
|
@ -124,8 +126,8 @@ class PostgreSqlExecutorPool extends QueryExecutor {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<List>> query(
|
Future<List<List>> query(
|
||||||
String tableName, String query, Map<String, dynamic> substitutionValues,
|
String tableName, String? query, Map<String, dynamic> substitutionValues,
|
||||||
[List<String> returningFields]) {
|
[List<String>? returningFields]) {
|
||||||
return _pool.withResource(() async {
|
return _pool.withResource(() async {
|
||||||
var executor = await _next();
|
var executor = await _next();
|
||||||
return executor.query(
|
return executor.query(
|
||||||
|
@ -134,7 +136,7 @@ class PostgreSqlExecutorPool extends QueryExecutor {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<T> transaction<T>(FutureOr<T> Function(QueryExecutor) f) {
|
Future<T?> transaction<T>(FutureOr<T> Function(QueryExecutor) f) {
|
||||||
return _pool.withResource(() async {
|
return _pool.withResource(() async {
|
||||||
var executor = await _next();
|
var executor = await _next();
|
||||||
return executor.transaction(f);
|
return executor.transaction(f);
|
||||||
|
|
|
@ -1,32 +1,29 @@
|
||||||
name: angel_orm_postgres
|
name: angel_orm_postgres
|
||||||
version: 2.0.0
|
version: 3.0.0
|
||||||
description: PostgreSQL support for Angel's ORM. Includes functionality for querying and transactions.
|
description: PostgreSQL support for Angel's ORM. Includes functionality for querying and transactions.
|
||||||
author: Tobe O <thosakwe@gmail.com>
|
homepage: https://github.com/dukefirehawk/angel
|
||||||
homepage: https://github.com/angel-dart/orm
|
|
||||||
publish_to: none
|
publish_to: none
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=2.10.0 <3.0.0'
|
sdk: '>=2.12.0 <3.0.0'
|
||||||
dependencies:
|
dependencies:
|
||||||
angel_orm:
|
angel_orm:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/dukefirehawk/angel.git
|
url: https://github.com/dukefirehawk/angel.git
|
||||||
ref: sdk-2.12.x
|
ref: sdk-2.12.x_nnbd
|
||||||
path: packages/orm/angel_orm
|
path: packages/orm/angel_orm
|
||||||
logging: ^1.0.0
|
logging: ^1.0.1
|
||||||
pool: ^1.0.0
|
pool: ^1.5.0
|
||||||
postgres:
|
postgres: ^2.3.2
|
||||||
git:
|
|
||||||
url: https://github.com/dukefirehawk/postgresql-dart
|
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
angel_orm_test:
|
angel_orm_test:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/dukefirehawk/angel.git
|
url: https://github.com/dukefirehawk/angel.git
|
||||||
ref: sdk-2.12.x
|
ref: sdk-2.12.x_nnbd
|
||||||
path: packages/orm/angel_orm_test
|
path: packages/orm/angel_orm_test
|
||||||
pretty_logging:
|
pretty_logging:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/dukefirehawk/angel.git
|
url: https://github.com/dukefirehawk/angel.git
|
||||||
ref: sdk-2.12.x
|
ref: sdk-2.12.x_nnbd
|
||||||
path: packages/pretty_logging
|
path: packages/pretty_logging
|
||||||
test: ^1.15.7
|
test: ^1.17.3
|
||||||
|
|
|
@ -13,13 +13,13 @@ Future<void> closePg(QueryExecutor executor) =>
|
||||||
(executor as PostgreSqlExecutor).close();
|
(executor as PostgreSqlExecutor).close();
|
||||||
|
|
||||||
Future<PostgreSqlExecutor> connectToPostgres(Iterable<String> schemas) async {
|
Future<PostgreSqlExecutor> connectToPostgres(Iterable<String> schemas) async {
|
||||||
var conn = new PostgreSQLConnection('127.0.0.1', 5432, 'angel_orm_test',
|
var conn = PostgreSQLConnection('127.0.0.1', 5432, 'orm_test',
|
||||||
username: Platform.environment['POSTGRES_USERNAME'] ?? 'postgres',
|
username: Platform.environment['POSTGRES_USERNAME'] ?? 'test',
|
||||||
password: Platform.environment['POSTGRES_PASSWORD'] ?? 'password');
|
password: Platform.environment['POSTGRES_PASSWORD'] ?? 'test123');
|
||||||
await conn.open();
|
await conn.open();
|
||||||
|
|
||||||
for (var s in schemas)
|
for (var s in schemas)
|
||||||
await conn.execute(await new File('test/migrations/$s.sql').readAsString());
|
await conn.execute(await File('test/migrations/$s.sql').readAsString());
|
||||||
|
|
||||||
return new PostgreSqlExecutor(conn, logger: Logger.root);
|
return PostgreSqlExecutor(conn, logger: Logger.root);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,14 +16,14 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
executor = await createExecutor();
|
executor = await createExecutor();
|
||||||
|
|
||||||
// Insert an author
|
// Insert an author
|
||||||
var query = new AuthorQuery()..values.name = 'J.K. Rowling';
|
var query = AuthorQuery()..values.name = 'J.K. Rowling';
|
||||||
jkRowling = await query.insert(executor);
|
jkRowling = await query.insert(executor);
|
||||||
|
|
||||||
query.values.name = 'J.K. Jameson';
|
query.values.name = 'J.K. Jameson';
|
||||||
jameson = await query.insert(executor);
|
jameson = await query.insert(executor);
|
||||||
|
|
||||||
// And a book
|
// And a book
|
||||||
var bookQuery = new BookQuery();
|
var bookQuery = BookQuery();
|
||||||
bookQuery.values
|
bookQuery.values
|
||||||
..authorId = int.parse(jkRowling!.id!)
|
..authorId = int.parse(jkRowling!.id!)
|
||||||
..partnerAuthorId = int.parse(jameson!.id!)
|
..partnerAuthorId = int.parse(jameson!.id!)
|
||||||
|
@ -36,7 +36,7 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
|
|
||||||
group('selects', () {
|
group('selects', () {
|
||||||
test('select all', () async {
|
test('select all', () async {
|
||||||
var query = new BookQuery();
|
var query = BookQuery();
|
||||||
List<Book?> books = await query.get(executor);
|
List<Book?> books = await query.get(executor);
|
||||||
expect(books, hasLength(1));
|
expect(books, hasLength(1));
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('select one', () async {
|
test('select one', () async {
|
||||||
var query = new BookQuery();
|
var query = BookQuery();
|
||||||
query.where!.id.equals(int.parse(deathlyHallows!.id!));
|
query.where!.id.equals(int.parse(deathlyHallows!.id!));
|
||||||
print(query.compile(Set()));
|
print(query.compile(Set()));
|
||||||
|
|
||||||
|
@ -68,15 +68,15 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('where clause', () async {
|
test('where clause', () async {
|
||||||
var query = new BookQuery()
|
var query = BookQuery()
|
||||||
..where!.name.equals('Goblet of Fire')
|
..where!.name.equals('Goblet of Fire')
|
||||||
..orWhere((w) => w!.authorId.equals(int.parse(jkRowling!.id!)));
|
..orWhere((w) => w!.authorId.equals(int.parse(jkRowling!.id!)));
|
||||||
print(query.compile(Set()));
|
print(query.compile(Set()));
|
||||||
|
|
||||||
List<Book?> books = await query.get(executor);
|
List<Book> books = await query.get(executor) as List<Book>;
|
||||||
expect(books, hasLength(1));
|
expect(books, hasLength(1));
|
||||||
|
|
||||||
var book = books.first!;
|
var book = books.first;
|
||||||
print(book.toJson());
|
print(book.toJson());
|
||||||
expect(book.id, deathlyHallows!.id);
|
expect(book.id, deathlyHallows!.id);
|
||||||
expect(book.name, deathlyHallows!.name);
|
expect(book.name, deathlyHallows!.name);
|
||||||
|
@ -88,9 +88,9 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('union', () async {
|
test('union', () async {
|
||||||
var query1 = new BookQuery()..where!.name.like('Deathly%');
|
var query1 = BookQuery()..where!.name.like('Deathly%');
|
||||||
var query2 = new BookQuery()..where!.authorId.equals(-1);
|
var query2 = BookQuery()..where!.authorId.equals(-1);
|
||||||
var query3 = new BookQuery()
|
var query3 = BookQuery()
|
||||||
..where!.name.isIn(['Goblet of Fire', 'Order of the Phoenix']);
|
..where!.name.isIn(['Goblet of Fire', 'Order of the Phoenix']);
|
||||||
query1
|
query1
|
||||||
..union(query2)
|
..union(query2)
|
||||||
|
@ -126,12 +126,12 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
|
|
||||||
test('delete stream', () async {
|
test('delete stream', () async {
|
||||||
printSeparator('Delete stream test');
|
printSeparator('Delete stream test');
|
||||||
var query = new BookQuery()..where!.name.equals(deathlyHallows!.name!);
|
var query = BookQuery()..where!.name.equals(deathlyHallows!.name!);
|
||||||
print(query.compile(Set(), preamble: 'DELETE', withFields: false));
|
print(query.compile(Set(), preamble: 'DELETE', withFields: false));
|
||||||
List<Book?> books = await query.delete(executor);
|
List<Book>? books = await query.delete(executor) as List<Book>;
|
||||||
expect(books, hasLength(1));
|
expect(books, hasLength(1));
|
||||||
|
|
||||||
var book = books.first!;
|
var book = books.first;
|
||||||
expect(book.id, deathlyHallows!.id);
|
expect(book.id, deathlyHallows!.id);
|
||||||
expect(book.author, isNotNull);
|
expect(book.author, isNotNull);
|
||||||
expect(book.author!.name, jkRowling!.name);
|
expect(book.author!.name, jkRowling!.name);
|
||||||
|
@ -139,7 +139,7 @@ belongsToTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
|
|
||||||
test('update book', () async {
|
test('update book', () async {
|
||||||
var cloned = deathlyHallows!.copyWith(name: "Sorcerer's Stone");
|
var cloned = deathlyHallows!.copyWith(name: "Sorcerer's Stone");
|
||||||
var query = new BookQuery()
|
var query = BookQuery()
|
||||||
..where!.id.equals(int.parse(cloned.id!))
|
..where!.id.equals(int.parse(cloned.id!))
|
||||||
..values.copyFrom(cloned);
|
..values.copyFrom(cloned);
|
||||||
var book = await (query.updateOne(executor) as FutureOr<Book>);
|
var book = await (query.updateOne(executor) as FutureOr<Book>);
|
||||||
|
|
|
@ -2,7 +2,6 @@ import 'dart:async';
|
||||||
import 'package:angel_orm/angel_orm.dart';
|
import 'package:angel_orm/angel_orm.dart';
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
import 'models/custom_expr.dart';
|
import 'models/custom_expr.dart';
|
||||||
import 'util.dart';
|
|
||||||
|
|
||||||
customExprTests(FutureOr<QueryExecutor> Function() createExecutor,
|
customExprTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
{FutureOr<void> Function(QueryExecutor)? close}) {
|
{FutureOr<void> Function(QueryExecutor)? close}) {
|
||||||
|
|
|
@ -11,7 +11,7 @@ hasManyTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
close ??= (_) => null;
|
close ??= (_) => null;
|
||||||
|
|
||||||
setUp(() async {
|
setUp(() async {
|
||||||
var query = new TreeQuery()..values.rings = 10;
|
var query = TreeQuery()..values.rings = 10;
|
||||||
|
|
||||||
executor = await createExecutor();
|
executor = await createExecutor();
|
||||||
appleTree = await query.insert(executor);
|
appleTree = await query.insert(executor);
|
||||||
|
@ -36,11 +36,11 @@ hasManyTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
}
|
}
|
||||||
|
|
||||||
setUp(() async {
|
setUp(() async {
|
||||||
var appleQuery = new FruitQuery()
|
var appleQuery = FruitQuery()
|
||||||
..values.treeId = treeId
|
..values.treeId = treeId
|
||||||
..values.commonName = 'Apple';
|
..values.commonName = 'Apple';
|
||||||
|
|
||||||
var bananaQuery = new FruitQuery()
|
var bananaQuery = FruitQuery()
|
||||||
..values.treeId = treeId
|
..values.treeId = treeId
|
||||||
..values.commonName = 'Banana';
|
..values.commonName = 'Banana';
|
||||||
|
|
||||||
|
@ -49,13 +49,13 @@ hasManyTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('can fetch any children', () async {
|
test('can fetch any children', () async {
|
||||||
var query = new TreeQuery()..where!.id.equals(treeId);
|
var query = TreeQuery()..where!.id.equals(treeId);
|
||||||
var tree = await (query.getOne(executor) as FutureOr<Tree>);
|
var tree = await (query.getOne(executor) as FutureOr<Tree>);
|
||||||
verify(tree);
|
verify(tree);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('sets on update', () async {
|
test('sets on update', () async {
|
||||||
var tq = new TreeQuery()
|
var tq = TreeQuery()
|
||||||
..where!.id.equals(treeId)
|
..where!.id.equals(treeId)
|
||||||
..values.rings = 24;
|
..values.rings = 24;
|
||||||
var tree = await (tq.updateOne(executor) as FutureOr<Tree>);
|
var tree = await (tq.updateOne(executor) as FutureOr<Tree>);
|
||||||
|
@ -64,13 +64,13 @@ hasManyTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('sets on delete', () async {
|
test('sets on delete', () async {
|
||||||
var tq = new TreeQuery()..where!.id.equals(treeId);
|
var tq = TreeQuery()..where!.id.equals(treeId);
|
||||||
var tree = await (tq.deleteOne(executor) as FutureOr<Tree>);
|
var tree = await (tq.deleteOne(executor) as FutureOr<Tree>);
|
||||||
verify(tree);
|
verify(tree);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('returns empty on false subquery', () async {
|
test('returns empty on false subquery', () async {
|
||||||
var tq = new TreeQuery()
|
var tq = TreeQuery()
|
||||||
..where!.id.equals(treeId)
|
..where!.id.equals(treeId)
|
||||||
..fruits!.where!.commonName.equals('Kiwi');
|
..fruits!.where!.commonName.equals('Kiwi');
|
||||||
var tree = await (tq.getOne(executor) as FutureOr<Tree>);
|
var tree = await (tq.getOne(executor) as FutureOr<Tree>);
|
||||||
|
|
|
@ -11,7 +11,7 @@ hasOneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
|
|
||||||
setUp(() async {
|
setUp(() async {
|
||||||
executor = await createExecutor();
|
executor = await createExecutor();
|
||||||
var query = new LegQuery()..values.name = 'Left';
|
var query = LegQuery()..values.name = 'Left';
|
||||||
originalLeg = await query.insert(executor);
|
originalLeg = await query.insert(executor);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ hasOneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
|
|
||||||
test('sets to null if no child', () async {
|
test('sets to null if no child', () async {
|
||||||
print(LegQuery().compile(Set()));
|
print(LegQuery().compile(Set()));
|
||||||
var query = new LegQuery()..where!.id.equals(int.parse(originalLeg!.id!));
|
var query = LegQuery()..where!.id.equals(int.parse(originalLeg!.id!));
|
||||||
var leg = await (query.getOne(executor) as FutureOr<Leg>);
|
var leg = await (query.getOne(executor) as FutureOr<Leg>);
|
||||||
print(leg.toJson());
|
print(leg.toJson());
|
||||||
expect(leg.name, originalLeg!.name);
|
expect(leg.name, originalLeg!.name);
|
||||||
|
@ -28,10 +28,10 @@ hasOneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('can fetch one foot', () async {
|
test('can fetch one foot', () async {
|
||||||
var footQuery = new FootQuery()
|
var footQuery = FootQuery()
|
||||||
..values.legId = int.parse(originalLeg!.id!)
|
..values.legId = int.parse(originalLeg!.id!)
|
||||||
..values.nToes = 5.64;
|
..values.nToes = 5.64;
|
||||||
var legQuery = new LegQuery()..where!.id.equals(int.parse(originalLeg!.id!));
|
var legQuery = LegQuery()..where!.id.equals(int.parse(originalLeg!.id!));
|
||||||
var foot = await (footQuery.insert(executor) as FutureOr<Foot>);
|
var foot = await (footQuery.insert(executor) as FutureOr<Foot>);
|
||||||
var leg = await (legQuery.getOne(executor) as FutureOr<Leg>);
|
var leg = await (legQuery.getOne(executor) as FutureOr<Leg>);
|
||||||
|
|
||||||
|
@ -43,10 +43,10 @@ hasOneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('only fetches one foot even if there are multiple', () async {
|
test('only fetches one foot even if there are multiple', () async {
|
||||||
var footQuery = new FootQuery()
|
var footQuery = FootQuery()
|
||||||
..values.legId = int.parse(originalLeg!.id!)
|
..values.legId = int.parse(originalLeg!.id!)
|
||||||
..values.nToes = 24;
|
..values.nToes = 24;
|
||||||
var legQuery = new LegQuery()..where!.id.equals(int.parse(originalLeg!.id!));
|
var legQuery = LegQuery()..where!.id.equals(int.parse(originalLeg!.id!));
|
||||||
var foot = await (footQuery.insert(executor) as FutureOr<Foot>);
|
var foot = await (footQuery.insert(executor) as FutureOr<Foot>);
|
||||||
var leg = await (legQuery.getOne(executor) as FutureOr<Leg>);
|
var leg = await (legQuery.getOne(executor) as FutureOr<Leg>);
|
||||||
expect(leg.name, originalLeg!.name);
|
expect(leg.name, originalLeg!.name);
|
||||||
|
@ -57,10 +57,10 @@ hasOneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('sets foot on update', () async {
|
test('sets foot on update', () async {
|
||||||
var footQuery = new FootQuery()
|
var footQuery = FootQuery()
|
||||||
..values.legId = int.parse(originalLeg!.id!)
|
..values.legId = int.parse(originalLeg!.id!)
|
||||||
..values.nToes = 5.64;
|
..values.nToes = 5.64;
|
||||||
var legQuery = new LegQuery()
|
var legQuery = LegQuery()
|
||||||
..where!.id.equals(int.parse(originalLeg!.id!))
|
..where!.id.equals(int.parse(originalLeg!.id!))
|
||||||
..values.copyFrom(originalLeg!.copyWith(name: 'Right'));
|
..values.copyFrom(originalLeg!.copyWith(name: 'Right'));
|
||||||
var foot = await (footQuery.insert(executor) as FutureOr<Foot>);
|
var foot = await (footQuery.insert(executor) as FutureOr<Foot>);
|
||||||
|
@ -73,10 +73,10 @@ hasOneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('sets foot on delete', () async {
|
test('sets foot on delete', () async {
|
||||||
var footQuery = new FootQuery()
|
var footQuery = FootQuery()
|
||||||
..values.legId = int.parse(originalLeg!.id!)
|
..values.legId = int.parse(originalLeg!.id!)
|
||||||
..values.nToes = 5.64;
|
..values.nToes = 5.64;
|
||||||
var legQuery = new LegQuery()..where!.id.equals(int.parse(originalLeg!.id!));
|
var legQuery = LegQuery()..where!.id.equals(int.parse(originalLeg!.id!));
|
||||||
var foot = await (footQuery.insert(executor) as FutureOr<Foot>);
|
var foot = await (footQuery.insert(executor) as FutureOr<Foot>);
|
||||||
var leg = await (legQuery.deleteOne(executor) as FutureOr<Leg>);
|
var leg = await (legQuery.deleteOne(executor) as FutureOr<Leg>);
|
||||||
print(leg.toJson());
|
print(leg.toJson());
|
||||||
|
@ -87,7 +87,7 @@ hasOneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('sets null on false subquery', () async {
|
test('sets null on false subquery', () async {
|
||||||
var legQuery = new LegQuery()
|
var legQuery = LegQuery()
|
||||||
..where!.id.equals(originalLeg!.idAsInt!)
|
..where!.id.equals(originalLeg!.idAsInt!)
|
||||||
..foot!.where!.legId.equals(originalLeg!.idAsInt! + 1024);
|
..foot!.where!.legId.equals(originalLeg!.idAsInt! + 1024);
|
||||||
var leg = await (legQuery.getOne(executor) as FutureOr<Leg>);
|
var leg = await (legQuery.getOne(executor) as FutureOr<Leg>);
|
||||||
|
|
|
@ -3,13 +3,13 @@ import 'package:angel_orm/angel_orm.dart';
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
import 'models/car.dart';
|
import 'models/car.dart';
|
||||||
|
|
||||||
final DateTime y2k = new DateTime.utc(2000, 1, 1);
|
final DateTime y2k = DateTime.utc(2000, 1, 1);
|
||||||
|
|
||||||
standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
{FutureOr<void> Function(QueryExecutor)? close}) {
|
{FutureOr<void> Function(QueryExecutor)? close}) {
|
||||||
close ??= (_) => null;
|
close ??= (_) => null;
|
||||||
test('to where', () {
|
test('to where', () {
|
||||||
var query = new CarQuery();
|
var query = CarQuery();
|
||||||
query.where
|
query.where
|
||||||
?..familyFriendly.isTrue
|
?..familyFriendly.isTrue
|
||||||
..recalledAt.lessThanOrEqualTo(y2k, includeTime: false);
|
..recalledAt.lessThanOrEqualTo(y2k, includeTime: false);
|
||||||
|
@ -24,7 +24,7 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
// var row = [0, 'Mazda', 'CX9', true, y2k, y2k, y2k];
|
// var row = [0, 'Mazda', 'CX9', true, y2k, y2k, y2k];
|
||||||
var row = [0, y2k, y2k, 'Mazda', 'CX9', true, y2k];
|
var row = [0, y2k, y2k, 'Mazda', 'CX9', true, y2k];
|
||||||
print(row);
|
print(row);
|
||||||
var car = new CarQuery().deserialize(row)!;
|
var car = CarQuery().deserialize(row)!;
|
||||||
print(car.toJson());
|
print(car.toJson());
|
||||||
expect(car.id, '0');
|
expect(car.id, '0');
|
||||||
expect(car.make, 'Mazda');
|
expect(car.make, 'Mazda');
|
||||||
|
@ -47,7 +47,7 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
|
|
||||||
group('selects', () {
|
group('selects', () {
|
||||||
test('select all', () async {
|
test('select all', () async {
|
||||||
List<Car?> cars = await new CarQuery().get(executor);
|
List<Car?> cars = await CarQuery().get(executor);
|
||||||
expect(cars, []);
|
expect(cars, []);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
Car? ferrari;
|
Car? ferrari;
|
||||||
|
|
||||||
setUp(() async {
|
setUp(() async {
|
||||||
var query = new CarQuery();
|
var query = CarQuery();
|
||||||
query.values
|
query.values
|
||||||
..make = 'Ferrari東'
|
..make = 'Ferrari東'
|
||||||
..description = 'Vroom vroom!'
|
..description = 'Vroom vroom!'
|
||||||
|
@ -64,11 +64,11 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('where clause is applied', () async {
|
test('where clause is applied', () async {
|
||||||
var query = new CarQuery()..where!.familyFriendly.isTrue;
|
var query = CarQuery()..where!.familyFriendly.isTrue;
|
||||||
List<Car?> cars = await query.get(executor);
|
List<Car?> cars = await query.get(executor);
|
||||||
expect(cars, isEmpty);
|
expect(cars, isEmpty);
|
||||||
|
|
||||||
var sportsCars = new CarQuery()..where!.familyFriendly.isFalse;
|
var sportsCars = CarQuery()..where!.familyFriendly.isFalse;
|
||||||
cars = await sportsCars.get(executor);
|
cars = await sportsCars.get(executor);
|
||||||
print(cars.map((c) => c!.toJson()));
|
print(cars.map((c) => c!.toJson()));
|
||||||
|
|
||||||
|
@ -80,9 +80,9 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('union', () async {
|
test('union', () async {
|
||||||
var query1 = new CarQuery()..where!.make.like('%Fer%');
|
var query1 = CarQuery()..where!.make.like('%Fer%');
|
||||||
var query2 = new CarQuery()..where!.familyFriendly.isTrue;
|
var query2 = CarQuery()..where!.familyFriendly.isTrue;
|
||||||
var query3 = new CarQuery()..where!.description.equals('Submarine');
|
var query3 = CarQuery()..where!.description.equals('Submarine');
|
||||||
Union<Car?> union = query1.union(query2).unionAll(query3);
|
Union<Car?> union = query1.union(query2).unionAll(query3);
|
||||||
print(union.compile(Set()));
|
print(union.compile(Set()));
|
||||||
var cars = await union.get(executor);
|
var cars = await union.get(executor);
|
||||||
|
@ -90,7 +90,7 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('or clause', () async {
|
test('or clause', () async {
|
||||||
var query = new CarQuery()
|
var query = CarQuery()
|
||||||
..where!.make.like('Fer%')
|
..where!.make.like('Fer%')
|
||||||
..orWhere((where) => where
|
..orWhere((where) => where
|
||||||
?..familyFriendly.isTrue
|
?..familyFriendly.isTrue
|
||||||
|
@ -101,7 +101,7 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('limit obeyed', () async {
|
test('limit obeyed', () async {
|
||||||
var query = new CarQuery()..limit(0);
|
var query = CarQuery()..limit(0);
|
||||||
print(query.compile(Set()));
|
print(query.compile(Set()));
|
||||||
List<Car?> cars = await query.get(executor);
|
List<Car?> cars = await query.get(executor);
|
||||||
expect(cars, isEmpty);
|
expect(cars, isEmpty);
|
||||||
|
@ -109,23 +109,23 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
|
|
||||||
test('get one', () async {
|
test('get one', () async {
|
||||||
var id = int.parse(ferrari!.id!);
|
var id = int.parse(ferrari!.id!);
|
||||||
var query = new CarQuery()..where!.id.equals(id);
|
var query = CarQuery()..where!.id.equals(id);
|
||||||
var car = await query.getOne(executor);
|
var car = await query.getOne(executor);
|
||||||
expect(car, ferrari);
|
expect(car, ferrari);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('delete one', () async {
|
test('delete one', () async {
|
||||||
var id = int.parse(ferrari!.id!);
|
var id = int.parse(ferrari!.id!);
|
||||||
var query = new CarQuery()..where!.id.equals(id);
|
var query = CarQuery()..where!.id.equals(id);
|
||||||
var car = await (query.deleteOne(executor) as FutureOr<Car>);
|
var car = await (query.deleteOne(executor) as FutureOr<Car>);
|
||||||
expect(car.toJson(), ferrari!.toJson());
|
expect(car.toJson(), ferrari!.toJson());
|
||||||
|
|
||||||
List<Car?> cars = await new CarQuery().get(executor);
|
List<Car?> cars = await CarQuery().get(executor);
|
||||||
expect(cars, isEmpty);
|
expect(cars, isEmpty);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('delete stream', () async {
|
test('delete stream', () async {
|
||||||
var query = new CarQuery()
|
var query = CarQuery()
|
||||||
..where!.make.equals('Ferrari東')
|
..where!.make.equals('Ferrari東')
|
||||||
..orWhere((w) => w!.familyFriendly.isTrue);
|
..orWhere((w) => w!.familyFriendly.isTrue);
|
||||||
print(query.compile(Set(), preamble: 'DELETE FROM "cars"'));
|
print(query.compile(Set(), preamble: 'DELETE FROM "cars"'));
|
||||||
|
@ -136,7 +136,7 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('update', () async {
|
test('update', () async {
|
||||||
var query = new CarQuery()
|
var query = CarQuery()
|
||||||
..where!.id.equals(int.parse(ferrari!.id!))
|
..where!.id.equals(int.parse(ferrari!.id!))
|
||||||
..values.make = 'Hyundai';
|
..values.make = 'Hyundai';
|
||||||
List<Car?> cars = await query.update(executor);
|
List<Car?> cars = await query.update(executor);
|
||||||
|
@ -146,7 +146,7 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
|
|
||||||
test('update car', () async {
|
test('update car', () async {
|
||||||
var cloned = ferrari!.copyWith(make: 'Angel');
|
var cloned = ferrari!.copyWith(make: 'Angel');
|
||||||
var query = new CarQuery()..values.copyFrom(cloned);
|
var query = CarQuery()..values.copyFrom(cloned);
|
||||||
var car = await (query.updateOne(executor) as FutureOr<Car>);
|
var car = await (query.updateOne(executor) as FutureOr<Car>);
|
||||||
print(car.toJson());
|
print(car.toJson());
|
||||||
expect(car.toJson(), cloned.toJson());
|
expect(car.toJson(), cloned.toJson());
|
||||||
|
@ -155,9 +155,9 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('insert', () async {
|
test('insert', () async {
|
||||||
var recalledAt = new DateTime.now();
|
var recalledAt = DateTime.now();
|
||||||
var query = new CarQuery();
|
var query = CarQuery();
|
||||||
var now = new DateTime.now();
|
var now = DateTime.now();
|
||||||
query.values
|
query.values
|
||||||
..make = 'Honda'
|
..make = 'Honda'
|
||||||
..description = 'Hello'
|
..description = 'Hello'
|
||||||
|
@ -175,13 +175,13 @@ standaloneTests(FutureOr<QueryExecutor> Function() createExecutor,
|
||||||
});
|
});
|
||||||
|
|
||||||
test('insert car', () async {
|
test('insert car', () async {
|
||||||
var recalledAt = new DateTime.now();
|
var recalledAt = DateTime.now();
|
||||||
var beetle = new Car(
|
var beetle = Car(
|
||||||
make: 'Beetle',
|
make: 'Beetle',
|
||||||
description: 'Herbie',
|
description: 'Herbie',
|
||||||
familyFriendly: true,
|
familyFriendly: true,
|
||||||
recalledAt: recalledAt);
|
recalledAt: recalledAt);
|
||||||
var query = new CarQuery()..values.copyFrom(beetle);
|
var query = CarQuery()..values.copyFrom(beetle);
|
||||||
var car = await (query.insert(executor) as FutureOr<Car>);
|
var car = await (query.insert(executor) as FutureOr<Car>);
|
||||||
print(car.toJson());
|
print(car.toJson());
|
||||||
expect(car.make, beetle.make);
|
expect(car.make, beetle.make);
|
||||||
|
|
Loading…
Reference in a new issue