diff options
author | Florian Dold <florian@dold.me> | 2021-02-16 13:46:51 +0100 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2021-02-16 13:47:01 +0100 |
commit | 987f22de02648485ec6f1d3c1558abcfa6d624a0 (patch) | |
tree | 5883ed1ae4a2debaff8795acadadf8d4b0e2e5be /packages/idb-bridge/src/idb-wpt-ported | |
parent | db59275b6b43f8fa7f36899ae81cb7139a2e80cb (diff) | |
download | wallet-core-987f22de02648485ec6f1d3c1558abcfa6d624a0.tar.xz |
next batch of test cases and fixes
Diffstat (limited to 'packages/idb-bridge/src/idb-wpt-ported')
3 files changed, 397 insertions, 2 deletions
diff --git a/packages/idb-bridge/src/idb-wpt-ported/idbindex_get.test.ts b/packages/idb-bridge/src/idb-wpt-ported/idbindex_get.test.ts new file mode 100644 index 000000000..8a8cb3129 --- /dev/null +++ b/packages/idb-bridge/src/idb-wpt-ported/idbindex_get.test.ts @@ -0,0 +1,177 @@ +import test from "ava"; +import { BridgeIDBKeyRange, BridgeIDBRequest } from ".."; +import { IDBDatabase } from "../idbtypes"; +import { createdb } from "./wptsupport"; + +// IDBIndex.get() - returns the record +test("WPT idbindex_get.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any, index: any; + const record = { key: 1, indexedProperty: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { keyPath: "key" }); + index = objStore.createIndex("index", "indexedProperty"); + + objStore.add(record); + }; + + open_rq.onsuccess = function (e) { + var rq = db + .transaction("store") + .objectStore("store") + .index("index") + .get(record.indexedProperty); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result.key, record.key); + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBIndex.get() - returns the record where the index contains duplicate values +test("WPT idbindex_get2.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + const records = [ + { key: 1, indexedProperty: "data" }, + { key: 2, indexedProperty: "data" }, + { key: 3, indexedProperty: "data" }, + ]; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("test", { keyPath: "key" }); + objStore.createIndex("index", "indexedProperty"); + + for (var i = 0; i < records.length; i++) objStore.add(records[i]); + }; + + open_rq.onsuccess = function (e) { + var rq = db + .transaction("test") + .objectStore("test") + .index("index") + .get("data"); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result.key, records[0].key); + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBIndex.get() - attempt to retrieve a record that doesn't exist +test("WPT idbindex_get3.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var rq = db + .createObjectStore("test", { keyPath: "key" }) + .createIndex("index", "indexedProperty") + .get(1); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result, undefined); + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBIndex.get() - returns the record with the first key in the range +test("WPT idbindex_get4.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + + var open_rq = createdb(t); + + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var store = db.createObjectStore("store", { keyPath: "key" }); + store.createIndex("index", "indexedProperty"); + + for (var i = 0; i < 10; i++) { + store.add({ key: i, indexedProperty: "data" + i }); + } + }; + + open_rq.onsuccess = function (e) { + var rq = db + .transaction("store") + .objectStore("store") + .index("index") + .get(BridgeIDBKeyRange.bound("data4", "data7")); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result.key, 4); + t.deepEqual(e.target.result.indexedProperty, "data4"); + setTimeout(function () { + resolve(); + }, 4); + }; + }; + }); + t.pass(); +}); + +// IDBIndex.get() - throw DataError when using invalid key +test("WPT idbindex_get5.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + + var index = db + .createObjectStore("test", { keyPath: "key" }) + .createIndex("index", "indexedProperty"); + t.throws( + function () { + index.get(NaN); + }, + { name: "DataError" }, + ); + resolve(); + }; + }); + t.pass(); +}); + +// IDBIndex.get() - throw InvalidStateError when the index is deleted +test("WPT idbindex_get6.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var store = db.createObjectStore("store", { keyPath: "key" }); + var index = store.createIndex("index", "indexedProperty"); + + store.add({ key: 1, indexedProperty: "data" }); + store.deleteIndex("index"); + + t.throws( + function () { + index.get("data"); + }, + { name: "InvalidStateError" }, + ); + resolve(); + }; + }); + t.pass(); +}); diff --git a/packages/idb-bridge/src/idb-wpt-ported/idbobjectstore_add.test.ts b/packages/idb-bridge/src/idb-wpt-ported/idbobjectstore_add.test.ts index b0c1de2d7..b8fdb5ac3 100644 --- a/packages/idb-bridge/src/idb-wpt-ported/idbobjectstore_add.test.ts +++ b/packages/idb-bridge/src/idb-wpt-ported/idbobjectstore_add.test.ts @@ -1,4 +1,5 @@ import test from "ava"; +import { BridgeIDBRequest } from ".."; import { IDBDatabase } from "../idbtypes"; import { createdb } from "./wptsupport"; @@ -228,7 +229,8 @@ test("WPT idbobjectstore_add7.htm", async (t) => { t.pass(); }); -// IDBObjectStore.add() - object store has autoIncrement:true and the key path is an object attribute +// IDBObjectStore.add() - object store has autoIncrement:true and the key path +// is an object attribute test("WPT idbobjectstore_add8.htm", async (t) => { await new Promise<void>((resolve, reject) => { var db: any; @@ -268,3 +270,217 @@ test("WPT idbobjectstore_add8.htm", async (t) => { }); t.pass(); }); + +// IDBObjectStore.add() - Attempt to add a record that does not meet the +// constraints of an object store's inline key requirements +test("WPT idbobjectstore_add9.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + const record = { key: 1, property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + var rq, + db = e.target.result, + objStore = db.createObjectStore("store", { keyPath: "key" }); + + t.throws( + function () { + rq = objStore.add(record, 1); + }, + { name: "DataError" }, + ); + t.deepEqual(rq, undefined); + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - Attempt to call 'add' without an key parameter when the +// object store uses out-of-line keys. +test("WPT idbobjectstore_add10.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + const record = { property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + + var rq, + objStore = db.createObjectStore("store"); + + t.throws( + function () { + rq = objStore.add(record); + }, + { name: "DataError" }, + ); + + t.deepEqual(rq, undefined); + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - Attempt to add a record where the record's key +// does not meet the constraints of a valid key +test("WPT idbobjectstore_add11.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + const record = { key: { value: 1 }, property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + + var rq, + objStore = db.createObjectStore("store", { keyPath: "key" }); + + t.throws( + function () { + rq = objStore.add(record); + }, + { name: "DataError" }, + ); + + t.deepEqual(rq, undefined); + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - Attempt to add a record where the +// record's in-line key is not defined +test("WPT idbobjectstore_add12.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + const record = { property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + + var rq, + objStore = db.createObjectStore("store", { keyPath: "key" }); + t.throws( + function () { + rq = objStore.add(record); + }, + { name: "DataError" }, + ); + t.deepEqual(rq, undefined); + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - Attempt to add a record where the out of line +// key provided does not meet the constraints of a valid key +test("WPT idbobjectstore_add13.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + const record = { property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + + var rq, + objStore = db.createObjectStore("store"); + + t.throws( + function () { + rq = objStore.add(record, { value: 1 }); + }, + { name: "DataError" }, + ); + + t.deepEqual(rq, undefined); + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - Add a record where a value +// being indexed does not meet the constraints of a valid key +test("WPT idbobjectstore_add14.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + const record = { key: 1, indexedProperty: { property: "data" } }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + + var rq, + objStore = db.createObjectStore("store", { keyPath: "key" }); + + objStore.createIndex("index", "indexedProperty"); + + rq = objStore.add(record); + + t.assert(rq instanceof BridgeIDBRequest); + rq.onsuccess = function () { + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - If the transaction this IDBObjectStore belongs +// to has its mode set to readonly, throw ReadOnlyError +test("WPT idbobjectstore_add15.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (event: any) { + db = event.target.result; + db.createObjectStore("store", { keyPath: "pKey" }); + }; + + open_rq.onsuccess = function (event) { + var txn = db.transaction("store"); + var ostore = txn.objectStore("store"); + t.throws( + function () { + ostore.add({ pKey: "primaryKey_0" }); + }, + { name: "ReadOnlyError" }, + ); + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - If the object store has been +// deleted, the implementation must throw a DOMException of type InvalidStateError +test("WPT idbobjectstore_add16.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + let ostore: any; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (event: any) { + db = event.target.result; + ostore = db.createObjectStore("store", { keyPath: "pKey" }); + db.deleteObjectStore("store"); + + t.throws( + function () { + ostore.add({ pKey: "primaryKey_0" }); + }, + { name: "InvalidStateError" }, + ); + resolve(); + }; + }); + t.pass(); +}); diff --git a/packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts b/packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts index 92e78a685..5716a7ae5 100644 --- a/packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts +++ b/packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts @@ -5,7 +5,9 @@ import { MemoryBackend } from "../MemoryBackend"; import { compareKeys } from "../util/cmp"; BridgeIDBFactory.enableTracing = true; -const idbFactory = new BridgeIDBFactory(new MemoryBackend()); +const backend = new MemoryBackend(); +backend.enableTracing = true; +const idbFactory = new BridgeIDBFactory(backend); const self = { indexedDB: idbFactory, |