notifierTest.js (2364B)
1 "use strict"; 2 3 describe("Zotero.Notifier", function () { 4 describe("#trigger()", function () { 5 it("should trigger add events before modify events", function* () { 6 var deferred = Zotero.Promise.defer(); 7 var events = []; 8 var observer = { 9 notify: (action, type, ids) => { 10 events.push(action); 11 if (events.length == 2) { 12 deferred.resolve(); 13 } 14 } 15 }; 16 var id = Zotero.Notifier.registerObserver(observer, null, 'test_trigger'); 17 18 yield Zotero.DB.executeTransaction(function* () { 19 var item = new Zotero.Item('book'); 20 item.setField('title', 'A'); 21 yield item.save(); 22 item.setField('title', 'B'); 23 yield item.save(); 24 25 Zotero.Notifier.queue('unknown', 'item', item.id); 26 }); 27 28 assert.isTrue(deferred.promise.isResolved()); 29 assert.lengthOf(events, 3); 30 assert.equal(events[0], 'add'); 31 assert.equal(events[1], 'modify'); 32 assert.equal(events[2], 'unknown'); 33 34 Zotero.Notifier.unregisterObserver(id); 35 }); 36 37 it("should add events to passed queue", function* () { 38 var collection = yield createDataObject('collection'); 39 40 var deferred = Zotero.Promise.defer(); 41 var observer = { 42 notify: () => deferred.resolve() 43 }; 44 var id = Zotero.Notifier.registerObserver(observer, null, 'test_trigger'); 45 46 var queue = new Zotero.Notifier.Queue; 47 var item = createUnsavedDataObject('item'); 48 item.setCollections([collection.id]); 49 yield item.saveTx({ 50 notifierQueue: queue 51 }); 52 assert.isTrue(deferred.promise.isPending()); 53 assert.equal(queue.size, 2); 54 yield Zotero.Notifier.commit(queue); 55 assert.isTrue(deferred.promise.isResolved()); 56 57 Zotero.Notifier.unregisterObserver(id); 58 }); 59 }); 60 61 describe("#queue", function () { 62 it("should handle notification after DB timeout from another transaction", async function () { 63 var promise1 = Zotero.DB.executeTransaction(async function () { 64 var item = createUnsavedDataObject('item'); 65 await item.save(); 66 67 await Zotero.Promise.delay(2000); 68 69 Zotero.Notifier.queue('refresh', 'item', item.id); 70 }.bind(this)); 71 72 var promise2 = Zotero.DB.executeTransaction(async function () { 73 var item = createUnsavedDataObject('item'); 74 await item.save(); 75 }.bind(this), { waitTimeout: 1000 }); 76 77 await promise1; 78 assert.isTrue(promise2.isRejected()); 79 }); 80 }); 81 });