У меня довольно простая политика Pundit с областью действия для разных ролей пользователей. Я не могу понять, как проверить это в Rspec. В частности, я не знаю, как определить область, в которую вошел пользователь, прежде чем получить доступ к области.
Вот что я пробовал:
let(:records) { policy_scope(Report) }
context 'admin user' do
before(:each) { sign_in(admin_user) }
it { expect(reports.to_a).to match_array([account1_report, account2_report]) }
end
context 'client user' do
before(:each) { sign_in(account2_user) }
it { expect(reports.to_a).to match_array([account2_report]) }
end
Когда я запускаю Rspec, я получаю:
NoMethodError: undefined method `sign_in' for #<RSpec::ExampleGroups::ReportPolicy::Scope:0x00007f93241c67b8>
Я широко использую sign_in
в тестах контроллеров, но, полагаю, это не применимо в тесте политик.
Документы Pundit говорят только:
Pundit не предоставляет DSL для тестирования областей. Просто протестируйте его как обычный класс Ruby!
Итак ... у кого-нибудь есть пример тестирования области Pundit для конкретного пользователя? Как мне определить область действия current_user?
FWIW, вот суть моей политики:
class ReportPolicy < ApplicationPolicy
def index?
true
end
class Scope < Scope
def resolve
if user.role == 'admin'
scope.all
else
scope.where(account_id: user.account_id)
end
end
end
end
В моем контроллере я называю это следующим образом. Я подтвердил, что это работает правильно в реальном мире: администраторы видят все отчеты, а другие пользователи видят отчеты только для своей учетной записи:
reports = policy_scope(Report)