* Move ApiController to Api/BaseController * API controllers inherit from Api::BaseController * Add coverage for various error cases in api/base controllerclosed-social-v3
@ -1,6 +1,6 @@ | |||||
# frozen_string_literal: true | # frozen_string_literal: true | ||||
class ApiController < ApplicationController | |||||
class Api::BaseController < ApplicationController | |||||
DEFAULT_STATUSES_LIMIT = 20 | DEFAULT_STATUSES_LIMIT = 20 | ||||
DEFAULT_ACCOUNTS_LIMIT = 40 | DEFAULT_ACCOUNTS_LIMIT = 40 | ||||
@ -1,6 +1,6 @@ | |||||
# frozen_string_literal: true | # frozen_string_literal: true | ||||
class Api::V1::InstancesController < ApiController | |||||
class Api::V1::InstancesController < Api::BaseController | |||||
respond_to :json | respond_to :json | ||||
def show; end | def show; end | ||||
@ -0,0 +1,54 @@ | |||||
# frozen_string_literal: true | |||||
require 'rails_helper' | |||||
class FakeService; end | |||||
describe Api::BaseController do | |||||
controller do | |||||
def success | |||||
head 200 | |||||
end | |||||
def error | |||||
FakeService.new | |||||
end | |||||
end | |||||
describe 'Forgery protection' do | |||||
before do | |||||
routes.draw { post 'success' => 'api/base#success' } | |||||
end | |||||
it 'does not protect from forgery' do | |||||
ActionController::Base.allow_forgery_protection = true | |||||
post 'success' | |||||
expect(response).to have_http_status(:success) | |||||
end | |||||
end | |||||
describe 'Error handling' do | |||||
ERRORS_WITH_CODES = { | |||||
ActiveRecord::RecordInvalid => 422, | |||||
Mastodon::ValidationError => 422, | |||||
ActiveRecord::RecordNotFound => 404, | |||||
Goldfinger::Error => 422, | |||||
HTTP::Error => 503, | |||||
OpenSSL::SSL::SSLError => 503, | |||||
Mastodon::NotPermittedError => 403, | |||||
} | |||||
before do | |||||
routes.draw { get 'error' => 'api/base#error' } | |||||
end | |||||
ERRORS_WITH_CODES.each do |error, code| | |||||
it "Handles error class of #{error}" do | |||||
expect(FakeService).to receive(:new).and_raise(error) | |||||
get 'error' | |||||
expect(response).to have_http_status(code) | |||||
end | |||||
end | |||||
end | |||||
end |
@ -1,21 +0,0 @@ | |||||
# frozen_string_literal: true | |||||
require 'rails_helper' | |||||
describe ApiController, type: :controller do | |||||
controller do | |||||
def success | |||||
head 200 | |||||
end | |||||
end | |||||
before do | |||||
routes.draw { post 'success' => 'api#success' } | |||||
end | |||||
it 'does not protect from forgery' do | |||||
ActionController::Base.allow_forgery_protection = true | |||||
post 'success' | |||||
expect(response).to have_http_status(:success) | |||||
end | |||||
end |