openstreetmap-website/test/models/user_test.rb
Andy Allan feb3b03227 Use model relations when creating objects from factories
Rather than passing around record ids explicitly, we can use the
model relations and pass around the models. This makes reading the
tests slightly simpler to read.
2016-10-19 11:32:08 +01:00

270 lines
9.5 KiB
Ruby

# -*- coding: utf-8 -*-
require "test_helper"
class UserTest < ActiveSupport::TestCase
include Rails::Dom::Testing::Assertions::SelectorAssertions
api_fixtures
fixtures :languages, :user_roles
def test_invalid_with_empty_attributes
user = User.new
assert !user.valid?
assert user.errors[:email].any?
assert user.errors[:pass_crypt].any?
assert user.errors[:display_name].any?
assert user.errors[:email].any?
assert !user.errors[:home_lat].any?
assert !user.errors[:home_lon].any?
assert !user.errors[:home_zoom].any?
end
def test_unique_email
new_user = User.new(
:email => users(:normal_user).email,
:status => "active",
:pass_crypt => Digest::MD5.hexdigest("test"),
:display_name => "new user",
:data_public => 1,
:description => "desc"
)
assert !new_user.save
assert new_user.errors[:email].include?("has already been taken")
end
def test_unique_display_name
new_user = User.new(
:email => "tester@openstreetmap.org",
:status => "pending",
:pass_crypt => Digest::MD5.hexdigest("test"),
:display_name => users(:normal_user).display_name,
:data_public => 1,
:description => "desc"
)
assert !new_user.save
assert new_user.errors[:display_name].include?("has already been taken")
end
def test_email_valid
ok = %w(a@s.com test@shaunmcdonald.me.uk hello_local@ping-d.ng
test_local@openstreetmap.org test-local@example.com)
bad = %w(hi ht@ n@ @.com help@.me.uk help"hi.me.uk も対@応します
輕觸搖晃的遊戲@ah.com も対応します@s.name)
ok.each do |name|
user = users(:normal_user)
user.email = name
assert user.valid?(:save), user.errors.full_messages.join(",")
end
bad.each do |name|
user = users(:normal_user)
user.email = name
assert user.invalid?(:save), "#{name} is valid when it shouldn't be"
end
end
def test_display_name_length
user = users(:normal_user)
user.display_name = "123"
assert user.valid?, " should allow nil display name"
user.display_name = "12"
assert !user.valid?, "should not allow 2 char name"
user.display_name = ""
assert !user.valid?
user.display_name = nil
# Don't understand why it isn't allowing a nil value,
# when the validates statements specifically allow it
# It appears the database does not allow null values
assert !user.valid?
end
def test_display_name_valid
# Due to sanitisation in the view some of these that you might not
# expact are allowed
# However, would they affect the xml planet dumps?
ok = ["Name", "'me", "he\"", "<hr>", "*ho", "\"help\"@",
"vergrößern", "ルシステムにも対応します", "輕觸搖晃的遊戲"]
# These need to be 3 chars in length, otherwise the length test above
# should be used.
bad = ["<hr/>", "test@example.com", "s/f", "aa/", "aa;", "aa.",
"aa,", "aa?", "/;.,?", "も対応します/", "#ping",
"foo\x1fbar", "foo\x7fbar", "foo\ufffebar", "foo\uffffbar",
"new", "terms", "save", "confirm", "confirm-email",
"go_public", "reset-password", "forgot-password", "suspended"]
ok.each do |display_name|
user = users(:normal_user)
user.display_name = display_name
assert user.valid?, "#{display_name} is invalid, when it should be"
end
bad.each do |display_name|
user = users(:normal_user)
user.display_name = display_name
assert !user.valid?, "#{display_name} is valid when it shouldn't be"
end
end
def test_friend_with
create(:friend, :befriender => users(:normal_user), :befriendee => users(:public_user))
assert users(:normal_user).is_friends_with?(users(:public_user))
assert !users(:normal_user).is_friends_with?(users(:inactive_user))
assert !users(:public_user).is_friends_with?(users(:normal_user))
assert !users(:public_user).is_friends_with?(users(:inactive_user))
assert !users(:inactive_user).is_friends_with?(users(:normal_user))
assert !users(:inactive_user).is_friends_with?(users(:public_user))
end
def test_users_nearby
# second user has their data public and is close by normal user
assert_equal [users(:public_user), users(:german_user)], users(:normal_user).nearby
# second_user has normal user nearby, but normal user has their data private
assert_equal [users(:german_user)], users(:public_user).nearby
# inactive_user has no user nearby
assert_equal [], users(:inactive_user).nearby
# north_pole_user has no user nearby, and doesn't throw exception
assert_equal [], users(:north_pole_user).nearby
# confirmed_user has no home location
assert_equal [], users(:confirmed_user).nearby
end
def test_friends_with
# normal user is a friend of second user
# it should be a one way friend associatation
norm = users(:normal_user)
sec = users(:public_user)
create(:friend, :befriender => norm, :befriendee => sec)
assert_equal 1, Friend.count
assert_equal [sec], norm.friend_users
assert_equal 1, norm.friend_users.size
assert_equal 1, Friend.count
assert norm.is_friends_with?(sec)
assert !sec.is_friends_with?(norm)
assert !users(:normal_user).is_friends_with?(users(:inactive_user))
assert !users(:public_user).is_friends_with?(users(:normal_user))
assert !users(:public_user).is_friends_with?(users(:inactive_user))
assert !users(:inactive_user).is_friends_with?(users(:normal_user))
assert !users(:inactive_user).is_friends_with?(users(:public_user))
# Friend.delete(friend)
# assert_equal 0, Friend.count
end
def test_user_preferred_editor
user = users(:normal_user)
assert_equal nil, user.preferred_editor
user.preferred_editor = "potlatch"
assert_equal "potlatch", user.preferred_editor
user.save!
user.preferred_editor = "invalid_editor"
assert_raise(ActiveRecord::RecordInvalid) { user.save! }
end
def test_visible
assert_equal 22, User.visible.count
assert_raise ActiveRecord::RecordNotFound do
User.visible.find(users(:suspended_user).id)
end
assert_raise ActiveRecord::RecordNotFound do
User.visible.find(users(:deleted_user).id)
end
end
def test_active
assert_equal 21, User.active.count
assert_raise ActiveRecord::RecordNotFound do
User.active.find(users(:inactive_user).id)
end
assert_raise ActiveRecord::RecordNotFound do
User.active.find(users(:suspended_user).id)
end
assert_raise ActiveRecord::RecordNotFound do
User.active.find(users(:deleted_user).id)
end
end
def test_identifiable
assert_equal 23, User.identifiable.count
assert_raise ActiveRecord::RecordNotFound do
User.identifiable.find(users(:normal_user).id)
end
end
def test_languages
user = users(:normal_user)
assert_equal ["en"], user.languages
user.languages = %w(de fr en)
assert_equal %w(de fr en), user.languages
user.languages = %w(fr de sl)
assert_equal "de", user.preferred_language
assert_equal %w(fr de sl), user.preferred_languages.map(&:to_s)
user = users(:public_user)
assert_equal %w(en de), user.languages
end
def test_visible?
assert_equal true, users(:inactive_user).visible?
assert_equal true, users(:normal_user).visible?
assert_equal true, users(:confirmed_user).visible?
assert_equal false, users(:suspended_user).visible?
assert_equal false, users(:deleted_user).visible?
end
def test_active?
assert_equal false, users(:inactive_user).active?
assert_equal true, users(:normal_user).active?
assert_equal true, users(:confirmed_user).active?
assert_equal false, users(:suspended_user).active?
assert_equal false, users(:deleted_user).active?
end
def test_moderator?
assert_equal false, users(:normal_user).moderator?
assert_equal true, users(:moderator_user).moderator?
end
def test_administrator?
assert_equal false, users(:normal_user).administrator?
assert_equal true, users(:administrator_user).administrator?
end
def test_has_role?
assert_equal false, users(:normal_user).has_role?("administrator")
assert_equal false, users(:normal_user).has_role?("moderator")
assert_equal true, users(:administrator_user).has_role?("administrator")
assert_equal true, users(:moderator_user).has_role?("moderator")
end
def test_delete
user = users(:normal_user)
user.delete
assert_equal "user_#{user.id}", user.display_name
assert user.description.blank?
assert_equal nil, user.home_lat
assert_equal nil, user.home_lon
assert_equal false, user.image.file?
assert_equal "deleted", user.status
assert_equal false, user.visible?
assert_equal false, user.active?
end
def test_to_xml
user = users(:normal_user)
xml = user.to_xml
assert_select Nokogiri::XML::Document.parse(xml.to_s), "user" do
assert_select "[display_name=?]", user.display_name
assert_select "[account_created=?]", user.creation_time.xmlschema
assert_select "home[lat=?][lon=?][zoom=?]", user.home_lat.to_s, user.home_lon.to_s, user.home_zoom.to_s
end
end
def test_to_xml_node
user = users(:normal_user)
xml = user.to_xml_node
assert_select Nokogiri::XML::DocumentFragment.parse(xml.to_s), "user" do
assert_select "[display_name=?]", user.display_name
assert_select "[account_created=?]", user.creation_time.xmlschema
assert_select "home[lat=?][lon=?][zoom=?]", user.home_lat.to_s, user.home_lon.to_s, user.home_zoom.to_s
end
end
end