blob: cbf77d1b1648438e09982e1fb4cb813ed1f4fd52 [file] [log] [blame]
library IndexedDB1Test;
import 'package:unittest/unittest.dart';
import 'package:unittest/html_config.dart';
import 'dart:async';
import 'dart:html' as html;
import 'dart:indexed_db' as idb;
main() {
useHtmlConfiguration();
if (!idb.IdbFactory.supported) {
return;
}
var dbName = 'test_db_5';
var storeName = 'test_store';
var indexName = 'name_index';
var db;
test('init', () {
return html.window.indexedDB.deleteDatabase(dbName).then((_) {
return html.window.indexedDB.open(dbName, version: 1,
onUpgradeNeeded: (e) {
var db = e.target.result;
var objectStore = db.createObjectStore(storeName,
autoIncrement: true);
var index = objectStore.createIndex(indexName, 'name_index',
unique: false);
});
}).then((database) {
db = database;
});
});
if (html.window.indexedDB.supportsDatabaseNames) {
test('getDatabaseNames', () {
return html.window.indexedDB.getDatabaseNames().then((names) {
expect(names.contains(dbName), isTrue);
});
});
}
var value = {'name_index': 'one', 'value': 'add_value'};
test('add/delete', () {
var transaction = db.transaction(storeName, 'readwrite');
var key;
return transaction.objectStore(storeName).add(value).then((addedKey) {
key = addedKey;
}).then((_) {
return transaction.completed;
}).then((_) {
transaction = db.transaction(storeName, 'readonly');
return transaction.objectStore(storeName).getObject(key);
}).then((readValue) {
expect(readValue['value'], value['value']);
return transaction.completed;
}).then((_) {
transaction = db.transactionList([storeName], 'readwrite');
return transaction.objectStore(storeName).delete(key);
}).then((_) {
return transaction.completed;
}).then((_) {
var transaction = db.transactionList([storeName], 'readonly');
return transaction.objectStore(storeName).count();
}).then((count) {
expect(count, 0);
});
});
test('clear/count', () {
var transaction = db.transaction(storeName, 'readwrite');
transaction.objectStore(storeName).add(value);
return transaction.completed.then((_) {
transaction = db.transaction(storeName, 'readonly');
return transaction.objectStore(storeName).count();
}).then((count) {
expect(count, 1);
}).then((_) {
return transaction.completed;
}).then((_) {
transaction = db.transactionList([storeName], 'readwrite');
transaction.objectStore(storeName).clear();
return transaction.completed;
}).then((_) {
var transaction = db.transactionList([storeName], 'readonly');
return transaction.objectStore(storeName).count();
}).then((count) {
expect(count, 0);
});
});
test('index', () {
var transaction = db.transaction(storeName, 'readwrite');
transaction.objectStore(storeName).add(value);
transaction.objectStore(storeName).add(value);
transaction.objectStore(storeName).add(value);
transaction.objectStore(storeName).add(value);
return transaction.completed.then((_) {
transaction = db.transactionList([storeName], 'readonly');
var index = transaction.objectStore(storeName).index(indexName);
return index.count();
}).then((count) {
expect(count, 4);
return transaction.completed;
}).then((_) {
transaction = db.transaction(storeName, 'readonly');
var index = transaction.objectStore(storeName).index(indexName);
return index.openCursor(autoAdvance: true).length;
}).then((cursorsLength) {
expect(cursorsLength, 4);
return transaction.completed;
}).then((_) {
transaction = db.transaction(storeName, 'readonly');
var index = transaction.objectStore(storeName).index(indexName);
return index.openKeyCursor(autoAdvance: true).length;
}).then((cursorsLength) {
expect(cursorsLength, 4);
return transaction.completed;
}).then((_) {
transaction = db.transaction(storeName, 'readonly');
var index = transaction.objectStore(storeName).index(indexName);
return index.get('one');
}).then((readValue) {
expect(readValue['value'], value['value']);
return transaction.completed;
}).then((_) {
transaction = db.transaction(storeName, 'readwrite');
transaction.objectStore(storeName).clear();
return transaction.completed;
});
});
var deleteValue = {'name_index': 'two', 'value': 'delete_value'};
var updateValue = {'name_index': 'three', 'value': 'update_value'};
var updatedValue = {'name_index': 'three', 'value': 'updated_value'};
test('cursor', () {
var transaction = db.transaction(storeName, 'readwrite');
transaction.objectStore(storeName).add(value);
transaction.objectStore(storeName).add(deleteValue);
transaction.objectStore(storeName).add(updateValue);
return transaction.completed.then((_) {
transaction = db.transactionList([storeName], 'readwrite');
var index = transaction.objectStore(storeName).index(indexName);
var cursors = index.openCursor().asBroadcastStream();
cursors.listen((cursor) {
var value = cursor.value;
if (value['value'] == 'delete_value') {
cursor.delete().then((_) {
cursor.next();
});
} else if (value['value'] == 'update_value') {
cursor.update(updatedValue).then((_) {
cursor.next();
});
} else {
cursor.next();
}
});
return cursors.last;
}).then((_) {
return transaction.completed;
}).then((_) {
transaction = db.transaction(storeName, 'readonly');
var index = transaction.objectStore(storeName).index(indexName);
return index.get('three');
}).then((readValue) {
expect(readValue['value'], 'updated_value');
return transaction.completed;
}).then((_) {
transaction = db.transaction(storeName, 'readonly');
var index = transaction.objectStore(storeName).index(indexName);
return index.get('two');
}).then((readValue) {
expect(readValue, isNull);
return transaction.completed;
});
});
}