Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
204 lines
6.4 KiB
JavaScript
Executable file
204 lines
6.4 KiB
JavaScript
Executable file
'use strict';
|
|
/* global Search, MockSearchHtml, Normalizer, MockSearchSource, MocksHelper */
|
|
|
|
requireApp('communications/contacts/test/unit/mock_search.html.js');
|
|
requireApp('communications/contacts/test/unit/mock_search_source.js');
|
|
require('/shared/js/text_normalizer.js');
|
|
require('/shared/js/contacts/utilities/event_listeners.js');
|
|
require('/shared/js/contacts/utilities/image_loader.js');
|
|
require('/shared/js/lazy_loader.js');
|
|
require('/shared/js/contacts/utilities/dom.js');
|
|
require('/shared/js/utilities.js');
|
|
requireApp('communications/contacts/test/unit/mock_navigation.js');
|
|
requireApp('communications/contacts/test/unit/mock_main_navigation.js');
|
|
|
|
require('/contacts/js/fb_resolver.js');
|
|
|
|
new MocksHelper([
|
|
'MainNavigation'
|
|
]).init();
|
|
|
|
require('/shared/js/contacts/search.js');
|
|
|
|
suite('Search mode', function() {
|
|
var searchBox, searchList, noResults;
|
|
var contact = {
|
|
id: 'b1ae8e148bd14560aaa9d7265bb39b0f',
|
|
givenName: ['Aaeéií(") BC'],
|
|
familyName: ['Surname'],
|
|
tel: [{ value:'555555555'}]
|
|
};
|
|
|
|
function assertContactFound(contactUuid, expectedContacts) {
|
|
var selectorStr = 'section#groups-list-search li.contact-item';
|
|
var contacts = document.querySelectorAll(selectorStr);
|
|
assert.isTrue(noResults.classList.contains('hide'));
|
|
assert.lengthOf(contacts, expectedContacts, 'The number of contacts' +
|
|
' retrieved is different from what is expected');
|
|
|
|
assert.isFalse(contacts[0] === null, 'The search returned no contacts');
|
|
|
|
var contactFound = false;
|
|
for (var i = 0, len = contacts.length; i < len; i++) {
|
|
if (contacts[i].dataset.uuid == contactUuid) {
|
|
contactFound = true;
|
|
break;
|
|
}
|
|
}
|
|
assert.isTrue(contactFound, 'The contact has not been found');
|
|
}
|
|
|
|
suiteSetup(function() {
|
|
document.body.innerHTML = MockSearchHtml;
|
|
|
|
searchList = document.getElementById('search-list');
|
|
noResults = document.getElementById('no-result');
|
|
|
|
searchBox = document.getElementById('search-contact');
|
|
Search.init(MockSearchSource, true, null);
|
|
Search.enterSearchMode({preventDefault: function() {}});
|
|
});
|
|
|
|
teardown(function() {
|
|
Search.invalidateCache();
|
|
});
|
|
|
|
test('Search results are empty', function(done) {
|
|
searchBox.value = 'YYY';
|
|
Search.search(function search_finished() {
|
|
done(function() {
|
|
assert.isFalse(noResults.classList.contains('hide'));
|
|
});
|
|
});
|
|
});
|
|
|
|
test('Search by name & surname with trailing whitespaces', function(done) {
|
|
searchBox.value = contact.givenName[0].substr(0,4) + ' ';
|
|
searchBox.value += contact.familyName[0] + ' ';
|
|
window.Search.search(function search_finished() {
|
|
done(function() {
|
|
assertContactFound(contact.id, 1);
|
|
});
|
|
});
|
|
});
|
|
|
|
test('Search non-alphabetical characters', function(done) {
|
|
searchBox.value = ')';
|
|
Search.search(function search_finished() {
|
|
done(function() {
|
|
assertContactFound(contact.id, 1);
|
|
});
|
|
});
|
|
});
|
|
|
|
test('Search for quotes', function(done) {
|
|
searchBox.value = '"';
|
|
Search.search(function search_finished() {
|
|
done(function() {
|
|
assertContactFound(contact.id, 1);
|
|
});
|
|
});
|
|
});
|
|
|
|
test('Search phone number', function(done) {
|
|
searchBox.value = contact.tel[0].value;
|
|
Search.search(function search_finished() {
|
|
done(function() {
|
|
assertContactFound(contact.id, 1);
|
|
});
|
|
});
|
|
});
|
|
|
|
test('Searching for initials with middle name', function(done) {
|
|
var givenName = contact.givenName[0];
|
|
var middleNameInitial = givenName[givenName.indexOf(' ') + 1];
|
|
searchBox.value = givenName[0] + ' ' + middleNameInitial + ' ' +
|
|
contact.familyName[0][0];
|
|
Search.search(function search_finished() {
|
|
done(function() {
|
|
assertContactFound(contact.id, 1);
|
|
});
|
|
});
|
|
});
|
|
|
|
suite('Highlighting', function() {
|
|
teardown(function() {
|
|
Search.invalidateCache();
|
|
});
|
|
|
|
// With 'strict' set to false, we will only need a single match to pass the
|
|
// test. Otherwise, every highlighted string needs to be equal to 'phrase'.
|
|
function assertHighlight(phrase, strict) {
|
|
var regExp = new RegExp('^' + Normalizer.toAscii(phrase) + '$', 'i'),
|
|
highlightedNodes = searchList.getElementsByTagName('mark');
|
|
|
|
assert.isTrue(highlightedNodes.length > 0);
|
|
|
|
for (var i = 0, l = highlightedNodes.length; i < l; i++) {
|
|
// We want to be non-case-sensitive so simple comparison of strings will
|
|
// not work here. There could also be problems with different languages
|
|
// when using String.toLowerCase(), that's why we use a RegExp.
|
|
var normalized = Normalizer.toAscii(highlightedNodes[i].innerHTML);
|
|
var test = regExp.test(normalized);
|
|
if (strict){
|
|
assert.isTrue(test);
|
|
} else if (test) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (!strict) {
|
|
assert.fail();
|
|
}
|
|
}
|
|
|
|
test('Highlighting does not modify contact text', function(done) {
|
|
searchBox.value = contact.givenName[0][0];
|
|
Search.search(function search_finished() {
|
|
done(function() {
|
|
var selector = '#groups-list-search .contact-item .contact-text';
|
|
assert.equal(contact.givenName[0] + ' ' + contact.familyName[0],
|
|
searchList.querySelector(selector).textContent);
|
|
});
|
|
});
|
|
});
|
|
|
|
test('Correctly highlighted for first char', function(done) {
|
|
searchBox.value = contact.familyName[0][0];
|
|
Search.search(function search_finished() {
|
|
done(function() {
|
|
assertHighlight(contact.familyName[0][0], true);
|
|
});
|
|
});
|
|
});
|
|
|
|
test('Correctly highlighted for more than one letter', function(done) {
|
|
searchBox.value = contact.familyName[0];
|
|
Search.search(function search_finished() {
|
|
done(function() {
|
|
assertHighlight(contact.familyName[0], true);
|
|
});
|
|
});
|
|
});
|
|
|
|
test('Equivalent extended characters are highlighted', function(done) {
|
|
searchBox.value = 'ae';
|
|
Search.search(function search_finished() {
|
|
done(function() {
|
|
assertHighlight('áe', false);
|
|
});
|
|
});
|
|
});
|
|
|
|
test('Accented search term highlights accented and equivalent characters',
|
|
function(done) {
|
|
searchBox.value = 'áe';
|
|
Search.search(function search_finished() {
|
|
done(function() {
|
|
assertHighlight('áe', false);
|
|
assertHighlight('ae', false);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|