FEATURE: user directory returns staged users during search

This commit is contained in:
Gerhard Schlager 2017-11-19 01:17:31 +01:00
parent 546b206da0
commit 92a831bae6
5 changed files with 90 additions and 53 deletions

View File

@ -23,7 +23,7 @@ class DirectoryItemsController < ApplicationController
user_ids = nil
if params[:name].present?
user_ids = UserSearch.new(params[:name]).search.pluck(:id)
user_ids = UserSearch.new(params[:name], include_staged_users: true).search.pluck(:id)
if user_ids.present?
# Add the current user if we have at least one other match
if current_user && result.dup.where(user_id: user_ids).exists?

View File

@ -9,6 +9,7 @@ class UserSearch
@topic_id = opts[:topic_id]
@topic_allowed_users = opts[:topic_allowed_users]
@searching_user = opts[:searching_user]
@include_staged_users = opts[:include_staged_users] || false
@limit = opts[:limit] || 20
@group = opts[:group]
@guardian = Guardian.new(@searching_user)
@ -16,7 +17,8 @@ class UserSearch
end
def scoped_users
users = User.where(active: true, staged: false)
users = User.where(active: true)
users = users.where(staged: false) unless @include_staged_users
if @group
users = users.where('users.id IN (

View File

@ -1,51 +0,0 @@
require 'rails_helper'
describe DirectoryItemsController do
it "requires a `period` param" do
expect { get :index, format: :json }.to raise_error(ActionController::ParameterMissing)
end
it "requires a proper `period` param" do
get :index, params: { period: 'eviltrout' }, format: :json
expect(response).not_to be_success
end
context "without data" do
context "and a logged in user" do
let!(:user) { log_in }
it "succeeds" do
get :index, params: { period: 'all' }, format: :json
expect(response).to be_success
end
end
end
context "with data" do
before do
Fabricate(:user)
DirectoryItem.refresh!
end
it "succeeds with a valid value" do
get :index, params: { period: 'all' }, format: :json
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json).to be_present
expect(json['directory_items']).to be_present
expect(json['total_rows_directory_items']).to be_present
expect(json['load_more_directory_items']).to be_present
end
it "fails when the directory is disabled" do
SiteSetting.enable_user_directory = false
get :index, params: { period: 'all' }, format: :json
expect(response).not_to be_success
end
end
end

View File

@ -134,6 +134,9 @@ describe UserSearch do
# don't return staged users
results = search_for(staged.username)
expect(results).to be_blank
results = search_for(staged.username, include_staged_users: true)
expect(results.first.username).to eq(staged.username)
end
end

View File

@ -0,0 +1,83 @@
require 'rails_helper'
describe DirectoryItemsController do
let!(:user) { Fabricate(:user) }
it "requires a `period` param" do
expect do
get '/directory_items.json'
end.to raise_error(ActionController::ParameterMissing)
end
it "requires a proper `period` param" do
get '/directory_items.json', params: { period: 'eviltrout' }
expect(response).not_to be_success
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).to be_success
end
end
end
context "with data" do
before do
Fabricate(:evil_trout)
Fabricate(:walter_white)
Fabricate(:staged, username: 'stage_user')
DirectoryItem.refresh!
end
it "succeeds with a valid value" do
get '/directory_items.json', params: { period: 'all' }
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json).to be_present
expect(json['directory_items']).to be_present
expect(json['total_rows_directory_items']).to be_present
expect(json['load_more_directory_items']).to be_present
expect(json['directory_items'].length).to eq(4)
expect(json['total_rows_directory_items']).to eq(4)
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_success
end
it "finds user by name" do
get '/directory_items.json', params: { period: 'all', name: 'eviltrout' }
expect(response).to be_success
json = ::JSON.parse(response.body)
expect(json).to be_present
expect(json['directory_items'].length).to eq(1)
expect(json['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).to be_success
json = ::JSON.parse(response.body)
expect(json).to be_present
expect(json['directory_items'].length).to eq(1)
expect(json['total_rows_directory_items']).to eq(1)
expect(json['directory_items'][0]['user']['username']).to eq('stage_user')
end
end
end