| // Copyright (c) 2020, 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 IndexedDB1Test; |
| |
| import 'package:async_helper/async_helper.dart'; |
| import 'package:async_helper/async_minitest.dart'; |
| import 'dart:async'; |
| import 'dart:html' as html; |
| import 'dart:indexed_db' as idb; |
| |
| var dbName = 'test_db_5'; |
| var storeName = 'test_store'; |
| var indexName = 'name_index'; |
| var db; |
| var value = {'name_index': 'one', 'value': 'add_value'}; |
| |
| Future testInit() async { |
| await html.window.indexedDB!.deleteDatabase(dbName); |
| db = await html.window.indexedDB!.open(dbName, version: 1, |
| onUpgradeNeeded: (idb.VersionChangeEvent e) { |
| var db = e.target.result; |
| var objectStore = db.createObjectStore(storeName, autoIncrement: true); |
| objectStore.createIndex(indexName, 'name_index', unique: false); |
| }); |
| } |
| |
| Future testAddDelete() async { |
| var transaction = db.transaction(storeName, 'readwrite'); |
| var key = await transaction.objectStore(storeName).add(value); |
| await transaction.completed; |
| transaction = db.transaction(storeName, 'readonly'); |
| var readValue = await transaction.objectStore(storeName).getObject(key); |
| expect(readValue['value'], value['value']); |
| await transaction.completed; |
| transaction = db.transactionList([storeName], 'readwrite'); |
| await transaction.objectStore(storeName).delete(key); |
| await transaction.completed; |
| transaction = db.transactionList([storeName], 'readonly'); |
| var count = await transaction.objectStore(storeName).count(); |
| expect(count, 0); |
| } |
| |
| Future testClearCount() async { |
| var transaction = db.transaction(storeName, 'readwrite'); |
| transaction.objectStore(storeName).add(value); |
| |
| await transaction.completed; |
| transaction = db.transaction(storeName, 'readonly'); |
| var count = await transaction.objectStore(storeName).count(); |
| expect(count, 1); |
| await transaction.completed; |
| transaction = db.transactionList([storeName], 'readwrite'); |
| transaction.objectStore(storeName).clear(); |
| await transaction.completed; |
| transaction = db.transactionList([storeName], 'readonly'); |
| count = await transaction.objectStore(storeName).count(); |
| expect(count, 0); |
| } |
| |
| Future testIndex() async { |
| 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); |
| |
| await transaction.completed; |
| transaction = db.transactionList([storeName], 'readonly'); |
| var index = transaction.objectStore(storeName).index(indexName); |
| var count = await index.count(); |
| expect(count, 4); |
| await transaction.completed; |
| transaction = db.transaction(storeName, 'readonly'); |
| index = transaction.objectStore(storeName).index(indexName); |
| var cursorsLength = await index.openCursor(autoAdvance: true).length; |
| expect(cursorsLength, 4); |
| await transaction.completed; |
| transaction = db.transaction(storeName, 'readonly'); |
| index = transaction.objectStore(storeName).index(indexName); |
| cursorsLength = await index.openKeyCursor(autoAdvance: true).length; |
| expect(cursorsLength, 4); |
| await transaction.completed; |
| transaction = db.transaction(storeName, 'readonly'); |
| index = transaction.objectStore(storeName).index(indexName); |
| var readValue = await index.get('one'); |
| expect(readValue['value'], value['value']); |
| await transaction.completed; |
| transaction = db.transaction(storeName, 'readwrite'); |
| transaction.objectStore(storeName).clear(); |
| return transaction.completed; |
| } |
| |
| Future testCursor() async { |
| var deleteValue = {'name_index': 'two', 'value': 'delete_value'}; |
| var updateValue = {'name_index': 'three', 'value': 'update_value'}; |
| var updatedValue = {'name_index': 'three', 'value': 'updated_value'}; |
| var transaction = db.transaction(storeName, 'readwrite'); |
| transaction.objectStore(storeName).add(value); |
| transaction.objectStore(storeName).add(deleteValue); |
| transaction.objectStore(storeName).add(updateValue); |
| |
| await transaction.completed; |
| 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(); |
| } |
| }); |
| await cursors.last; |
| await transaction.completed; |
| transaction = db.transaction(storeName, 'readonly'); |
| index = transaction.objectStore(storeName).index(indexName); |
| var readValue = await index.get('three'); |
| expect(readValue['value'], 'updated_value'); |
| await transaction.completed; |
| transaction = db.transaction(storeName, 'readonly'); |
| index = transaction.objectStore(storeName).index(indexName); |
| readValue = await index.get('two'); |
| expect(readValue, isNull); |
| return transaction.completed; |
| } |
| |
| main() { |
| if (!idb.IdbFactory.supported) { |
| return; |
| } |
| asyncTest(() async { |
| await testInit(); |
| await testAddDelete(); |
| await testClearCount(); |
| await testIndex(); |
| await testCursor(); |
| }); |
| } |