discourse/spec/requests/directory_items_controller_spec.rb
David Taylor a9eb1163e1
UX: Do not include current user in group-filtered directory results (#11310)
At the moment, when filtering by group, the directory will unconditionally return the current user at the top of the list. This is quite unexpected, given that the user is deliberately trying to filter the list. This commit makes sure the 'include current user' logic only triggers for unfiltered directories
2020-11-23 10:22:14 +11:00

153 lines
5.3 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
describe DirectoryItemsController do
fab!(:user) { Fabricate(:user) }
fab!(:evil_trout) { Fabricate(:evil_trout) }
fab!(:walter_white) { Fabricate(:walter_white) }
fab!(:stage_user) { Fabricate(:staged, username: 'stage_user') }
fab!(:group) { Fabricate(:group, users: [evil_trout, stage_user]) }
it "requires a `period` param" do
get '/directory_items.json'
expect(response.status).to eq(400)
end
it "requires a proper `period` param" do
get '/directory_items.json', params: { period: 'eviltrout' }
expect(response).not_to be_successful
end
context "without data" do
context "and a logged in user" do
before { sign_in(user) }
it "succeeds" do
get '/directory_items.json', params: { period: 'all' }
expect(response.status).to eq(200)
end
end
end
context "with data" do
before do
DirectoryItem.refresh!
end
it "succeeds with a valid value" do
get '/directory_items.json', params: { period: 'all' }
expect(response.status).to eq(200)
json = response.parsed_body
expect(json).to be_present
expect(json['directory_items']).to be_present
expect(json['meta']['total_rows_directory_items']).to be_present
expect(json['meta']['load_more_directory_items']).to be_present
expect(json['meta']['last_updated_at']).to be_present
expect(json['directory_items'].length).to eq(4)
expect(json['meta']['total_rows_directory_items']).to eq(4)
expect(json['meta']['load_more_directory_items']).to include('.json')
end
it "fails when the directory is disabled" do
SiteSetting.enable_user_directory = false
get '/directory_items.json', params: { period: 'all' }
expect(response).not_to be_successful
end
it "sort username with asc as a parameter" do
get '/directory_items.json', params: { asc: true, order: 'username', period: 'all' }
expect(response.status).to eq(200)
json = response.parsed_body
names = json['directory_items'].map { |item| item['user']['username'] }
expect(names).to eq(names.sort)
end
it "sort username without asc as a parameter" do
get '/directory_items.json', params: { order: 'username', period: 'all' }
expect(response.status).to eq(200)
json = response.parsed_body
names = json['directory_items'].map { |item| item['user']['username'] }
expect(names).to eq(names.sort.reverse)
end
it "finds user by name" do
get '/directory_items.json', params: { period: 'all', name: 'eviltrout' }
expect(response.status).to eq(200)
json = response.parsed_body
expect(json).to be_present
expect(json['directory_items'].length).to eq(1)
expect(json['meta']['total_rows_directory_items']).to eq(1)
expect(json['directory_items'][0]['user']['username']).to eq('eviltrout')
end
it "finds staged user by name" do
get '/directory_items.json', params: { period: 'all', name: 'stage_user' }
expect(response.status).to eq(200)
json = response.parsed_body
expect(json).to be_present
expect(json['directory_items'].length).to eq(1)
expect(json['meta']['total_rows_directory_items']).to eq(1)
expect(json['directory_items'][0]['user']['username']).to eq('stage_user')
end
it "excludes users by username" do
get '/directory_items.json', params: { period: 'all', exclude_usernames: "stage_user,eviltrout" }
expect(response.status).to eq(200)
json = response.parsed_body
expect(json).to be_present
expect(json['directory_items'].length).to eq(2)
expect(json['meta']['total_rows_directory_items']).to eq(2)
expect(json['directory_items'][0]['user']['username']).to eq(walter_white.username) | eq(user.username)
expect(json['directory_items'][1]['user']['username']).to eq(walter_white.username) | eq(user.username)
end
it "filters users by group" do
get '/directory_items.json', params: { period: 'all', group: group.name }
expect(response.status).to eq(200)
json = response.parsed_body
expect(json).to be_present
expect(json['directory_items'].length).to eq(2)
expect(json['meta']['total_rows_directory_items']).to eq(2)
expect(json['directory_items'][0]['user']['username']).to eq(evil_trout.username) | eq(stage_user.username)
expect(json['directory_items'][1]['user']['username']).to eq(evil_trout.username) | eq(stage_user.username)
end
it "checks group permissions" do
group.update!(visibility_level: Group.visibility_levels[:members])
sign_in(evil_trout)
get '/directory_items.json', params: { period: 'all', group: group.name }
expect(response.status).to eq(200)
get '/directory_items.json', params: { period: 'all', group: 'not a group' }
expect(response.status).to eq(400)
sign_in(user)
get '/directory_items.json', params: { period: 'all', group: group.name }
expect(response.status).to eq(403)
end
it "does not force-include self in group-filtered results" do
me = Fabricate(:user)
DirectoryItem.refresh!
sign_in(me)
get '/directory_items.json', params: { period: 'all', group: group.name }
expect(response.parsed_body['directory_items'].length).to eq(2)
end
end
end