gecko/addon-sdk/source/test/test-indexed-db.js
2013-08-01 00:28:15 +02:00

129 lines
3.9 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
let xulApp = require("sdk/system/xul-app");
if (xulApp.versionInRange(xulApp.platformVersion, "16.0a1", "*")) {
new function tests() {
const { indexedDB, IDBKeyRange, DOMException
} = require("sdk/indexed-db");
exports["test indexedDB is frozen"] = function(assert){
let original = indexedDB.open;
let f = function(){};
assert.throws(function(){indexedDB.open = f});
assert.equal(indexedDB.open,original);
assert.notEqual(indexedDB.open,f);
};
exports["test db variables"] = function(assert) {
[ indexedDB, IDBKeyRange, DOMException
].forEach(function(value) {
assert.notEqual(typeof(value), "undefined", "variable is defined");
});
}
exports["test open"] = function(assert, done) {
let request = indexedDB.open("MyTestDatabase");
request.onerror = function(event) {
assert.fail("Failed to open indexedDB")
done();
};
request.onsuccess = function(event) {
assert.pass("IndexedDB was open");
done();
};
};
exports["test dbname is unprefixed"] = function(assert, done) {
// verify fixes in https://bugzilla.mozilla.org/show_bug.cgi?id=786688
let dbName = "dbname-unprefixed";
let request = indexedDB.open(dbName);
request.onerror = function(event) {
assert.fail("Failed to open db");
done();
};
request.onsuccess = function(event) {
assert.equal(request.result.name, dbName);
done();
};
};
exports["test structuring the database"] = function(assert, done) {
// This is what our customer data looks like.
let customerData = [
{ ssn: "444-44-4444", name: "Bill", age: 35, email: "bill@company.com" },
{ ssn: "555-55-5555", name: "Donna", age: 32, email: "donna@home.org" }
];
let dbName = "the_name";
let request = indexedDB.open(dbName, 2);
request.onerror = function(event) {
assert.fail("Failed to open db");
done();
};
request.onsuccess = function(event) {
assert.pass("transaction is complete");
testRead(assert, done);
}
request.onupgradeneeded = function(event) {
assert.pass("data base upgrade")
var db = event.target.result;
// Create an objectStore to hold information about our customers. We"re
// going to use "ssn" as our key path because it"s guaranteed to be
// unique.
var objectStore = db.createObjectStore("customers", { keyPath: "ssn" });
// Create an index to search customers by name. We may have duplicates
// so we can"t use a unique index.
objectStore.createIndex("name", "name", { unique: false });
// Create an index to search customers by email. We want to ensure that
// no two customers have the same email, so use a unique index.
objectStore.createIndex("email", "email", { unique: true });
// Store values in the newly created objectStore.
customerData.forEach(function(data) {
objectStore.add(data);
});
assert.pass("data added to object store");
};
};
function testRead(assert, done) {
let dbName = "the_name";
let request = indexedDB.open(dbName, 2);
request.onsuccess = function(event) {
assert.pass("data opened")
var db = event.target.result;
let transaction = db.transaction(["customers"]);
var objectStore = transaction.objectStore("customers");
var request = objectStore.get("444-44-4444");
request.onerror = function(event) {
assert.fail("Failed to retrive data")
};
request.onsuccess = function(event) {
// Do something with the request.result!
assert.equal(request.result.name, "Bill", "Name is correct");
done();
};
};
request.onerror = function() {
assert.fail("failed to open db");
};
};
}
} else {
exports.testDB = function(assert) {
assert.pass("IndexedDB is not implemented")
}
}
require("test").run(exports);