blob: e3dd55e1998428de3954d1e17bc7613c57468bc6 [file] [log] [blame]
// 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.
}