diff options
Diffstat (limited to 'comm/mailnews/import/test/unit/test_AddrBookFileImporter.js')
-rw-r--r-- | comm/mailnews/import/test/unit/test_AddrBookFileImporter.js | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/comm/mailnews/import/test/unit/test_AddrBookFileImporter.js b/comm/mailnews/import/test/unit/test_AddrBookFileImporter.js new file mode 100644 index 0000000000..2ba696d1ed --- /dev/null +++ b/comm/mailnews/import/test/unit/test_AddrBookFileImporter.js @@ -0,0 +1,130 @@ +/* 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 https://mozilla.org/MPL/2.0/. */ + +var { AddrBookFileImporter } = ChromeUtils.import( + "resource:///modules/AddrBookFileImporter.jsm" +); + +/** + * Create a temporary address book, import a source file into it, then test the + * cards are correct. + * + * @param {string} type - A source file type supported by AddrBookFileImporter. + * @param {string} filePath - The path of a source file. + * @param {string} refDataKey - The key of an object in addressbook.json. + * @param {string[]} [csvFieldMap] - Map of CSV fields to address book fields. + */ +async function test_importAbFile(type, filePath, refDataKey, csvFieldMap) { + // Create an address book and init the importer. + let dirId = MailServices.ab.newAddressBook( + `tmp-${type}`, + "", + Ci.nsIAbManager.JS_DIRECTORY_TYPE + ); + let targetDir = MailServices.ab.getDirectoryFromId(dirId); + let importer = new AddrBookFileImporter(type); + + // Start importing. + let sourceFile = do_get_file(filePath); + if (type == "csv") { + let unmatched = await importer.parseCsvFile(sourceFile); + if (unmatched.length) { + importer.setCsvFields(csvFieldMap); + } + } + await importer.startImport(sourceFile, targetDir); + + // Read in the reference data. + let refFile = do_get_file("resources/addressbook.json"); + let refData = JSON.parse(await IOUtils.readUTF8(refFile.path))[refDataKey]; + + // Compare with the reference data. + for (let i = 0; i < refData.length; i++) { + let card = targetDir.childCards[i]; + for (let [key, value] of Object.entries(refData[i])) { + if (key == "LastModifiedDate") { + continue; + } + if (key == "_vCard") { + equal( + card + .getProperty(key, "") + .replace( + /UID:[a-f0-9-]{36}/i, + "UID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + ), + `BEGIN:VCARD\r\n${value.join("\r\n")}\r\nEND:VCARD\r\n`, + "_vCard should be correct" + ); + } else { + equal(card.getProperty(key, ""), value, `${key} should be correct`); + } + } + } +} + +/** Test importing .csv file works. */ +add_task(async function test_importCsvFile() { + // A comma separated file. + await test_importAbFile( + "csv", + "resources/basic_csv_addressbook.csv", + "csv_import" + ); + + // A semicolon separated file. + await test_importAbFile("csv", "resources/csv_semicolon.csv", "csv_import"); + + // A comma separated file without header row. + Services.prefs.setBoolPref("mail.import.csv.skipfirstrow", false); + await test_importAbFile("csv", "resources/csv_no_header.csv", "csv_import", [ + 2, // DisplayName + 0, // FirstName + 1, // LastName + 4, // PrimaryEmail + ]); + Services.prefs.clearUserPref("mail.import.csv.skipfirstrow"); + + // A comma separated file with some fields containing quotes. + await test_importAbFile("csv", "resources/quote.csv", "quote_csv"); + + // Non-UTF8 csv file. + await test_importAbFile( + "csv", + "resources/shiftjis_addressbook.csv", + "shiftjis_csv" + ); + await test_importAbFile( + "csv", + "resources/utf16_addressbook.csv", + "utf16_csv" + ); +}); + +/** Test importing .vcf file works. */ +add_task(async function test_importVCardFile() { + return test_importAbFile( + "vcard", + "resources/basic_vcard_addressbook.vcf", + "vcard_import" + ); +}); + +/** Test importing .vcf file with \r\r\n as line breaks works. */ +add_task(async function test_importDosVCardFile() { + return test_importAbFile( + "vcard", + "resources/dos_vcard_addressbook.vcf", + "dos_vcard_import" + ); +}); + +/** Test importing .ldif file works. */ +add_task(async function test_importLdifFile() { + return test_importAbFile( + "ldif", + "resources/basic_ldif_addressbook.ldif", + "basic_addressbook" + ); +}); |