summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/addrbook/test/unit/test_nsAbAutoCompleteSearch4.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/addrbook/test/unit/test_nsAbAutoCompleteSearch4.js')
-rw-r--r--comm/mailnews/addrbook/test/unit/test_nsAbAutoCompleteSearch4.js258
1 files changed, 258 insertions, 0 deletions
diff --git a/comm/mailnews/addrbook/test/unit/test_nsAbAutoCompleteSearch4.js b/comm/mailnews/addrbook/test/unit/test_nsAbAutoCompleteSearch4.js
new file mode 100644
index 0000000000..e1de6f1bbd
--- /dev/null
+++ b/comm/mailnews/addrbook/test/unit/test_nsAbAutoCompleteSearch4.js
@@ -0,0 +1,258 @@
+/*
+ * Fourth Test suite for nsAbAutoCompleteSearch - test for second email address.
+ */
+
+var ACR = Ci.nsIAutoCompleteResult;
+
+var cards = [
+ // Basic tests for primary and secondary emails.
+ {
+ email: "primary@test.invalid",
+ secondEmail: "second@test.invalid",
+ firstName: "",
+ },
+ {
+ email: "test1@test.invalid",
+ secondEmail: "test2@test.invalid",
+ firstName: "firstName",
+ },
+ {
+ email: "bar1@test.invalid",
+ secondEmail: "bar2@test.invalid",
+ firstName: "sweet",
+ },
+ {
+ email: "boo1@test.invalid",
+ secondEmail: "boo2@test.invalid",
+ firstName: "sample",
+ },
+ {
+ email: "name@test.invalid",
+ secondEmail: "thename@test.invalid",
+ firstName: "thename",
+ },
+ // Test to check correct sorting of primary and secondary emails.
+ {
+ email: "foo_b@test.invalid",
+ secondEmail: "foo_a@test.invalid",
+ displayName: "sortbasic",
+ },
+ {
+ email: "d@test.invalid",
+ secondEmail: "e@test.invalid",
+ displayName: "testsort",
+ },
+ {
+ email: "c@test.invalid",
+ secondEmail: "a@test.invalid",
+ displayName: "testsort",
+ },
+ // "2testsort" does the same as "testsort" but turns the cards around to
+ // ensure the order is always consistent.
+ {
+ email: "c@test.invalid",
+ secondEmail: "a@test.invalid",
+ displayName: "2testsort",
+ },
+ {
+ email: "d@test.invalid",
+ secondEmail: "e@test.invalid",
+ displayName: "2testsort",
+ },
+ {
+ email: "g@test.invalid",
+ secondEmail: "f@test.invalid",
+ displayName: "3testsort",
+ popularityIndex: 3,
+ },
+ {
+ email: "j@test.invalid",
+ secondEmail: "h@test.invalid",
+ displayName: "3testsort",
+ popularityIndex: 5,
+ },
+ // Add a contact that matches, but has no email. Should not show up.
+ { displayName: "primaryX" },
+];
+
+// These are for the initial search
+var searches = [
+ "primary",
+ "second",
+ "firstName",
+ "thename",
+ "sortbasic",
+ "testsort",
+ "2testsort",
+ "3testsort",
+];
+
+var expectedResults = [
+ ["primary@test.invalid", "second@test.invalid"], // searching for primary/second returns
+ [
+ "second@test.invalid", // both the emails as the new search query
+ "primary@test.invalid",
+ ], // looks in both the fields.
+ ["test1@test.invalid", "test2@test.invalid"],
+ ["thename@test.invalid", "name@test.invalid"],
+ ["sortbasic <foo_b@test.invalid>", "sortbasic <foo_a@test.invalid>"],
+ [
+ "testsort <c@test.invalid>",
+ "testsort <a@test.invalid>",
+ "testsort <d@test.invalid>",
+ "testsort <e@test.invalid>",
+ "3testsort <j@test.invalid>",
+ "3testsort <h@test.invalid>",
+ "3testsort <g@test.invalid>",
+ "3testsort <f@test.invalid>",
+ "2testsort <c@test.invalid>",
+ "2testsort <a@test.invalid>",
+ "2testsort <d@test.invalid>",
+ "2testsort <e@test.invalid>",
+ ],
+ [
+ "2testsort <c@test.invalid>",
+ "2testsort <a@test.invalid>",
+ "2testsort <d@test.invalid>",
+ "2testsort <e@test.invalid>",
+ ],
+ [
+ "3testsort <j@test.invalid>",
+ "3testsort <h@test.invalid>",
+ "3testsort <g@test.invalid>",
+ "3testsort <f@test.invalid>",
+ ],
+];
+
+// These are for subsequent searches - reducing the number of results.
+var reductionSearches = ["b", "bo", "boo2"];
+
+var reductionExpectedResults = [
+ [
+ "bar1@test.invalid",
+ "bar2@test.invalid",
+ "boo1@test.invalid",
+ "boo2@test.invalid",
+ "sortbasic <foo_b@test.invalid>",
+ "sortbasic <foo_a@test.invalid>",
+ ],
+ ["boo1@test.invalid", "boo2@test.invalid"],
+ ["boo2@test.invalid"],
+];
+
+add_task(async () => {
+ // We set up the cards for this test manually as it is easier to set the
+ // popularity index and we don't need many.
+
+ // Ensure all the directories are initialised.
+ MailServices.ab.directories;
+
+ let ab = MailServices.ab.getDirectory(kPABData.URI);
+
+ function createAndAddCard(element) {
+ var card = Cc["@mozilla.org/addressbook/cardproperty;1"].createInstance(
+ Ci.nsIAbCard
+ );
+
+ card.primaryEmail = element.email;
+ if ("secondEmail" in element) {
+ card.setProperty("SecondEmail", element.secondEmail);
+ }
+ card.displayName = element.displayName;
+ if ("popularityIndex" in element) {
+ card.setProperty("PopularityIndex", element.popularityIndex);
+ }
+ card.firstName = element.firstName;
+
+ ab.addCard(card);
+ }
+
+ cards.forEach(createAndAddCard);
+
+ var acs = Cc["@mozilla.org/autocomplete/search;1?name=addrbook"].getService(
+ Ci.nsIAutoCompleteSearch
+ );
+
+ var obs = new acObserver();
+
+ print("Checking Initial Searches");
+
+ async function checkSearch(element, index) {
+ print("Search #" + index + ": search=" + element);
+ let resultPromise = obs.waitForResult();
+ acs.startSearch(
+ element,
+ JSON.stringify({ type: "addr_to", idKey: "" }),
+ null,
+ obs
+ );
+ await resultPromise;
+
+ for (let i = 0; i < obs._result.matchCount; i++) {
+ print("... got " + i + ": " + obs._result.getValueAt(i));
+ }
+
+ Assert.equal(obs._search, acs);
+ Assert.equal(obs._result.searchString, element);
+ Assert.equal(obs._result.searchResult, ACR.RESULT_SUCCESS);
+ Assert.equal(obs._result.errorDescription, null);
+ Assert.equal(obs._result.matchCount, expectedResults[index].length);
+
+ for (let i = 0; i < expectedResults[index].length; ++i) {
+ Assert.equal(obs._result.getValueAt(i), expectedResults[index][i]);
+ Assert.equal(obs._result.getLabelAt(i), expectedResults[index][i]);
+ Assert.equal(obs._result.getCommentAt(i), "");
+ Assert.equal(obs._result.getStyleAt(i), "local-abook");
+ Assert.equal(obs._result.getImageAt(i), "");
+ obs._result.QueryInterface(Ci.nsIAbAutoCompleteResult);
+ }
+ }
+
+ for (let i = 0; i < searches.length; i++) {
+ await checkSearch(searches[i], i);
+ }
+
+ print("Checking Reduction of Search Results");
+
+ var lastResult = null;
+
+ async function checkReductionSearch(element, index) {
+ let resultPromise = obs.waitForResult();
+ acs.startSearch(
+ element,
+ JSON.stringify({ type: "addr_to", idKey: "" }),
+ lastResult,
+ obs
+ );
+ await resultPromise;
+
+ Assert.equal(obs._search, acs);
+ Assert.equal(obs._result.searchString, element);
+ Assert.equal(obs._result.searchResult, ACR.RESULT_SUCCESS);
+ Assert.equal(obs._result.errorDescription, null);
+ Assert.equal(
+ obs._result.matchCount,
+ reductionExpectedResults[index].length
+ );
+
+ for (var i = 0; i < reductionExpectedResults[index].length; ++i) {
+ Assert.equal(
+ obs._result.getValueAt(i),
+ reductionExpectedResults[index][i]
+ );
+ Assert.equal(
+ obs._result.getLabelAt(i),
+ reductionExpectedResults[index][i]
+ );
+ Assert.equal(obs._result.getCommentAt(i), "");
+ Assert.equal(obs._result.getStyleAt(i), "local-abook");
+ Assert.equal(obs._result.getImageAt(i), "");
+ obs._result.QueryInterface(Ci.nsIAbAutoCompleteResult);
+ }
+ lastResult = obs._result;
+ }
+
+ for (let i = 0; i < reductionSearches.length; i++) {
+ await checkReductionSearch(reductionSearches[i], i);
+ }
+});