| Index: pkg/appengine/test/integration/db/metamodel_test.dart
|
| diff --git a/pkg/appengine/test/integration/db/metamodel_test.dart b/pkg/appengine/test/integration/db/metamodel_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..81a9598e90fedc9d65826d09293a73fda09a9e36
|
| --- /dev/null
|
| +++ b/pkg/appengine/test/integration/db/metamodel_test.dart
|
| @@ -0,0 +1,109 @@
|
| +// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +library metamodel_test;
|
| +
|
| +import 'dart:async';
|
| +
|
| +import 'package:unittest/unittest.dart';
|
| +
|
| +import 'package:appengine/src/appengine_context.dart';
|
| +import 'package:appengine/src/api_impl/raw_datastore_v3_impl.dart';
|
| +import 'package:appengine/src/protobuf_api/rpc/rpc_service_remote_api.dart';
|
| +import 'package:gcloud/datastore.dart';
|
| +import 'package:gcloud/datastore.dart' show Key, Query, Partition;
|
| +import 'package:gcloud/db.dart' as db;
|
| +import 'package:gcloud/db/metamodel.dart';
|
| +
|
| +List<Entity> buildEntitiesWithDifferentNamespaces() {
|
| + newKey(String namespace, String kind, int id) {
|
| + var partition = new Partition(namespace);
|
| + return new Key([new KeyElement(kind, id)], partition: partition);
|
| + }
|
| +
|
| + newEntity(String namespace, String kind, {int id: 1}) {
|
| + return new Entity(newKey(namespace, kind, id), {'ping': 'pong'});
|
| + }
|
| +
|
| + return [
|
| + newEntity(null, 'NullKind', id: 1),
|
| + newEntity(null, 'NullKind', id: 2),
|
| + newEntity(null, 'NullKind2', id: 1),
|
| + newEntity(null, 'NullKind2', id: 2),
|
| +
|
| + newEntity('FooNamespace', 'FooKind', id: 1),
|
| + newEntity('FooNamespace', 'FooKind', id: 2),
|
| + newEntity('FooNamespace', 'FooKind2', id: 1),
|
| + newEntity('FooNamespace', 'FooKind2', id: 2),
|
| +
|
| + newEntity('BarNamespace', 'BarKind', id: 1),
|
| + newEntity('BarNamespace', 'BarKind', id: 2),
|
| + newEntity('BarNamespace', 'BarKind2', id: 1),
|
| + newEntity('BarNamespace', 'BarKind2', id: 2),
|
| + ];
|
| +}
|
| +
|
| +Future sleep(Duration duration) {
|
| + var completer = new Completer();
|
| + new Timer(duration, completer.complete);
|
| + return completer.future;
|
| +}
|
| +
|
| +runTests(datastore, db.DatastoreDB store) {
|
| + final cond = predicate;
|
| +
|
| + group('e2e_db_metamodel', () {
|
| + test('namespaces__insert_lookup_delete', () {
|
| + var entities = buildEntitiesWithDifferentNamespaces();
|
| + var keys = entities.map((e) => e.key).toList();
|
| +
|
| + return datastore.commit(inserts: entities).then((_) {
|
| + return sleep(const Duration(seconds: 10)).then((_) {
|
| + var namespaceQuery = store.query(Namespace);
|
| + return namespaceQuery.run().toList()
|
| + .then((List<Namespace> namespaces) {
|
| + expect(namespaces.length, 3);
|
| + expect(namespaces, contains(cond((ns) => ns.name == null)));
|
| + expect(namespaces,
|
| + contains(cond((ns) => ns.name == 'FooNamespace')));
|
| + expect(namespaces,
|
| + contains(cond((ns) => ns.name == 'BarNamespace')));
|
| +
|
| + var futures = [];
|
| + for (var namespace in namespaces) {
|
| + var partition = store.newPartition(namespace.name);
|
| + var kindQuery = store.query(Kind, partition: partition);
|
| + futures.add(kindQuery.run().toList().then((List<Kind> kinds) {
|
| + expect(kinds.length, greaterThanOrEqualTo(2));
|
| + if (namespace.name == null) {
|
| + expect(kinds, contains(cond((k) => k.name == 'NullKind')));
|
| + expect(kinds, contains(cond((k) => k.name == 'NullKind2')));
|
| + } else if (namespace.name == 'FooNamespace') {
|
| + expect(kinds, contains(cond((k) => k.name == 'FooKind')));
|
| + expect(kinds, contains(cond((k) => k.name == 'FooKind2')));
|
| + } else if (namespace.name == 'BarNamespace') {
|
| + expect(kinds, contains(cond((k) => k.name == 'BarKind')));
|
| + expect(kinds, contains(cond((k) => k.name == 'BarKind2')));
|
| + }
|
| + }));
|
| + }
|
| + return Future.wait(futures).then((_) {
|
| + expect(datastore.commit(deletes: keys), completes);
|
| + });
|
| + });
|
| + });
|
| + });
|
| + });
|
| + });
|
| +}
|
| +
|
| +main() {
|
| + var rpcService = new RPCServiceRemoteApi('127.0.0.1', 4444);
|
| + var appengineContext = new AppengineContext(
|
| + 'dev', 'test-application', 'test-version', null, null, null);
|
| + var datastore =
|
| + new DatastoreV3RpcImpl(rpcService, appengineContext, '<invalid-ticket>');
|
| +
|
| + runTests(datastore, new db.DatastoreDB(datastore));
|
| +}
|
|
|