ydn.db
Version:
Javascript database library for IndexedDB, WebDatabase (WebSQL) and WebStorage (localStorage) storage mechanisms supporting version migration, advanced query and transaction workflow.
316 lines (245 loc) • 8.59 kB
JavaScript
goog.require('goog.debug.Console');
goog.require('goog.testing.jsunit');
goog.require('ydn.debug');
goog.require('ydn.async');
goog.require('ydn.db.crud.Storage');
goog.require('goog.testing.PropertyReplacer');
var reachedFinalContinuation, schema, debug_console, db, objs;
var db_name = 'test_crud_4';
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.debug.log('ydn.db', 'finest');
//ydn.db.con.IndexedDb.DEBUG = true;
//ydn.db.con.WebSql.DEBUG = true;
//ydn.db.crud.req.IndexedDb.DEBUG = true;
var indexes = [new ydn.db.schema.Index('tag', ydn.db.schema.DataType.TEXT)];
var stores = [new ydn.db.schema.Store(table_name, 'id'),
new ydn.db.schema.Store(store_name_inline_number, 'id', false, ydn.db.schema.DataType.NUMERIC, undefined, true),
new ydn.db.schema.Store(table_name_offline),
new ydn.db.schema.Store(load_store_name, 'id', false, ydn.db.schema.DataType.NUMERIC, indexes)
];
schema = new ydn.db.schema.Database(undefined, stores);
};
var tearDown = function() {
assertTrue('The final continuation was not reached', reachedFinalContinuation);
};
var test_created_event = function() {
var db = new ydn.db.crud.Storage(db_name, schema, options);
var hasEventFired = false;
var ev;
var key = Math.random();
var obj = {id: key, value: '1', remark: 'put test'};
waitForCondition(
// Condition
function() { return hasEventFired; },
// Continuation
function() {
assertNotNull(ev);
assertEquals('name', 'RecordEvent', ev.name);
assertEquals('type', 'created', ev.type);
assertEquals('store name', store_name_inline_number, ev.store_name);
assertEquals('key', key, ev.key);
assertEquals('value', obj, ev.value);
// Remember, the state of this boolean will be tested in tearDown().
reachedFinalContinuation = true;
},
100, // interval
3000); // maxTimeout
db.addEventListener('created', function(e) {
ev = e;
hasEventFired = true;
});
db.add(store_name_inline_number, obj);
};
var test_store_created_event = function() {
var db = new ydn.db.crud.Storage(db_name, schema, options);
var hasEventFired = false;
var ev;
var keys = [Math.ceil(Math.random() * 100000),
Math.ceil(Math.random() * 100000)];
var obj = [
{name: "rand key 1", id: keys[0]},
{name: "rand key 2", id: keys[1]}
];
waitForCondition(
// Condition
function() { return hasEventFired; },
// Continuation
function() {
assertNotNull(ev);
assertEquals('name', 'StoreEvent', ev.name);
assertEquals('type', 'created', ev.type);
assertEquals('store name', store_name_inline_number, ev.store_name);
assertArrayEquals('key', keys, ev.keys);
assertArrayEquals('value', obj, ev.values);
// Remember, the state of this boolean will be tested in tearDown().
reachedFinalContinuation = true;
},
100, // interval
3000); // maxTimeout
db.addEventListener('created', function(e) {
ev = e;
hasEventFired = true;
});
db.add(store_name_inline_number, obj);
};
var test_updated_event = function() {
var db = new ydn.db.crud.Storage(db_name, schema, options);
var hasEventFired = false;
var ev;
var key = Math.random();
var obj = {id: key, value: '1', remark: 'put test'};
waitForCondition(
// Condition
function() { return hasEventFired; },
// Continuation
function() {
assertNotNull(ev);
assertEquals('name', 'RecordEvent', ev.name);
assertEquals('type', 'updated', ev.type);
assertEquals('store name', store_name_inline_number, ev.store_name);
assertEquals('key', key, ev.key);
assertEquals('value', obj, ev.value);
// Remember, the state of this boolean will be tested in tearDown().
reachedFinalContinuation = true;
},
100, // interval
3000); // maxTimeout
db.addEventListener('updated', function(e) {
ev = e;
hasEventFired = true;
});
db.put(store_name_inline_number, obj);
};
var test_updated_store_event = function() {
var db = new ydn.db.crud.Storage(db_name, schema, options);
var hasEventFired = false;
var ev;
var objs = [{id: 1, value: '1', remark: 'put test'}, {id: 2, value: '2', remark: 'put test'}];
var keys = [1, 2];
waitForCondition(
// Condition
function() { return hasEventFired; },
// Continuation
function() {
assertNotNull(ev);
assertEquals('name', 'StoreEvent', ev.name);
assertEquals('type', 'updated', ev.type);
assertEquals('store name', store_name_inline_number, ev.store_name);
assertArrayEquals('key', keys, ev.keys);
assertArrayEquals('value', objs, ev.values);
// Remember, the state of this boolean will be tested in tearDown().
reachedFinalContinuation = true;
},
100, // interval
3000); // maxTimeout
db.addEventListener('updated', function(e) {
ev = e;
hasEventFired = true;
});
db.put(store_name_inline_number, objs);
};
var test_deleted_event = function() {
var db = new ydn.db.crud.Storage(db_name, schema, options);
var ev_count = 0;
var store_event, record_event;
var objs = [{id: 1, value: '1', remark: 'put test'}, {id: 2, value: '2', remark: 'put test'}];
var keys = [1, 2];
waitForCondition(
// Condition
function() { return ev_count == 2; },
// Continuation
function() {
assertNotNull(store_event);
assertNotNull(record_event);
assertEquals('name', 'RecordEvent', record_event.name);
assertEquals('type', 'deleted', record_event.type);
assertEquals('store name', store_name_inline_number, record_event.store_name);
assertEquals('key', keys[0], record_event.key);
assertUndefined('value', record_event.value);
assertEquals('name', 'StoreEvent', store_event.name);
assertEquals('type', 'deleted', store_event.type);
assertEquals('store name', store_name_inline_number, store_event.store_name);
assertUndefined('key', store_event.key);
assertUndefined('value', store_event.value);
// Remember, the state of this boolean will be tested in tearDown().
reachedFinalContinuation = true;
},
100, // interval
3000); // maxTimeout
db.addEventListener('deleted', function(e) {
// console.log(e);
if (e.name == 'StoreEvent') {
store_event = e;
} else {
record_event = e;
}
ev_count++;
});
db.put(store_name_inline_number, objs).addCallback(function() {
db.remove(store_name_inline_number, keys[0]);
db.remove(store_name_inline_number, ydn.db.KeyRange.lowerBound(-1));
});
};
var test_run = function() {
var db = new ydn.db.crud.Storage(db_name, schema, options);
var done = false;
var result;
var objs = [{id: 1, value: '1', remark: 'put test'}, {id: 2, value: '2', remark: 'put test'}];
var keys = [1, 2];
waitForCondition(
// Condition
function() { return done; },
// Continuation
function() {
assertArrayEquals('put', keys, result);
reachedFinalContinuation = true;
},
100, // interval
2000); // maxTimeout
db.run(function (tdb) {
tdb.put(store_name_inline_number, objs).addBoth(function(x) {
result = x;
});
}, [store_name_inline_number], 'readwrite').addBoth(function() {
done = true;
});
};
var test_store_event = function() {
var db_name_event = 'test_tb' + Math.random();
var schema = {
stores: [{
name: 'st'
}
]};
var done1 = false;
var result;
waitForCondition(
// Condition
function() { return done1; },
// Continuation
function() {
assertEquals('event name', 'ReadyEvent', result.name);
assertEquals('event type', 'ready', result.type);
assertEquals('version number', 1, result.getVersion());
assertNaN('old version number', result.getOldVersion());
reachedFinalContinuation = true;
ydn.db.deleteDatabase(db.getName(), db.getType());
db.close();
},
100, // interval
2000); // maxTimeout
var db = new ydn.db.crud.Storage(db_name_event, schema);
db.addEventListener('ready', function (e) {
//console.log(e);
assertFalse('1. already called ready event', done1);
result = e;
done1 = true;
});
};
var testCase = new goog.testing.ContinuationTestCase();
testCase.autoDiscoverTests();
G_testRunner.initialize(testCase);