summaryrefslogtreecommitdiffstats
path: root/comm/mail/services/sync/test/unit/test_addressBook_tracker.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/services/sync/test/unit/test_addressBook_tracker.js')
-rw-r--r--comm/mail/services/sync/test/unit/test_addressBook_tracker.js167
1 files changed, 167 insertions, 0 deletions
diff --git a/comm/mail/services/sync/test/unit/test_addressBook_tracker.js b/comm/mail/services/sync/test/unit/test_addressBook_tracker.js
new file mode 100644
index 0000000000..9831252fb6
--- /dev/null
+++ b/comm/mail/services/sync/test/unit/test_addressBook_tracker.js
@@ -0,0 +1,167 @@
+/* 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/. */
+
+do_get_profile();
+
+const { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+const { AddressBooksEngine } = ChromeUtils.importESModule(
+ "resource://services-sync/engines/addressBooks.sys.mjs"
+);
+const { Service } = ChromeUtils.importESModule(
+ "resource://services-sync/service.sys.mjs"
+);
+const { TestUtils } = ChromeUtils.import(
+ "resource://testing-common/TestUtils.jsm"
+);
+const { PromiseTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/PromiseTestUtils.sys.mjs"
+);
+
+let engine, store, tracker;
+
+add_setup(async function () {
+ engine = new AddressBooksEngine(Service);
+ await engine.initialize();
+ store = engine._store;
+ tracker = engine._tracker;
+
+ Assert.equal(tracker.score, 0);
+ Assert.equal(tracker._isTracking, false);
+ Assert.deepEqual(await tracker.getChangedIDs(), {});
+
+ tracker.start();
+ Assert.equal(tracker._isTracking, true);
+});
+
+/**
+ * Test creating, changing, and deleting an address book that should be synced.
+ */
+add_task(async function testNetworkAddressBook() {
+ Assert.equal(tracker.score, 0);
+ Assert.deepEqual(await tracker.getChangedIDs(), {});
+
+ let id = newUID();
+ let dirPrefId = MailServices.ab.newAddressBook(
+ "Sync Address Book",
+ null,
+ MailServices.ab.CARDDAV_DIRECTORY_TYPE,
+ id
+ );
+ Assert.equal(tracker.score, 301);
+ Assert.deepEqual(await tracker.getChangedIDs(), { [id]: 0 });
+
+ tracker.clearChangedIDs();
+ Assert.deepEqual(await tracker.getChangedIDs(), {});
+ tracker.resetScore();
+ Assert.equal(tracker.score, 0);
+
+ let book = MailServices.ab.getDirectoryFromId(dirPrefId);
+ book.dirName = "changed name";
+ Assert.equal(tracker.score, 301);
+ Assert.deepEqual(await tracker.getChangedIDs(), { [id]: 0 });
+
+ tracker.clearChangedIDs();
+ tracker.resetScore();
+
+ book.setIntValue("carddav.syncinterval", 0);
+ Assert.equal(tracker.score, 301);
+ Assert.deepEqual(await tracker.getChangedIDs(), { [id]: 0 });
+
+ book.setStringValue("carddav.url", "https://localhost/");
+ Assert.equal(tracker.score, 301);
+ Assert.deepEqual(await tracker.getChangedIDs(), { [id]: 0 });
+
+ tracker.clearChangedIDs();
+ tracker.resetScore();
+
+ let deletedPromise = TestUtils.topicObserved("addrbook-directory-deleted");
+ MailServices.ab.deleteAddressBook(book.URI);
+ await deletedPromise;
+ Assert.equal(tracker.score, 301);
+ Assert.deepEqual(await tracker.getChangedIDs(), { [id]: 0 });
+
+ tracker.clearChangedIDs();
+ tracker.resetScore();
+});
+
+/**
+ * Test a local address book. This shouldn't affect the tracker at all.
+ */
+add_task(async function testStorageAddressBook() {
+ let dirPrefId = MailServices.ab.newAddressBook(
+ "Sync Address Book",
+ null,
+ MailServices.ab.JS_DIRECTORY_TYPE
+ );
+ Assert.deepEqual(await tracker.getChangedIDs(), {});
+ Assert.equal(tracker.score, 0);
+
+ let book = MailServices.ab.getDirectoryFromId(dirPrefId);
+ book.dirName = "changed name";
+ book.setBoolValue("readOnly", true);
+ Assert.deepEqual(await tracker.getChangedIDs(), {});
+ Assert.equal(tracker.score, 0);
+
+ let deletedPromise = TestUtils.topicObserved("addrbook-directory-deleted");
+ MailServices.ab.deleteAddressBook(book.URI);
+ await deletedPromise;
+ Assert.deepEqual(await tracker.getChangedIDs(), {});
+ Assert.equal(tracker.score, 0);
+});
+
+/**
+ * Test the store methods on address books. The tracker should ignore them.
+ */
+add_task(async function testIncomingChanges() {
+ PromiseTestUtils.expectUncaughtRejection(/Connection failure/);
+
+ let id = newUID();
+
+ tracker.ignoreAll = true;
+ await store.applyIncoming({
+ id,
+ name: "New Book",
+ type: MailServices.ab.CARDDAV_DIRECTORY_TYPE,
+ prefs: {
+ url: "https://localhost/",
+ syncInterval: 0,
+ username: "username",
+ },
+ });
+ tracker.ignoreAll = false;
+
+ Assert.deepEqual(await tracker.getChangedIDs(), {});
+ Assert.equal(tracker.score, 0);
+
+ tracker.clearChangedIDs();
+ tracker.resetScore();
+
+ tracker.ignoreAll = true;
+ await store.applyIncoming({
+ id,
+ name: "New Book (changed)!",
+ type: MailServices.ab.CARDDAV_DIRECTORY_TYPE,
+ prefs: {
+ url: "https://localhost/",
+ syncInterval: 30,
+ username: "username@localhost",
+ },
+ });
+ tracker.ignoreAll = false;
+
+ Assert.deepEqual(await tracker.getChangedIDs(), {});
+ Assert.equal(tracker.score, 0);
+
+ tracker.ignoreAll = true;
+ await store.applyIncoming({
+ id,
+ deleted: true,
+ });
+ tracker.ignoreAll = false;
+
+ Assert.deepEqual(await tracker.getChangedIDs(), {});
+ Assert.equal(tracker.score, 0);
+});