added tests for new_musicians

This commit is contained in:
Scott Comer 2014-05-26 14:16:01 -05:00
parent 918d65cd92
commit 7446898071
3 changed files with 140 additions and 50 deletions

View File

@ -292,12 +292,24 @@ module JamRuby
end end
def self.new_musicians(usr, since_date) def self.new_musicians(usr, since_date)
# todo scott turn this into score .within(radius, :origin => [usr.lat, usr.lng]) # this attempts to find interesting musicians to tell another musician about where interesting
# is "has a good score and was created recently"
# we're sort of depending upon usr being a musicians_geocoded as well...
# this appears to only be called from EmailBatchNewMusician#deliver_batch_sets! which is
# an offline process and thus uses the last jam location as "home base"
rel = User.musicians locidispid = usr.last_jam_locidispid
score_limit = 60
limit = 50
rel = User.musicians_geocoded
.where(['created_at >= ? AND users.id != ?', since_date, usr.id]) .where(['created_at >= ? AND users.id != ?', since_date, usr.id])
.order('created_at DESC') .joins('inner join scores on users.last_jam_locidispid = scores.alocidispid')
.limit(50) .where(['scores.blocidispid = ?', locidispid])
.where(['scores.score <= ?', score_limit])
.order('scores.score') # best scores first
.order('users.created_at DESC') # then most recent
.limit(limit)
objs = rel.all.to_a objs = rel.all.to_a

View File

@ -140,8 +140,8 @@ module JamRuby
scope :musicians, where(:musician => true) scope :musicians, where(:musician => true)
scope :fans, where(:musician => false) scope :fans, where(:musician => false)
# todo scott someone with locidispid - scope :geocoded_users, where(['lat IS NOT NULL AND lng IS NOT NULL']) scope :geocoded_users, where(['last_jam_locidispid IS NOT NULL'])
# todo scott geocoded_users that are musicians - scope :musicians_geocoded, musicians.geocoded_users scope :musicians_geocoded, musicians.geocoded_users
scope :email_opt_in, where(:subscribe_email => true) scope :email_opt_in, where(:subscribe_email => true)
def user_progression_fields def user_progression_fields
@ -1177,12 +1177,12 @@ module JamRuby
def self.deliver_new_musician_notifications(since_date=nil) def self.deliver_new_musician_notifications(since_date=nil)
since_date ||= Time.now-1.week since_date ||= Time.now-1.week
# todo scott return musicians with locidispid not null # return musicians with locidispid not null
# self.geocoded_users.find_each do |usr| self.musicians_geocoded.find_each do |usr|
# Search.new_musicians(usr, since_date) do |new_nearby| Search.new_musicians(usr, since_date) do |new_nearby|
# UserMailer.new_musicians(usr, new_nearby).deliver UserMailer.new_musicians(usr, new_nearby).deliver
# end end
# end end
end end
def facebook_invite! def facebook_invite!

View File

@ -5,29 +5,94 @@ describe 'Musician search' do
before(:each) do before(:each) do
# @geocode1 = FactoryGirl.create(:geocoder) # @geocode1 = FactoryGirl.create(:geocoder)
# @geocode2 = FactoryGirl.create(:geocoder) # @geocode2 = FactoryGirl.create(:geocoder)
@users = [] t = Time.now - 10.minute
@users << @user1 = FactoryGirl.create(:user)
@users << @user2 = FactoryGirl.create(:user) @user1 = FactoryGirl.create(:user, created_at: t+1.minute, last_jam_locidispid: 1)
@users << @user3 = FactoryGirl.create(:user) @user2 = FactoryGirl.create(:user, created_at: t+2.minute, last_jam_locidispid: 2)
@users << @user4 = FactoryGirl.create(:user) @user3 = FactoryGirl.create(:user, created_at: t+3.minute, last_jam_locidispid: 3)
@user4 = FactoryGirl.create(:user, created_at: t+4.minute, last_jam_locidispid: 4)
@user5 = FactoryGirl.create(:user, created_at: t+5.minute, last_jam_locidispid: 5)
@user6 = FactoryGirl.create(:user, created_at: t+6.minute) # not geocoded
@user7 = FactoryGirl.create(:user, created_at: t+7.minute, musician: false) # not musician
@musicians = []
@musicians << @user1
@musicians << @user2
@musicians << @user3
@musicians << @user4
@musicians << @user5
@musicians << @user6
@geomusicians = []
@geomusicians << @user1
@geomusicians << @user2
@geomusicians << @user3
@geomusicians << @user4
@geomusicians << @user5
Score.delete_all
Score.createx(1, 'a', 1, 1, 'a', 1, 10)
Score.createx(1, 'a', 1, 2, 'b', 2, 20)
Score.createx(1, 'a', 1, 3, 'c', 3, 30)
Score.createx(1, 'a', 1, 4, 'd', 4, 40)
Score.createx(2, 'b', 2, 3, 'c', 3, 15)
Score.createx(2, 'b', 2, 4, 'd', 4, 70)
end end
context 'default filter settings' do context 'default filter settings' do
it "finds all musicians" do it "finds all musicians" do
# expects all the users # expects all the musicians
num = User.musicians.count results = Search.musician_filter
results = Search.musician_filter({ :per_page => num }) results.search_type.should == :musicians_filter
expect(results.results.count).to eq(num) results.results.count.should == @musicians.length
expect(results.search_type).to be(:musicians_filter) results.results.should eq @musicians.reverse
end
it "finds all musicians page 1" do
# expects all the musicians
results = Search.musician_filter({page: 1})
results.search_type.should == :musicians_filter
results.results.count.should == @musicians.length
results.results.should eq @musicians.reverse
end
it "finds all musicians page 2" do
# expects no musicians (all fit on page 1)
results = Search.musician_filter({page: 2})
results.search_type.should == :musicians_filter
results.results.count.should == 0
end
it "finds all musicians page 1 per_page 3" do
# expects three of the musicians
results = Search.musician_filter({per_page: 3})
results.search_type.should == :musicians_filter
results.results.count.should == 3
results.results.should eq @musicians.reverse.slice(0, 3)
end
it "finds all musicians page 2 per_page 3" do
# expects two of the musicians
results = Search.musician_filter({page: 2, per_page: 3})
results.search_type.should == :musicians_filter
results.results.count.should == 3
results.results.should eq @musicians.reverse.slice(3, 3)
end
it "finds all musicians page 3 per_page 3" do
# expects two of the musicians
results = Search.musician_filter({page: 3, per_page: 3})
results.search_type.should == :musicians_filter
results.results.count.should == 0
end end
it "finds musicians with proper ordering" do it "finds musicians with proper ordering" do
# the ordering should be create_at since no followers exist # the ordering should be create_at desc since no followers exist
expect(Follow.count).to eq(0) expect(Follow.count).to eq(0)
results = Search.musician_filter({ :per_page => User.musicians.count }) results = Search.musician_filter({ :per_page => User.musicians.count })
results.results.each_with_index do |uu, idx| results.results.each_with_index do |uu, idx|
expect(uu.id).to eq(@users.reverse[idx].id) expect(uu.id).to eq(@musicians.reverse[idx].id)
end end
end end
@ -90,7 +155,7 @@ describe 'Musician search' do
f3.save f3.save
# @user2.followers.concat([@user3, @user4, @user2]) # @user2.followers.concat([@user3, @user4, @user2])
results = Search.musician_filter({ :per_page => @users.size }, @user3) results = Search.musician_filter({ :per_page => @musicians.size }, @user3)
expect(results.results[0].id).to eq(@user2.id) expect(results.results[0].id).to eq(@user2.id)
# check the follower count for given entry # check the follower count for given entry
@ -154,8 +219,8 @@ describe 'Musician search' do
# @user4.followers.concat([@user4]) # @user4.followers.concat([@user4])
# @user3.followers.concat([@user4]) # @user3.followers.concat([@user4])
# @user2.followers.concat([@user4]) # @user2.followers.concat([@user4])
expect(@user4.top_followings.count).to be 3 expect(@user4.top_followings.count).to eq 3
expect(@user4.top_followings.map(&:id)).to match_array((@users - [@user1]).map(&:id)) expect(@user4.top_followings.map(&:id)).to match_array((@musicians - [@user1, @user5, @user6]).map(&:id))
end end
it "friends stat shows friend count" do it "friends stat shows friend count" do
@ -275,30 +340,43 @@ describe 'Musician search' do
context 'new users' do context 'new users' do
it "find nearby" do it "find three for user1" do
pending 'todo scott fix this test so it does something' # user2..4 are scored against user1
# create new user outside 500 from Apex to ensure its excluded from results ms = Search.new_musicians(@user1, Time.now - 1.week)
FactoryGirl.create(:user, {city: "Austin", state: "TX", country: "US"}) ms.should_not be_nil
User.geocoded_users.find_each do |usr| ms.length.should == 3
Search.new_musicians(usr, Time.now - 1.week) do |new_usrs| ms.should eq [@user2, @user3, @user4]
# the newly created user is not nearby the existing users (which are in Apex, NC)
# and that user is not included in query
expect(new_usrs.count).to eq(User.musicians.count - 1)
end
end
end end
it "sends new musician email" do it "find two for user2" do
pending 'todo scott fix this test so it does something' # user1,3,4 are scored against user1, but user4 is bad
# create new user outside 500 from Apex to ensure its excluded from results ms = Search.new_musicians(@user2, Time.now - 1.week)
FactoryGirl.create(:user, {city: "Austin", state: "TX", country: "US"}) ms.should_not be_nil
User.geocoded_users.find_each do |usr| ms.length.should == 2
Search.new_musicians(usr, Time.now - 1.week) do |new_usrs| ms.should eq [@user3, @user1]
# the newly created user is not nearby the existing users (which are in Apex, NC) end
# and that user is not included in query
expect(new_usrs.count).to eq(User.musicians.count - 1) it "find two for user3" do
end # user1..2 are scored against user3
end ms = Search.new_musicians(@user3, Time.now - 1.week)
ms.should_not be_nil
ms.length.should == 2
ms.should eq [@user2, @user1]
end
it "find one for user4" do
# user1..2 are scored against user4, but user2 is bad
ms = Search.new_musicians(@user4, Time.now - 1.week)
ms.should_not be_nil
ms.length.should == 1
ms.should eq [@user1]
end
it "find none for user5" do
# user1..4 are not scored against user5
ms = Search.new_musicians(@user5, Time.now - 1.week)
ms.should_not be_nil
ms.length.should == 0
end end
end end