Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid comparing domains when looking for an exact match of a local account #3336

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 7 additions & 1 deletion app/services/account_search_service.rb
Expand Up @@ -59,7 +59,13 @@ def domain_is_local?
end

def exact_match
@_exact_match ||= Account.find_remote(query_username, query_domain)
@_exact_match ||= begin
if domain_is_local?
Account.find_local(query_username)
else
Account.find_remote(query_username, query_domain)
end
end
end

def search_results
Expand Down
31 changes: 25 additions & 6 deletions spec/services/account_search_service_spec.rb
Expand Up @@ -33,25 +33,25 @@
describe 'searching local and remote users' do
describe "when only '@'" do
before do
allow(Account).to receive(:find_remote)
allow(Account).to receive(:find_local)
allow(Account).to receive(:search_for)
subject.call('@', 10)
end

it 'uses find_remote with empty query to look for local accounts' do
expect(Account).to have_received(:find_remote).with('', nil)
it 'uses find_local with empty query to look for local accounts' do
expect(Account).to have_received(:find_local).with('')
end
end

describe 'when no domain' do
before do
allow(Account).to receive(:find_remote)
allow(Account).to receive(:find_local)
allow(Account).to receive(:search_for)
subject.call('one', 10)
end

it 'uses find_remote with nil domain to look for local accounts' do
expect(Account).to have_received(:find_remote).with('one', nil)
it 'uses find_local to look for local accounts' do
expect(Account).to have_received(:find_local).with('one')
end

it 'uses search_for to find matches' do
Expand Down Expand Up @@ -101,6 +101,25 @@
end
end

describe 'when there is a local domain' do
around do |example|
before = Rails.configuration.x.local_domain
example.run
Rails.configuration.x.local_domain = before
end

it 'returns exact match first' do
remote = Fabricate(:account, username: 'a', domain: 'remote', display_name: 'e')
remote_too = Fabricate(:account, username: 'b', domain: 'remote', display_name: 'e')
exact = Fabricate(:account, username: 'e')
Rails.configuration.x.local_domain = 'example.com'

results = subject.call('e@example.com', 2)
expect(results.size).to eq 2
expect(results).to eq([exact, remote]).or eq([exact, remote_too])
end
end

describe 'when there is a domain but no exact match' do
it 'follows the remote account when resolve is true' do
service = double(call: nil)
Expand Down