about summary refs log tree commit diff
path: root/spec/services/search_service_spec.rb
diff options
context:
space:
mode:
authorMatt Jankowski <mjankowski@thoughtbot.com>2017-05-05 11:26:04 -0400
committerEugen Rochko <eugen@zeonfederated.com>2017-05-05 17:26:04 +0200
commit20c37ed0f988298de75a3c41472222076806d243 (patch)
tree9fd1d3a688483e2fbc26e5ec02586db1ce7602b4 /spec/services/search_service_spec.rb
parent9501a877048a34627155b04b75a9c75fdbb25cb9 (diff)
Add specs (and refactor) of FetchRemoteResourceService and SearchService (#2812)
* Coverage for fetch remote resource service

* Refactor fetch remote resource service

* Coverage for search service

* Refactor search service
Diffstat (limited to 'spec/services/search_service_spec.rb')
-rw-r--r--spec/services/search_service_spec.rb101
1 files changed, 101 insertions, 0 deletions
diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb
new file mode 100644
index 000000000..00475c699
--- /dev/null
+++ b/spec/services/search_service_spec.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe SearchService do
+  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)
+        results = subject.call('', 10)
+
+        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)
+          allow(FetchRemoteResourceService).to receive(:new).and_return(service)
+          results = subject.call(@query, 10)
+
+          expect(service).to have_received(:call).with(@query)
+          expect(results).to eq empty_results
+        end
+      end
+
+      context 'that finds an account' do
+        it 'includes the account in the results' do
+          account = Account.new
+          service = double(call: account)
+          allow(FetchRemoteResourceService).to receive(:new).and_return(service)
+
+          results = subject.call(@query, 10)
+          expect(service).to have_received(:call).with(@query)
+          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
+          status = Status.new
+          service = double(call: status)
+          allow(FetchRemoteResourceService).to receive(:new).and_return(service)
+
+          results = subject.call(@query, 10)
+          expect(service).to have_received(:call).with(@query)
+          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'
+          account = Account.new
+          service = double(call: [account])
+          allow(AccountSearchService).to receive(:new).and_return(service)
+
+          results = subject.call(query, 10)
+          expect(service).to have_received(:call).with(query, 10, false, nil)
+          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
+          allow(Tag).to receive(:search_for).with('tag', 10).and_return([tag])
+
+          results = subject.call(query, 10)
+          expect(Tag).to have_received(:search_for).with('tag', 10)
+          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)
+
+          results = subject.call(query, 10)
+          expect(Tag).not_to have_received(:search_for)
+          expect(results).to eq empty_results
+        end
+      end
+    end
+  end
+
+  def empty_results
+    { accounts: [], hashtags: [], statuses: [] }
+  end
+end