У меня есть такие характеристики:
it "should let a user destroy their own picture" do
expect do
delete :destroy, { id: p1.id }
puts "\n\nOK resp\n#{response.status}\n\n\n"
end.to change { Picture.count }.by(-1)
end
it "should not let a user delete another user's picture" do
sign_in(user2)
expect do
delete :destroy, { id: p1.id }
puts "\n\nNOT OK resp\n#{response.status}\n\n\n"
end.to change { Picture.count }.by(0)
end
Первый правильно возвращает 302
(я перенаправляю после уничтожения). Второй корректно проходит, что означает, что пользователь не может уничтожить, но возвращает код состояния 200
вместо 401
, как он должен вернуть.
По моему ApplicationController
:
class ApplicationController < ActionController::Base
include Pundit
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
def user_not_authorized
render file: "public/401.html", status: :unauthorized
end
...
end
С или без строки rescue from
я все равно получаю 200
. Кажется, что хотя pundit
правильно перехватывает true
или false
в методе authorize(@obj)
и останавливает выполнение, но он не поднимается, когда получает false
.
Как я могу это исправить?