Search code examples
ruby-on-railstestingdevise

Rails Testing Devise registrations_controller


I only want a person with a specific email to be able to register. I am using Devise and here is my internal controllers/admins/registrations_controller.rb

class Admins::RegistrationsController < Devise::RegistrationsController
  def create
    if params[:admin][:email] == Rails.application.credentials.development[:admin_email]
      super
    end
 end

I'm trying to send an email, password, and confirmation password inside my test.

require 'rails_helper'
RSpec.describe Admins::RegistrationsController do
  it 'does not allow xxx@gmail.com with very-secret password to register' do 
    @request.env["devise.mapping"]=Devise.mappings[:admin]
    patch :create, admin: {email: 'xxx@gmail.com", password: "very-secret", password-confirmations: "very-secret"}
  end
end

I get an Argument Error: unknown keyword: admin. How do I write a proper patch request for Devise?

EDIT: My routes.rb

Rails.application.routes.draw do
  devise_for :admins, controllers: {sessions: 'admins/sessions', 
  registrations: 'admins/registrations'}
  ....

My rake routes

admin_registration PATCH  /admins(.:format) 
    admins/registrations#update
                   PUT    /admins(.:format)                                                                        
    admins/registrations#update
                   DELETE /admins(.:format)                                                                        
    admins/registrations#destroy
                   POST   /admins(.:format)                                                                        
    admins/registrations#create

MORE INFO: This is print out from using the browser, it does work in the browser:

  Started POST "/admins" for ::1 at 2019-7-03 21:08:58 -0500
  Processing by Admins::RegistrationsController#create as HTML
    Parameters: {"utf8"=>"_", "authenticity_token"=>"xxx", "admin"=>{"email"=>"abc@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}
  inside registrations_controller.rb CREATE

Solution

  • post :create, params: {"admin"=>{"email"=>"abc@gmail.com", "password"=>"very-secret", "password_confirmation"=>"very-secret"}}