ydn.db
Version:
Javascript database library for IndexedDB, WebDatabase (WebSQL) and WebStorage (localStorage) storage mechanisms supporting version migration, advanced query and transaction workflow.
507 lines (413 loc) • 12.5 kB
JavaScript
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_01_encode_key = function () {
var test_key = function (key, type) {
var encoded = ydn.db.schema.Index.js2sql(key, type);
var decoded = ydn.db.schema.Index.sql2js(encoded, type);
if (goog.isArray(key)) {
assertArrayEquals(type + ':' + JSON.stringify(key), key, decoded);
} else {
assertEquals(type + ':' + JSON.stringify(key), key, decoded);
}
};
test_key(0, ydn.db.schema.DataType.NUMERIC);
test_key(1, ydn.db.schema.DataType.NUMERIC);
test_key(0);
test_key(1);
test_key('abc', ydn.db.schema.DataType.TEXT);
test_key('abc');
test_key(['a', 'b'], ['TEXT', 'TEXT']);
test_key(['a', 'b']);
reachedFinalContinuation = true;
};
var _test_02_encode_blob = function () {
var test_key = function (key, type) {
var encoded = ydn.db.schema.Index.js2sql(key, type);
var decoded = ydn.db.schema.Index.sql2js(encoded, type);
if (goog.isArray(key)) {
assertArrayEquals(type + ':' + JSON.stringify(key), key, decoded);
} else {
//console.log(key);
//console.log(decoded);
assertEquals(type + ':' + JSON.stringify(key), key, decoded);
}
};
var done;
waitForCondition(
// Condition
function () {
return done;
},
// Continuation
function () {
reachedFinalContinuation = true;
},
100, // interval
5000); // maxTimeout
var url = 'http://upload.wikimedia.org/wikipedia/commons/6/6e/HTML5-logo.svg';
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.responseType = "blob";
xhr.addEventListener("load", function () {
if (xhr.status === 200) {
//console.log("Image retrieved");
var blob = xhr.response;
test_key(blob, ydn.db.schema.DataType.BLOB);
done = true;
}
}, false);
xhr.send();
};
/**
*/
var test_11_string_keys = function() {
// ydn.debug.log('ydn.db.crud.req', 'finest');
var db_name = 'test_11_string_keys';
var basic_schema = getBasicSchema();
var db = new ydn.db.crud.Storage(db_name, basic_schema, options);
var on_completed = function() {
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
reachedFinalContinuation = true;
};
key_test(db, 'x');
//key_test(new Date()); // Date is allow key
key_test(db, 't@som.com');
key_test(db, 'http://www.ok.com');
key_test(db, 'http://www.ok.com/?id=123#ok');
key_test(db, 'ID: /*!32302 10*/');
key_test(db, 'x;" DROP TABLE ' + string_table, string_table, on_completed);
};
var test_12_number_keys = function() {
var db_name = 'test_key_12_3';
var basic_schema = getBasicSchema();
var db = new ydn.db.crud.Storage(db_name, basic_schema, options);
var on_completed = function() {
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
reachedFinalContinuation = true;
};
key_test(db, 1, number_table);
key_test(db, 0, number_table);
key_test(db, -1, number_table);
key_test(db, Math.random(), number_table);
key_test(db, -Math.random(), number_table);
key_test(db, 1.0, number_table, on_completed);
};
var test_21_out_of_line = function () {
var db_name = 'test_21_out_of_line';
var basic_schema = getBasicSchema();
var db = new ydn.db.crud.Storage(db_name, basic_schema, options);
var key = Math.random();
var data = {test: 'some random ' + Math.random(), type: Math.random()};
var done, result, put_done, put_result;
waitForCondition(
// Condition
function () {
return done;
},
// Continuation
function () {
assertEquals('value', data.test, result.test);
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', key, put_result);
// retrieve back by those key
db.get(out_of_line_store, put_result).addBoth(function (value) {
console.log('fetch value: ' + JSON.stringify(value));
result = value;
done = true;
});
},
100, // interval
5000); // maxTimeout
db.put(out_of_line_store, data, key).addCallback(function (value) {
//console.log(['receiving key from put', value]);
put_done = true;
put_result = value
});
};
var test_22_out_of_line_array = function () {
var store_name = 'demoOS';
var db_name = 'test_22_2';
var store_schema = new ydn.db.schema.Store(store_name, undefined, false);
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:'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 keys = objs.map(function(x) {return x.id});
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);
assertArrayEquals('get back the keys', keys, put_result);
// 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
5000); // maxTimeout
db.put(store_name, objs, keys).addCallback(function (value) {
//console.log(['receiving key from put', value]);
put_done = true;
put_result = value
});
};
var test_51_autoschema_out_of_line_key = function () {
var db_name = 'test_51_no_type_key_1';
var db = new ydn.db.crud.Storage(db_name);
var key = Math.random();
var data = {test: 'some random ' + Math.random(), type: Math.random()};
var done, result, put_done, put_result;
waitForCondition(
// Condition
function () {
return put_done;
},
// Continuation
function () {
assertEquals('key', key, put_result);
// retrieve back by those key
waitForCondition(
// Condition
function () {
return done;
},
// Continuation
function () {
assertEquals('value', data.test, result.test);
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
reachedFinalContinuation = true;
},
100, // interval
5000); // maxTimeout
db.get(out_of_line_store, key).addBoth(function (value) {
//console.log('fetch value: ' + JSON.stringify(value));
result = value;
done = true;
});
},
100, // interval
5000); // maxTimeout
db.put(out_of_line_store, data, key).addCallback(function (value) {
//console.log(['receiving key from put', value]);
put_done = true;
put_result = value
});
};
var test_52_autoschema_in_line_key = function () {
var db_name = 'test_52_autoschema_in_line_key_1';
var db = new ydn.db.crud.Storage(db_name);
var key = Math.random();
var store = {name: 'st', keyPath: 'id'};
var data = {id: key, test: 'some random ' + Math.random(), type: Math.random()};
var done, result, put_done, put_result;
waitForCondition(
// Condition
function () {
return put_done;
},
// Continuation
function () {
assertEquals('key', key, put_result);
// retrieve back by those key
waitForCondition(
// Condition
function () {
return done;
},
// Continuation
function () {
assertEquals('value', data.test, result.test);
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
reachedFinalContinuation = true;
},
100, // interval
5000); // maxTimeout
db.get('st', key).addBoth(function (value) {
console.log('fetch value: ' + JSON.stringify(value));
result = value;
done = true;
});
},
100, // interval
5000); // maxTimeout
db.put(store, data).addCallback(function (value) {
//console.log(['receiving key from put', value]);
put_done = true;
put_result = value
});
};
var test_index_generator = function() {
var db_name = 'test_index_generator-1';
var schema = {
stores: [
{
name: 'st',
keyPath: 'id',
indexes: [
{
name: 'lowerName',
generator: function(obj) {
return obj.name.toLowerCase();
}
}]
}]
};
var db = new ydn.db.crud.Storage(db_name, schema, options);
var done, result;
waitForCondition(
// Condition
function() { return done; },
// Continuation
function() {
assertObjectEquals('get result', [3, 2, 1], result);
reachedFinalContinuation = true;
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
},
100, // interval
1000); // maxTimeout
var data = [
{
name: 'fa',
id: 1,
value: 'm' + Math.random()
},
{
name: 'Da',
id: 2,
value: 'm' + Math.random()
},
{
name: 'ba',
id: 3,
value: 'm' + Math.random()
}
];
db.clear('st');
db.put('st', data);
db.keys('st', 'lowerName').addBoth(function (x) {
result = x;
done = true;
});
};
var testCase = new goog.testing.ContinuationTestCase();
testCase.autoDiscoverTests();
G_testRunner.initialize(testCase);