mirror of
https://github.com/discourse/discourse.git
synced 2025-01-23 03:57:30 +08:00
3829c78526
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
151 lines
4.5 KiB
Ruby
151 lines
4.5 KiB
Ruby
require 'rails_helper'
|
|
require_dependency 'user'
|
|
|
|
describe UserSerializer do
|
|
|
|
context "with a TL0 user seen as anonymous" do
|
|
let(:user) { Fabricate.build(:user, trust_level: 0, user_profile: Fabricate.build(:user_profile)) }
|
|
let(:serializer) { UserSerializer.new(user, scope: Guardian.new, root: false) }
|
|
let(:json) { serializer.as_json }
|
|
|
|
let(:untrusted_attributes) { %i{bio_raw bio_cooked bio_excerpt location website profile_background card_background} }
|
|
|
|
it "doesn't serialize untrusted attributes" do
|
|
untrusted_attributes.each { |attr| expect(json).not_to have_key(attr) }
|
|
end
|
|
end
|
|
|
|
context "as current user" do
|
|
it "serializes options correctly" do
|
|
# so we serialize more stuff
|
|
SiteSetting.edit_history_visible_to_public = false
|
|
|
|
user = Fabricate.build(:user,
|
|
user_profile: Fabricate.build(:user_profile),
|
|
user_option: UserOption.new(edit_history_public: true),
|
|
user_stat: UserStat.new
|
|
)
|
|
|
|
json = UserSerializer.new(user, scope: Guardian.new(user), root: false).as_json
|
|
|
|
expect(json[:user_option][:edit_history_public]).to eq(true)
|
|
|
|
end
|
|
end
|
|
|
|
context "with a user" do
|
|
let(:user) { Fabricate.build(:user, user_profile: Fabricate.build(:user_profile) ) }
|
|
let(:serializer) { UserSerializer.new(user, scope: Guardian.new, root: false) }
|
|
let(:json) { serializer.as_json }
|
|
|
|
it "produces json" do
|
|
expect(json).to be_present
|
|
end
|
|
|
|
context "with `enable_names` true" do
|
|
before do
|
|
SiteSetting.enable_names = true
|
|
end
|
|
|
|
it "has a name" do
|
|
expect(json[:name]).to be_present
|
|
end
|
|
end
|
|
|
|
|
|
context "with `enable_names` false" do
|
|
before do
|
|
SiteSetting.stubs(:enable_names?).returns(false)
|
|
end
|
|
|
|
it "has a name" do
|
|
expect(json[:name]).to be_blank
|
|
end
|
|
end
|
|
|
|
context "with filled out card background" do
|
|
before do
|
|
user.user_profile.card_background = 'http://card.com'
|
|
end
|
|
|
|
it "has a profile background" do
|
|
expect(json[:card_background]).to eq 'http://card.com'
|
|
end
|
|
end
|
|
|
|
context "with filled out profile background" do
|
|
before do
|
|
user.user_profile.profile_background = 'http://background.com'
|
|
end
|
|
|
|
it "has a profile background" do
|
|
expect(json[:profile_background]).to eq 'http://background.com'
|
|
end
|
|
end
|
|
|
|
context "with filled out website" do
|
|
before do
|
|
user.user_profile.website = 'http://example.com/user'
|
|
end
|
|
|
|
it "has a website" do
|
|
expect(json[:website]).to eq 'http://example.com/user'
|
|
end
|
|
|
|
context "has a website name" do
|
|
it "returns website host name when instance domain is not same as website domain" do
|
|
Discourse.stubs(:current_hostname).returns('discourse.org')
|
|
expect(json[:website_name]).to eq 'example.com'
|
|
end
|
|
|
|
it "returns complete website path when instance domain is same as website domain" do
|
|
Discourse.stubs(:current_hostname).returns('example.com')
|
|
expect(json[:website_name]).to eq 'example.com/user'
|
|
end
|
|
|
|
it "returns complete website path when website domain is parent of instance domain" do
|
|
Discourse.stubs(:current_hostname).returns('forums.example.com')
|
|
expect(json[:website_name]).to eq 'example.com/user'
|
|
end
|
|
end
|
|
end
|
|
|
|
context "with filled out bio" do
|
|
before do
|
|
user.user_profile.bio_raw = 'my raw bio'
|
|
user.user_profile.bio_cooked = 'my cooked bio'
|
|
end
|
|
|
|
it "has a bio" do
|
|
expect(json[:bio_raw]).to eq 'my raw bio'
|
|
end
|
|
|
|
it "has a cooked bio" do
|
|
expect(json[:bio_cooked]).to eq 'my cooked bio'
|
|
end
|
|
end
|
|
end
|
|
|
|
context "with custom_fields" do
|
|
let(:user) { Fabricate(:user) }
|
|
let(:json) { UserSerializer.new(user, scope: Guardian.new, root: false).as_json }
|
|
|
|
before do
|
|
user.custom_fields['secret_field'] = 'Only for me to know'
|
|
user.custom_fields['public_field'] = 'Everyone look here'
|
|
user.save
|
|
end
|
|
|
|
it "doesn't serialize the fields by default" do
|
|
json[:custom_fields]
|
|
expect(json[:custom_fields]).to be_empty
|
|
end
|
|
|
|
it "serializes the fields listed in public_user_custom_fields site setting" do
|
|
SiteSetting.stubs(:public_user_custom_fields).returns('public_field')
|
|
expect(json[:custom_fields]['public_field']).to eq(user.custom_fields['public_field'])
|
|
expect(json[:custom_fields]['secret_field']).to eq(nil)
|
|
end
|
|
end
|
|
end
|