diff options
Diffstat (limited to '')
-rw-r--r-- | comm/mailnews/addrbook/test/unit/test_convertOnSave.js | 329 |
1 files changed, 329 insertions, 0 deletions
diff --git a/comm/mailnews/addrbook/test/unit/test_convertOnSave.js b/comm/mailnews/addrbook/test/unit/test_convertOnSave.js new file mode 100644 index 0000000000..da26ffe56c --- /dev/null +++ b/comm/mailnews/addrbook/test/unit/test_convertOnSave.js @@ -0,0 +1,329 @@ +/* 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/. */ + +// Tests that any card added to an AddrBookDirectory is stored as a vCard. +// Some properties are also recorded outside the vCard for performance reasons +// and/or searching. + +// Each type of card is saved and checked twice: once with its own UID and +// again with a new UID. This ensures that UIDs are appropriately stored. + +var { AddrBookCard } = ChromeUtils.import( + "resource:///modules/AddrBookCard.jsm" +); +var { SQLiteDirectory } = ChromeUtils.import( + "resource:///modules/SQLiteDirectory.jsm" +); +var { VCardPropertyEntry } = ChromeUtils.import( + "resource:///modules/VCardUtils.jsm" +); + +Services.prefs.setStringPref( + "ldap_2.servers.conversion.filename", + "conversion.sqlite" +); + +var book = new SQLiteDirectory(); +book.init("jsaddrbook://conversion.sqlite"); + +/** Tests an instance of nsAbCardProperty. */ +add_task(function testCardProperty() { + let cardProperty = Cc[ + "@mozilla.org/addressbook/cardproperty;1" + ].createInstance(Ci.nsIAbCard); + cardProperty.UID = "99999999-8888-7777-6666-555555555555"; + cardProperty.displayName = "display name"; + cardProperty.firstName = "first"; + cardProperty.lastName = "last"; + cardProperty.primaryEmail = "primary@email"; + cardProperty.setProperty("SecondEmail", "second@email"); + cardProperty.setProperty("NickName", "nick"); + cardProperty.setProperty("FaxNumber", "1234567"); + cardProperty.setProperty("BirthYear", 2001); + cardProperty.setProperty("BirthMonth", 1); + cardProperty.setProperty("BirthDay", 1); + cardProperty.setProperty("FakeProperty", "fake value"); + + saveCardAndTest(cardProperty, false); + saveCardAndTest(cardProperty, true); +}); + +/** + * Tests an instance of AddrBookCard, populated in the same way that card are + * created from storage. This instance *doesn't* contain a vCard, and + * is therefore the same as a card that hasn't yet been migrated to vCard. + */ +add_task(function testABCard() { + let abCard = new AddrBookCard(); + abCard._uid = "99999999-8888-7777-6666-555555555555"; + abCard._properties = new Map([ + ["PopularityIndex", 0], // NO + ["DisplayName", "display name"], + ["FirstName", "first"], + ["LastName", "last"], + ["PrimaryEmail", "primary@email"], + ["SecondEmail", "second@email"], + ["NickName", "nick"], + ["FaxNumber", "1234567"], + ["BirthYear", 2001], + ["BirthMonth", 1], + ["BirthDay", 1], + ["FakeProperty", "fake value"], + ]); + + saveCardAndTest(abCard, false); + saveCardAndTest(abCard, true); +}); + +/** + * Tests an instance of AddrBookCard, populated in the same way that card are + * created from storage. This instance *does* contain a vCard. + */ +add_task(function testABCardWithVCard() { + let abCard = new AddrBookCard(); + abCard._uid = "99999999-8888-7777-6666-555555555555"; + abCard._properties = new Map([ + ["PopularityIndex", 0], // NO + ["DisplayName", "display name"], + ["FirstName", "first"], + ["LastName", "last"], + ["PrimaryEmail", "primary@email"], + ["SecondEmail", "second@email"], + ["NickName", "nick"], + ["FakeProperty", "fake value"], + [ + "_vCard", + formatVCard` + BEGIN:VCARD + VERSION:4.0 + EMAIL;PREF=1:primary@email + EMAIL:second@email + FN:display name + NICKNAME:nick + BDAY;VALUE=DATE:20010101 + N:last;first;;; + TEL;TYPE=fax;VALUE=TEXT:1234567 + UID:99999999-8888-7777-6666-555555555555 + END:VCARD + `, + ], + ]); + + saveCardAndTest(abCard, false); + saveCardAndTest(abCard, true); +}); + +/** + * Tests an instance of AddrBookCard, populated in the same way that card are + * created from storage. This instance *does* contain a vCard. + */ +add_task(function testABCardWithVCardOnly() { + let abCard = new AddrBookCard(); + abCard._uid = "99999999-8888-7777-6666-555555555555"; + abCard._properties = new Map([ + ["FakeProperty", "fake value"], // NO + ["PopularityIndex", 0], // NO + [ + "_vCard", + formatVCard` + BEGIN:VCARD + VERSION:4.0 + EMAIL;PREF=1:primary@email + EMAIL:second@email + FN:display name + NICKNAME:nick + BDAY;VALUE=DATE:20010101 + N:last;first;;; + TEL;TYPE=fax;VALUE=TEXT:1234567 + UID:99999999-8888-7777-6666-555555555555 + END:VCARD + `, + ], + ]); + + saveCardAndTest(abCard, false); + saveCardAndTest(abCard, true); +}); + +/** + * Tests an instance of AddrBookCard, populated in the same way that card are + * created from storage. This instance *does* contain a vCard, but also some + * properties that shouldn't exist because their value is stored in the vCard. + */ +add_task(function testABCardWithVCardAndExtraProps() { + let abCard = new AddrBookCard(); + abCard._uid = "99999999-8888-7777-6666-555555555555"; + abCard._properties = new Map([ + ["PopularityIndex", 0], // NO + ["DisplayName", "display name"], + ["FirstName", "first"], + ["LastName", "last"], + ["PrimaryEmail", "primary@email"], + ["SecondEmail", "second@email"], + ["NickName", "nick"], + ["FaxNumber", "1234567"], + ["BirthYear", 2001], + ["BirthMonth", 1], + ["BirthDay", 1], + ["FakeProperty", "fake value"], + [ + "_vCard", + formatVCard` + BEGIN:VCARD + VERSION:4.0 + EMAIL;PREF=1:primary@email + EMAIL:second@email + FN:display name + NICKNAME:nick + BDAY;VALUE=DATE:20010101 + N:last;first;;; + TEL;TYPE=fax;VALUE=TEXT:1234567 + UID:99999999-8888-7777-6666-555555555555 + END:VCARD + `, + ], + ]); + + saveCardAndTest(abCard, false); + saveCardAndTest(abCard, true); +}); + +/** Tests an instance of AddrBookCard, created from scratch. */ +add_task(function testABCardConstructed() { + let abCard = new AddrBookCard(); + abCard.UID = "99999999-8888-7777-6666-555555555555"; + abCard.displayName = "display name"; + abCard.firstName = "first"; + abCard.lastName = "last"; + abCard.primaryEmail = "primary@email"; + abCard.vCardProperties.addValue("email", "second@email"); + abCard.vCardProperties.addValue("nickname", "nick"); + abCard.vCardProperties.addEntry( + new VCardPropertyEntry("tel", { type: "fax" }, "text", "1234567") + ); + abCard.vCardProperties.addEntry( + new VCardPropertyEntry("bday", {}, "date", "20010101") + ); + abCard.setProperty("FakeProperty", "fake value"); + + saveCardAndTest(abCard, false); + saveCardAndTest(abCard, true); +}); + +/** Tests an instance of AddrBookCard, created from scratch. */ +add_task(function testABCardConstructionThrows() { + let abCard = new AddrBookCard(); + abCard.UID = "99999999-8888-7777-6666-555555555555"; + abCard.displayName = "display name"; + abCard.firstName = "first"; + abCard.lastName = "last"; + abCard.primaryEmail = "primary@email"; + // these properties will be forgotten + Assert.throws( + () => abCard.setProperty("SecondEmail", "second@email"), + /Unable to set SecondEmail as a property/ + ); + Assert.throws( + () => abCard.setProperty("NickName", "nick"), + /Unable to set NickName as a property/ + ); + Assert.throws( + () => abCard.setProperty("FaxNumber", "1234567"), + /Unable to set FaxNumber as a property/ + ); + Assert.throws( + () => abCard.setProperty("BirthYear", 2001), + /Unable to set BirthYear as a property/ + ); + Assert.throws( + () => abCard.setProperty("BirthMonth", 1), + /Unable to set BirthMonth as a property/ + ); + Assert.throws( + () => abCard.setProperty("BirthDay", 1), + /Unable to set BirthDay as a property/ + ); + abCard.setProperty("FakeProperty", "fake value"); +}); + +function saveCardAndTest(card, useNewUID) { + info(`Saving the card ${useNewUID ? "with" : "without"} a new UID`); + + Assert.equal(book.childCardCount, 0); + + let savedCard = book.dropCard(card, useNewUID); + Assert.deepEqual(Array.from(savedCard.properties, p => p.name).sort(), [ + "DisplayName", + "FakeProperty", + "FirstName", + "LastModifiedDate", + "LastName", + "NickName", + "PopularityIndex", + "PrimaryEmail", + "SecondEmail", + "_vCard", + ]); + + if (useNewUID) { + Assert.notEqual(savedCard.UID, "99999999-8888-7777-6666-555555555555"); + } else { + Assert.equal(savedCard.UID, "99999999-8888-7777-6666-555555555555"); + } + + Assert.equal(savedCard.getProperty("DisplayName", "WRONG"), "display name"); + Assert.equal(savedCard.getProperty("FirstName", "WRONG"), "first"); + Assert.equal(savedCard.getProperty("LastName", "WRONG"), "last"); + Assert.equal(savedCard.getProperty("PrimaryEmail", "WRONG"), "primary@email"); + Assert.equal(savedCard.getProperty("SecondEmail", "WRONG"), "second@email"); + Assert.equal(savedCard.getProperty("NickName", "WRONG"), "nick"); + Assert.equal(savedCard.getProperty("FakeProperty", "WRONG"), "fake value"); + Assert.equal(savedCard.getProperty("PopularityIndex", "WRONG"), "0"); + + let vCard = savedCard.getProperty("_vCard", "WRONG"); + Assert.stringContains(vCard, "\r\nEMAIL;PREF=1:primary@email\r\n"); + Assert.stringContains(vCard, "\r\nEMAIL:second@email\r\n"); + Assert.stringContains(vCard, "\r\nFN:display name\r\n"); + Assert.stringContains(vCard, "\r\nNICKNAME:nick\r\n"); + Assert.stringContains(vCard, "\r\nBDAY;VALUE=DATE:20010101\r\n"); + Assert.stringContains(vCard, "\r\nN:last;first;;;\r\n"); + Assert.stringContains(vCard, "\r\nTEL;TYPE=fax;VALUE=TEXT:1234567\r\n"); + Assert.stringContains(vCard, `\r\nUID:${savedCard.UID}\r\n`); + + let modifiedDate = parseInt( + savedCard.getProperty("LastModifiedDate", ""), + 10 + ); + Assert.lessOrEqual(modifiedDate, Date.now() / 1000); + Assert.greater(modifiedDate, Date.now() / 1000 - 10); + + Assert.equal(savedCard.displayName, "display name"); + Assert.equal(savedCard.firstName, "first"); + Assert.equal(savedCard.lastName, "last"); + Assert.equal(savedCard.primaryEmail, "primary@email"); + Assert.deepEqual(savedCard.emailAddresses, ["primary@email", "second@email"]); + + Assert.ok(savedCard.supportsVCard); + Assert.ok(savedCard.vCardProperties); + + Assert.deepEqual(savedCard.vCardProperties.getAllValues("fn"), [ + "display name", + ]); + Assert.deepEqual(savedCard.vCardProperties.getAllValues("email"), [ + "primary@email", + "second@email", + ]); + Assert.deepEqual(savedCard.vCardProperties.getAllValues("nickname"), [ + "nick", + ]); + Assert.deepEqual(savedCard.vCardProperties.getAllValues("bday"), [ + "2001-01-01", + ]); + Assert.deepEqual(savedCard.vCardProperties.getAllValues("n"), [ + ["last", "first", "", "", ""], + ]); + Assert.deepEqual(savedCard.vCardProperties.getAllValues("tel"), ["1234567"]); + + book.deleteCards(book.childCards); +} |