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', () 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);
      var index =
          objectStore.createIndex(indexName, 'name_index', unique: false);
    });
  });

  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;
    });
  });
}
