/closureCompiler/trunk/closure/goog/gears/database_test.html
https://github.com/johnjbarton/JavaScriptLibraries · HTML · 699 lines · 597 code · 94 blank · 8 comment · 0 complexity · b84423d14bec0e06de9a51bd261faf52 MD5 · raw file
- <!DOCTYPE html>
- <html>
- <!--
- Copyright 2007 The Closure Library Authors. All Rights Reserved.
- Use of this source code is governed by the Apache License, Version 2.0.
- See the COPYING file for details.
- -->
- <!--
- -->
- <head>
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <title>Closure Unit Tests - goog.gears.Database</title>
- <script src="../base.js"></script>
- <script>
- goog.require('goog.gears.Database');
- goog.require('goog.testing.jsunit');
- </script>
- </head>
- <body>
- <script>
- function isGearsAllowed() {
- return goog.gears.hasFactory() && goog.gears.getFactory().hasPermission;
- }
- var database;
- function setUpPage() {
- if (isGearsAllowed()) {
- try {
- database = new goog.gears.Database('tester', 'database-test');
- } catch (e) {
- debug('Could not create the database');
- }
- }
- setUpPageStatus = 'complete'; // jsunit magic
- }
- function setUp() {
- if (!database) {
- return;
- }
- database.execute('DROP TABLE IF EXISTS Test');
- database.execute('CREATE TABLE IF NOT EXISTS Test (x TEXT, y TEXT)');
- database.execute('INSERT INTO Test VALUES (?, ?)', 'a', 'alpha');
- database.execute('INSERT INTO Test VALUES (?, ?)', 'b', 'beta');
- database.execute('INSERT INTO Test VALUES (?, ?)', 'g', 'gamma');
- }
- function tearDown() {
- if (database) {
- goog.events.removeAll(database);
- // Rollback to clean up transaction state.
- while (database.isInTransaction()) {
- database.rollback();
- }
- }
- }
- function testCreateDatabase() {
- if (!database) {
- return;
- }
- assertNotNull('Could not create the database', database);
- }
- function testCreateTable() {
- if (!database) {
- return;
- }
- var created = database.queryValue('SELECT 1 FROM SQLITE_MASTER ' +
- 'WHERE TYPE=? AND NAME=?',
- 'table',
- 'Test') != null;
- assertTrue('Test table could not be created', created);
- assertEquals('Wrong number of rows after more insertions', 3,
- database.queryValue('SELECT COUNT(*) FROM Test'));
- }
- function testQueryValue() {
- if (!database) {
- return;
- }
- // testing retrieving a single value
- var val = database.queryValue('SELECT y FROM Test WHERE x=?', 'b');
- assertEquals('Wrong value returned by query', 'beta', val);
- // testing a query that returns nothing
- val = database.queryValue('SELECT y FROM Test WHERE x=?', 'd');
- assertNull('Should not have returned a value for the query', val);
- // testing that the query returns the first row of the query
- val = database.queryValue('SELECT y FROM Test');
- assertEquals('Wrong value returned by query', 'alpha', val);
- // testing that the query returns the first element of the row of the query
- val = database.queryValue('SELECT * FROM Test');
- assertEquals('Wrong value returned by query', 'a', val);
- // And the same with an array.
- // testing retrieving a single value
- val = database.queryValue('SELECT y FROM Test WHERE x=?', ['b']);
- assertEquals('Wrong value returned by query', 'beta', val);
- // testing a query that returns nothing
- val = database.queryValue('SELECT y FROM Test WHERE x=?', ['d']);
- assertNull('Should not have returned a value for the query', val);
- }
- function testQueryObject() {
- if (!database) {
- return;
- }
- // testing that the query returns the correct object
- var obj = database.queryObject('SELECT * FROM Test WHERE x=?', 'b');
- assertNotNull('Should have returned a value for the query', obj);
- assertEquals('Wrong value returned by query', 'b', obj['x']);
- assertEquals('Wrong value returned by query', 'beta', obj['y']);
- // testing that the query returns null when there is no match
- obj = database.queryValue('SELECT * FROM Test WHERE x=?', 'd');
- assertNull('Should not have returned a value for the query', obj);
- // testing that the query returns the first row when there are multiple
- // rows returned.
- obj = database.queryObject('SELECT * FROM Test');
- assertNotNull('Should have returned a value for the query', obj);
- assertEquals('Wrong value returned by query', 'a', obj['x']);
- assertEquals('Wrong value returned by query', 'alpha', obj['y']);
- // And the same with an array.
- // testing that the query returns the correct object
- obj = database.queryObject('SELECT * FROM Test WHERE x=?', ['b']);
- assertNotNull('Should have returned a value for the query', obj);
- assertEquals('Wrong value returned by query', 'b', obj['x']);
- assertEquals('Wrong value returned by query', 'beta', obj['y']);
- // testing that the query returns null when there is no match
- obj = database.queryValue('SELECT * FROM Test WHERE x=?', ['d']);
- assertNull('Should not have returned a value for the query', obj);
- }
- function testQueryValueArray() {
- if (!database) {
- return;
- }
- // testing selecting returning of multiple single values
- var arr = database.queryValueArray('SELECT y FROM Test');
- assertNotNull('Should have returned a value for the query', arr);
- assertEquals('Wrong value returned by query', 3, arr.length);
- assertEquals('Wrong value returned by query', 'alpha', arr[0]);
- assertEquals('Wrong value returned by query', 'beta', arr[1]);
- assertEquals('Wrong value returned by query', 'gamma', arr[2]);
- // testing selecting returning of multiple single values when there
- // are no matches.
- arr = database.queryValueArray('SELECT y FROM Test WHERE x=?', 'd');
- assertNotNull('Should have returned a value for the query', arr);
- assertEquals('Wrong value returned by query', 0, arr.length);
- // testing selecting returning of multiple single values even when
- // selecting multiple columns - should return the first column
- arr = database.queryValueArray('SELECT * FROM Test');
- assertNotNull('Should have returned a value for the query', arr);
- assertEquals('Wrong value returned by query', 3, arr.length);
- assertEquals('Wrong value returned by query', 'a', arr[0]);
- assertEquals('Wrong value returned by query', 'b', arr[1]);
- assertEquals('Wrong value returned by query', 'g', arr[2]);
- // And the same with an array.
- // testing selecting returning of multiple single values when there
- // are no matches.
- arr = database.queryValueArray('SELECT y FROM Test WHERE x=?', ['d']);
- assertNotNull('Should have returned a value for the query', arr);
- assertEquals('Wrong value returned by query', 0, arr.length);
- }
- function testQueryObjectArray() {
- if (!database) {
- return;
- }
- // testing selecting returning of array of objects
- var arr = database.queryObjectArray('SELECT * FROM Test');
- assertNotNull('Should have returned a value for the query', arr);
- assertEquals('Wrong value returned by query', 3, arr.length);
- assertEquals('Wrong value returned by query', 'a', arr[0]['x']);
- assertEquals('Wrong value returned by query', 'alpha', arr[0]['y']);
- assertEquals('Wrong value returned by query', 'b', arr[1]['x']);
- assertEquals('Wrong value returned by query', 'beta', arr[1]['y']);
- assertEquals('Wrong value returned by query', 'g', arr[2]['x']);
- assertEquals('Wrong value returned by query', 'gamma', arr[2]['y']);
- // testing selecting returning of multiple objects when there
- // are no matches.
- arr = database.queryObjectArray('SELECT y FROM Test WHERE x=?', 'd');
- assertNotNull('Should have returned a value for the query', arr);
- assertEquals('Wrong value returned by query', 0, arr.length);
- // And the same with an array.
- // testing selecting returning of multiple objects when there
- // are no matches.
- arr = database.queryObjectArray('SELECT y FROM Test WHERE x=?', ['d']);
- assertNotNull('Should have returned a value for the query', arr);
- assertEquals('Wrong value returned by query', 0, arr.length);
- }
- function testQueryToArrays() {
- if (!database) {
- return;
- }
- // testing selecting returning of array of arrays
- var arr = database.queryArrays('SELECT * FROM Test');
- assertNotNull('Should have returned a value for the query', arr);
- assertEquals('Wrong value returned by query', 3, arr.length);
- assertEquals('Wrong value returned by query', 'a', arr[0][0]);
- assertEquals('Wrong value returned by query', 'alpha', arr[0][1]);
- assertEquals('Wrong value returned by query', 'b', arr[1][0]);
- assertEquals('Wrong value returned by query', 'beta', arr[1][1]);
- assertEquals('Wrong value returned by query', 'g', arr[2][0]);
- assertEquals('Wrong value returned by query', 'gamma', arr[2][1]);
- arr = database.queryArrays('SELECT * FROM Test WHERE x=?', 'd');
- assertNotNull('Should have returned a value for the query', arr);
- assertEquals('Wrong value returned by query', 0, arr.length);
- // And the same with an array.
- arr = database.queryArrays('SELECT * FROM Test WHERE x=?', ['d']);
- assertNotNull('Should have returned a value for the query', arr);
- assertEquals('Wrong value returned by query', 0, arr.length);
- }
- function testForEachValue() {
- if (!database) {
- return;
- }
- // testing the foreach value when there are matching values
- var vals = [];
- database.forEachValue('SELECT * FROM Test',
- function(val, row, col, name) {
- vals.push({val: val, row: row, col: col, name: name});
- return true;
- },
- null);
- assertEquals('Wrong value returned by query', 6, vals.length);
- assertEquals('Wrong value returned by query', 'a', vals[0].val);
- assertEquals('Wrong value returned by query', 0, vals[0].row);
- assertEquals('Wrong value returned by query', 0, vals[0].col);
- assertEquals('Wrong value returned by query', 'x', vals[0].name);
- assertEquals('Wrong value returned by query', 'alpha', vals[1].val);
- assertEquals('Wrong value returned by query', 0, vals[1].row);
- assertEquals('Wrong value returned by query', 1, vals[1].col);
- assertEquals('Wrong value returned by query', 'y', vals[1].name);
- assertEquals('Wrong value returned by query', 'b', vals[2].val);
- assertEquals('Wrong value returned by query', 1, vals[2].row);
- assertEquals('Wrong value returned by query', 0, vals[2].col);
- assertEquals('Wrong value returned by query', 'x', vals[2].name);
- assertEquals('Wrong value returned by query', 'beta', vals[3].val);
- assertEquals('Wrong value returned by query', 1, vals[3].row);
- assertEquals('Wrong value returned by query', 1, vals[3].col);
- assertEquals('Wrong value returned by query', 'y', vals[3].name);
- assertEquals('Wrong value returned by query', 'g', vals[4].val);
- assertEquals('Wrong value returned by query', 2, vals[4].row);
- assertEquals('Wrong value returned by query', 0, vals[4].col);
- assertEquals('Wrong value returned by query', 'x', vals[4].name);
- assertEquals('Wrong value returned by query', 'gamma', vals[5].val);
- assertEquals('Wrong value returned by query', 2, vals[5].row);
- assertEquals('Wrong value returned by query', 1, vals[5].col);
- assertEquals('Wrong value returned by query', 'y', vals[5].name);
- vals = [];
- database.forEachValue('SELECT * FROM Test WHERE x=?',
- function(val, row, col, name) {
- vals.push({val: val, row: row, col: col, name: name});
- },
- null,
- 'd');
- assertEquals('Wrong value returned by query', 0, vals.length);
- // And the same with an array.
- vals = [];
- database.forEachValue('SELECT * FROM Test WHERE x=?',
- function(val, row, col, name) {
- vals.push({val: val, row: row, col: col, name: name});
- },
- null,
- ['d']);
- assertEquals('Wrong value returned by query', 0, vals.length);
- }
- function testForEachRow() {
- if (!database) {
- return;
- }
- var vals = [];
- database.forEachRow('SELECT * FROM Test',
- function(arr, row) {
- vals.push({arr: arr, row: row});
- return true;
- },
- null);
- assertEquals('Wrong value returned by query', 3, vals.length);
- assertEquals('Wrong value returned by query', 'a', vals[0].arr[0]);
- assertEquals('Wrong value returned by query', 'alpha', vals[0].arr[1]);
- assertEquals('Wrong value returned by query', 0, vals[0].row);
- assertEquals('Wrong value returned by query', 'b', vals[1].arr[0]);
- assertEquals('Wrong value returned by query', 'beta', vals[1].arr[1]);
- assertEquals('Wrong value returned by query', 1, vals[1].row);
- assertEquals('Wrong value returned by query', 'g', vals[2].arr[0]);
- assertEquals('Wrong value returned by query', 'gamma', vals[2].arr[1]);
- assertEquals('Wrong value returned by query', 2, vals[2].row);
- vals = [];
- database.forEachRow('SELECT * FROM Test WHERE x=?',
- function(arr, row) {
- vals.push({arr: arr, row: row});
- return true;
- },
- null,
- 'd');
- assertEquals('Wrong value returned by query', 0, vals.length);
- // And the same with an array.
- vals = [];
- database.forEachRow('SELECT * FROM Test WHERE x=?',
- function(arr, row) {
- vals.push({arr: arr, row: row});
- return true;
- },
- null,
- ['d']);
- assertEquals('Wrong value returned by query', 0, vals.length);
- }
- function testMultipleBegins() {
- if (!database) {
- return;
- }
- var db1;
- var db2;
- try {
- db1 = new goog.gears.Database('tester', 'database-test');
- db2 = new goog.gears.Database('tester', 'database-test');
- } catch (e) {
- fail('Could not create the databases');
- }
- db1.begin();
- try {
- // This should time out as being locked.
- db2.begin();
- fail('Should not have been able to get past second begin transaction.');
- } catch (e) {
- assertFalse(
- 'Second begin should have failed, but claims to be in a transaction.',
- db2.isInTransaction());
- assertTrue(
- 'Second begin not reported as being locked',
- goog.gears.Database.isLockedException(e));
- }
- db1.commit();
- db2.begin();
- assertTrue('New second begin failed', db2.isInTransaction());
- db2.commit();
- };
- function testIsLockedExceptionMessage() {
- if (!database) {
- return;
- }
- var lockedExStr = 'Database operation failed. ERROR: database is locked ' +
- 'DETAILS: database is locked';
- assertTrue(goog.gears.Database.isLockedException(lockedExStr));
- assertFalse(goog.gears.Database.isLockedException(
- 'Database operation failed. ERROR: invalid SQL operation'));
- assertTrue(goog.gears.Database.isLockedException(Error(lockedExStr)));
- }
- function testNestedBegins() {
- if (!database) {
- return;
- }
- // Try normal nested begins.
- database.begin();
- try {
- database.begin();
- database.commit();
- database.commit();
- } catch (e) {
- fail('Could not run nested transactions');
- }
- // Now try nested begins with lower begin levels
- database.begin();
- try {
- database.beginDeferred();
- database.commit();
- database.commit();
- } catch (e) {
- fail('Could not run nested transactions');
- }
- // Now try begins with increasing begin levels. This should throw
- // an error.
- database.beginDeferred();
- try {
- database.beginImmediate();
- fail('Could not run nested transactions');
- database.commit();
- database.commit();
- } catch (e) {
- database.rollback(e);
- }
- }
- function testCommit() {
- if (!database) {
- return;
- }
- var db;
- try {
- db = new goog.gears.Database('tester', 'database-test');
- } catch (e) {
- debug('Could not create the database');
- }
- var committed = false;
- var rollbacked = false;
- database.begin();
- goog.events.listen(database, 'commit', function(e) {committed = true;});
- goog.events.listen(database, 'rollback', function(e) {rollbacked = true;});
- assertTrue('Incorrect reporting of being in a transaction',
- database.isInTransaction());
- database.execute('INSERT INTO Test VALUES(?, ?)', 'o', 'omega');
- var cnt = database.queryValue('SELECT COUNT(*) FROM Test');
- assertEquals('Found wrong number of rows', 4, cnt);
- cnt = db.queryValue('SELECT COUNT(*) FROM Test');
- assertEquals('Found wrong number of rows', 3, cnt);
- database.commit();
- cnt = db.queryValue('SELECT COUNT(*) FROM Test');
- assertEquals('Found wrong number of rows', 4, cnt);
- assertFalse('Incorrect reporting of being in a transaction',
- database.isInTransaction());
- assertTrue('Commit event not dispatched', committed);
- assertFalse('Rollback event wrongly dispatched', rollbacked);
- }
- function testCommit2() {
- if (!database) {
- return;
- }
- var db;
- try {
- db = new goog.gears.Database('tester', 'database-test');
- } catch (e) {
- debug('Could not create the database');
- }
- var committed = false;
- var rollbacked = false;
- database.begin();
- goog.events.listen(database, 'commit', function(e) {committed = true;});
- goog.events.listen(database, 'rollback', function(e) {rollbacked = true;});
- database.execute('INSERT INTO Test VALUES(?, ?)', 's', 'sigma');
- assertTrue('Incorrect reporting of being in a transaction',
- database.isInTransaction());
- database.begin();
- assertTrue('Incorrect reporting of being in a transaction',
- database.isInTransaction());
- database.execute('INSERT INTO Test VALUES(?, ?)', 's', 'sigma');
- database.commit();
- assertFalse('Commit event wrongly dispatched', committed);
- assertFalse('Rollback event wrongly dispatched', rollbacked);
- assertTrue('Incorrect reporting of being in a transaction',
- database.isInTransaction());
- // the values should not be committed at this point.
- cnt = database.queryValue('SELECT COUNT(*) FROM Test');
- assertEquals('Found wrong number of rows', 5, cnt);
- cnt = db.queryValue('SELECT COUNT(*) FROM Test');
- assertEquals('Found wrong number of rows', 3, cnt);
- database.commit();
- cnt = db.queryValue('SELECT COUNT(*) FROM Test');
- assertEquals('Found wrong number of rows', 5, cnt);
- assertFalse('Incorrect reporting of being in a transaction',
- database.isInTransaction());
- assertTrue('Commit function not called', committed);
- assertFalse('Rollback function wrongly called', rollbacked);
- }
- function testRollback() {
- if (!database) {
- return;
- }
- var begun = false;
- var committed = false;
- var rollbacked = false;
- goog.events.listen(database, 'begin', function(e) {begun = true;});
- database.begin();
- assertTrue('Begin event not dispatched', begun);
- goog.events.listen(database, 'commit', function(e) {committed = true;});
- goog.events.listen(database, 'rollback', function(e) {rollbacked = true;});
- database.execute('INSERT INTO Test VALUES(?, ?)', 'o', 'omega');
- var cnt = database.queryValue('SELECT COUNT(*) FROM Test');
- assertEquals('Found wrong number of rows', 4, cnt);
- database.rollback();
- cnt = database.queryValue('SELECT COUNT(*) FROM Test');
- assertEquals('Found wrong number of rows', 3, cnt);
- assertFalse('Incorrect reporting of being in a transaction',
- database.isInTransaction());
- assertFalse('Commit event wrongly dispatched', committed);
- assertTrue('Rollback event not dispatched', rollbacked);
- }
- function testRollback2() {
- if (!database) {
- return;
- }
- var begun = false;
- var committed = false;
- var rollbacked = false;
- database.begin();
- goog.events.listen(database, 'commit', function(e) {committed = true;});
- goog.events.listen(database, 'rollback', function(e) {rollbacked = true;});
- database.execute('INSERT INTO Test VALUES(?, ?)', 's', 'sigma');
- database.begin();
- database.execute('INSERT INTO Test VALUES(?, ?)', 's', 'sigma');
- database.rollback();
- // the values should not be rolledback at this point.
- cnt = database.queryValue('SELECT COUNT(*) FROM Test');
- assertEquals('Found wrong number of rows', 5, cnt);
- assertFalse('Commit event wrongly dispatched', committed);
- assertFalse('Rollback event wrongly dispatched', rollbacked);
- database.rollback();
- cnt = database.queryValue('SELECT COUNT(*) FROM Test');
- assertEquals('Found wrong number of rows', 3, cnt);
- assertFalse('Incorrect reporting of being in a transaction',
- database.isInTransaction());
- assertFalse('Commit event wrongly dispatched', committed);
- assertTrue('Rollback event not dispatched', rollbacked);
- }
- function testPreventDefault() {
- if (!database) {
- return;
- }
- var committed = false;
- database.begin();
- goog.events.listen(database, 'beforecommit', function(e) {
- e.preventDefault();
- });
- goog.events.listen(database, 'commit', function(e) {committed = true;});
- database.execute('INSERT INTO Test VALUES(?, ?)', 'd', 'delta');
- database.commit();
- assertFalse('Commit ignored beforecommit preventDefault()', committed);
- database.rollback();
- }
- function testPreventDefault2() {
- if (!database) {
- return;
- }
- var rollbacked = false;
- database.begin();
- goog.events.listen(database, 'beforerollback', function(e) {
- e.preventDefault();
- });
- goog.events.listen(database, 'rollback', function(e) {
- rollbacked = true;
- });
- database.execute('INSERT INTO Test VALUES(?, ?)', 'd', 'delta');
- database.rollback();
- assertFalse('Rollback ignored beforerollback preventDefault()', rollbacked);
- goog.events.removeAll(database);
- database.rollback();
- }
- function testLastInsertId() {
- if (!database) {
- return;
- }
- database.execute('INSERT INTO Test VALUES (?, ?)', 'a', 'alpha');
- var id = database.getLastInsertRowId();
- database.execute('INSERT INTO Test VALUES (?, ?)', 'b', 'beta');
- assertEquals('Incorrect last insert id',
- id + 1, database.getLastInsertRowId());
- }
- function testError() {
- if (!database) {
- return;
- }
- var sql = 'INSERT INTO Unknown VALUES(?, ?)';
- try {
- database.execute('INSERT INTO Unknown VALUES(?, ?)', 'alpha', 1);
- fail('Should not have gotten here');
- } catch (e) {
- assertEquals('Wrong sql information', sql + ': ["alpha",1]', e.message0);
- }
- }
- function testThrowInBeforeSubmit() {
- if (!database) {
- return;
- }
- var errorSentinel = Error();
- var committed = false;
- database.begin();
- goog.events.listen(database, 'beforecommit', function(e) {
- throw errorSentinel;
- });
- goog.events.listen(database, 'commit', function(e) {
- committed = true;
- });
- database.execute('INSERT INTO Test VALUES(?, ?)', 'd', 'delta');
- try {
- database.commit();
- fail('Should have thrown an error');
- } catch (ex) {
- assertEquals(errorSentinel, ex);
- assertTrue('Should still be in the transaction',
- database.isInTransaction());
- }
- assertFalse('Should not have been commited since we threw an error ' +
- 'in beforecommit', committed);
- database.rollback();
- }
- function testThrowInBeforeRollback() {
- if (!database) {
- return;
- }
- var errorSentinel = Error();
- var rollbacked = false;
- database.begin();
- goog.events.listen(database, 'beforerollback', function(e) {
- throw errorSentinel;
- });
- goog.events.listen(database, 'rollback', function(e) {
- rollbacked = true;
- });
- database.execute('INSERT INTO Test VALUES(?, ?)', 'd', 'delta');
- try {
- database.rollback();
- fail('Should have thrown an error');
- } catch (ex) {
- assertEquals(errorSentinel, ex);
- assertTrue('Should still be in the transaction',
- database.isInTransaction());
- }
- assertFalse('Should not have been rolled back since we threw an error ' +
- 'in beforerollback', rollbacked);
- goog.events.removeAll(database);
- database.rollback();
- }
- </script>
- </body>
- </html>