require 'test_helper'
class UserTest < ActiveSupport::TestCase
fixtures :all
test "should_create_user" do
assert_difference User, :count do
user = create_user
assert !user.new_record?, "#{user.errors.full_messages.to_sentence}"
end
end
test "should prevent malicious chars inserted in email via newlines" do
user = User.new(:email => "valid@email.com%0A")
assert !user.valid?
assert user.errors[:email]
end
test "should prevent malicious chars inserted in login via newlines" do
user = User.new(:login => "validlogin%0A")
assert !user.valid?
assert user.errors[:email]
end
test "should_trim_whitespace" do
user = users(:quentin)
user.login = 'quentin '
user.save!
assert_equal user.login, 'quentin'
end
test "should_not_reject_spaces" do
user = User.new(:login => 'foo bar')
user.valid?
assert user.errors[:login].empty?
end
test "should_reject_special_chars" do
user = User.new(:login => '&stripes')
assert !user.valid?
assert user.errors[:login]
end
test "should_accept_normal_chars_in_login" do
u = create_user(:login => "foo_and_bar")
assert u.errors[:login].empty?
u = create_user(:login => "2foo-and-bar")
assert u.errors[:login].empty?
end
test "should_require_login" do
assert_no_difference User, :count do
u = create_user(:login => nil)
assert u.errors[:login]
end
end
test "should_find_user_with_numerals_in_login" do
u = create_user(:login => "2foo-and-bar")
assert u.errors[:login].empty?
assert_equal u, User.find("2foo-and-bar")
end
test "should_require_password" do
assert_no_difference User, :count do
u = create_user(:password => nil)
assert u.errors[:password]
end
end
test "should_require_password_confirmation" do
assert_no_difference User, :count do
u = create_user(:password_confirmation => nil)
assert u.errors[:password_confirmation]
end
end
test "should_require_email" do
assert_no_difference User, :count do
u = create_user(:email => nil)
assert u.errors[:email]
end
end
test "should_require_valid_birthday" do
assert_no_difference User, :count do
u = create_user(:birthday => 1.year.ago)
assert u.errors[:birthday].any?
end
end
test "should_handle_email_upcase" do
assert_difference User, :count, 1 do
assert create_user(:email => 'FOO@BAR.NET').valid?
end
end
test "should_update_password" do
activate_authlogic
users(:quentin).update_attributes(:password => 'new password', :password_confirmation => 'new password')
assert_equal users(:quentin), UserSession.create(:login => 'quentin', :password => 'new password').record
end
test "should deliver password reset instructions" do
assert_difference ActionMailer::Base.deliveries, :length, 1 do
users(:quentin).deliver_password_reset_instructions!
end
end
test "should_not_rehash_password" do
activate_authlogic
users(:quentin).update_attributes(:login => 'quentin_two')
assert_equal users(:quentin), UserSession.create(:login => 'quentin_two', :password => 'test').record
end
test "should_show_location" do
assert_equal users(:quentin).location, metro_areas(:twincities).name
end
test "should_call_avatar_photo" do
assert_equal users(:quentin).avatar_photo_url, configatron.photo.missing_medium
assert_equal users(:quentin).avatar_photo_url(:thumb), configatron.photo.missing_thumb
end
test "should_find_featured" do
featured = User.find_featured
assert_equal featured.size, 1
end
test "should_find_by_activity" do
assert_difference Activity, :count, 3 do
users(:quentin).track_activity(:logged_in)
users(:quentin).track_activity(:logged_in)
users(:quentin).track_activity(:logged_in)
end
assert !User.find_by_activity({:require_avatar => false}).empty?
users(:quentin).update_attribute(:avatar_id, 1) #just pretend
assert !User.find_by_activity.empty?
end
test "should_not_include_inactive_users_in_find_by_activity" do
inactive_user = create_user
assert !inactive_user.active?
Activity.create(:user => inactive_user)
assert_nothing_raised do
User.find_by_activity({:limit => 5, :require_avatar => false})
end
end
test "should_update_activities_counter_on_user" do
#make sure the initial count is right
Activity.destroy_all
users(:quentin).update_attribute( :activities_count, Activity.by(users(:quentin)) )
assert_difference users(:quentin), :activities_count, 1 do
users(:quentin).track_activity(:logged_in)
users(:quentin).reload
end
end
test "should_have_reached_daily_friend_request_limit" do
Friendship.daily_request_limit = 1
assert !users(:quentin).has_reached_daily_friend_request_limit?
f = Friendship.create!(:user => users(:quentin), :friend => users(:kevin), :initiator => true, :friendship_status => FriendshipStatus[:pending])
assert users(:quentin).has_reached_daily_friend_request_limit?
end
test "get_network_activity" do
users(:aaron).track_activity(:logged_in) #create an activity
u = users(:quentin)
f = friendships(:aaron_receive_quentin_pending)
f.update_attributes(:friendship_status => FriendshipStatus[:accepted]) && f.reverse.update_attributes(:friendship_status => FriendshipStatus[:accepted])
assert !u.network_activity.empty?
end
test "should_get_comments_activity" do
user = users(:quentin)
2.times do
comment = user.comments.create!(:comment => "foo", :user => users(:aaron), :recipient => user)
end
assert_equal 2, user.comments_activity.size
end
test "should_deactivate" do
assert users(:quentin).active?
users(:quentin).deactivate
assert !users(:quentin).reload.active?
end
test "should activate and send email" do
#make quentin inactive
users(:quentin).deactivate
assert !users(:quentin).reload.active?
assert_difference ActionMailer::Base.deliveries, :length, 1 do
users(:quentin).activate
assert users(:quentin).reload.active?
end
end
test "should_return_full_location" do
assert_equal "Minneapolis / St. Paul", users(:quentin).full_location
end
test "should_prohibit_reserved_logins " do
user = create_user(:login => configatron.reserved_logins.first)
assert !user.valid?
end
test "should find user tagged with a tag" do
user = users(:quentin)
user.tag_list = 'foo'
user.save
assert User.tagged_with('foo').include?(user)
end
test "should prepare params for search" do
params = User.prepare_params_for_search(:metro_area_id => 1, :state_id => 1)
assert_equal(params, {:metro_area_id=>1, :state_id=>1, "metro_area_id"=>1, "state_id"=>1, "country_id"=>nil})
end
test "should build scope for search params" do
params = {'country_id' => 1, 'state_id' => 1, 'metro_area_id' => 1, 'login' => 'foo', 'vendor' => false, 'description' => 'baz'}
scope = User.build_conditions_for_search(params)
#This sucks; I want to make sure that the correct scopes are set up on the relation, but I don't know a better way.
assert_equal("SELECT \"users\".* FROM \"users\" WHERE \"users\".\"metro_area_id\" = 1 AND (users.activated_at IS NOT NULL) AND (`users`.login LIKE '%foo%') AND (`users`.description LIKE '%baz%')", scope.to_sql)
end
test "should create user from authorization" do
hash = {'provider' => 'twitter',
'uid' => '12345',
'nickname' => 'omniauthuser',
'email' => 'email@example.com' }
Authorization.create!(hash) do |auth|
assert_difference User, :count, 1 do
user = User.find_or_create_from_authorization(auth)
auth.user = user
end
end
end
test "should not require password or email for omniauthed user" do
user = User.new
user.authorizing_from_omniauth = true
user.valid?
assert(user.errors[:email].empty?, "Should not have errors on email")
assert(user.errors[:birthday].empty?, "Should not have errors on birthday")
end
protected
def create_user(options = {})
User.create({
:login => 'quire',
:email => 'quire@example.com',
:password => 'quire123',
:password_confirmation => 'quire123',
:birthday => configatron.min_age.years.ago }.merge(options))
end
end