diff options
Diffstat (limited to 'testing/web-platform/tests/IndexedDB/keygenerator-inject.html')
-rw-r--r-- | testing/web-platform/tests/IndexedDB/keygenerator-inject.html | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/testing/web-platform/tests/IndexedDB/keygenerator-inject.html b/testing/web-platform/tests/IndexedDB/keygenerator-inject.html new file mode 100644 index 0000000000..57f3a53848 --- /dev/null +++ b/testing/web-platform/tests/IndexedDB/keygenerator-inject.html @@ -0,0 +1,119 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Key Generator behavior with explicit keys and value injection</title> +<link rel=help href="https://w3c.github.io/IndexedDB/#inject-key-into-value"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/support.js"></script> +<script> + +indexeddb_test( + (t, db) => { + db.createObjectStore('store', {autoIncrement: true, keyPath: 'id'}); + }, + (t, db) => { + const tx = db.transaction('store', 'readwrite', {durability: 'relaxed'}); + t.onabort = t.unreached_func('transaction should not abort'); + + const store = tx.objectStore('store'); + + store.put({name: 'n'}).onsuccess = t.step_func(e => { + const key = e.target.result; + assert_equals(key, 1, 'Key generator initial value should be 1'); + store.get(key).onsuccess = t.step_func(e => { + const value = e.target.result; + assert_equals(typeof value, 'object', 'Result should be object'); + assert_equals(value.name, 'n', 'Result should have name property'); + assert_equals(value.id, key, 'Key should be injected'); + t.done(); + }); + }); + }, + 'Key is injected into value - single segment path'); + +indexeddb_test( + (t, db) => { + db.createObjectStore('store', {autoIncrement: true, keyPath: 'a.b.id'}); + }, + (t, db) => { + const tx = db.transaction('store', 'readwrite', {durability: 'relaxed'}); + t.onabort = t.unreached_func('transaction should not abort'); + + const store = tx.objectStore('store'); + + store.put({name: 'n'}).onsuccess = t.step_func(e => { + const key = e.target.result; + assert_equals(key, 1, 'Key generator initial value should be 1'); + store.get(key).onsuccess = t.step_func(e => { + const value = e.target.result; + assert_equals(typeof value, 'object', 'Result should be object'); + assert_equals(value.name, 'n', 'Result should have name property'); + assert_equals(value.a.b.id, key, 'Key should be injected'); + t.done(); + }); + }); + }, + 'Key is injected into value - multi-segment path'); + +indexeddb_test( + (t, db) => { + db.createObjectStore('store', {autoIncrement: true, keyPath: 'a.b.id'}); + }, + (t, db) => { + const tx = db.transaction('store', 'readwrite', {durability: 'relaxed'}); + t.onabort = t.unreached_func('transaction should not abort'); + + const store = tx.objectStore('store'); + + store.put({name: 'n1', b: {name: 'n2'}}).onsuccess = t.step_func(e => { + const key = e.target.result; + assert_equals(key, 1, 'Key generator initial value should be 1'); + store.get(key).onsuccess = t.step_func(e => { + const value = e.target.result; + assert_equals(typeof value, 'object', 'Result should be object'); + assert_equals(value.name, 'n1', 'Result should have name property'); + assert_equals(value.b.name, 'n2', 'Result should have name property'); + assert_equals(value.a.b.id, key, 'Key should be injected'); + t.done(); + }); + }); + }, + 'Key is injected into value - multi-segment path, partially populated'); + +indexeddb_test( + (t, db) => { + db.createObjectStore('store', {autoIncrement: true, keyPath: 'id'}); + }, + (t, db) => { + const tx = db.transaction('store', 'readwrite', {durability: 'relaxed'}); + const store = tx.objectStore('store'); + + assert_throws_dom('DataError', () => { + store.put(123); + }, 'Key path should be checked against value'); + + t.done(); + }, + 'put() throws if key cannot be injected - single segment path'); + +indexeddb_test( + (t, db) => { + db.createObjectStore('store', {autoIncrement: true, keyPath: 'a.b.id'}); + }, + (t, db) => { + const tx = db.transaction('store', 'readwrite', {durability: 'relaxed'}); + const store = tx.objectStore('store'); + + assert_throws_dom('DataError', () => { + store.put({a: 123}); + }, 'Key path should be checked against value'); + + assert_throws_dom('DataError', () => { + store.put({a: {b: 123} }); + }, 'Key path should be checked against value'); + + t.done(); + }, + 'put() throws if key cannot be injected - multi-segment path'); + +</script> |