235 lines
8.6 KiB
Ruby
235 lines
8.6 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe 'Musician search' do
|
|
|
|
before(:each) do
|
|
@geocode1 = FactoryGirl.create(:geocoder)
|
|
@geocode2 = FactoryGirl.create(:geocoder)
|
|
@users = []
|
|
@users << @user1 = FactoryGirl.create(:user)
|
|
@users << @user2 = FactoryGirl.create(:user)
|
|
@users << @user3 = FactoryGirl.create(:user)
|
|
@users << @user4 = FactoryGirl.create(:user)
|
|
end
|
|
|
|
context 'default filter settings' do
|
|
|
|
it "finds all musicians" do
|
|
# expects all the users
|
|
num = User.musicians.count
|
|
results = Search.musician_search({ :per_page => num })
|
|
expect(results.musicians_filter.count).to eq(num)
|
|
end
|
|
|
|
it "finds musicians with proper ordering" do
|
|
# the ordering should be create_at since no followers exist
|
|
expect(UserFollower.count).to eq(0)
|
|
results = Search.musician_search({ :per_page => User.musicians.count })
|
|
results.musicians_filter.each_with_index do |uu, idx|
|
|
expect(uu.id).to eq(@users.reverse[idx].id)
|
|
end
|
|
end
|
|
|
|
it "sorts musicians by followers" do
|
|
# establish sorting order
|
|
@user4.followers.concat([@user2, @user3, @user4])
|
|
@user3.followers.concat([@user3, @user4])
|
|
@user2.followers.concat([@user1])
|
|
expect(@user4.followers.count).to be 3
|
|
expect(UserFollower.count).to be 6
|
|
|
|
# refresh the order to ensure it works right
|
|
@user2.followers.concat([@user3, @user4, @user2])
|
|
results = Search.musician_search({ :per_page => @users.size }, @user3)
|
|
expect(results.musicians_filter[0].id).to eq(@user2.id)
|
|
|
|
# check the follower count for given entry
|
|
expect(results.musicians_filter[0].search_follow_count.to_i).not_to eq(0)
|
|
# check the follow relationship between current_user and result
|
|
expect(results.is_follower?(@user2)).to be true
|
|
end
|
|
|
|
it 'paginates properly' do
|
|
# make sure pagination works right
|
|
params = { :per_page => 2, :page => 1 }
|
|
results = Search.musician_search(params)
|
|
expect(results.musicians_filter.count).to be 2
|
|
end
|
|
|
|
end
|
|
|
|
def make_recording(usr)
|
|
connection = FactoryGirl.create(:connection, :user => usr)
|
|
instrument = FactoryGirl.create(:instrument, :description => 'a great instrument')
|
|
track = FactoryGirl.create(:track, :connection => connection, :instrument => instrument)
|
|
music_session = FactoryGirl.create(:music_session, :creator => usr, :musician_access => true)
|
|
music_session.connections << connection
|
|
music_session.save
|
|
recording = Recording.start(music_session, usr)
|
|
recording.stop
|
|
recording.reload
|
|
genre = FactoryGirl.create(:genre)
|
|
recording.claim(usr, "name", "description", genre, true, true)
|
|
recording.reload
|
|
recording
|
|
end
|
|
|
|
def make_session(usr)
|
|
connection = FactoryGirl.create(:connection, :user => usr)
|
|
music_session = FactoryGirl.create(:music_session, :creator => usr, :musician_access => true)
|
|
music_session.connections << connection
|
|
music_session.save
|
|
end
|
|
|
|
context 'musician stat counters' do
|
|
|
|
it "displays musicians top followings" do
|
|
@user4.followers.concat([@user4])
|
|
@user3.followers.concat([@user4])
|
|
@user2.followers.concat([@user4])
|
|
expect(@user4.top_followings.count).to be 3
|
|
expect(@user4.top_followings.map(&:id)).to match_array((@users - [@user1]).map(&:id))
|
|
end
|
|
|
|
it "friends stat shows friend count" do
|
|
# create friendship record
|
|
Friendship.save(@user1.id, @user2.id)
|
|
# search on user2
|
|
results = Search.musician_search({}, @user2)
|
|
friend = results.musicians_filter.detect { |mm| mm.id == @user1.id }
|
|
expect(friend).to_not be_nil
|
|
expect(results.friend_count(friend)).to be 1
|
|
@user1.reload
|
|
expect(friend.friends?(@user2)).to be true
|
|
expect(results.is_friend?(@user1)).to be true
|
|
end
|
|
|
|
it "recording stat shows recording count" do
|
|
recording = make_recording(@user1)
|
|
expect(recording.users.length).to be 1
|
|
expect(recording.users.first).to eq(@user1)
|
|
@user1.reload
|
|
expect(@user1.recordings.length).to be 1
|
|
expect(@user1.recordings.first).to eq(recording)
|
|
expect(recording.claimed_recordings.length).to be 1
|
|
expect(@user1.recordings.detect { |rr| rr == recording }).to_not be_nil
|
|
|
|
results = Search.musician_search({},@user1)
|
|
uu = results.musicians_filter.detect { |mm| mm.id == @user1.id }
|
|
expect(uu).to_not be_nil
|
|
|
|
expect(results.record_count(uu)).to be 1
|
|
expect(results.session_count(uu)).to be 1
|
|
end
|
|
|
|
end
|
|
|
|
context 'musician sorting' do
|
|
|
|
it "by plays" do
|
|
make_recording(@user1)
|
|
# order results by num recordings
|
|
results = Search.musician_search({ :orderby => 'plays' }, @user2)
|
|
expect(results.musicians_filter[0].id).to eq(@user1.id)
|
|
|
|
# add more data and make sure order still correct
|
|
make_recording(@user2); make_recording(@user2)
|
|
results = Search.musician_search({ :orderby => 'plays' }, @user2)
|
|
expect(results.musicians_filter[0].id).to eq(@user2.id)
|
|
end
|
|
|
|
it "by now playing" do
|
|
# should get 1 result with 1 active session
|
|
make_session(@user3)
|
|
results = Search.musician_search({ :orderby => 'playing' }, @user2)
|
|
expect(results.musicians_filter.count).to be 1
|
|
expect(results.musicians_filter.first.id).to eq(@user3.id)
|
|
|
|
# should get 2 results with 2 active sessions
|
|
# sort order should be created_at DESC
|
|
make_session(@user4)
|
|
results = Search.musician_search({ :orderby => 'playing' }, @user2)
|
|
expect(results.musicians_filter.count).to be 2
|
|
expect(results.musicians_filter[0].id).to eq(@user4.id)
|
|
expect(results.musicians_filter[1].id).to eq(@user3.id)
|
|
end
|
|
|
|
end
|
|
|
|
context 'filter settings' do
|
|
it "searches musicisns for an instrument" do
|
|
minst = FactoryGirl.create(:musician_instrument, {
|
|
:user => @user1,
|
|
:instrument => Instrument.find('tuba') })
|
|
@user1.musician_instruments << minst
|
|
@user1.reload
|
|
ii = @user1.instruments.detect { |inst| inst.id == 'tuba' }
|
|
expect(ii).to_not be_nil
|
|
results = Search.musician_search({ :instrument => ii.id })
|
|
results.musicians_filter.each do |rr|
|
|
expect(rr.instruments.detect { |inst| inst.id=='tuba' }.id).to eq(ii.id)
|
|
end
|
|
expect(results.musicians_filter.count).to be 1
|
|
end
|
|
|
|
it "finds musicians within a given distance of given location" do
|
|
num = User.musicians.count
|
|
expect(@user1.lat).to_not be_nil
|
|
# short distance
|
|
results = Search.musician_search({ :per_page => num,
|
|
:distance => 10,
|
|
:city => 'Apex' }, @user1)
|
|
expect(results.musicians_filter.count).to be num
|
|
# long distance
|
|
results = Search.musician_search({ :per_page => num,
|
|
:distance => 1000,
|
|
:city => 'Miami',
|
|
:state => 'FL' }, @user1)
|
|
expect(results.musicians_filter.count).to be num
|
|
end
|
|
|
|
it "finds musicians within a given distance of users location" do
|
|
expect(@user1.lat).to_not be_nil
|
|
# uses the location of @user1
|
|
results = Search.musician_search({ :distance => 10, :per_page => User.musicians.count }, @user1)
|
|
expect(results.musicians_filter.count).to be User.musicians.count
|
|
end
|
|
|
|
it "finds no musicians within a given distance of location" do
|
|
expect(@user1.lat).to_not be_nil
|
|
results = Search.musician_search({ :distance => 10, :city => 'San Francisco' }, @user1)
|
|
expect(results.musicians_filter.count).to be 0
|
|
end
|
|
|
|
end
|
|
|
|
context 'new users' do
|
|
|
|
it "find nearby" do
|
|
# create new user outside 500 from Apex to ensure its excluded from results
|
|
FactoryGirl.create(:user, {city: "Austin", state: "TX", country: "US"})
|
|
User.geocoded_users.find_each do |usr|
|
|
Search.new_musicians(usr) do |new_usrs|
|
|
# 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
|
|
|
|
it "sends new musician email" do
|
|
# create new user outside 500 from Apex to ensure its excluded from results
|
|
FactoryGirl.create(:user, {city: "Austin", state: "TX", country: "US"})
|
|
User.geocoded_users.find_each do |usr|
|
|
Search.new_musicians(usr) do |new_usrs|
|
|
# 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
|
|
|
|
end
|