У меня есть простой метод контроллера: WelcomeController#dashboard
, который предназначен для того, чтобы быть целевой страницей ПОСЛЕ того, как пользователь войдет в систему (у пользователя есть роль 'manager' для этого теста).
I'mНачнем с простого, так что в этом контроллере еще не так много controllers / welcome_controller.rb :
class WelcomeController < ApplicationController
skip_authorize_resource only: :index
authorize_resource class: false, only: [:dashboard]
skip_before_action :authenticate_user!, only: [:index]
layout 'external', only: [:index]
def index; end
def dashboard; end
end
Итак, у меня установлен CanCanCan и в моих моделях/ability.rb file:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.admin?
can :manage, :all
can :access, :rails_admin
elsif user.manager?
can :read, Lesson
can :access, :dashboard
can :modify, Company
elsif user.user?
can :read, Lesson
else
can :read, :root
end
end
end
Однако мой тест Rspec не проходит, и я не могу понять, почему.Код в spec / controllers / welcome_controller_spec.rb :
require 'rails_helper'
require 'cancan/matchers'
RSpec.describe WelcomeController, type: :controller do
describe 'GET #index' do
it 'returns http success' do
get :index
expect(response).to have_http_status(:success)
end
end
describe 'GET #dashboard' do
it 'manager routes to dashboard after login' do
company = Company.create!(name: 'ACME', domain: 'acme.com')
user = User.create!(email: 'test@test.com', password: 'password', password_confirmation: 'password', company_id: company.id, role: 1)
sign_in user
get :dashboard
expect(response).to have_http_status(:success)
end
it 'user does not route to dashboard after login' do
user = create(:user)
sign_in user
expect { get :dashboard }.to raise_error(CanCan::AccessDenied)
end
end
end
, что приводит к этой ошибке:
Failures:
1) WelcomeController GET #dashboard manager routes to dashboard after login
Failure/Error: get :dashboard
CanCan::AccessDenied:
You are not authorized to access this page.
# ./spec/controllers/welcome_controller_spec.rb:17:in `block (3 levels) in <top (required)>'
Мне интересно, что только "Диспетчер маршрутов на приборную панель после входа в систему »Тест - это то, что не удается, так как 3-й тест для пользователя проходит без проблем, хотя я использую тот же самый вызов :dashboard
.
Я был бы благодарен за любыеПомощь / предложения.
Спасибо!