Extract people.filter_people_by_search_terms()

This code used to be in subs.js, but now it's in people.js and has
some unit tests.

I did this w/showell as part of live coding on Zulip.
This commit is contained in:
sonali0901 2016-10-18 22:51:38 +05:30 committed by Tim Abbott
parent bca1953aa4
commit 1bc7990327
3 changed files with 75 additions and 19 deletions

View File

@ -17,6 +17,8 @@ set_global('admin', {
show_or_hide_menu_item: function () {}
});
var _ = global._;
(function test_basics() {
var orig_person = {
email: 'orig@example.com',
@ -123,4 +125,46 @@ set_global('admin', {
{ email: 'bob@example.com', full_name: 'Bob van Roberts' }
];
assert.deepEqual(others, expected);
people.remove(alice1);
people.remove(alice2);
people.remove(bob);
}());
(function test_filtered_users() {
var charles = {
email: 'charles@example.com',
full_name: 'Charles Dickens'
};
var maria = {
email: 'athens@example.com',
full_name: 'Maria Athens'
};
var ashton = {
email: 'ashton@example.com',
full_name: 'Ashton Smith'
};
people.add_in_realm(charles);
people.add_in_realm(maria);
people.add_in_realm(ashton);
var search_term = 'a';
var users = people.get_rest_of_realm();
var filtered_people = people.filter_people_by_search_terms(users, search_term);
var expected = [
{ email: 'athens@example.com', full_name: 'Maria Athens' },
{ email: 'ashton@example.com', full_name: 'Ashton Smith' }
];
assert.equal(filtered_people["ashton@example.com"], true);
assert.equal(filtered_people["athens@example.com"], true);
assert.equal(_.keys(filtered_people).length, 2);
assert(!_.has(filtered_people, 'charles@example.com'));
search_term = '';
filtered_people = people.filter_people_by_search_terms(users, search_term);
assert(_.isEmpty(filtered_people));
people.remove(charles);
people.remove(maria);
people.remove(ashton);
}());

View File

@ -17,6 +17,36 @@ exports.realm_get = function realm_get(email) {
return realm_people_dict.get(email);
};
exports.filter_people_by_search_terms = function (users, search_terms) {
var filtered_users = {};
// Loop through users and populate filtered_users only
// if they include search_terms
_.each(users, function (user) {
var person = exports.get_by_email(user.email);
// Get person object (and ignore errors)
if (!person || !person.full_name) {
return;
}
// Remove extra whitespace
var names = person.full_name.toLowerCase().split(/\s+/);
names = _.map(names, function (name) {
return name.trim();
});
// Return user emails that include search terms
return _.any(search_terms, function (search_term) {
return _.any(names, function (name) {
if (name.indexOf(search_term.trim()) === 0) {
filtered_users[user.email] = true;
}
});
});
});
return filtered_users;
};
exports.get_by_name = function realm_get(name) {
return people_by_name_dict.get(name);
};

View File

@ -695,25 +695,7 @@ $(function () {
}
var search_term = user_list.expectOne().val().trim();
var search_terms = search_term.toLowerCase().split(",");
var filtered_users = {};
_.each(users, function (user) {
var person = people.get_by_email(user.email);
if (!person || !person.full_name) {
return;
}
var names = person.full_name.toLowerCase().split(/\s+/);
names = _.map(names, function (s) {
return s.trim();
});
return _.any(search_terms, function (search_term) {
return _.any(names, function (name) {
if (name.indexOf(search_term.trim()) === 0) {
filtered_users[user.email] = true;
}
});
});
});
var filtered_users = people.filter_people_by_search_terms(users, search_terms);
// Hide users which aren't in filtered users
_.each(users, function (user) {