UNPKG

ydn.db

Version:

Javascript database library for IndexedDB, WebDatabase (WebSQL) and WebStorage (localStorage) storage mechanisms supporting version migration, advanced query and transaction workflow.

399 lines (323 loc) 9.66 kB
goog.require('goog.debug.Console'); goog.require('goog.testing.jsunit'); goog.require('ydn.async'); goog.require('ydn.db.crud.Storage'); goog.require('ydn.db.schema.DataType'); goog.require('ydn.db'); goog.require('ydn.debug'); goog.require('ydn.testing'); var reachedFinalContinuation, basic_schema; var string_table = 't1'; var number_table = 't2'; var date_table = 't3'; var array_table = 't4'; var out_of_line_store = 't5'; var setUp = function() { // ydn.debug.log('ydn.db.crud.req', 'finest'); reachedFinalContinuation = false; }; var tearDown = function() { assertTrue('The final continuation was not reached', reachedFinalContinuation); }; var getBasicSchema = function () { var s1 = new ydn.db.schema.Store(string_table, 'id'); var s2 = new ydn.db.schema.Store(number_table, 'id', false, ydn.db.schema.DataType.NUMERIC); var s3 = new ydn.db.schema.Store(date_table, 'id', false, ydn.db.schema.DataType.DATE); var s4 = new ydn.db.schema.Store(array_table, 'id', false, ydn.db.schema.DataType.ARRAY); var s5 = new ydn.db.schema.Store(out_of_line_store, undefined, false); basic_schema = new ydn.db.schema.Database(undefined, [s1, s2, s3, s4, s5]); return basic_schema; }; var key_test = function(db, key, table_name, callback) { var db_name = 'key-test' + Math.random(); table_name = table_name || string_table; //console.log('testing ' + key + ' on ' + table_name); var key_value = 'a' + Math.random(); var a_done; var a_value; waitForCondition( // Condition function() { return a_done; }, // Continuation function() { assertEquals('put a', key, a_value); }, 100, // interval 2000); // maxTimeout db.put(table_name, {id: key, value: key_value}).addCallback(function(value) { //console.log(db + ' receiving put value callback for ' + key + ' = ' + key_value); a_value = value; a_done = true; }); var b_done; var b_value; waitForCondition( // Condition function() { return b_done; }, // Continuation function() { assertEquals('get', key_value, b_value.value); if (callback) { callback(true); } }, 100, // interval 5000); // maxTimeout db.close(); db.get(table_name, key).addCallback(function(value) { // console.log(db + ' receiving get value callback ' + key + ' = ' + JSON.stringify(value)); b_value = value; b_done = true; }); }; var test_13_array_key = function () { var store_name = 'st'; var db_name = 'test_13_array_key'; var schema = { stores: [{ name: store_name, keyPath: 'id' }] }; var db = new ydn.db.crud.Storage(db_name, schema, options); var objs = [ {id:['a', 'qs0'], value:0, type:'a'}, {id:['a', 'qs1'], value:1, type:'a'} ]; db.put(store_name, objs).addCallback(function (value) { //console.log(db_name + ' ready'); }); var done, result; waitForCondition( // Condition function () { return done; }, // Continuation function () { assertArrayEquals('result', objs, result); ydn.db.deleteDatabase(db_name, db.getType()); db.close(); reachedFinalContinuation = true; }, 100, // interval 5000); // maxTimeout db.values(store_name).addBoth(function (value) { // console.log('fetch value: ' + JSON.stringify(value)); result = value; done = true; }); }; var test_40_nested_keyPath = function() { var store_name = 'ts1'; var db_name = 'test_key_40_4'; var store = new ydn.db.schema.Store(store_name, 'id.$t', false, ydn.db.schema.DataType.TEXT); var schema = new ydn.db.schema.Database(undefined, [store]); var db = new ydn.db.crud.Storage(db_name, schema, options); var key = 'a'; var put_done = false; var put_value = {value: Math.random()}; put_value.id = {$t: key}; var put_value_received; waitForCondition( // Condition function() { return put_done; }, // Continuation function() { assertEquals('put a 1', key, put_value_received); // Remember, the state of this boolean will be tested in tearDown(). }, 100, // interval 5000); // maxTimeout db.put(store_name, put_value).addCallback(function(value) { console.log('put: ' + value); put_value_received = value; put_done = true; }); var get_done; var get_value_received; waitForCondition( // Condition function() { return get_done; }, // Continuation function() { assertObjectEquals('get', put_value, get_value_received); reachedFinalContinuation = true; ydn.db.deleteDatabase(db_name, db.getType()); db.close(); }, 100, // interval 5000); // maxTimeout db.get(store_name, key).addCallback(function(value) { console.log('receiving get value callback ' + key + ' = ' + JSON.stringify(value) + ' ' + typeof value); get_value_received = value; get_done = true; }); }; var test_42_autoincreasement_offline = function () { var store_name = 'demoOS'; var db_name = 'test_42_26'; var schema = { stores: [ { name: store_name, autoIncrement: true }] }; var db = new ydn.db.crud.Storage(db_name, schema, options); var objs = [ {id:'qs0', value:0, type:'a'}, {id:'qs1', value:1, type:'a'}, {id:'at2', value:2, type:'b'}, {id:'bs1', value:3, type:'b'}, {id:'bs2', value:4, type:'c'}, {id:'bs3', value:5, type:'c'}, {id:'st3', value:6, type:'c'} ]; var done, result, put_done, put_result; waitForCondition( // Condition function () { return done; }, // Continuation function () { assertEquals('length', objs.length, result.length); assertArrayEquals('get back', objs, result); ydn.db.deleteDatabase(db_name, db.getType()); db.close(); reachedFinalContinuation = true; }, 100, // interval 5000); // maxTimeout waitForCondition( // Condition function () { return put_done; }, // Continuation function () { assertEquals('key length', objs.length, put_result.length); for (var i = 1; i < objs.length; i++) { assertEquals('auto increase at ' + i, put_result[i], put_result[i-1] + 1); } // retrieve back by those key db.values(store_name, put_result).addBoth(function (value) { //console.log('fetch value: ' + JSON.stringify(value)); result = value; done = true; }); }, 100, // interval 2000); // maxTimeout db.put(store_name, objs).addCallback(function (value) { //console.log(['receiving key from put', value]); put_done = true; put_result = value }); }; var test_43_autoincreasement_inline = function () { var store_name = 'demoOS'; var db_name = 'test_key_43_5'; var store_schema = new ydn.db.schema.Store(store_name, 'value', true, ydn.db.schema.DataType.INTEGER); var schema = new ydn.db.schema.Database(undefined, [store_schema]); var db = new ydn.db.crud.Storage(db_name, schema, options); var objs = [ {id:'qs0', value:0, type:'a'}, {id:'bs1', type:'b'}, {id:'bs2', value:4, type:'c'}, {id:'st3', type:'c'} ]; var done, result, put_done, keys; waitForCondition( // Condition function () { return done; }, // Continuation function () { assertEquals('length', objs.length, result.length); for (var i = 0; i < objs.length; i++) { assertEquals('obj ' + i, objs[i].id, result[i].id); } ydn.db.deleteDatabase(db_name, db.getType()); db.close(); reachedFinalContinuation = true; }, 100, // interval 5000); // maxTimeout waitForCondition( // Condition function () { return put_done; }, // Continuation function () { assertEquals('key length', objs.length, keys.length); for (var i = 0; i < keys.length; i++) { assertNotNullNorUndefined('at ' + i, keys[i]); if (goog.isDef(objs[i].value)) { assertEquals('at ' + i, objs[i].value, keys[i]); } } // retrieve back by those key db.values(store_name, keys).addBoth(function (value) { //console.log('fetch value: ' + JSON.stringify(value)); result = value; done = true; }); }, 100, // interval 5000); // maxTimeout // last two are given different value db.put(store_name, objs).addCallback(function (value) { //console.log(['receiving key from put', value]); keys = value; put_done = true; }).addErrback(function(e) { console.error(e); keys = []; put_done = true; }); }; var test_composite_primary_key = function () { var db_name = 'test_composite_primary_key'; var schema = { stores: [ { name: 'st', keyPath: ['id1', 'id2'] }] }; var db = new ydn.db.crud.Storage(db_name, schema, options); var done, result; waitForCondition( // Condition function() { return done; }, // Continuation function() { assertObjectEquals('get result', data, result); reachedFinalContinuation = true; ydn.db.deleteDatabase(db_name, db.getType()); db.close(); }, 100, // interval 1000); // maxTimeout var data = { id1: 'a', id2: 'b', value: 'm' + Math.random() }; db.put('st', data); db.get('st', ['a', 'b']).addBoth(function (x) { result = x; done = true; }); }; var testCase = new goog.testing.ContinuationTestCase(); testCase.autoDiscoverTests(); G_testRunner.initialize(testCase);