diff options
author | Florian Dold <florian@dold.me> | 2021-02-16 16:45:15 +0100 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2021-02-16 16:45:15 +0100 |
commit | f9df95ded5ba1d6a6edadd24615c5e175ea5bac8 (patch) | |
tree | a7bab6bcb09f865181e86002a526992f17588035 /packages/idb-bridge/src/idb-wpt-ported/idbobjectstore-add.test.ts | |
parent | b814697fc9e4d55fbdb9b60ff82bef0c0c310494 (diff) | |
download | wallet-core-f9df95ded5ba1d6a6edadd24615c5e175ea5bac8.tar.xz |
more WPTs
Diffstat (limited to 'packages/idb-bridge/src/idb-wpt-ported/idbobjectstore-add.test.ts')
-rw-r--r-- | packages/idb-bridge/src/idb-wpt-ported/idbobjectstore-add.test.ts | 486 |
1 files changed, 486 insertions, 0 deletions
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 new file mode 100644 index 000000000..b8fdb5ac3 --- /dev/null +++ b/packages/idb-bridge/src/idb-wpt-ported/idbobjectstore-add.test.ts @@ -0,0 +1,486 @@ +import test from "ava"; +import { BridgeIDBRequest } from ".."; +import { IDBDatabase } from "../idbtypes"; +import { createdb } from "./wptsupport"; + +// IDBObjectStore.add() - add with an inline key +test("WPT idbobjectstore_add.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: IDBDatabase | undefined; + const record = { key: 1, property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db!.createObjectStore("store", { keyPath: "key" }); + + objStore.add(record); + }; + + open_rq.onsuccess = function (e) { + var rq = db!.transaction("store").objectStore("store").get(record.key); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result.property, record.property); + t.deepEqual(e.target.result.key, record.key); + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - add with an out-of-line key +test("WPT idbobjectstore_add2.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + const key = 1; + const record = { property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store"); + + objStore.add(record, key); + }; + + open_rq.onsuccess = function (e) { + var rq = db.transaction("store").objectStore("store").get(key); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result.property, record.property); + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - record with same key already exists +test("WPT idbobjectstore_add3.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + const record = { key: 1, property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { keyPath: "key" }); + objStore.add(record); + + var rq = objStore.add(record); + rq.onsuccess = () => t.fail("success on adding duplicate record"); + + rq.onerror = function (e: any) { + t.deepEqual(e.target.error.name, "ConstraintError"); + t.deepEqual(rq.error.name, "ConstraintError"); + t.deepEqual(e.type, "error"); + e.preventDefault(); + e.stopPropagation(); + }; + }; + + // Defer done, giving rq.onsuccess a chance to run + open_rq.onsuccess = function (e) { + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - add where an index has unique:true specified +test("WPT idbobjectstore_add4.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + let db: any; + let record = { key: 1, property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { autoIncrement: true }); + objStore.createIndex("i1", "property", { unique: true }); + objStore.add(record); + + var rq = objStore.add(record); + rq.onsuccess = () => t.fail("success on adding duplicate indexed record"); + + rq.onerror = function (e: any) { + t.deepEqual(rq.error.name, "ConstraintError"); + t.deepEqual(e.target.error.name, "ConstraintError"); + t.deepEqual(e.type, "error"); + e.preventDefault(); + e.stopPropagation(); + }; + }; + + // Defer done, giving a spurious rq.onsuccess a chance to run + open_rq.onsuccess = function (e) { + resolve(); + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - object store's key path is an object attribute +test("WPT idbobjectstore_add5.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + const record = { test: { obj: { key: 1 } }, property: "data" }; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { keyPath: "test.obj.key" }); + objStore.add(record); + }; + + open_rq.onsuccess = function (e: any) { + var rq = db + .transaction("store") + .objectStore("store") + .get(record.test.obj.key); + + rq.onsuccess = function (e: any) { + t.deepEqual(e.target.result.property, record.property); + resolve(); + }; + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - autoIncrement and inline keys +test("WPT idbobjectstore_add6.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + const record = { property: "data" }; + const expected_keys = [1, 2, 3, 4]; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { + keyPath: "key", + autoIncrement: true, + }); + + objStore.add(record); + objStore.add(record); + objStore.add(record); + objStore.add(record); + }; + + open_rq.onsuccess = function (e) { + var actual_keys: any[] = [], + rq = db.transaction("store").objectStore("store").openCursor(); + + rq.onsuccess = function (e: any) { + var cursor = e.target.result; + + if (cursor) { + actual_keys.push(cursor.value.key); + cursor.continue(); + } else { + t.deepEqual(actual_keys, expected_keys); + resolve(); + } + }; + }; + }); + t.pass(); +}); + +// IDBObjectStore.add() - autoIncrement and out-of-line keys +test("WPT idbobjectstore_add7.htm", async (t) => { + await new Promise<void>((resolve, reject) => { + var db: any; + const record = { property: "data" }; + const expected_keys = [1, 2, 3, 4]; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { autoIncrement: true }); + + objStore.add(record); + objStore.add(record); + objStore.add(record); + objStore.add(record); + }; + + open_rq.onsuccess = function (e) { + var actual_keys: any[] = [], + rq = db.transaction("store").objectStore("store").openCursor(); + + rq.onsuccess = function (e: any) { + var cursor = e.target.result; + + if (cursor) { + actual_keys.push(cursor.key); + cursor.continue(); + } else { + t.deepEqual(actual_keys, expected_keys); + resolve(); + } + }; + }; + }); + t.pass(); +}); + +// 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; + const record = { property: "data" }; + const expected_keys = [1, 2, 3, 4]; + + var open_rq = createdb(t); + open_rq.onupgradeneeded = function (e: any) { + db = e.target.result; + var objStore = db.createObjectStore("store", { + keyPath: "test.obj.key", + autoIncrement: true, + }); + + objStore.add(record); + objStore.add(record); + objStore.add(record); + objStore.add(record); + }; + + open_rq.onsuccess = function (e) { + var actual_keys: any[] = [], + rq = db.transaction("store").objectStore("store").openCursor(); + + rq.onsuccess = function (e: any) { + var cursor = e.target.result; + + if (cursor) { + actual_keys.push(cursor.value.test.obj.key); + cursor.continue(); + } else { + t.deepEqual(actual_keys, expected_keys); + resolve(); + } + }; + }; + }); + 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(); +}); |