| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require 'rails_helper' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-02 18:58:48 +02:00
										 |  |  | describe SearchService, type: :service do | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  |   subject { described_class.new } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe '#call' do | 
					
						
							|  |  |  |     describe 'with a blank query' do | 
					
						
							|  |  |  |       it 'returns empty results without searching' do | 
					
						
							|  |  |  |         allow(AccountSearchService).to receive(:new) | 
					
						
							|  |  |  |         allow(Tag).to receive(:search_for) | 
					
						
							| 
									
										
										
										
											2019-04-07 04:59:13 +02:00
										 |  |  |         results = subject.call('', nil, 10) | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(results).to eq(empty_results) | 
					
						
							|  |  |  |         expect(AccountSearchService).not_to have_received(:new) | 
					
						
							|  |  |  |         expect(Tag).not_to have_received(:search_for) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe 'with an url query' do | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         @query = 'http://test.host/query' | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context 'that does not find anything' do | 
					
						
							|  |  |  |         it 'returns the empty results' do | 
					
						
							|  |  |  |           service = double(call: nil) | 
					
						
							| 
									
										
										
										
											2018-01-22 22:24:22 +09:00
										 |  |  |           allow(ResolveURLService).to receive(:new).and_return(service) | 
					
						
							| 
									
										
										
										
											2019-07-27 04:42:08 +02:00
										 |  |  |           results = subject.call(@query, nil, 10, resolve: true) | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-07 04:59:13 +02:00
										 |  |  |           expect(service).to have_received(:call).with(@query, on_behalf_of: nil) | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  |           expect(results).to eq empty_results | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context 'that finds an account' do | 
					
						
							|  |  |  |         it 'includes the account in the results' do | 
					
						
							| 
									
										
										
										
											2019-04-07 04:59:13 +02:00
										 |  |  |           account = Account.new | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  |           service = double(call: account) | 
					
						
							| 
									
										
										
										
											2018-01-22 22:24:22 +09:00
										 |  |  |           allow(ResolveURLService).to receive(:new).and_return(service) | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-27 04:42:08 +02:00
										 |  |  |           results = subject.call(@query, nil, 10, resolve: true) | 
					
						
							| 
									
										
										
										
											2019-04-07 04:59:13 +02:00
										 |  |  |           expect(service).to have_received(:call).with(@query, on_behalf_of: nil) | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  |           expect(results).to eq empty_results.merge(accounts: [account]) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context 'that finds a status' do | 
					
						
							|  |  |  |         it 'includes the status in the results' do | 
					
						
							| 
									
										
										
										
											2019-04-07 04:59:13 +02:00
										 |  |  |           status = Status.new | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  |           service = double(call: status) | 
					
						
							| 
									
										
										
										
											2018-01-22 22:24:22 +09:00
										 |  |  |           allow(ResolveURLService).to receive(:new).and_return(service) | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-27 04:42:08 +02:00
										 |  |  |           results = subject.call(@query, nil, 10, resolve: true) | 
					
						
							| 
									
										
										
										
											2019-04-07 04:59:13 +02:00
										 |  |  |           expect(service).to have_received(:call).with(@query, on_behalf_of: nil) | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  |           expect(results).to eq empty_results.merge(statuses: [status]) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe 'with a non-url query' do | 
					
						
							|  |  |  |       context 'that matches an account' do | 
					
						
							|  |  |  |         it 'includes the account in the results' do | 
					
						
							|  |  |  |           query = 'username' | 
					
						
							| 
									
										
										
										
											2019-04-07 04:59:13 +02:00
										 |  |  |           account = Account.new | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  |           service = double(call: [account]) | 
					
						
							|  |  |  |           allow(AccountSearchService).to receive(:new).and_return(service) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-07 04:59:13 +02:00
										 |  |  |           results = subject.call(query, nil, 10) | 
					
						
							|  |  |  |           expect(service).to have_received(:call).with(query, nil, limit: 10, offset: 0, resolve: false) | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  |           expect(results).to eq empty_results.merge(accounts: [account]) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       context 'that matches a tag' do | 
					
						
							|  |  |  |         it 'includes the tag in the results' do | 
					
						
							|  |  |  |           query = '#tag' | 
					
						
							|  |  |  |           tag = Tag.new | 
					
						
							| 
									
										
										
										
											2019-09-28 01:02:21 +02:00
										 |  |  |           allow(Tag).to receive(:search_for).with('tag', 10, 0, exclude_unreviewed: nil).and_return([tag]) | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-07 04:59:13 +02:00
										 |  |  |           results = subject.call(query, nil, 10) | 
					
						
							| 
									
										
										
										
											2019-09-28 01:02:21 +02:00
										 |  |  |           expect(Tag).to have_received(:search_for).with('tag', 10, 0, exclude_unreviewed: nil) | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  |           expect(results).to eq empty_results.merge(hashtags: [tag]) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         it 'does not include tag when starts with @ character' do | 
					
						
							|  |  |  |           query = '@username' | 
					
						
							|  |  |  |           allow(Tag).to receive(:search_for) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-07 04:59:13 +02:00
										 |  |  |           results = subject.call(query, nil, 10) | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  |           expect(Tag).not_to have_received(:search_for) | 
					
						
							|  |  |  |           expect(results).to eq empty_results | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2020-05-14 23:37:37 +02:00
										 |  |  |         it 'does not include account when starts with # character' do | 
					
						
							|  |  |  |           query = '#tag' | 
					
						
							|  |  |  |           allow(AccountSearchService).to receive(:new) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           results = subject.call(query, nil, 10) | 
					
						
							|  |  |  |           expect(AccountSearchService).to_not have_received(:new) | 
					
						
							|  |  |  |           expect(results).to eq empty_results | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-05-05 11:26:04 -04:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def empty_results | 
					
						
							|  |  |  |     { accounts: [], hashtags: [], statuses: [] } | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |