From a11a2fb052ad2903426e7798040f699b8a1f051c Mon Sep 17 00:00:00 2001
From: Matt Jankowski <matt@jankowski.online>
Date: Wed, 24 Jan 2024 05:31:31 -0500
Subject: [PATCH] Add error classes to api/base errors coverage (#28864)

---
 spec/controllers/api/base_controller_spec.rb | 30 +++++++++++++-------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/spec/controllers/api/base_controller_spec.rb b/spec/controllers/api/base_controller_spec.rb
index db1e8777f7..f8e014be2f 100644
--- a/spec/controllers/api/base_controller_spec.rb
+++ b/spec/controllers/api/base_controller_spec.rb
@@ -12,7 +12,7 @@ describe Api::BaseController do
       head 200
     end
 
-    def error
+    def failure
       FakeService.new
     end
   end
@@ -30,7 +30,7 @@ describe Api::BaseController do
 
     it 'does not protect from forgery' do
       ActionController::Base.allow_forgery_protection = true
-      post 'success'
+      post :success
       expect(response).to have_http_status(200)
     end
   end
@@ -50,47 +50,55 @@ describe Api::BaseController do
 
     it 'returns http forbidden for unconfirmed accounts' do
       user.update(confirmed_at: nil)
-      post 'success'
+      post :success
       expect(response).to have_http_status(403)
     end
 
     it 'returns http forbidden for pending accounts' do
       user.update(approved: false)
-      post 'success'
+      post :success
       expect(response).to have_http_status(403)
     end
 
     it 'returns http forbidden for disabled accounts' do
       user.update(disabled: true)
-      post 'success'
+      post :success
       expect(response).to have_http_status(403)
     end
 
     it 'returns http forbidden for suspended accounts' do
       user.account.suspend!
-      post 'success'
+      post :success
       expect(response).to have_http_status(403)
     end
   end
 
   describe 'error handling' do
     before do
-      routes.draw { get 'error' => 'api/base#error' }
+      routes.draw { get 'failure' => 'api/base#failure' }
     end
 
     {
       ActiveRecord::RecordInvalid => 422,
-      Mastodon::ValidationError => 422,
       ActiveRecord::RecordNotFound => 404,
-      Mastodon::UnexpectedResponseError => 503,
+      ActiveRecord::RecordNotUnique => 422,
+      Date::Error => 422,
       HTTP::Error => 503,
-      OpenSSL::SSL::SSLError => 503,
+      Mastodon::InvalidParameterError => 400,
       Mastodon::NotPermittedError => 403,
+      Mastodon::RaceConditionError => 503,
+      Mastodon::RateLimitExceededError => 429,
+      Mastodon::UnexpectedResponseError => 503,
+      Mastodon::ValidationError => 422,
+      OpenSSL::SSL::SSLError => 503,
+      Seahorse::Client::NetworkingError => 503,
+      Stoplight::Error::RedLight => 503,
     }.each do |error, code|
       it "Handles error class of #{error}" do
         allow(FakeService).to receive(:new).and_raise(error)
 
-        get 'error'
+        get :failure
+
         expect(response).to have_http_status(code)
         expect(FakeService).to have_received(:new)
       end