zotero/test/tests/dbTest.js
Dan Stillman 9e3e680be8 Rework DB transaction handling
Rollback callbacks weren't being properly called, and some other things were in
the wrong place, particularly with nested transactions.
2015-04-25 03:17:41 -04:00

83 lines
2.5 KiB
JavaScript

describe("Zotero.DB", function() {
describe("#executeTransaction()", function () {
it("should roll back on error", function* () {
yield Zotero.DB.queryAsync("CREATE TABLE tmpRollbackOnError (foo INT)");
yield Zotero.DB.queryAsync("INSERT INTO tmpRollbackOnError VALUES (1)");
try {
yield Zotero.DB.executeTransaction(function* () {
yield Zotero.DB.queryAsync("INSERT INTO tmpRollbackOnError VALUES (2)");
throw 'Aborting transaction -- ignore';
});
}
catch (e) {
if (typeof e != 'string' || !e.startsWith('Aborting transaction')) throw e;
}
var count = yield Zotero.DB.valueQueryAsync("SELECT COUNT(*) FROM tmpRollbackOnError");
assert.equal(count, 1);
var conn = yield Zotero.DB._getConnectionAsync();
assert.isFalse(conn.transactionInProgress);
yield Zotero.DB.queryAsync("DROP TABLE tmpRollbackOnError");
});
it("should run onRollback callbacks", function* () {
var callbackRan = false;
yield Zotero.DB.queryAsync("CREATE TABLE tmpOnRollback (foo INT)");
try {
yield Zotero.DB.executeTransaction(
function* () {
yield Zotero.DB.queryAsync("INSERT INTO tmpOnRollback VALUES (1)");
throw 'Aborting transaction -- ignore';
},
{
onRollback: function () {
callbackRan = true;
}
}
);
}
catch (e) {
if (typeof e != 'string' || !e.startsWith('Aborting transaction')) throw e;
}
assert.ok(callbackRan);
yield Zotero.DB.queryAsync("DROP TABLE tmpOnRollback");
});
it("should run onRollback callbacks for nested transactions", function* () {
var callback1Ran = false;
var callback2Ran = false;
yield Zotero.DB.queryAsync("CREATE TABLE tmpOnNestedRollback (foo INT)");
try {
yield Zotero.DB.executeTransaction(function* () {
yield Zotero.DB.queryAsync("INSERT INTO tmpOnNestedRollback VALUES (1)");
yield Zotero.DB.executeTransaction(
function* () {
yield Zotero.DB.queryAsync("INSERT INTO tmpOnNestedRollback VALUES (2)");
throw 'Aborting transaction -- ignore';
},
{
onRollback: function () {
callback1Ran = true;
}
}
);
},
{
onRollback: function () {
callback2Ran = true;
}
});
}
catch (e) {
if (typeof e != 'string' || !e.startsWith('Aborting transaction')) throw e;
}
assert.ok(callback1Ran);
assert.ok(callback2Ran);
yield Zotero.DB.queryAsync("DROP TABLE tmpOnNestedRollback");
});
})
});