And another thing I forgot to mention:

I fired up script/server to see if it was ACTUALLY redirecting, and it
sure is.  Using Firebug (Firefox extension) under Firefox 3.5, I can
see:

Location        http://localhost:3000/users/assign_location

So it's definitely throwing a redirect, but I have no clue why the
tests won't "see it" as one.

On Jul 31, 3:08 pm, Phoenix Rising <[email protected]> wrote:
> This is probably due to my novice understanding of integration tests,
> but this behavior looked pretty strange, so I figured I'd ask.
>
> The application I'm working on at present requires users, upon login,
> to assign themselves to a location.  Locations are pre-loaded in the
> database.  Because I don't want the user "getting around" this
> functionality by ignoring it and just clicking something else (this is
> a workplace-only application), I'm using this as part of my
> authentication process.
>
> Long story short, every controller has a before_filter called
> "login_required".  The login_required method exists in
> ApplicationController.  It's very simple: checks to see if the user's
> session contains a "username" value.   If not, they're kicked back to
> the authenticate controller and told to login.
>
> If they DO have this in their session, however, is where the fun
> starts.  At that point, it looks for the user in the database
> (original authentication is done by Active Directory, and I have a
> local database that "syncs" with AD nightly).  If found, it then
> checks to see if the user's home location (called a "store" in this
> case) is set.  If NOT, it redirects them to /users/assign_location.
>
> And there's the rub: it's an actual call to redirect_to.  Yet my
> integration test receives a 200 response (success), which of course
> causes assert_redirected_to to fail.
>
> Here's my before_filter method that's being called (what's responsible
> for said redirect):
>
> class ApplicationController < ActionController::Base
>   # ...snip ...
>
>   def login_required
>     if session[:username]
>       # Has this user set his/her home location yet?
>       begin
>         @user = User.find(:first, :conditions => {:account_username =>
> session[:username]})
>       rescue ActiveRecord::RecordNotFound => e
>         logger.warn "Couldn't find user with account_username #{session
> [:username]} - AR threw #{e}"
>         reset_session
>         redirect_to :controller => "authenticate", :action => "index"
>         return false
>       end
>
>       if [email protected]_home_location?
>         # Do the redirect
>         redirect_to :controller => "users", :action =>
> "assign_location"
>       end
>
>       return true
>     end
>
>     flash[:warning] = "Please login to continue."
>     session[:return_to] = request.request_uri
>     redirect_to :controller => "authenticate"
>     return false
>   end
>
> I have an integration test that just tries to do a straight get
> request on a particular URL.  For example:
>
>     get "/users/"
>     assert_response :redirect
>     assert_redirected_to "/users/assign_location"
>
> In this test, the session is totally blank.  It doesn't exist yet.
> So, by default, the user should be redirected to /users/
> assign_location.  However, my tests report that the server responds
> with code 200:
>
>   1) Failure:
> test_user_assings_own_location(UserFlowsTest) [/test/integration/
> user_flows_test.rb:24]:
> Expected response to be a <:redirect>, but was <200>
>
> Any thoughts as to what I'm doing wrong here?
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to