about summary refs log tree commit diff
path: root/spec/controllers/authorize_follows_controller_spec.rb
diff options
context:
space:
mode:
authorMatt Jankowski <mjankowski@thoughtbot.com>2017-04-26 18:19:53 -0400
committerEugen Rochko <eugen@zeonfederated.com>2017-04-27 00:19:53 +0200
commit0618f09939b7afc607bcd983139b91e056debe4d (patch)
treee6b362f7f2928a09bf5dd1c387c1737421b0f359 /spec/controllers/authorize_follows_controller_spec.rb
parenta23eaf720e08db8503c443816e652b3683525e02 (diff)
Add spec coverage and refactor authorize_follows controller (#2505)
Diffstat (limited to 'spec/controllers/authorize_follows_controller_spec.rb')
-rw-r--r--spec/controllers/authorize_follows_controller_spec.rb108
1 files changed, 108 insertions, 0 deletions
diff --git a/spec/controllers/authorize_follows_controller_spec.rb b/spec/controllers/authorize_follows_controller_spec.rb
new file mode 100644
index 000000000..f65b620cc
--- /dev/null
+++ b/spec/controllers/authorize_follows_controller_spec.rb
@@ -0,0 +1,108 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe AuthorizeFollowsController do
+  describe 'GET #show' do
+    describe 'when signed out' do
+      it 'redirects to sign in page' do
+        get :show
+
+        expect(response).to redirect_to(new_user_session_path)
+      end
+    end
+
+    describe 'when signed in' do
+      let(:user) { Fabricate(:user) }
+      let(:account) { Fabricate(:account, user: user) }
+
+      before do
+        sign_in(user)
+      end
+
+      it 'renders error without acct param' do
+        get :show
+
+        expect(response).to render_template(:error)
+      end
+
+      it 'renders error when account cant be found' do
+        service = double
+        allow(FollowRemoteAccountService).to receive(:new).and_return(service)
+        allow(service).to receive(:call).with('missing@hostname').and_return(nil)
+
+        get :show, params: { acct: 'acct:missing@hostname' }
+
+        expect(response).to render_template(:error)
+        expect(service).to have_received(:call).with('missing@hostname')
+      end
+
+      it 'sets account from url' do
+        account = double
+        service = double
+        allow(FetchRemoteAccountService).to receive(:new).and_return(service)
+        allow(service).to receive(:call).with('http://example.com').and_return(account)
+
+        get :show, params: { acct: 'http://example.com' }
+
+        expect(response).to have_http_status(:success)
+        expect(service).to have_received(:call).with('http://example.com')
+      end
+
+      it 'sets account from acct uri' do
+        account = double
+        service = double
+        allow(FollowRemoteAccountService).to receive(:new).and_return(service)
+        allow(service).to receive(:call).with('found@hostname').and_return(account)
+
+        get :show, params: { acct: 'acct:found@hostname' }
+
+        expect(response).to have_http_status(:success)
+        expect(service).to have_received(:call).with('found@hostname')
+      end
+    end
+  end
+
+  describe 'POST #create' do
+    describe 'when signed out' do
+      it 'redirects to sign in page' do
+        post :create
+
+        expect(response).to redirect_to(new_user_session_path)
+      end
+    end
+
+    describe 'when signed in' do
+      let(:user) { Fabricate(:user) }
+      let(:account) { Fabricate(:account, user: user) }
+
+      before do
+        sign_in(user)
+      end
+
+      it 'shows error when account not found' do
+        service = double
+        allow(FollowService).to receive(:new).and_return(service)
+        allow(service).to receive(:call).with(account, 'user@hostname').and_return(nil)
+
+        post :create, params: { acct: 'acct:user@hostname' }
+
+        expect(service).to have_received(:call).with(account, 'user@hostname')
+        expect(response).to render_template(:error)
+      end
+
+      it 'follows account when found' do
+        target_account = double(id: '123')
+        result_account = double(target_account: target_account)
+        service = double
+        allow(FollowService).to receive(:new).and_return(service)
+        allow(service).to receive(:call).with(account, 'user@hostname').and_return(result_account)
+
+        post :create, params: { acct: 'acct:user@hostname' }
+
+        expect(service).to have_received(:call).with(account, 'user@hostname')
+        expect(response).to redirect_to(web_url('accounts/123'))
+      end
+    end
+  end
+end