ydn.db
Version:
Javascript database library for IndexedDB, WebDatabase (WebSQL) and WebStorage (localStorage) storage mechanisms supporting version migration, advanced query and transaction workflow.
515 lines (420 loc) • 12.1 kB
JavaScript
goog.require('goog.debug.Console');
goog.require('goog.testing.PropertyReplacer');
goog.require('goog.testing.jsunit');
goog.require('ydn.async');
goog.require('ydn.db.crud.Storage');
goog.require('ydn.debug');
var reachedFinalContinuation, schema, debug_console, db, objs;
var table_name = 'st_inline';
var table_name_offline = 'st_offline';
var store_name_inline_number = 'st_inline_n';
var load_store_name = 'st_load';
var setUp = function() {
ydn.json.POLY_FILL = true;
// ydn.debug.log('ydn.db', 'finest');
// ydn.db.crud.req.WebSql.DEBUG = true;
// ydn.debug.log('ydn.db', 'finest');
// ydn.db.tr.Serial.DEBUG = true;
//ydn.db.crud.req.IndexedDb.DEBUG = true;
// ydn.db.con.IndexedDb.DEBUG = true;
};
var tearDown = function() {
assertTrue('The final continuation was not reached', reachedFinalContinuation);
};
var test_put_array = function() {
var db_name = 'test_131';
var schema = {
stores: [{
name: 'st',
keyPath: 'id'
}]
};
var db = new ydn.db.crud.Storage(db_name, schema, options);
var arr = [];
var n = ydn.db.crud.req.IndexedDb.REQ_PER_TX / 2;
for (var i = 0; i < n; i++) {
arr.push({id: i, value: 'a' + Math.random()});
}
var hasEventFired = false;
var results;
waitForCondition(
// Condition
function() { return hasEventFired; },
// Continuation
function() {
assertEquals('length', arr.length, results.length);
for (var i = 0; i < arr.length; i++) {
assertEquals('1', arr[i].id, results[i]);
}
reachedFinalContinuation = true;
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
},
100, // interval
2000); // maxTimeout
db.put('st', arr).addBoth(function(value) {
//console.log('receiving value callback.');
results = value;
hasEventFired = true;
});
};
var test_put_array_unique_constraint = function() {
var db_name = 'test_12_put_array_unique_constraint-4';
var schema = {
stores: [{
name: 'st',
keyPath: 'id',
indexes: [
{
keyPath: 'type',
unique: true,
type: 'INTEGER'
}]
}]
};
var data1 = [{
id: 1,
type: 1,
value: 'a'
}, {
id: 2,
type: 2,
value: 'b'
}];
var data2 = [{
id: 1, // void unique constraint
type: 3,
value: 'c'
}, {
id: 4,
type: 4,
value: 'd'
}];
// console.log(data);
var db = new ydn.db.crud.Storage(db_name, schema, options);
var hasEventFired = false;
var results1, results2, is_success;
waitForCondition(
// Condition
function() { return hasEventFired; },
// Continuation
function() {
assertEquals('correct length for results1', 2, results1.length);
assertEquals('correct length for results2', 2, results2.length);
assertArrayEquals('results1', [1, 2], results1);
assertEquals('results2 last', 4, results2[1]);
assertFalse('has error', is_success);
assertEquals('error record', 'ConstraintError', results2[0].name);
reachedFinalContinuation = true;
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
},
100, // interval
2000); // maxTimeout
db.clear('st');
db.add('st', data1).addCallbacks(function(x) {
// console.log(x);
results1 = x;
}, function(value) {
// console.log(value);
results1 = value;
});
db.add('st', data2).addCallbacks(function(x) {
// console.log(x);
is_success = true;
results2 = x;
hasEventFired = true;
}, function(value) {
// console.log(value);
is_success = false;
results2 = value;
hasEventFired = true;
});
};
var test_put_array_unique_index_constraint = function() {
// Chrome bug report
// https://code.google.com/p/chromium/issues/detail?id=258273
var db_name = 'test_12_put_array_unique_index_constraint-4';
var schema = {
stores: [{
name: 'st',
keyPath: 'id',
indexes: [
{
keyPath: 'type',
unique: true,
type: 'INTEGER'
}]
}]
};
var data1 = [{
id: 1,
type: 1,
value: 'a'
}, {
id: 2,
type: 2,
value: 'b'
}];
var data2 = [{
id: 3,
type: 1, // void unique constraint
value: 'c'
}, {
id: 4,
type: 4,
value: 'd'
}];
// console.log(data);
var db = new ydn.db.crud.Storage(db_name, schema, options);
var hasEventFired = false;
var results1, results2, keys, is_success;
waitForCondition(
// Condition
function() { return hasEventFired; },
// Continuation
function() {
db.getSchema(function(s) {
console.log(s);
});
assertEquals('correct length for results1', 2, results1.length);
assertEquals('correct length for results2', 2, results2.length);
assertArrayEquals('results1', [1, 2], results1);
assertFalse('has error', is_success);
assertArrayEquals('keys', [1, 2, 4], keys);
assertEquals('results2 last', 4, results2[1]);
assertEquals('error record', 'ConstraintError', results2[0].name);
reachedFinalContinuation = true;
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
},
100, // interval
2000); // maxTimeout
db.clear('st');
db.put('st', data1).addCallbacks(function(x) {
// console.log(x);
results1 = x;
}, function(value) {
// console.log(value);
results1 = value;
});
db.put('st', data2).addCallbacks(function(x) {
console.log(x);
is_success = true;
results2 = x;
}, function(value) {
console.log(value);
is_success = false;
results2 = value;
});
db.keys('st').addBoth(function(x) {
keys = x;
hasEventFired = true;
});
};
var _test_put_large_array = function() {
var db_name = 'test_crud_ 13_2';
var db = new ydn.db.crud.Storage(db_name, schema, options);
var arr = [];
var n = 1500;
for (var i = 0; i < n; i++) {
arr.push({id: i, value: 'a' + Math.random()});
}
var hasEventFired = false;
var results;
waitForCondition(
// Condition
function() { return hasEventFired; },
// Continuation
function() {
assertEquals('length', arr.length, results.length);
reachedFinalContinuation = true;
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
},
100, // interval
2000); // maxTimeout
db.put(table_name, arr).addBoth(function(value) {
console.log('receiving value callback.');
results = value;
hasEventFired = true;
});
};
var _test_get_large_array = function() {
var db_name = 'test_crud_23 _2';
var db = new ydn.db.crud.Storage(db_name, schema, options);
var arr = [];
var ids = [];
var n = 1500;
for (var i = 0; i < n; i++) {
ids[i] = i;
arr[i] = {id: i, value: 'a' + Math.random()};
}
var hasEventFired = false;
var results;
waitForCondition(
// Condition
function() { return hasEventFired; },
// Continuation
function() {
assertEquals('length', ids.length, results.length);
var cids = [0, 500, 1000, 1450];
for (var i = 0; i < cids.length; i++) {
var id = cids[i];
assertEquals('of ' + id, arr[id].value, results[id].value);
}
reachedFinalContinuation = true;
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
},
100, // interval
2000); // maxTimeout
db.put(table_name, arr);
db.values(table_name, ids).addBoth(function(value) {
//console.log('receiving value callback.');
results = value;
hasEventFired = true;
});
};
var test_get_all_no_data = function() {
var db_name = 'test_get_all_2';
var table_name = 'no_data_table';
var stores = [new ydn.db.schema.Store(table_name, 'id')];
var schema = new ydn.db.schema.Database(1, stores);
var db = new ydn.db.crud.Storage(db_name, schema, options);
var hasEventFired = false;
var put_value;
waitForCondition(
// Condition
function() { return hasEventFired; },
// Continuation
function() {
assertArrayEquals('get empty table', [], put_value);
// Remember, the state of this boolean will be tested in tearDown().
reachedFinalContinuation = true;
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
},
100, // interval
2000); // maxTimeout
db.values(table_name).addBoth(function(value) {
//console.log('receiving value callback.');
put_value = value;
hasEventFired = true;
});
};
var test_get_none_exist = function() {
var db_name = 'test_25_get_none_exist';
var db = new ydn.db.crud.Storage(db_name, schema, options);
var hasEventFired = false;
var put_value;
waitForCondition(
// Condition
function() { return hasEventFired; },
// Continuation
function() {
assertUndefined('retriving non existing value', put_value);
// Remember, the state of this boolean will be tested in tearDown().
reachedFinalContinuation = true;
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
},
100, // interval
2000); // maxTimeout
db.get(table_name, 'no_data').addBoth(function(value) {
// console.log(value);
put_value = value;
hasEventFired = true;
});
};
var test_array_key = function() {
var db_name = 'test_51_array_key_1';
var stores = [new ydn.db.schema.Store(table_name, 'id')];
var schema = new ydn.db.schema.Database(undefined, stores);
var db = new ydn.db.crud.Storage(db_name, schema, options);
var key = ['a', 'b'];
var key_value = 'a' + Math.random();
var a_done;
var a_value;
waitForCondition(
// Condition
function() {
return a_done;
},
// Continuation
function() {
assertArrayEquals('put a', key, a_value);
var b_done;
var b_value;
waitForCondition(
// Condition
function() {
return b_done;
},
// Continuation
function() {
assertEquals('get ' + JSON.stringify(key), key_value, b_value.value);
reachedFinalContinuation = true;
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
},
100, // interval
2000); // maxTimeout
db.get(table_name, key).addBoth(function(value) {
//console.log(db + ' receiving get value callback ' + key + ' = ' + value);
b_value = value;
b_done = true;
});
},
100, // interval
1000); // maxTimeout
db.put(table_name, {id: key, value: key_value}).addBoth(function(value) {
// console.log(db + ' receiving put value callback for ' + key + ' = ' + key_value);
a_value = value;
a_done = true;
});
};
var test_constrained_error = function() {
var db_name = 'test_constrained_error' + Math.random();
var schema = {
stores: [
{
name: 'st',
keyPath: 'id',
type: 'TEXT'
}]
};
var db = new ydn.db.crud.Storage(db_name, schema, options);
var obj = {id: 1, value: 'v' + Math.random()};
var done, result, result2;
waitForCondition(
// Condition
function() { return done; },
// Continuation
function() {
assertEquals('key', 1, result);
assertNotNullNorUndefined('is an error', result2);
if (options.mechanisms[0] == 'websql') {
assertEquals('is an ConstraintError', 6, result2.code);
} else {
assertEquals('is an ConstraintError', 'ConstraintError', result2.name);
}
reachedFinalContinuation = true;
ydn.db.deleteDatabase(db_name, db.getType());
db.close();
},
100, // interval
1000); // maxTimeout
db.add('st', obj).addBoth(function(k) {
result = k;
});
db.add('st', obj).addBoth(function(x) {
result2 = x;
done = true;
});
};
var tearDownPage = function() {
};
var testCase = new goog.testing.ContinuationTestCase();
testCase.autoDiscoverTests();
G_testRunner.initialize(testCase);