summaryrefslogtreecommitdiffstats
path: root/comm/calendar/test/unit/test_deleted_items.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/calendar/test/unit/test_deleted_items.js')
-rw-r--r--comm/calendar/test/unit/test_deleted_items.js106
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;
+});