On 7/17/07, Ryan Tucker <[EMAIL PROTECTED]> wrote:

Daniel N wrote:
>
>
> On 7/17/07, *Ryan Tucker* <[EMAIL PROTECTED]
> <mailto:[EMAIL PROTECTED]>> wrote:
>
>     Daniel N wrote:
>     >
>     >
>     > On 7/17/07, *Ryan Tucker* <[EMAIL PROTECTED]
>     <mailto:[EMAIL PROTECTED]>
>     > <mailto:[EMAIL PROTECTED]
>     <mailto:[EMAIL PROTECTED]>>> wrote:
>     >
>     >     Ryan Tucker wrote:
>     >     > Thank you in advance for your help.  I am relatively new
>     to both
>     >     Rails
>     >     > and Rspec and I am hoping for some insight from some
>     experienced
>     >     veterans.
>     >     >
>     >     > Right now I am using Rspec for code that has already been
>     >     written so
>     >     > that additional functionality can be developed using the BDD
>     >     method. My
>     >     > problem shows up when I try to spec controllers that are
>     behind the
>     >     > login system.  Each page checks for the session[:user], and
if
>     >     they do
>     >     > not exists, requires them to login.  Logging in is handled
>     by one
>     >     > controller (the Admin controller) and I want to access a
>     page under
>     >     > another controller (say a Students controller).
>     >     >
>     >     > In my students_controller_spec.rb, I want want to make sure
>     >     > http://test.host/students is successfully displayed, so I
>     wrote
>     >     > something like:
>     >     >
>     >     >   it "should be successful" do
>     >     >     get :index
>     >     >     response.should be_success
>     >     >   end
>     >     >
>     >     > The problem is that is keeps redirecting to my login page at
>     >     > http://test.host/login.  I tried then setting
>     session[:user] and
>     >     doing a
>     >     > post to my login page to simulate a login so that I could
>     access the
>     >     > correct page, but that does not seem to work.  I tried a
>     number of
>     >     > things, including the following:
>     >     >
>     >     > def do_login
>     >     >   @user = User.find(:first, :conditions => ['username = ?' ,
>     >     'ryan'] )
>     >     >   session[:user] = @ user.id <http://user.id> <
http://user.id>
>     >     >   post :login, :path => []
>     >     > end
>     >     >
>     >     > describe StudentsController do
>     >     >   it "should be successful" do
>     >     >     do_login
>     >     >     get :index
>     >     >     response.should be_success
>     >     >   end
>     >     > end
>     >     >
>     >     > This still results in being redirected to the login page at
>     >     > http://test.host/login when I want to go to
>     >     http://test.host/students.
>     >     > Also, I realize I am actually doing a call on my test
>     database for
>     >     > this.  Part of the reason is that code that called during
>     login
>     >     checks
>     >     > fields of a user.  The other reason is I could not get it to
>     >     work using
>     >     > stubs, but that might just have been because I was not using
>     >     them properly.
>     >     >
>     >     > Any insight will be helpful, thanks!
>     >     >
>     >     > -Ryan
>     >     > _______________________________________________
>     >     > rspec-users mailing list
>     >     > [email protected]
>     <mailto:[email protected]> <mailto:
>     [email protected] <mailto:[email protected]>>
>     >     > http://rubyforge.org/mailman/listinfo/rspec-users
>     >     >
>     >     Forgot one thing.
>     >
>     >     In trying to do the post, I get the error that "No action
>     >     responded to
>     >     login" suggesting that I am not properly accessing the login
>     >     function in
>     >     my Admin controller.
>     >
>     >     Thanks again,
>     >     Ryan
>     >
>     >
>     >
>     > Ryan, the login action is being called on
>     your  StudentsController and
>     > so it's not found.
>     >
>     > If it's the presence of the session[:user] that tells the
>     > before_filter that your logged in, the you don't need to do the
>     post.
>     > In fact you shouldn't post, since as you found out if you post to
>     > login, your posting to the login action of the controller your
>     > currently in.  Bad.  Your setting the session and you shouldn't
need
>     > to do any more.
>     >
>     > HTH
>     > Daniel
>     >
>     >
>     >
>
------------------------------------------------------------------------
>
>     >
>     > _______________________________________________
>     > rspec-users mailing list
>     > [email protected] <mailto:[email protected]>
>     > http://rubyforge.org/mailman/listinfo/rspec-users
>     Thanks, Daniel.
>
>     That was my understanding as well, but, for some reason, that has
not
>     been enough.  The post was an attempt to simulate an actual login by
>     posting to another controller (I know it was bad...) since just
>     setting
>     the session[:user] was not a success.  Thank you for your help
though.
>
>     Take care,
>     Ryan
>
>
> Can you post your before_filter method that checks if your logged in?
>
> Also your login method in your Admin controller.
>
> Cheers
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> rspec-users mailing list
> [email protected]
> http://rubyforge.org/mailman/listinfo/rspec-users
  #  The Logins are to track a users activity, and this supports
  # when a user wants to access a page and needs to login first, sending
them to it after they login.
  # Authenticate checks the username and password against the username
and password in the
  # database.
  def login
    if request.post?
      if @current_user = User.authenticate(params[:username],
params[:password])
        login = Login.create(:remote_ip => request.remote_ip.to_s,
:user_agent => request.user_agent.to_s, :http_vars => request.env)
        @current_user.logins << login
        session[:user] = @current_user.id
        uri = session[:original_uri]
        session[:original_uri] = nil
        redirect_to uri || home_url
        return
      else
        flash[:error] = "Access denied"
      end
    end

    if session[:user]
      redirect_to home_url
      return false
    end
    set_page_title "Log In"
  end

  # This checks that there is a current user, and checks if they are
active
  # In my case, I am keeping track of whether or not I have disabled
  # a user.  active?() returns true so long as they are have not been
deactivated.
  def check_authentication
    unless @current_user and @current_user.active?
      session[:original_uri] = request.request_uri
      redirect_to log_in_url
      return false
    end
    true
  end


Thank you again for your help.


I hope I can ;)

Take care,
Ryan



Ok there's a fair bit of stuff going on in the login code.  It doesn't seem
that you've included your before_filter that checks to see if a user is
logged in in your controller.

Do you use a before_filter or some other method in the controller to check
for logged in status?  Can you post the code that checks if a user is logged
in for the controller.

Cheers
Daniel
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to