discourse/spec/services/user_updater_spec.rb
Sam 3829c78526 PERF: shift most user options out of the user table
As it stands we load up user records quite frequently on the topic pages,
this in turn pulls all the columns for the users being selected, just to
discard them after they are loaded

New structure keeps all options in a discrete table, this is better organised
and allows us to easily add more column without worrying about bloating the
user table
2016-02-17 18:08:25 +11:00

139 lines
3.9 KiB
Ruby

require 'rails_helper'
describe UserUpdater do
let(:acting_user) { Fabricate.build(:user) }
describe '#update_muted_users' do
it 'has no cross talk' do
u1 = Fabricate(:user)
u2 = Fabricate(:user)
u3 = Fabricate(:user)
updater = UserUpdater.new(u1, u1)
updater.update_muted_users("#{u2.username},#{u3.username}")
updater = UserUpdater.new(u2, u2)
updater.update_muted_users("#{u3.username},#{u1.username}")
updater = UserUpdater.new(u3, u3)
updater.update_muted_users("")
expect(MutedUser.where(user_id: u2.id).count).to eq 2
expect(MutedUser.where(user_id: u1.id).count).to eq 2
expect(MutedUser.where(user_id: u3.id).count).to eq 0
end
end
describe '#update' do
it 'saves user' do
user = Fabricate(:user, name: 'Billy Bob')
updater = UserUpdater.new(acting_user, user)
updater.update(name: 'Jim Tom')
expect(user.reload.name).to eq 'Jim Tom'
end
it 'updates various fields' do
user = Fabricate(:user)
updater = UserUpdater.new(acting_user, user)
updater.update(bio_raw: 'my new bio',
email_always: 'true',
mailing_list_mode: true,
digest_after_days: "8")
user.reload
expect(user.user_profile.bio_raw).to eq 'my new bio'
expect(user.user_option.email_always).to eq true
expect(user.user_option.mailing_list_mode).to eq true
expect(user.user_option.digest_after_days).to eq 8
end
context 'when update succeeds' do
it 'returns true' do
user = Fabricate(:user)
updater = UserUpdater.new(acting_user, user)
expect(updater.update).to be_truthy
end
end
context 'when update fails' do
it 'returns false' do
user = Fabricate(:user)
user.stubs(save: false)
updater = UserUpdater.new(acting_user, user)
expect(updater.update).to be_falsey
end
end
context 'with permission to update title' do
it 'allows user to change title' do
user = Fabricate(:user, title: 'Emperor')
guardian = stub
guardian.stubs(:can_grant_title?).with(user).returns(true)
Guardian.stubs(:new).with(acting_user).returns(guardian)
updater = UserUpdater.new(acting_user, user)
updater.update(title: 'Minion')
expect(user.reload.title).to eq 'Minion'
end
end
context 'without permission to update title' do
it 'does not allow user to change title' do
user = Fabricate(:user, title: 'Emperor')
guardian = stub
guardian.stubs(:can_grant_title?).with(user).returns(false)
Guardian.stubs(:new).with(acting_user).returns(guardian)
updater = described_class.new(acting_user, user)
updater.update(title: 'Minion')
expect(user.reload.title).not_to eq 'Minion'
end
end
context 'when website includes http' do
it 'does not add http before updating' do
user = Fabricate(:user)
updater = described_class.new(acting_user, user)
updater.update(website: 'http://example.com')
expect(user.reload.user_profile.website).to eq 'http://example.com'
end
end
context 'when website does not include http' do
it 'adds http before updating' do
user = Fabricate(:user)
updater = described_class.new(acting_user, user)
updater.update(website: 'example.com')
expect(user.reload.user_profile.website).to eq 'http://example.com'
end
end
context 'when custom_fields is empty string' do
it "update is successful" do
user = Fabricate(:user)
user.custom_fields = {'import_username' => 'my_old_username'}
user.save
updater = described_class.new(acting_user, user)
updater.update(website: 'example.com', custom_fields: '')
expect(user.reload.custom_fields).to eq({'import_username' => 'my_old_username'})
end
end
end
end