diff --git a/app/controllers/api/salmon_controller.rb b/app/controllers/api/salmon_controller.rb index 7fc5e548d6a..f611b48a098 100644 --- a/app/controllers/api/salmon_controller.rb +++ b/app/controllers/api/salmon_controller.rb @@ -5,10 +5,8 @@ class Api::SalmonController < ApiController respond_to :txt def update - payload = request.body.read - - if !payload.nil? && verify?(payload) - SalmonWorker.perform_async(@account.id, payload.force_encoding('UTF-8')) + if verify_payload? + process_salmon head 201 else head 202 @@ -21,7 +19,15 @@ class Api::SalmonController < ApiController @account = Account.find(params[:id]) end - def verify?(payload) - VerifySalmonService.new.call(payload) + def payload + @_payload ||= request.body.read + end + + def verify_payload? + payload.present? && VerifySalmonService.new.call(payload) + end + + def process_salmon + SalmonWorker.perform_async(@account.id, payload.force_encoding('UTF-8')) end end diff --git a/spec/controllers/api/salmon_controller_spec.rb b/spec/controllers/api/salmon_controller_spec.rb index 6897caeebbe..3e4686200b6 100644 --- a/spec/controllers/api/salmon_controller_spec.rb +++ b/spec/controllers/api/salmon_controller_spec.rb @@ -13,29 +13,42 @@ RSpec.describe Api::SalmonController, type: :controller do end describe 'POST #update' do - before do - request.env['RAW_POST_DATA'] = File.read(File.join(Rails.root, 'spec', 'fixtures', 'salmon', 'mention.xml')) - post :update, params: { id: account.id } + context 'with valid post data' do + before do + request.env['RAW_POST_DATA'] = File.read(File.join(Rails.root, 'spec', 'fixtures', 'salmon', 'mention.xml')) + post :update, params: { id: account.id } + end + + it 'contains XML in the request body' do + expect(request.body.read).to be_a String + end + + it 'returns http success' do + expect(response).to have_http_status(:success) + end + + it 'creates remote account' do + expect(Account.find_by(username: 'gargron', domain: 'quitter.no')).to_not be_nil + end + + it 'creates status' do + expect(Status.find_by(uri: 'tag:quitter.no,2016-03-20:noticeId=1276923:objectType=note')).to_not be_nil + end + + it 'creates mention for target account' do + expect(account.mentions.count).to eq 1 + end end - it 'contains XML in the request body' do - expect(request.body.read).to be_a String - end + context 'with invalid post data' do + before do + request.env['RAW_POST_DATA'] = '' + post :update, params: { id: account.id } + end - it 'returns http success' do - expect(response).to have_http_status(:success) - end - - it 'creates remote account' do - expect(Account.find_by(username: 'gargron', domain: 'quitter.no')).to_not be_nil - end - - it 'creates status' do - expect(Status.find_by(uri: 'tag:quitter.no,2016-03-20:noticeId=1276923:objectType=note')).to_not be_nil - end - - it 'creates mention for target account' do - expect(account.mentions.count).to eq 1 + it 'returns http success' do + expect(response).to have_http_status(202) + end end end end