diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb index 25fcdf2af..4c186569f 100644 --- a/app/controllers/people_controller.rb +++ b/app/controllers/people_controller.rb @@ -2,7 +2,13 @@ class PeopleController < ApplicationController before_filter :authenticate_user! def index - @people = Person.friends.paginate :page => params[:page], :order => 'created_at DESC' + unless params[:q] + @people = Person.friends.paginate :page => params[:page], :order => 'created_at DESC' + render :index + else + @people = Person.search_for_friends(params[:q]) + render :xml => @people + end end def show diff --git a/app/models/person.rb b/app/models/person.rb index bc6e586ec..ee7ad104f 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -30,9 +30,11 @@ class Person after_destroy :remove_all_traces - scope :friends, where(:_type => "Person", :active => true) - - + scope :friends, where(:_type => "Person", :active => true) + + def self.search_for_friends(query) + Person.all('$where' => "function() { return this.profile.first_name.match(/^#{query}/i) || this.profile.last_name.match(/^#{query}/i); }") + end def real_name "#{profile.first_name.to_s} #{profile.last_name.to_s}" diff --git a/spec/controllers/people_controller_spec.rb b/spec/controllers/people_controller_spec.rb new file mode 100644 index 000000000..f0cea0279 --- /dev/null +++ b/spec/controllers/people_controller_spec.rb @@ -0,0 +1,61 @@ +require File.dirname(__FILE__) + '/../spec_helper' + +describe PeopleController do + render_views + before do + @user = Factory.create(:user, :profile => Profile.new( :first_name => "bob", :last_name => "smith")) + request.env['warden'] = mock_model(Warden, :authenticate? => @user, :authenticate! => @user, :authenticate => @user) + + sign_in :user, @user + end + + it "index should yield search results for substring of person name" do + friend_one = Factory.create(:person) + friend_two = Factory.create(:person) + friend_three = Factory.create(:person) + friend_four = Factory.create(:person) + + friend_one.profile.first_name = "Robert" + friend_one.profile.last_name = "Grimm" + friend_one.profile.save + + friend_two.profile.first_name = "Eugene" + friend_two.profile.last_name = "Weinstein" + friend_two.save + + friend_three.profile.first_name = "Yevgeniy" + friend_three.profile.last_name = "Dodis" + friend_three.save + + friend_four.profile.first_name = "Casey" + friend_four.profile.last_name = "Grippi" + friend_four.save + + + puts Person.friends.count + + get :index, :q => "Eu" + + + assigns[:people].include?(friend_two).should == true + assigns[:people].include?(friend_one).should == false + assigns[:people].include?(friend_three).should == false + assigns[:people].include?(friend_four).should == false + + get :index, :q => "Wei" + assigns[:people].include?(friend_two).should == true + assigns[:people].include?(friend_one).should == false + assigns[:people].include?(friend_three).should == false + assigns[:people].include?(friend_four).should == false + + get :index, :q => "Gri" + assigns[:people].include?(friend_one).should == true + assigns[:people].include?(friend_four).should == true + assigns[:people].include?(friend_two).should == false + assigns[:people].include?(friend_three).should == false + + get :index + assigns[:people].should == Person.friends.all + end + +end