2019-04-30 08:27:42 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2015-10-11 17:41:23 +08:00
|
|
|
require 'rails_helper'
|
2014-05-28 01:54:04 +08:00
|
|
|
|
|
|
|
describe UserProfile do
|
2014-06-10 13:19:08 +08:00
|
|
|
it 'is created automatically when a user is created' do
|
2014-05-28 01:54:04 +08:00
|
|
|
user = Fabricate(:evil_trout)
|
2014-12-31 22:55:03 +08:00
|
|
|
expect(user.user_profile).to be_present
|
2014-05-28 01:54:04 +08:00
|
|
|
end
|
2014-06-10 13:19:08 +08:00
|
|
|
|
2014-08-05 14:37:56 +08:00
|
|
|
describe 'rebaking' do
|
|
|
|
it 'correctly rebakes bio' do
|
|
|
|
user_profile = Fabricate(:evil_trout).user_profile
|
|
|
|
user_profile.update_columns(bio_raw: "test", bio_cooked: "broken", bio_cooked_version: nil)
|
|
|
|
|
|
|
|
problems = UserProfile.rebake_old(10)
|
2014-12-31 22:55:03 +08:00
|
|
|
expect(problems.length).to eq(0)
|
2014-08-05 14:37:56 +08:00
|
|
|
|
|
|
|
user_profile.reload
|
2014-12-31 22:55:03 +08:00
|
|
|
expect(user_profile.bio_cooked).to eq("<p>test</p>")
|
|
|
|
expect(user_profile.bio_cooked_version).to eq(UserProfile::BAKED_VERSION)
|
2014-08-05 14:37:56 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-06-10 13:19:08 +08:00
|
|
|
describe 'new' do
|
2019-03-11 11:12:11 +08:00
|
|
|
let(:user_profile) { UserProfile.new(bio_raw: "test") }
|
2014-06-10 13:19:08 +08:00
|
|
|
|
|
|
|
it 'is not valid without user' do
|
2014-11-01 01:44:26 +08:00
|
|
|
expect(user_profile.valid?).to be false
|
2014-06-10 13:19:08 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'is is valid with user' do
|
|
|
|
user_profile.user = Fabricate.build(:user)
|
2014-11-01 01:44:26 +08:00
|
|
|
expect(user_profile.valid?).to be true
|
2014-06-10 13:19:08 +08:00
|
|
|
end
|
|
|
|
|
2014-09-09 03:17:31 +08:00
|
|
|
it "doesn't support really long bios" do
|
|
|
|
user_profile = Fabricate.build(:user_profile_long)
|
2014-12-31 22:55:03 +08:00
|
|
|
expect(user_profile).not_to be_valid
|
2014-09-09 03:17:31 +08:00
|
|
|
end
|
|
|
|
|
2016-12-26 23:24:54 +08:00
|
|
|
context "website validation" do
|
2017-12-21 12:27:17 +08:00
|
|
|
let(:user_profile) { Fabricate.build(:user_profile, user: Fabricate(:user)) }
|
2016-02-06 04:49:48 +08:00
|
|
|
|
2017-12-21 12:27:17 +08:00
|
|
|
it "should not allow invalid URLs" do
|
|
|
|
user_profile.website = "http://https://google.com"
|
|
|
|
expect(user_profile).to_not be_valid
|
2016-12-26 23:24:54 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it "validates website domain if user_website_domains_whitelist setting is present" do
|
|
|
|
SiteSetting.user_website_domains_whitelist = "discourse.org"
|
2017-12-21 12:27:17 +08:00
|
|
|
|
|
|
|
user_profile.website = "https://google.com"
|
|
|
|
expect(user_profile).not_to be_valid
|
|
|
|
|
|
|
|
user_profile.website = "http://discourse.org"
|
|
|
|
expect(user_profile).to be_valid
|
2016-12-26 23:24:54 +08:00
|
|
|
end
|
2018-05-17 15:51:24 +08:00
|
|
|
|
|
|
|
it "doesn't blow up with an invalid URI" do
|
|
|
|
SiteSetting.user_website_domains_whitelist = "discourse.org"
|
|
|
|
|
|
|
|
user_profile.website = 'user - https://forum.example.com/user'
|
|
|
|
expect { user_profile.save! }.to raise_error(ActiveRecord::RecordInvalid)
|
|
|
|
end
|
2016-02-06 04:49:48 +08:00
|
|
|
end
|
|
|
|
|
2014-06-10 13:19:08 +08:00
|
|
|
describe 'after save' do
|
|
|
|
let(:user) { Fabricate(:user) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
user.user_profile.bio_raw = 'my bio'
|
|
|
|
user.user_profile.save
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'has cooked bio' do
|
|
|
|
expect(user.user_profile.bio_cooked).to be_present
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'has bio summary' do
|
|
|
|
expect(user.user_profile.bio_summary).to be_present
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'changing bio' do
|
|
|
|
let(:user) { Fabricate(:user) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
user.user_profile.bio_raw = "**turtle power!**"
|
|
|
|
user.user_profile.save
|
|
|
|
user.user_profile.reload
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should markdown the raw_bio and put it in cooked_bio' do
|
2014-12-31 22:55:03 +08:00
|
|
|
expect(user.user_profile.bio_cooked).to eq("<p><strong>turtle power!</strong></p>")
|
2014-06-10 13:19:08 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-15 16:05:09 +08:00
|
|
|
describe 'bio excerpt emojis' do
|
|
|
|
let(:user) { Fabricate(:user) }
|
2018-06-01 11:56:56 +08:00
|
|
|
let(:upload) { Fabricate(:upload) }
|
2017-08-15 16:05:09 +08:00
|
|
|
|
|
|
|
before do
|
2018-06-01 11:56:56 +08:00
|
|
|
CustomEmoji.create!(name: 'test', upload: upload)
|
2017-08-15 16:05:09 +08:00
|
|
|
Emoji.clear_cache
|
|
|
|
|
2018-06-01 11:56:56 +08:00
|
|
|
user.user_profile.update!(
|
|
|
|
bio_raw: "hello :test: :woman_scientist:t5: 🤔"
|
|
|
|
)
|
2017-08-15 16:05:09 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'supports emoji images' do
|
2018-08-16 19:45:30 +08:00
|
|
|
expect(user.user_profile.bio_excerpt(500, keep_emoji_images: true)).to eq("hello <img src=\"#{upload.url}?v=#{Emoji::EMOJI_VERSION}\" title=\":test:\" class=\"emoji emoji-custom\" alt=\":test:\"> <img src=\"/images/emoji/twitter/woman_scientist/5.png?v=#{Emoji::EMOJI_VERSION}\" title=\":woman_scientist:t5:\" class=\"emoji\" alt=\":woman_scientist:t5:\"> <img src=\"/images/emoji/twitter/thinking.png?v=#{Emoji::EMOJI_VERSION}\" title=\":thinking:\" class=\"emoji\" alt=\":thinking:\">")
|
2017-08-15 16:05:09 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-06-10 13:19:08 +08:00
|
|
|
describe 'bio link stripping' do
|
|
|
|
|
|
|
|
it 'returns an empty string with no bio' do
|
|
|
|
expect(Fabricate.build(:user_profile).bio_excerpt).to be_blank
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with a user that has a link in their bio' do
|
2014-07-25 10:15:43 +08:00
|
|
|
let(:user_profile) { Fabricate.build(:user_profile, bio_raw: "I love http://discourse.org") }
|
2014-06-10 13:19:08 +08:00
|
|
|
let(:user) do
|
|
|
|
user = Fabricate.build(:user, user_profile: user_profile)
|
|
|
|
user_profile.user = user
|
|
|
|
user
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:created_user) do
|
|
|
|
user = Fabricate(:user)
|
2014-07-25 10:15:43 +08:00
|
|
|
user.user_profile.bio_raw = 'I love http://discourse.org'
|
2014-06-10 13:19:08 +08:00
|
|
|
user.user_profile.save!
|
|
|
|
user
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'includes the link as nofollow if the user is not new' do
|
|
|
|
user.user_profile.send(:cook)
|
2016-11-20 20:49:14 +08:00
|
|
|
expect(user_profile.bio_excerpt).to match_html("I love <a href='http://discourse.org' rel='nofollow noopener'>http://discourse.org</a>")
|
|
|
|
expect(user_profile.bio_processed).to match_html("<p>I love <a href=\"http://discourse.org\" rel=\"nofollow noopener\">http://discourse.org</a></p>")
|
2014-06-10 13:19:08 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'removes the link if the user is new' do
|
2014-09-05 13:20:39 +08:00
|
|
|
user.trust_level = TrustLevel[0]
|
2014-06-10 13:19:08 +08:00
|
|
|
user_profile.send(:cook)
|
2014-07-25 10:15:43 +08:00
|
|
|
expect(user_profile.bio_excerpt).to match_html("I love http://discourse.org")
|
|
|
|
expect(user_profile.bio_processed).to eq("<p>I love http://discourse.org</p>")
|
2014-06-10 13:19:08 +08:00
|
|
|
end
|
|
|
|
|
2014-11-26 05:14:21 +08:00
|
|
|
it 'removes the link if the user is suspended' do
|
|
|
|
user.suspended_till = 1.month.from_now
|
|
|
|
user_profile.send(:cook)
|
|
|
|
expect(user_profile.bio_excerpt).to match_html("I love http://discourse.org")
|
|
|
|
expect(user_profile.bio_processed).to eq("<p>I love http://discourse.org</p>")
|
|
|
|
end
|
|
|
|
|
2014-09-05 04:16:46 +08:00
|
|
|
context 'tl3_links_no_follow is false' do
|
2017-07-07 14:09:14 +08:00
|
|
|
before { SiteSetting.tl3_links_no_follow = false }
|
2014-07-15 01:34:21 +08:00
|
|
|
|
|
|
|
it 'includes the link without nofollow if the user is trust level 3 or higher' do
|
2014-09-05 13:20:39 +08:00
|
|
|
user.trust_level = TrustLevel[3]
|
2014-07-15 01:34:21 +08:00
|
|
|
user_profile.send(:cook)
|
2014-07-25 10:15:43 +08:00
|
|
|
expect(user_profile.bio_excerpt).to match_html("I love <a href='http://discourse.org'>http://discourse.org</a>")
|
|
|
|
expect(user_profile.bio_processed).to match_html("<p>I love <a href=\"http://discourse.org\">http://discourse.org</a></p>")
|
2014-07-15 01:34:21 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'removes nofollow from links in bio when trust level is increased' do
|
2014-09-05 13:20:39 +08:00
|
|
|
created_user.change_trust_level!(TrustLevel[3])
|
2014-07-25 10:15:43 +08:00
|
|
|
expect(created_user.user_profile.bio_excerpt).to match_html("I love <a href='http://discourse.org'>http://discourse.org</a>")
|
|
|
|
expect(created_user.user_profile.bio_processed).to match_html("<p>I love <a href=\"http://discourse.org\">http://discourse.org</a></p>")
|
2014-07-15 01:34:21 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'adds nofollow to links in bio when trust level is decreased' do
|
2014-09-05 13:20:39 +08:00
|
|
|
created_user.trust_level = TrustLevel[3]
|
2014-07-15 01:34:21 +08:00
|
|
|
created_user.save
|
2014-09-28 07:38:00 +08:00
|
|
|
created_user.reload
|
2014-09-05 13:20:39 +08:00
|
|
|
created_user.change_trust_level!(TrustLevel[2])
|
2016-11-20 20:49:14 +08:00
|
|
|
expect(created_user.user_profile.bio_excerpt).to match_html("I love <a href='http://discourse.org' rel='nofollow noopener'>http://discourse.org</a>")
|
|
|
|
expect(created_user.user_profile.bio_processed).to match_html("<p>I love <a href=\"http://discourse.org\" rel=\"nofollow noopener\">http://discourse.org</a></p>")
|
2014-07-15 01:34:21 +08:00
|
|
|
end
|
2014-06-10 13:19:08 +08:00
|
|
|
end
|
|
|
|
|
2014-09-05 04:16:46 +08:00
|
|
|
context 'tl3_links_no_follow is true' do
|
2017-07-07 14:09:14 +08:00
|
|
|
before { SiteSetting.tl3_links_no_follow = true }
|
2014-06-10 13:19:08 +08:00
|
|
|
|
2014-07-15 01:34:21 +08:00
|
|
|
it 'includes the link with nofollow if the user is trust level 3 or higher' do
|
2014-09-05 13:20:39 +08:00
|
|
|
user.trust_level = TrustLevel[3]
|
2014-07-15 01:34:21 +08:00
|
|
|
user_profile.send(:cook)
|
2016-11-20 20:49:14 +08:00
|
|
|
expect(user_profile.bio_excerpt).to match_html("I love <a href='http://discourse.org' rel='nofollow noopener'>http://discourse.org</a>")
|
|
|
|
expect(user_profile.bio_processed).to match_html("<p>I love <a href=\"http://discourse.org\" rel=\"nofollow noopener\">http://discourse.org</a></p>")
|
2014-07-15 01:34:21 +08:00
|
|
|
end
|
2014-06-10 13:19:08 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2018-05-07 16:03:26 +08:00
|
|
|
|
|
|
|
context '.import_url_for_user' do
|
|
|
|
let(:user) { Fabricate(:user) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
stub_request(:any, "thisfakesomething.something.com")
|
|
|
|
.to_return(body: "abc", status: 404, headers: { 'Content-Length' => 3 })
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when profile_background_url returns an invalid status code' do
|
|
|
|
it 'should not do anything' do
|
|
|
|
url = "http://thisfakesomething.something.com/"
|
|
|
|
|
|
|
|
UserProfile.import_url_for_user(url, user, is_card_background: false)
|
|
|
|
|
|
|
|
user.reload
|
|
|
|
|
2019-04-29 11:58:52 +08:00
|
|
|
expect(user.profile_background_upload).to eq(nil)
|
2018-05-07 16:03:26 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when card_background_url returns an invalid status code' do
|
|
|
|
it 'should not do anything' do
|
|
|
|
url = "http://thisfakesomething.something.com/"
|
|
|
|
|
|
|
|
UserProfile.import_url_for_user(url, user, is_card_background: true)
|
|
|
|
|
|
|
|
user.reload
|
|
|
|
|
2019-04-29 11:58:52 +08:00
|
|
|
expect(user.card_background_upload).to eq(nil)
|
2018-05-07 16:03:26 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
2014-05-28 01:54:04 +08:00
|
|
|
end
|