about summary refs log tree commit diff
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/services/fetch_remote_resource_service_spec.rb53
-rw-r--r--spec/services/search_service_spec.rb101
2 files changed, 154 insertions, 0 deletions
diff --git a/spec/services/fetch_remote_resource_service_spec.rb b/spec/services/fetch_remote_resource_service_spec.rb
new file mode 100644
index 000000000..79834842a
--- /dev/null
+++ b/spec/services/fetch_remote_resource_service_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe FetchRemoteResourceService do
+  subject { described_class.new }
+
+  describe '#call' do
+    it 'returns nil when there is no atom url' do
+      url = 'http://example.com/missing-atom'
+      service = double
+      allow(FetchAtomService).to receive(:new).and_return service
+      allow(service).to receive(:call).with(url).and_return([nil, 'body'])
+
+      result = subject.call(url)
+      expect(result).to be_nil
+    end
+
+    it 'fetches remote accounts for feed types' do
+      url = 'http://example.com/atom-feed'
+      service = double
+      allow(FetchAtomService).to receive(:new).and_return service
+      feed_url = 'http://feed-url'
+      feed_content = '<feed>contents</feed>'
+      allow(service).to receive(:call).with(url).and_return([feed_url, feed_content])
+
+      account_service = double
+      allow(FetchRemoteAccountService).to receive(:new).and_return(account_service)
+      allow(account_service).to receive(:call)
+
+      _result = subject.call(url)
+
+      expect(account_service).to have_received(:call).with(feed_url, feed_content)
+    end
+
+    it 'fetches remote statuses for entry types' do
+      url = 'http://example.com/atom-entry'
+      service = double
+      allow(FetchAtomService).to receive(:new).and_return service
+      feed_url = 'http://feed-url'
+      feed_content = '<entry>contents</entry>'
+      allow(service).to receive(:call).with(url).and_return([feed_url, feed_content])
+
+      account_service = double
+      allow(FetchRemoteStatusService).to receive(:new).and_return(account_service)
+      allow(account_service).to receive(:call)
+
+      _result = subject.call(url)
+
+      expect(account_service).to have_received(:call).with(feed_url, feed_content)
+    end
+  end
+end
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