| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| library syncbase_database_test; |
| |
| import 'dart:convert' show UTF8; |
| |
| import 'package:test/test.dart'; |
| |
| import 'package:ether/syncbase_client.dart' |
| show SyncbaseClient, WatchChangeTypes, WatchChange; |
| |
| import './utils.dart' as utils; |
| |
| runDatabaseTests(SyncbaseClient c) { |
| test('getting a handle to a database', () { |
| var app = c.app(utils.uniqueName('app')); |
| var dbName = utils.uniqueName('db'); |
| var db = app.noSqlDatabase(dbName); |
| expect(db.name, equals(dbName)); |
| expect(db.fullName, equals(app.fullName + '/' + dbName)); |
| }); |
| |
| test('creating and destroying a database', () async { |
| var app = c.app(utils.uniqueName('app')); |
| await app.create(utils.emptyPerms()); |
| |
| var db = app.noSqlDatabase(utils.uniqueName('db')); |
| |
| expect(await db.exists(), equals(false)); |
| await db.create(utils.emptyPerms()); |
| expect(await db.exists(), equals(true)); |
| await db.destroy(); |
| expect(await db.exists(), equals(false)); |
| }); |
| |
| test('basic watch', () async { |
| var app = c.app(utils.uniqueName('app')); |
| await app.create(utils.emptyPerms()); |
| var db = app.noSqlDatabase(utils.uniqueName('db')); |
| await db.create(utils.emptyPerms()); |
| var table = db.table(utils.uniqueName('table')); |
| await table.create(utils.emptyPerms()); |
| |
| // Perform some operations that we won't be watching. |
| await table.put('row1', UTF8.encode('value1')); |
| await table.delete('row1'); |
| |
| // Start watching everything from now. |
| var resumeMarker = await db.getResumeMarker(); |
| var prefix = ''; |
| var watchStream = db.watch(table.name, prefix, resumeMarker); |
| |
| // Perform some operations while are watching. |
| var expectedChanges = new List<WatchChange>(); |
| |
| await table.put('row2', UTF8.encode('value2')); |
| resumeMarker = await db.getResumeMarker(); |
| var expectedChange = SyncbaseClient.watchChange( |
| tableName: table.name, |
| rowName: 'row2', |
| changeType: WatchChangeTypes.put, |
| valueBytes: UTF8.encode('value2'), |
| resumeMarker: resumeMarker); |
| expectedChanges.add(expectedChange); |
| |
| await table.delete('row2'); |
| resumeMarker = await db.getResumeMarker(); |
| expectedChange = SyncbaseClient.watchChange( |
| tableName: table.name, |
| rowName: 'row2', |
| changeType: WatchChangeTypes.delete, |
| resumeMarker: resumeMarker); |
| expectedChanges.add(expectedChange); |
| |
| // Ensure we see all the expected changes in order in the watch stream. |
| var changeNum = 0; |
| await for (var change in watchStream) { |
| // Classes generated by mojom Dart compiler do not override == and hashCode |
| // but they do override toString to print all properties. So we use toString |
| // to assert equality. |
| expect(change.toString(), equals(expectedChanges[changeNum].toString())); |
| changeNum++; |
| // We need to break out of awaiting for watch stream values when we get everything we expected. |
| // because watch stream does not end until canceled by design and we don't have canceling mechanism yet. |
| if (changeNum == expectedChanges.length) { |
| break; |
| } |
| } |
| }); |
| |
| // TODO(nlacasse): Test database.get/setPermissions. |
| } |