summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/addrbook/test/unit/test_collection.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/addrbook/test/unit/test_collection.js')
-rw-r--r--comm/mailnews/addrbook/test/unit/test_collection.js404
1 files changed, 404 insertions, 0 deletions
diff --git a/comm/mailnews/addrbook/test/unit/test_collection.js b/comm/mailnews/addrbook/test/unit/test_collection.js
new file mode 100644
index 0000000000..720f28c246
--- /dev/null
+++ b/comm/mailnews/addrbook/test/unit/test_collection.js
@@ -0,0 +1,404 @@
+/* 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/. */
+
+/*
+ * Test suite for the Address Collector Service.
+ *
+ * This tests the main collection functions for adding new cards and modifying
+ * existing ones.
+ *
+ * Tests against cards in different ABs are done in test_collection_2.js.
+ */
+
+// Source fields (emailHeader) and expected results for use for
+// testing the addition of new addresses to the database.
+//
+// Note: these email addresses should be different to allow collecting an
+// address to add a different card each time.
+var addEmailChecks =
+ // First 3 items aimed at basic collection and mail format.
+ [
+ {
+ emailHeader: "test0@foo.invalid",
+ primaryEmail: "test0@foo.invalid",
+ displayName: "",
+ firstName: "",
+ lastName: "",
+ screenName: "",
+ },
+ {
+ emailHeader: "test1@foo.invalid",
+ primaryEmail: "test1@foo.invalid",
+ displayName: "",
+ firstName: "",
+ lastName: "",
+ screenName: "",
+ },
+ {
+ emailHeader: "test2@foo.invalid",
+ primaryEmail: "test2@foo.invalid",
+ displayName: "",
+ firstName: "",
+ lastName: "",
+ screenName: "",
+ },
+ // UTF-8 based addresses (bug 407564)
+ {
+ emailHeader: "test0@\u00D0.invalid",
+ primaryEmail: "test0@\u00D0.invalid",
+ displayName: "",
+ firstName: "",
+ lastName: "",
+ screenName: "",
+ },
+ {
+ emailHeader: "test0\u00D0@foo.invalid",
+ primaryEmail: "test0\u00D0@foo.invalid",
+ displayName: "",
+ firstName: "",
+ lastName: "",
+ screenName: "",
+ },
+ // Screen names
+ {
+ emailHeader: "invalid\u00D00@aol.com",
+ primaryEmail: "invalid\u00D00@aol.com",
+ displayName: "",
+ firstName: "",
+ lastName: "",
+ screenName: "invalid\u00D00",
+ },
+ {
+ emailHeader: "invalid1\u00D00@cs.com",
+ primaryEmail: "invalid1\u00D00@cs.com",
+ displayName: "",
+ firstName: "",
+ lastName: "",
+ screenName: "invalid1\u00D00",
+ },
+ {
+ emailHeader: "invalid2\u00D00@netscape.net",
+ primaryEmail: "invalid2\u00D00@netscape.net",
+ displayName: "",
+ firstName: "",
+ lastName: "",
+ screenName: "invalid2\u00D00",
+ },
+ // Collection of names
+ {
+ emailHeader: "Test User <test3@foo.invalid>",
+ primaryEmail: "test3@foo.invalid",
+ displayName: "Test User",
+ firstName: "Test",
+ lastName: "User",
+ screenName: "",
+ },
+ {
+ emailHeader: "Test <test4@foo.invalid>",
+ primaryEmail: "test4@foo.invalid",
+ displayName: "Test",
+ firstName: "",
+ lastName: "",
+ screenName: "",
+ },
+ // Collection of names with UTF-8 specific items
+ {
+ emailHeader: "Test\u00D0 User <test5@foo.invalid>",
+ primaryEmail: "test5@foo.invalid",
+ displayName: "Test\u00D0 User",
+ firstName: "Test\u00D0",
+ lastName: "User",
+ screenName: "",
+ },
+ {
+ emailHeader: "Test\u00D0 <test6@foo.invalid>",
+ primaryEmail: "test6@foo.invalid",
+ displayName: "Test\u00D0",
+ firstName: "",
+ lastName: "",
+ screenName: "",
+ },
+ ];
+
+// Source fields (emailHeader) and expected results for use for
+// testing the modification of cards in the database.
+//
+// Note: these sets re-use some of the ones for ease of definition.
+var modifyEmailChecks =
+ // No display name/other details. Add details and modify mail format.
+ [
+ {
+ emailHeader: "Modify User\u00D0 <test0@\u00D0.invalid>",
+ primaryEmail: "test0@\u00D0.invalid",
+ displayName: "Modify User\u00D0",
+ firstName: "Modify",
+ lastName: "User\u00D0",
+ screenName: "",
+ },
+ {
+ emailHeader: "Modify <test0\u00D0@foo.invalid>",
+ primaryEmail: "test0\u00D0@foo.invalid",
+ displayName: "Modify",
+ firstName: "",
+ lastName: "",
+ screenName: "",
+ },
+ // No modification of existing cards with display names
+ {
+ emailHeader: "Modify2 User\u00D02 <test0@\u00D0.invalid>",
+ primaryEmail: "test0@\u00D0.invalid",
+ displayName: "Modify User\u00D0",
+ firstName: "Modify",
+ lastName: "User\u00D0",
+ screenName: "",
+ },
+ {
+ emailHeader: "Modify3 <test0\u00D0@foo.invalid>",
+ primaryEmail: "test0\u00D0@foo.invalid",
+ displayName: "Modify",
+ firstName: "",
+ lastName: "",
+ screenName: "",
+ },
+ // Check no modification of cards for mail format where format is not
+ // "unknown".
+ {
+ emailHeader: "Modify User\u00D0 <test0@\u00D0.invalid>",
+ primaryEmail: "test0@\u00D0.invalid",
+ displayName: "Modify User\u00D0",
+ firstName: "Modify",
+ lastName: "User\u00D0",
+ screenName: "",
+ },
+ {
+ emailHeader: "Modify <test0\u00D0@foo.invalid>",
+ primaryEmail: "test0\u00D0@foo.invalid",
+ displayName: "Modify",
+ firstName: "",
+ lastName: "",
+ screenName: "",
+ },
+ // No modification of cards with email in second email address.
+ {
+ emailHeader: "Modify Secondary <usersec\u00D0@foo.invalid>",
+ primaryEmail: "userprim\u00D0@foo.invalid",
+ secondEmail: "usersec\u00D0@foo.invalid",
+ displayName: "",
+ firstName: "",
+ lastName: "",
+ screenName: "",
+ },
+ {
+ emailHeader: "Modify <usersec\u00D0@foo.invalid>",
+ primaryEmail: "userprim\u00D0@foo.invalid",
+ secondEmail: "usersec\u00D0@foo.invalid",
+ displayName: "",
+ firstName: "",
+ lastName: "",
+ screenName: "",
+ },
+ ];
+
+var collectChecker = {
+ addressCollect: null,
+ AB: null,
+ part: 0,
+
+ checkAddress(aDetails) {
+ info("checkAddress: " + aDetails.emailHeader);
+ try {
+ this.addressCollect.collectAddress(aDetails.emailHeader, true);
+
+ this.checkCardResult(aDetails, false);
+ } catch (e) {
+ throw new Error(
+ "FAILED in checkAddress emailHeader: " +
+ aDetails.emailHeader +
+ " part: " +
+ this.part +
+ " : " +
+ e
+ );
+ }
+ ++this.part;
+ },
+
+ checkAll(aDetailsArray) {
+ try {
+ // Formulate the string to add.
+ var emailHeader = "";
+ var i;
+
+ for (i = 0; i < aDetailsArray.length - 1; ++i) {
+ emailHeader += aDetailsArray[i].emailHeader + ", ";
+ }
+
+ emailHeader += aDetailsArray[aDetailsArray.length - 1].emailHeader;
+
+ // Now add it. In this case we just set the Mail format Type to unknown.
+ this.addressCollect.collectAddress(emailHeader, true);
+
+ for (i = 0; i < aDetailsArray.length; ++i) {
+ this.checkCardResult(aDetailsArray[i], true);
+ }
+ } catch (e) {
+ throw new Error("FAILED in checkAll item: " + i + " : " + e);
+ }
+ },
+
+ checkCardResult(aDetails) {
+ info("checkCardResult: " + aDetails.emailHeader);
+ try {
+ var card = this.AB.cardForEmailAddress(aDetails.primaryEmail);
+
+ Assert.ok(card != null);
+
+ if ("secondEmail" in aDetails) {
+ Assert.equal(card.emailAddresses[1], aDetails.secondEmail);
+ }
+
+ Assert.equal(card.displayName, aDetails.displayName);
+ Assert.equal(card.firstName, aDetails.firstName);
+ Assert.equal(card.lastName, aDetails.lastName);
+ Assert.equal(card.getProperty("_AimScreenName", ""), aDetails.screenName);
+ } catch (e) {
+ throw new Error(
+ "FAILED in checkCardResult emailHeader: " +
+ aDetails.emailHeader +
+ " : " +
+ e
+ );
+ }
+ },
+};
+
+function run_test() {
+ // Test - Get the address collecter
+
+ // XXX Getting all directories ensures we create all ABs because the
+ // address collecter can't currently create ABs itself (bug 314448).
+ MailServices.ab.directories;
+
+ // Get the actual AB for the collector so we can check cards have been
+ // added.
+ collectChecker.AB = MailServices.ab.getDirectory(
+ Services.prefs.getCharPref("mail.collect_addressbook")
+ );
+
+ // Get the actual collecter
+ collectChecker.addressCollect = Cc[
+ "@mozilla.org/addressbook/services/addressCollector;1"
+ ].getService(Ci.nsIAbAddressCollector);
+
+ // Test - Addition of header without email address.
+
+ collectChecker.addressCollect.collectAddress("MyTest <>", true);
+
+ // Address book should have no cards present.
+ Assert.equal(collectChecker.AB.childCards.length, 0);
+
+ // Test - Email doesn't exist, but don't add it.
+
+ // As we've just set everything up, we know we haven't got anything in the
+ // AB, so just try and collect without adding.
+ collectChecker.addressCollect.collectAddress(
+ addEmailChecks[0].emailHeader,
+ false
+ );
+
+ var card = collectChecker.AB.cardForEmailAddress(
+ addEmailChecks[0].emailHeader
+ );
+
+ Assert.ok(card == null);
+
+ // Test - Try and collect various emails and formats.
+
+ collectChecker.part = 0;
+
+ addEmailChecks.forEach(collectChecker.checkAddress, collectChecker);
+
+ // Test - Do all emails at the same time.
+
+ // First delete all existing cards
+ collectChecker.AB.deleteCards(collectChecker.AB.childCards);
+
+ // Address book should have no cards present.
+ Assert.equal(collectChecker.AB.childCards.length, 0);
+
+ Assert.equal(
+ collectChecker.AB.cardForEmailAddress(addEmailChecks[0].emailHeader),
+ null
+ );
+
+ // Now do all emails at the same time.
+ collectChecker.checkAll(addEmailChecks);
+
+ // Test - Try and modify various emails and formats.
+
+ // Add a basic card with just primary and second email to allow testing
+ // of the case where we don't modify when second email is matching.
+ card = Cc["@mozilla.org/addressbook/cardproperty;1"].createInstance(
+ Ci.nsIAbCard
+ );
+
+ card.primaryEmail = "userprim\u00D0@foo.invalid";
+ card.setProperty("SecondEmail", "usersec\u00D0@foo.invalid");
+
+ collectChecker.AB.addCard(card);
+
+ collectChecker.part = 0;
+
+ modifyEmailChecks.forEach(collectChecker.checkAddress, collectChecker);
+
+ // Test collectSingleAddress - Note: because the above tests test
+ // collectAddress which we know calls collectSingleAddress, we only need to
+ // test the case where aSkipCheckExisting is true.
+
+ // Add an email that is already there and check we get two instances of it in
+ // the AB.
+
+ const kSingleAddress =
+ modifyEmailChecks[modifyEmailChecks.length - 1].primaryEmail;
+ const kSingleDisplayName = "Test Single";
+
+ collectChecker.addressCollect.collectSingleAddress(
+ kSingleAddress,
+ kSingleDisplayName,
+ true,
+ true
+ );
+
+ // Try collecting the same address in another case. This shouldn't create any
+ // new card.
+ collectChecker.addressCollect.collectSingleAddress(
+ kSingleAddress.toUpperCase(),
+ kSingleDisplayName,
+ true,
+ true
+ );
+
+ var foundCards = [];
+
+ for (card of collectChecker.AB.childCards) {
+ if (card.primaryEmail == kSingleAddress) {
+ foundCards.push(card);
+ }
+ }
+
+ Assert.equal(foundCards.length, 2);
+
+ if (
+ foundCards[0].displayName != kSingleDisplayName &&
+ foundCards[1].displayName != kSingleDisplayName
+ ) {
+ do_throw("Error, collectSingleCard didn't create a new card");
+ }
+
+ if (foundCards[0].displayName != "" && foundCards[1].displayName != "") {
+ do_throw(
+ "Error, collectSingleCard created ok, but other card does not exist"
+ );
+ }
+}