From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../mailnews/addrbook/test/unit/test_collection.js | 404 +++++++++++++++++++++ 1 file changed, 404 insertions(+) create mode 100644 comm/mailnews/addrbook/test/unit/test_collection.js (limited to 'comm/mailnews/addrbook/test/unit/test_collection.js') 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 ", + primaryEmail: "test3@foo.invalid", + displayName: "Test User", + firstName: "Test", + lastName: "User", + screenName: "", + }, + { + emailHeader: "Test ", + primaryEmail: "test4@foo.invalid", + displayName: "Test", + firstName: "", + lastName: "", + screenName: "", + }, + // Collection of names with UTF-8 specific items + { + emailHeader: "Test\u00D0 User ", + primaryEmail: "test5@foo.invalid", + displayName: "Test\u00D0 User", + firstName: "Test\u00D0", + lastName: "User", + screenName: "", + }, + { + emailHeader: "Test\u00D0 ", + 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 ", + primaryEmail: "test0@\u00D0.invalid", + displayName: "Modify User\u00D0", + firstName: "Modify", + lastName: "User\u00D0", + screenName: "", + }, + { + emailHeader: "Modify ", + primaryEmail: "test0\u00D0@foo.invalid", + displayName: "Modify", + firstName: "", + lastName: "", + screenName: "", + }, + // No modification of existing cards with display names + { + emailHeader: "Modify2 User\u00D02 ", + primaryEmail: "test0@\u00D0.invalid", + displayName: "Modify User\u00D0", + firstName: "Modify", + lastName: "User\u00D0", + screenName: "", + }, + { + emailHeader: "Modify3 ", + 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 ", + primaryEmail: "test0@\u00D0.invalid", + displayName: "Modify User\u00D0", + firstName: "Modify", + lastName: "User\u00D0", + screenName: "", + }, + { + emailHeader: "Modify ", + primaryEmail: "test0\u00D0@foo.invalid", + displayName: "Modify", + firstName: "", + lastName: "", + screenName: "", + }, + // No modification of cards with email in second email address. + { + emailHeader: "Modify Secondary ", + primaryEmail: "userprim\u00D0@foo.invalid", + secondEmail: "usersec\u00D0@foo.invalid", + displayName: "", + firstName: "", + lastName: "", + screenName: "", + }, + { + emailHeader: "Modify ", + 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" + ); + } +} -- cgit v1.2.3