3f6ecc0021
If a transaction took over 30 seconds and another transaction timed out waiting for it, the second transaction would reset the notifier queue, but if the first transaction then tried to queue an event, it would fail with this error and roll back. (It would be nice to figure out why transactions are taking over 30 seconds, though.)
81 lines
2.3 KiB
JavaScript
81 lines
2.3 KiB
JavaScript
"use strict";
|
|
|
|
describe("Zotero.Notifier", function () {
|
|
describe("#trigger()", function () {
|
|
it("should trigger add events before modify events", function* () {
|
|
var deferred = Zotero.Promise.defer();
|
|
var events = [];
|
|
var observer = {
|
|
notify: (action, type, ids) => {
|
|
events.push(action);
|
|
if (events.length == 2) {
|
|
deferred.resolve();
|
|
}
|
|
}
|
|
};
|
|
var id = Zotero.Notifier.registerObserver(observer, null, 'test_trigger');
|
|
|
|
yield Zotero.DB.executeTransaction(function* () {
|
|
var item = new Zotero.Item('book');
|
|
item.setField('title', 'A');
|
|
yield item.save();
|
|
item.setField('title', 'B');
|
|
yield item.save();
|
|
|
|
Zotero.Notifier.queue('unknown', 'item', item.id);
|
|
});
|
|
|
|
assert.isTrue(deferred.promise.isResolved());
|
|
assert.lengthOf(events, 3);
|
|
assert.equal(events[0], 'add');
|
|
assert.equal(events[1], 'modify');
|
|
assert.equal(events[2], 'unknown');
|
|
|
|
Zotero.Notifier.unregisterObserver(id);
|
|
});
|
|
|
|
it("should add events to passed queue", function* () {
|
|
var collection = yield createDataObject('collection');
|
|
|
|
var deferred = Zotero.Promise.defer();
|
|
var observer = {
|
|
notify: () => deferred.resolve()
|
|
};
|
|
var id = Zotero.Notifier.registerObserver(observer, null, 'test_trigger');
|
|
|
|
var queue = new Zotero.Notifier.Queue;
|
|
var item = createUnsavedDataObject('item');
|
|
item.setCollections([collection.id]);
|
|
yield item.saveTx({
|
|
notifierQueue: queue
|
|
});
|
|
assert.isTrue(deferred.promise.isPending());
|
|
assert.equal(queue.size, 2);
|
|
yield Zotero.Notifier.commit(queue);
|
|
assert.isTrue(deferred.promise.isResolved());
|
|
|
|
Zotero.Notifier.unregisterObserver(id);
|
|
});
|
|
});
|
|
|
|
describe("#queue", function () {
|
|
it("should handle notification after DB timeout from another transaction", async function () {
|
|
var promise1 = Zotero.DB.executeTransaction(async function () {
|
|
var item = createUnsavedDataObject('item');
|
|
await item.save();
|
|
|
|
await Zotero.Promise.delay(2000);
|
|
|
|
Zotero.Notifier.queue('refresh', 'item', item.id);
|
|
}.bind(this));
|
|
|
|
var promise2 = Zotero.DB.executeTransaction(async function () {
|
|
var item = createUnsavedDataObject('item');
|
|
await item.save();
|
|
}.bind(this), { waitTimeout: 1000 });
|
|
|
|
await promise1;
|
|
assert.isTrue(promise2.isRejected());
|
|
});
|
|
});
|
|
});
|