functional testing with restful authentication

I am having trouble getting functional tests to working with restful
authentication.

I have tried this:
require File.dirname(__FILE__) + '/../test_helper'
require 'users_controller'

class UsersControllerTest < ActionController::TestCase

  def setup
    @controller = UsersController.new
    @request = ActionController::TestRequest.new
    @response = ActionController::TestResponse.new
  end

  # this works fine (which it should)
  def test_truth
    assert true
  end

  def test_get_index
    login_as(:someone) # 'someone' is set up in the users_fixture yaml
file
    get :index
    assert_response :success
  end

end

The test_get_index function fails. It can't access the current_user
object. It tries to check the authentication, which I have set up in the
ApplicationController and it says nil.check_authentication is failing,
and it should be current_user.check_authentication.

Anyone know how to get current_user to work within functional tests?

Well, I couldn't find a solution to this, so I decided to rip out all
the current_<user_model_name> from authenticated_systems module and add
it to the application controller and made a similar function in
application helper. This did the trick, so now any tests I run will
work.

Funny, I struggled with this yesterday.

How is your authentication set up?

Mine is RESTful as well and I have a SessionsController. Its create
action logs the user in.

The way I handled it was to put a setup method in my test_helper.rb

as follows:

def setup
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
controller = @controller
@controller = SessionsController.new
post :create, { :login => “valid_username”, :password => “valid_password” }

@controller = controller

end

If you defined setup in any of your functional tests, just make sure you
do a call to super so that this will get called.

Hope this helps.

Franz

In my lib/authenticated_test_helper.rb , I have :

module AuthenticatedTestHelper
  # Sets the current user in the session from the user fixtures.
  def login_as(user)
    @request.session[:user_id] = user ? users(user).id : nil
  end

  def authorize_as(user)
    @request.env["HTTP_AUTHORIZATION"] = user ?
ActionController::HttpAuthentication::Basic.encode_credentials(users(user).email,
'test') : nil
  end
end

in my functionals tests, I only write (as an example..)
login_as(:xxx) xxx is the fixture name of a user.....

class ResidencesControllerTest < ActionController::TestCase
  fixtures :residences
  def setup
    @controller = ResidencesController.new
    @request = ActionController::TestRequest.new
    @response = ActionController::TestResponse.new
    @request.host = "localhost"
  end

  def test_god_should_not_get_index
    login_as (:god)
    get :index
    assert_redirected_to dashboard_path
  end