0
votes

I have a Devise User model and in my application I have different roles which I am specifying through an enum in my User model. When I am running the tests for the admin role, I am receiving the following error when running RSpec tests with Devise. I have tried some of the other answers to similar issues but nothing seems to be working. I hope you can point me in the right direction. Thanks!

RuntimeError:
   Could not find a valid mapping for {:email=>"[email protected]", :password=>"12345678", :password_confirmation=>"12345678", :role=>2}

Here is the User model:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :comments

  enum role: [:member, :moderator, :admin]

  before_save :set_default_role

  def set_default_role
    self.role ||= 0
  end
end

The user factory:

FactoryGirl.define do
  factory :user do
    email { Faker::Internet.email }
    password "12345678"
    password_confirmation "12345678"
    role 0
  end
end

The categories controller spec

require 'rails_helper'

RSpec.describe Admin::CategoriesController, type: :controller do

    it 'should redirect to sign in path for non signed users' do
        get :index
        expect(response).to redirect_to(new_user_session_path)
    end

    it 'should redirect to root path for non admin users' do
        user = create(:user)
        sign_in user
        get :index
        expect(response).to redirect_to(root_path)
    end

    describe 'GET #index' do
        context 'when admin signed in' do
            it 'renders the index template' do
                admin = attributes_for(:user, role: 2)
                sign_in admin
                get :index
                expect(response).to render_template(:index)
            end

            it 'assigns a list of categories' do
                admin = attributes_for(:user, role: 2)
                sign_in admin
                category = create(:category)
                expect(assigns(:categories)).to eq([category])
            end
        end
    end
end

and the routes file

Rails.application.routes.draw do
  devise_for :users

  namespace :admin do
    get '', to: 'dashboard#index', as: '/'

    resources :categories
  end

  resources :topics do
    resources :comments, only: :create
  end

  resources :categories do
    resources :topics
  end

  root 'categories#index'
end

I am also adding the User schema

  create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.inet     "current_sign_in_ip"
    t.inet     "last_sign_in_ip"
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
    t.integer  "role"
    t.string   "image"
  end

UPDATE:

I have updated the admin categories controller spec, specifically Devise's sign_in method from sign_in user to sign_in(:admin, user) as shown below.

describe 'GET #index' do
        context 'when admin signed in' do
            it 'renders the index template' do
                user = create(:user)
                user.role = 2
                sign_in(:admin, user)
                get :index
                expect(response).to render_template(:index)
            end
...

Now I am getting the following error

1) Admin::CategoriesController GET #index when admin signed in renders the index template
     Failure/Error: expect(response).to render_template(:index)
       expecting <"index"> but was a redirect to <http://test.host/users/sign_in>

For some reason the admin is not being signed in, I have included Devise Test Helpers in rails_helper.rb file, unfortunately the error continues. Any help will be greatly appreciated.

2

2 Answers

0
votes

Have you declared the role in the migration like

t.integer :role

As this would need to be in there to be included in the migration created structure.

If not

Add the line, in your database drop the table and run your rake again

0
votes

I was able to troubleshoot my own question and decided to post the answer in hope that it will help someone in the future.

Instead of setting the user role to admin in the the admin_categories_controller_spec file, instead I added a nested Factory inside the Users Factory.

FactoryGirl.define do
  factory :user do
    email { Faker::Internet.email }
    password "12345678"
    password_confirmation "12345678"
    role 0

    factory :admin do
        role 2
    end
  end
end

and the test ends up like this:

describe 'GET #index' do
        context 'when admin signed in' do
            it 'renders the index template' do
                admin = create(:admin)
                sign_in admin
                get :index
                expect(response).to render_template(:index)
            end

            it 'assigns a list of categories' do
                admin = create(:admin)
                sign_in admin
                category = create(:category)
                get :index
                expect(assigns(:categories)).to eq([category])
            end
        end
    end