diff options
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.js | 167 |
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); +}); |