summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/import/test/unit/test_AddrBookFileImporter.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/import/test/unit/test_AddrBookFileImporter.js')
-rw-r--r--comm/mailnews/import/test/unit/test_AddrBookFileImporter.js130
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"
+ );
+});