samedi 25 juillet 2015

Rails and OAuth controller test

I am developing a web-app using Ruby on Rails (4.2.0) and I faced the implementation the login via Oauth (I followed the RailsCast tutorials #235 and #236). In particular for the authentication I implemented the following model

class Authentication < ActiveRecord::Base

    # an authentication entry belongs to one user
    belongs_to :user

    # provider must be present
    validates :provider, presence: true

    # uid must be present
    validates :uid, presence: true

    # uniqueness of the couple user_id - provider
    validates_uniqueness_of :user_id, :scope => :provider
end

and the associated create action for the authentication controller is

def create
    omniauth = request.env["omniauth.auth"]
    authentication =Authentication.find_by_provider_and_uid(omniauth['provider'],omniauth['uid'])
    if authentication
        flash[:success] = "Welcome back #{omniauth['info']['name']}!"
        log_in(authentication.user)
        redirect_to root_url
    elsif current_user
        current_user.authentications.create(provider: omniauth['provider'], uid: omniauth['uid'])
        flash[:success] = "Welcome #{omniauth['info']['name']}!"
        redirect_to root_url
    else
        user = User.new
        user.authentications.build(:provider => omniauth ['provider'], :uid => omniauth['uid'])
        if user.save
          flash[:success] = "Signed in successfully."
          redirect_to root_url
        else
          session[:omniauth] = omniauth.except('extra')
          flash[:info] = "Just one step to go!"
          redirect_to signup_url
        end
    end
 end

While route.rb configuration file contains

match   '/auth/:provider/callback' => 'authentication#create', via: [:get, :post]

Now I get stucked in writing down the controller test for two main reasons:

  1. How can I make the post in test? With the following test unit

    class AuthenticationControllerTest < ActionController::TestCase
        test "post request"  do
            post :create
         end
     end
    
    

    I get the following error

    ActionController::UrlGenerationError: ActionController::UrlGenerationError: No route matches {:action=>"create", :controller=>"authentication"} 
    test/controllers/authentication_controller_test.rb:6:in `block in <class:AuthenticationControllerTest>'
    test/controllers/authentication_controller_test.rb:6:in `block in <class:AuthenticationControllerTest>'
    
    
  2. How can I create a "fake" env variable for the test?

Surfing the web I was able to find only tutorials using Capybara or Cucumber and nothing with the standard Rails tests.

Any kind of help will be really appreciated!

Andrea

Aucun commentaire:

Enregistrer un commentaire