diff options
Diffstat (limited to 'comm/mailnews/addrbook/test/unit/test_nsAbAutoCompleteSearch2.js')
-rw-r--r-- | comm/mailnews/addrbook/test/unit/test_nsAbAutoCompleteSearch2.js | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/comm/mailnews/addrbook/test/unit/test_nsAbAutoCompleteSearch2.js b/comm/mailnews/addrbook/test/unit/test_nsAbAutoCompleteSearch2.js new file mode 100644 index 0000000000..b2dafd41e8 --- /dev/null +++ b/comm/mailnews/addrbook/test/unit/test_nsAbAutoCompleteSearch2.js @@ -0,0 +1,194 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* + * Second Test suite for nsAbAutoCompleteSearch - test follow-on lookup after + * a previous search. + * + * We run this test without address books, constructing manually ourselves, + * so that we can ensure that we're not getting the data out of the address + * books. + */ + +var { getModelQuery } = ChromeUtils.import( + "resource:///modules/ABQueryUtils.jsm" +); + +// taken from nsAbAutoCompleteSearch.js +var ACR = Ci.nsIAutoCompleteResult; +var nsIAbAutoCompleteResult = Ci.nsIAbAutoCompleteResult; + +function nsAbAutoCompleteResult(aSearchString) { + // Can't create this in the prototype as we'd get the same array for + // all instances + this._searchResults = []; + this.searchString = aSearchString; + this.modelQuery = getModelQuery("mail.addr_book.autocompletequery.format"); + this.asyncDirectories = []; +} + +nsAbAutoCompleteResult.prototype = { + _searchResults: null, + + // nsIAutoCompleteResult + + modelQuery: null, + searchString: null, + searchResult: ACR.RESULT_NOMATCH, + defaultIndex: -1, + errorDescription: null, + + get matchCount() { + return this._searchResults.length; + }, + + getValueAt: function getValueAt(aIndex) { + return this._searchResults[aIndex].value; + }, + + getLabelAt: function getLabelAt(aIndex) { + return this.getValueAt(aIndex); + }, + + getCommentAt: function getCommentAt(aIndex) { + return this._searchResults[aIndex].comment; + }, + + getStyleAt: function getStyleAt(aIndex) { + return "local-abook"; + }, + + getImageAt: function getImageAt(aIndex) { + return ""; + }, + + getFinalCompleteValueAt(aIndex) { + return this.getValueAt(aIndex); + }, + + removeValueAt: function removeValueAt(aRowIndex, aRemoveFromDB) {}, + + // nsIAbAutoCompleteResult + + getCardAt: function getCardAt(aIndex) { + return this._searchResults[aIndex].card; + }, + + getEmailToUse: function getEmailToUse(aIndex) { + // For this test we can just use the primary email here. + return this._searchResults[aIndex].card.primaryEmail; + }, + + isCompleteResult: function isCompleteResult(aIndex) { + // For this test we claim all results are complete. + return true; + }, + + // nsISupports + + QueryInterface: ChromeUtils.generateQI([ + "nsIAutoCompleteResult", + "nsIAbAutoCompleteResult", + ]), +}; + +function createCard(chars, popularity) { + var card = Cc["@mozilla.org/addressbook/cardproperty;1"].createInstance( + Ci.nsIAbCard + ); + + card.firstName = "firstName".slice(0, chars); + card.lastName = "lastName".slice(0, chars); + card.displayName = "displayName".slice(0, chars); + card.primaryEmail = "email".slice(0, chars) + "@foo.invalid"; + card.setProperty("NickName", "nickName".slice(0, chars)); + + return card; +} + +var results = [ + { email: "d <e@foo.invalid>", dirName: kPABData.dirName }, + { email: "di <em@foo.invalid>", dirName: kPABData.dirName }, + { email: "dis <ema@foo.invalid>", dirName: kPABData.dirName }, +]; + +var firstNames = [ + { search: "fi", expected: [1, 2] }, + { search: "fir", expected: [2] }, +]; + +var lastNames = [ + { search: "la", expected: [1, 2] }, + { search: "las", expected: [2] }, +]; + +var inputs = [firstNames, lastNames]; + +add_task(async () => { + // Test - Create a new search component + + var acs = Cc["@mozilla.org/autocomplete/search;1?name=addrbook"].getService( + Ci.nsIAutoCompleteSearch + ); + + var obs = new acObserver(); + + // Ensure we've got the comment column set up for extra checking. + Services.prefs.setIntPref("mail.autoComplete.commentColumn", 1); + + // Make up the last autocomplete result + var lastResult = new nsAbAutoCompleteResult(); + + lastResult.searchString = ""; + lastResult.searchResult = ACR.RESULT_SUCCESS; + lastResult.defaultIndex = 0; + lastResult.errorDescription = null; + for (let i = 0; i < results.length; ++i) { + lastResult._searchResults.push({ + value: results[i].email, + comment: results[i].dirName, + card: createCard(i + 1, 0), + }); + } + + // Test - Matches + + // Now check multiple matches + async function checkInputItem(element, index) { + let resultPromise = obs.waitForResult(); + acs.startSearch( + element.search, + JSON.stringify({ type: "addr_to", idKey: "" }), + lastResult, + obs + ); + await resultPromise; + + Assert.equal(obs._search, acs); + Assert.equal(obs._result.searchString, element.search); + Assert.equal(obs._result.searchResult, ACR.RESULT_SUCCESS); + Assert.equal(obs._result.errorDescription, null); + Assert.equal(obs._result.matchCount, element.expected.length); + + for (let i = 0; i < element.expected.length; ++i) { + Assert.equal( + obs._result.getValueAt(i), + results[element.expected[i]].email + ); + Assert.equal( + obs._result.getLabelAt(i), + results[element.expected[i]].email + ); + Assert.equal( + obs._result.getCommentAt(i), + results[element.expected[i]].dirName + ); + Assert.equal(obs._result.getStyleAt(i), "local-abook"); + Assert.equal(obs._result.getImageAt(i), ""); + } + } + + for (let inputSet of inputs) { + for (let i = 0; i < inputSet.length; i++) { + await checkInputItem(inputSet[i], i); + } + } +}); |