discourse/spec/serializers/basic_user_serializer_spec.rb
Andrei Prigorshnev b3a1199493
FEATURE: Hide user status when user is hiding public profile and presence (#24300)
Users can hide their public profile and presence information by checking 
“Hide my public profile and presence features” on the 
`u/{username}/preferences/interface` page. In that case, we also don't 
want to return user status from the server.

This work has been started in https://github.com/discourse/discourse/pull/23946. 
The current PR fixes all the remaining places in Core.

Note that the actual fix is quite simple – a5802f484d. 
But we had a fair amount of duplication in the code responsible for 
the user status serialization, so I had to dry that up first. The refactoring 
as well as adding some additional tests is the main part of this PR.
2024-02-26 17:40:48 +04:00

87 lines
2.6 KiB
Ruby

# frozen_string_literal: true
RSpec.describe BasicUserSerializer do
fab!(:user) { Fabricate(:user) }
let(:serializer) { BasicUserSerializer.new(user, scope: Guardian.new(user), root: false) }
describe "#as_json" do
let(:json) { serializer.as_json }
it "returns the username" do
expect(json[:username]).to eq(user.username)
expect(json[:name]).to eq(user.name)
expect(json[:avatar_template]).to eq(user.avatar_template)
end
describe "extended serializers" do
let(:post_action) { Fabricate(:post_action, user: user) }
let(:serializer) do
PostActionUserSerializer.new(post_action, scope: Guardian.new(user), root: false)
end
it "returns the user correctly" do
expect(serializer.user.username).to eq(user.username)
end
end
it "doesn't return the name it when `enable_names` is false" do
SiteSetting.enable_names = false
expect(json[:name]).to eq(nil)
end
end
describe "#status" do
fab!(:user_status) { Fabricate(:user_status) }
before { user.user_status = user_status }
describe "when status is enabled in settings" do
before { SiteSetting.enable_user_status = true }
it "doesn't add status by default" do
serializer = BasicUserSerializer.new(user, root: false)
json = serializer.as_json
expect(json.keys).not_to include :status
end
context "when including user status" do
let(:serializer) { BasicUserSerializer.new(user, root: false, include_status: true) }
it "adds status if `include_status: true` has been passed" do
json = serializer.as_json
expect(json[:status]).to_not be_nil do |status|
expect(status.description).to eq(user_status.description)
expect(status.emoji).to eq(user_status.emoji)
end
end
it "doesn't add expired user status" do
user.user_status.ends_at = 1.minutes.ago
json = serializer.as_json
expect(json.keys).not_to include :status
end
it "doesn't return status if user doesn't have it set" do
user.clear_status!
user.reload
json = serializer.as_json
expect(json.keys).not_to include :status
end
end
end
describe "when status is disabled in settings" do
before { SiteSetting.enable_user_status = false }
it "doesn't add user status" do
serializer = BasicUserSerializer.new(user, root: false, include_status: true)
json = serializer.as_json
expect(json.keys).not_to include :status
end
end
end
end