REFACTOR: Move option to return emails into the serializer

This makes more sense than having the guardian take an accessor.
The logic belongs in the Serializer, where the JSON is calculated.

Also removed some of the DRYness in the spec. It's fewer lines
and made it easier to test the option on the serializer.
This commit is contained in:
Robin Ward 2019-01-11 11:10:02 -05:00
parent f94c0283b2
commit dbe42068a2
4 changed files with 40 additions and 77 deletions

View File

@ -32,12 +32,13 @@ class Admin::UsersController < Admin::AdminController
def index
users = ::AdminUserIndexQuery.new(params).find_users
opts = {}
if params[:show_emails] == "true"
guardian.can_see_emails = true
StaffActionLogger.new(current_user).log_show_emails(users)
opts[:emails_desired] = true
end
render_serialized(users, AdminUserListSerializer)
render_serialized(users, AdminUserListSerializer, opts)
end
def show

View File

@ -39,7 +39,7 @@ class AdminUserListSerializer < BasicUserSerializer
def include_email?
# staff members can always see their email
(scope.is_staff? && (object.id == scope.user.id || object.staged?)) ||
(scope.is_admin? && scope.can_see_emails?)
(scope.is_admin? && @options[:emails_desired])
end
alias_method :include_secondary_emails?, :include_email?

View File

@ -54,7 +54,6 @@ class Guardian
end
end
attr_accessor :can_see_emails
attr_reader :request
def initialize(user = nil, request = nil)
@ -381,10 +380,6 @@ class Guardian
)
end
def can_see_emails?
@can_see_emails
end
def can_export_entity?(entity)
return false unless @user
return true if is_admin?

View File

@ -8,92 +8,59 @@ describe AdminUserListSerializer do
let(:moderator) { Fabricate(:user_single_email, moderator: true, email: "moderator@email.com") }
let(:user) { Fabricate(:user_single_email, email: "user@email.com") }
let(:guardian) { Guardian.new(admin) }
let(:mod_guardian) { Guardian.new(moderator) }
let(:json) do
AdminUserListSerializer.new(user,
scope: guardian,
root: false
).as_json
let(:serializer) do
AdminUserListSerializer.new(user, scope: guardian, root: false)
end
let(:mod_json) do
AdminUserListSerializer.new(user,
scope: mod_guardian,
root: false
def serialize(user, viewed_by, opts = nil)
AdminUserListSerializer.new(
user,
scope: Guardian.new(viewed_by),
root: false,
emails_desired: opts && opts[:emails_desired]
).as_json
end
def fabricate_secondary_emails_for(u)
["first", "second"].each do |name|
Fabricate(:secondary_email, user: u, email: "#{name}@email.com")
end
Fabricate(:secondary_email, user: u, email: "first@email.com")
Fabricate(:secondary_email, user: u, email: "second@email.com")
end
shared_examples "shown" do |email|
it "contains emails" do
expect(json[:email]).to eq(email)
expect(json[:secondary_emails]).to contain_exactly(
"first@email.com",
"second@email.com"
)
end
it "contains an admin's own emails" do
fabricate_secondary_emails_for(admin)
json = serialize(admin, admin)
expect(json[:email]).to eq("admin@email.com")
expect(json[:secondary_emails]).to contain_exactly("first@email.com", "second@email.com")
end
shared_examples "not shown" do
it "doesn't contain emails" do
expect(json[:email]).to eq(nil)
expect(json[:secondary_emails]).to eq(nil)
end
it "doesn't include a regular user's emails" do
fabricate_secondary_emails_for(user)
json = serialize(user, user)
expect(json[:email]).to eq(nil)
expect(json[:secondary_emails]).to eq(nil)
end
context "with myself" do
let(:user) { admin }
before do
fabricate_secondary_emails_for(admin)
end
include_examples "shown", "admin@email.com"
it "doesn't return emails for a moderator request" do
fabricate_secondary_emails_for(user)
json = serialize(user, moderator, emails_desired: true)
expect(json[:email]).to eq(nil)
expect(json[:secondary_emails]).to eq(nil)
end
context "with a normal user" do
before do
fabricate_secondary_emails_for(user)
end
include_examples "not shown"
it "returns emails for admins when emails_desired is true" do
fabricate_secondary_emails_for(user)
json = serialize(user, admin, emails_desired: true)
expect(json[:email]).to eq("user@email.com")
expect(json[:secondary_emails]).to contain_exactly("first@email.com", "second@email.com")
end
context "when moderator makes a request with show_emails param set to true" do
before do
mod_guardian.can_see_emails = true
fabricate_secondary_emails_for(user)
end
it "doesn't contain emails" do
expect(mod_json[:email]).to eq(nil)
expect(mod_json[:secondary_emails]).to eq(nil)
end
end
context "with a normal user after clicking 'show emails'" do
before do
guardian.can_see_emails = true
fabricate_secondary_emails_for(user)
end
include_examples "shown", "user@email.com"
end
context "with a staged user" do
before do
user.staged = true
fabricate_secondary_emails_for(user)
end
include_examples "shown", "user@email.com"
it "returns a staged user's emails" do
user.staged = true
fabricate_secondary_emails_for(user)
json = serialize(user, admin)
expect(json[:email]).to eq("user@email.com")
expect(json[:secondary_emails]).to contain_exactly("first@email.com", "second@email.com")
end
end
end