diff options
Diffstat (limited to 'comm/calendar/test/unit/test_deleted_items.js')
-rw-r--r-- | comm/calendar/test/unit/test_deleted_items.js | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/comm/calendar/test/unit/test_deleted_items.js b/comm/calendar/test/unit/test_deleted_items.js new file mode 100644 index 0000000000..d68c927dae --- /dev/null +++ b/comm/calendar/test/unit/test_deleted_items.js @@ -0,0 +1,106 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var { XPCOMUtils } = ChromeUtils.importESModule("resource://gre/modules/XPCOMUtils.sys.mjs"); + +XPCOMUtils.defineLazyModuleGetters(this, { + CalEvent: "resource:///modules/CalEvent.jsm", +}); + +add_setup(function () { + // The deleted items service is started automatically by the start-up + // procedure, but that doesn't happen in XPCShell tests. Add an observer + // ourselves to simulate the behaviour. + let delmgr = Cc["@mozilla.org/calendar/deleted-items-manager;1"].getService(Ci.calIDeletedItems); + Services.obs.addObserver(delmgr, "profile-after-change"); + + do_calendar_startup(run_next_test); +}); + +function check_delmgr_call(aFunc) { + let delmgr = Cc["@mozilla.org/calendar/deleted-items-manager;1"].getService(Ci.calIDeletedItems); + + return new Promise((resolve, reject) => { + delmgr.wrappedJSObject.completedNotifier.handleCompletion = aReason => { + if (aReason == Ci.mozIStorageStatementCallback.REASON_FINISHED) { + resolve(); + } else { + reject(aReason); + } + }; + aFunc(); + }); +} + +add_task(async function test_deleted_items() { + let delmgr = Cc["@mozilla.org/calendar/deleted-items-manager;1"].getService(Ci.calIDeletedItems); + + // No items have been deleted, retrieving one should return null. + equal(delmgr.getDeletedDate("random"), null); + equal(delmgr.getDeletedDate("random", "random"), null); + + // Make sure the cache is initially flushed and that this doesn't throw an + // error. + await check_delmgr_call(() => delmgr.flush()); + + let memory = cal.manager.createCalendar("memory", Services.io.newURI("moz-storage-calendar://")); + cal.manager.registerCalendar(memory); + + let item = new CalEvent(); + item.id = "test-item-1"; + item.startDate = cal.dtz.now(); + item.endDate = cal.dtz.now(); + + // Add the item, it still shouldn't be in the deleted database. + await check_delmgr_call(() => memory.addItem(item)); + equal(delmgr.getDeletedDate(item.id), null); + equal(delmgr.getDeletedDate(item.id, memory.id), null); + + // We need to stop time so we have something to compare with. + let referenceDate = cal.createDateTime("20120726T112045"); + referenceDate.timezone = cal.dtz.defaultTimezone; + let futureDate = cal.createDateTime("20380101T000000"); + futureDate.timezone = cal.dtz.defaultTimezone; + let useFutureDate = false; + let oldNowFunction = cal.dtz.now; + cal.dtz.now = function () { + return (useFutureDate ? futureDate : referenceDate).clone(); + }; + + // Deleting an item should trigger it being marked for deletion. + await check_delmgr_call(() => memory.deleteItem(item)); + + // Now check if it was deleted at our reference date. + let deltime = delmgr.getDeletedDate(item.id); + notEqual(deltime, null); + equal(deltime.compare(referenceDate), 0); + + // The same with the calendar. + deltime = delmgr.getDeletedDate(item.id, memory.id); + notEqual(deltime, null); + equal(deltime.compare(referenceDate), 0); + + // Item should not be found in other calendars. + equal(delmgr.getDeletedDate(item.id, "random"), null); + + // Check if flushing works, we need to travel time for that. + useFutureDate = true; + await check_delmgr_call(() => delmgr.flush()); + equal(delmgr.getDeletedDate(item.id), null); + equal(delmgr.getDeletedDate(item.id, memory.id), null); + + // Start over with our past time. + useFutureDate = false; + + // Add, delete, add. Item should no longer be deleted. + await check_delmgr_call(() => memory.addItem(item)); + equal(delmgr.getDeletedDate(item.id), null); + await check_delmgr_call(() => memory.deleteItem(item)); + equal(delmgr.getDeletedDate(item.id).compare(referenceDate), 0); + await check_delmgr_call(() => memory.addItem(item)); + equal(delmgr.getDeletedDate(item.id), null); + + // Revert now function, in case more tests are written. + cal.dtz.now = oldNowFunction; +}); |