mercredi 10 janvier 2018

How can I test omniauth-facebook in rails 5 with minitest

I read previous possible questions that may have the answer but that not what I asked for.

First of all I am start to use test. However I already successful setup Omniauth-facebook for my App but still like to go back and test.

-sessions_controller.rb

class SessionsController < ApplicationController
  def new
    @title= 'Sign In'
  end

  def create
    auth = request.env["omniauth.auth"]
    user = User.from_omniauth(auth)
    session[:user_id] = user.id
    if params.permit[:remember_me]
      cookies.permanent[:auth_token] = user.auth_token
    else
      cookies[:auth_token] = user.auth_token
    end
    refresh_to root_path, :ma_notice => "Logged in"
  rescue
    redirect_to root_path, :alert=> "Authentication failed, please try again."
  end

  def destroy
    #session[:user_id] = nil
    cookies.delete(:auth_token)
    refresh_to root_path, :ma_notice => "Logged Out"
  end

  def failure
    ma_log "Authentication failed, please try again."
    redirect_to root_path, :alert=> "Authentication failed, please try again."
  end
end

-app/models/user.rb

class User

  ....
  ....

  def self.from_omniauth(auth)
    where(auth.slice(:uid, :provider, :email)).first_or_create do |user|
      case auth.provider 
        when 'identity'
          identity = Identity.find auth.uid
          user.code = identity.code
          user.email = identity.email
        else
          user.email = auth.info.email
          user.uid = auth.uid
          user.provider = auth.provider
          user.code = auth.info.name
          user.role = "M"
        end
      end
    end

  def send_password_reset
    generate_token(:password_reset_token)
    self.password_reset_sent_at = Time.zone.now
    save!
    UserMailer.password_reset(self).deliver
end

So what I did

  1. Test routes (Its seem simple but sometime I might forgot because I changing from dynamic route to fixed route as required in rails 5.2)

-test/integration/authen_test.rb

require 'test_helper'
class RoutesTest < ActionController::TestCase
  test 'facebook login' do
    assert_routing '/auth/facebook/callback', {controller: 'sessions', action: 'create',provider: 'facebook'}
  end

  test 'facebook login post' do
    assert_routing({path: '/auth/facebook/callback', method: 'post'},{controller: 'sessions', action: 'create' ,provider: 'facebook'})
  end
end

  1. I want to test if facebook accept login and return call back.

-test/models/user_test.rb

require 'test_helper'
class UserTest < ActiveSupport::TestCase
  test "Facebook  validation" do 
    auth = {provider: :facebook, FACEBOOK_API: "111111111111111", FACEBOOK_KEY: "11111111111111111111111111111111"}
    user = User.from_omniauth(auth)
    puts user
    assert_not nil
  end
end

Problem: It's always green even change FACEBOOK_API. I found the user from puts as well. It's seem like user.from _omniauth already gone to facebook and get info using FACEBOOK_API from .env not one I provided. Then how I can test if it really connected with facebook.

The same with this related test. It's always green in any FACEBOOI_API. That won't work as well.

  1. View Test. I like to test if no facebook login the system or not. The login would display accordingly. Still have no idea as stuck with Q.2 perhap someone could share how you do the test.

Aucun commentaire:

Enregistrer un commentaire