idbobjectstore_put.any.js (12077B)
1 // META: global=window,worker 2 // META: title=IDBObjectStore.put() 3 // META: script=resources/support.js 4 // @author Microsoft <https://www.microsoft.com> 5 // @author Intel <http://www.intel.com> 6 7 'use strict'; 8 9 async_test(t => { 10 let db; 11 const record = { key: 1, property: "data" }; 12 13 const open_rq = createdb(t); 14 open_rq.onupgradeneeded = function(e) { 15 db = e.target.result; 16 const objStore = db.createObjectStore("store", { keyPath: "key" }); 17 18 objStore.put(record); 19 }; 20 21 open_rq.onsuccess = function(e) { 22 const rq = db.transaction("store", "readonly") 23 .objectStore("store") 24 .get(record.key); 25 26 rq.onsuccess = t.step_func(function(e) { 27 assert_equals(e.target.result.property, record.property); 28 assert_equals(e.target.result.key, record.key); 29 t.done(); 30 }); 31 }; 32 }, 'put() with an inline key'); 33 34 async_test(t => { 35 let db; 36 const key = 1; 37 const record = { property: "data" }; 38 39 const open_rq = createdb(t); 40 open_rq.onupgradeneeded = function(e) { 41 db = e.target.result; 42 const objStore = db.createObjectStore("store"); 43 44 objStore.put(record, key); 45 }; 46 47 open_rq.onsuccess = function(e) { 48 const rq = db.transaction("store", "readonly") 49 .objectStore("store") 50 .get(key); 51 52 rq.onsuccess = t.step_func(function(e) { 53 assert_equals(e.target.result.property, record.property); 54 55 t.done(); 56 }); 57 }; 58 },'put() with an out-of-line key'); 59 60 async_test(t => { 61 let db; 62 let success_event; 63 const record = { key: 1, property: "data" }; 64 const record_put = { key: 1, property: "changed", more: ["stuff", 2] }; 65 66 const open_rq = createdb(t); 67 open_rq.onupgradeneeded = function(e) { 68 db = e.target.result; 69 const objStore = db.createObjectStore("store", { keyPath: "key" }); 70 objStore.put(record); 71 72 const rq = objStore.put(record_put); 73 rq.onerror = fail(t, "error on put"); 74 75 rq.onsuccess = t.step_func(function(e) { 76 success_event = true; 77 }); 78 }; 79 80 open_rq.onsuccess = function(e) { 81 assert_true(success_event); 82 83 const rq = db.transaction("store", "readonly") 84 .objectStore("store") 85 .get(1); 86 87 rq.onsuccess = t.step_func(function(e) { 88 const rec = e.target.result; 89 90 assert_equals(rec.key, record_put.key); 91 assert_equals(rec.property, record_put.property); 92 assert_array_equals(rec.more, record_put.more); 93 94 t.done(); 95 }); 96 }; 97 }, 'put() record with key already exists'); 98 99 async_test(t => { 100 const record = { key: 1, property: "data" }; 101 102 const open_rq = createdb(t); 103 open_rq.onupgradeneeded = function(e) { 104 let db = e.target.result; 105 const objStore = db.createObjectStore("store", { 106 autoIncrement: true }); 107 objStore.createIndex("i1", "property", { unique: true }); 108 objStore.put(record); 109 110 const rq = objStore.put(record); 111 rq.onsuccess = fail(t, "success on putting duplicate indexed record"); 112 113 rq.onerror = t.step_func(function(e) { 114 assert_equals(rq.error.name, "ConstraintError"); 115 assert_equals(e.target.error.name, "ConstraintError"); 116 117 assert_equals(e.type, "error"); 118 119 e.preventDefault(); 120 e.stopPropagation(); 121 }); 122 }; 123 124 // Defer done, giving a spurious rq.onsuccess a chance to run 125 open_rq.onsuccess = function(e) { 126 t.done(); 127 }; 128 }, 'put() where an index has unique:true specified'); 129 130 async_test(t => { 131 let db; 132 const record = { test: { obj: { key: 1 } }, property: "data" }; 133 134 const open_rq = createdb(t); 135 open_rq.onupgradeneeded = function(e) { 136 db = e.target.result; 137 const objStore = db.createObjectStore("store", 138 { keyPath: "test.obj.key" }); 139 objStore.put(record); 140 }; 141 142 open_rq.onsuccess = function(e) { 143 const rq = db.transaction("store", "readonly") 144 .objectStore("store") 145 .get(record.test.obj.key); 146 147 rq.onsuccess = t.step_func(function(e) { 148 assert_equals(e.target.result.property, record.property); 149 150 t.done(); 151 }); 152 }; 153 }, 'Object store\'s key path is an object attribute'); 154 155 async_test(t => { 156 let db; 157 const record = { property: "data" }; 158 const expected_keys = [1, 2, 3, 4]; 159 160 const open_rq = createdb(t); 161 open_rq.onupgradeneeded = function(e) { 162 db = e.target.result; 163 const objStore = db.createObjectStore("store", { keyPath: "key", 164 autoIncrement: true }); 165 166 objStore.put(record); 167 objStore.put(record); 168 objStore.put(record); 169 objStore.put(record); 170 }; 171 172 open_rq.onsuccess = function(e) { 173 let actual_keys = []; 174 const rq = db.transaction("store", "readonly") 175 .objectStore("store") 176 .openCursor(); 177 178 rq.onsuccess = t.step_func(function(e) { 179 const cursor = e.target.result; 180 181 if (cursor) { 182 actual_keys.push(cursor.value.key); 183 cursor.continue(); 184 } else { 185 assert_array_equals(actual_keys, expected_keys); 186 t.done(); 187 } 188 }); 189 }; 190 }, 'autoIncrement and inline keys'); 191 192 async_test(t => { 193 let db; 194 const record = { property: "data" }; 195 const expected_keys = [1, 2, 3, 4]; 196 197 const open_rq = createdb(t); 198 open_rq.onupgradeneeded = function(e) { 199 db = e.target.result; 200 const objStore = db.createObjectStore("store", { keyPath: "key", 201 autoIncrement: true }); 202 203 objStore.put(record); 204 objStore.put(record); 205 objStore.put(record); 206 objStore.put(record); 207 }; 208 209 open_rq.onsuccess = function(e) { 210 const actual_keys = []; 211 const rq = db.transaction("store", "readonly") 212 .objectStore("store") 213 .openCursor(); 214 215 rq.onsuccess = t.step_func(function(e) { 216 const cursor = e.target.result; 217 218 if(cursor) { 219 actual_keys.push(cursor.value.key); 220 cursor.continue(); 221 } else { 222 assert_array_equals(actual_keys, expected_keys); 223 t.done(); 224 } 225 }); 226 }; 227 }, 'autoIncrement and out-of-line keys'); 228 229 async_test(t => { 230 let db; 231 const record = { property: "data" }; 232 const expected_keys = [1, 2, 3, 4]; 233 234 const open_rq = createdb(t); 235 open_rq.onupgradeneeded = function(e) { 236 db = e.target.result; 237 const objStore = db.createObjectStore("store", 238 { keyPath: "test.obj.key", autoIncrement: true }); 239 240 objStore.put(record); 241 objStore.put(record); 242 objStore.put(record); 243 objStore.put(record); 244 }; 245 246 open_rq.onsuccess = function(e) { 247 const actual_keys = []; 248 const rq = db.transaction("store", "readonly") 249 .objectStore("store") 250 .openCursor(); 251 252 rq.onsuccess = t.step_func(function(e) { 253 const cursor = e.target.result; 254 255 if (cursor) { 256 actual_keys.push(cursor.value.test.obj.key); 257 cursor.continue(); 258 } else { 259 assert_array_equals(actual_keys, expected_keys); 260 t.done(); 261 } 262 }); 263 }; 264 }, 'Object store has autoIncrement:true and the key path is an object \ 265 attribute'); 266 267 async_test(t => { 268 const record = { key: 1, property: "data" }; 269 270 const open_rq = createdb(t); 271 open_rq.onupgradeneeded = function(e) { 272 let rq; 273 const db = e.target.result; 274 const objStore = db.createObjectStore("store", { keyPath: "key" }); 275 276 assert_throws_dom("DataError", function() { 277 rq = objStore.put(record, 1); 278 }); 279 280 assert_equals(rq, undefined); 281 t.done(); 282 }; 283 }, 'Attempt to put() a record that does not meet the constraints of an object \ 284 store\'s inline key requirements'); 285 286 async_test(t => { 287 const record = { property: "data" }; 288 289 const open_rq = createdb(t); 290 open_rq.onupgradeneeded = function(e) { 291 let db = e.target.result; 292 293 let rq; 294 const objStore = db.createObjectStore("store", { keyPath: "key" }); 295 296 assert_throws_dom("DataError", function() { 297 rq = objStore.put(record); 298 }); 299 300 assert_equals(rq, undefined); 301 t.done(); 302 }; 303 }, 'Attempt to call put() without an key parameter when the object store uses \ 304 out-of-line keys'); 305 306 async_test(t => { 307 const record = { key: { value: 1 }, property: "data" }; 308 309 const open_rq = createdb(t); 310 open_rq.onupgradeneeded = function(e) { 311 const db = e.target.result; 312 313 let rq; 314 const objStore = db.createObjectStore("store", { keyPath: "key" }); 315 316 assert_throws_dom("DataError", function() { 317 rq = objStore.put(record); 318 }); 319 320 assert_equals(rq, undefined); 321 t.done(); 322 }; 323 }, 'Attempt to put() a record where the record\'s key does not meet the \ 324 constraints of a valid key'); 325 326 async_test(t => { 327 const record = { property: "data" }; 328 329 const open_rq = createdb(t); 330 open_rq.onupgradeneeded = function(e) { 331 const db = e.target.result; 332 333 let rq; 334 const objStore = db.createObjectStore("store", { keyPath: "key" }); 335 336 assert_throws_dom("DataError", function() { 337 rq = objStore.put(record); 338 }); 339 340 assert_equals(rq, undefined); 341 t.done(); 342 }; 343 }, 'Attempt to put() a record where the record\'s in-line key is not defined'); 344 345 async_test(t => { 346 const record = { property: "data" }; 347 348 const open_rq = createdb(t); 349 open_rq.onupgradeneeded = function(e) { 350 const db = e.target.result; 351 352 let rq; 353 const objStore = db.createObjectStore("store"); 354 355 assert_throws_dom("DataError", function() { 356 rq = objStore.put(record, { value: 1 }); 357 }); 358 359 assert_equals(rq, undefined); 360 t.done(); 361 }; 362 }, 'Attempt to put() a record where the out of line key provided does not \ 363 meet the constraints of a valid key'); 364 365 async_test(t => { 366 const record = { key: 1, indexedProperty: { property: "data" } }; 367 368 const open_rq = createdb(t); 369 open_rq.onupgradeneeded = function(e) { 370 const db = e.target.result; 371 372 let rq; 373 const objStore = db.createObjectStore("store", { keyPath: "key" }); 374 375 objStore.createIndex("index", "indexedProperty"); 376 377 rq = objStore.put(record); 378 379 assert_true(rq instanceof IDBRequest); 380 rq.onsuccess = function() { 381 t.done(); 382 }; 383 }; 384 }, 'put() a record where a value being indexed does not meet the constraints \ 385 of a valid key'); 386 387 async_test(t => { 388 let db; 389 const open_rq = createdb(t); 390 open_rq.onupgradeneeded = function(event) { 391 db = event.target.result; 392 db.createObjectStore("store", { keyPath: "pKey" }); 393 }; 394 395 open_rq.onsuccess = function(event) { 396 const txn = db.transaction("store", "readonly"); 397 const ostore = txn.objectStore("store"); 398 t.step(function() { 399 assert_throws_dom("ReadOnlyError", function() { 400 ostore.put({ pKey: "primaryKey_0" }); 401 }); 402 }); 403 t.done(); 404 }; 405 }, 'If the transaction this IDBObjectStore belongs to has its mode set to \ 406 readonly, throw ReadOnlyError'); 407 408 async_test(t => { 409 let ostore; 410 const open_rq = createdb(t); 411 open_rq.onupgradeneeded = function(event) { 412 const db = event.target.result; 413 ostore = db.createObjectStore("store", { keyPath: "pKey" }); 414 db.deleteObjectStore("store"); 415 assert_throws_dom("InvalidStateError", function() { 416 ostore.put({ pKey: "primaryKey_0" }); 417 }); 418 t.done(); 419 }; 420 }, 'If the object store has been deleted, the implementation must throw a \ 421 DOMException of type InvalidStateError');