diff options
Diffstat (limited to 'comm/mailnews/addrbook/test/unit/test_nsAbAutoCompleteSearch4.js')
-rw-r--r-- | comm/mailnews/addrbook/test/unit/test_nsAbAutoCompleteSearch4.js | 258 |
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); + } +}); |