Authlogic - testy funkcjonalne

Mam problem ze zrobieniem testów funkcjonalnych dla kontrolera, w którym są dwa zbiory metod: dla zalogowanych i dla niezalogowanych. Do tego wszystkiego korzystam z authlogic i nijak nie idzie mi przetestowanie. Nie wiem co robię źle, możliwe, że coś przeoczyłem.

ApplicationController

[code]class ApplicationController < ActionController::Base

helper_method :current_user_session, :current_user
before_filter :require_user

private

def current_user_session
return @current_user_session if defined?(@current_user_session)
@current_user_session = UserSession.find
end

def current_user
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.user
end

def require_user
unless current_user
store_location
redirect_to root_url
return false
end
end

def require_no_user
if current_user
store_location
redirect_to account_url
return false
end
end

def store_location
session[:return_to] = request.request_uri
end

def redirect_back_or_default(default)
redirect_to(session[:return_to] || default)
session[:return_to] = nil
end

end[/code]
UsersController

[code]class UsersController < ApplicationController
before_filter :require_no_user, :only => [:new, :create]
skip_before_filter :require_user, :only => [:new, :create]

def new
# …
end

def create
# …
end

def show
# …
end

def edit
# …
end

def update
# …
end[/code]
User

class User < ActiveRecord::Base acts_as_authentic
Teraz muszę sprawdzić, czy: rejestrować (new, create) mogą się tylko niezalogowani oraz czy edytować dane(edit), aktualizować(update) i pokazywać jakieś informacje(show) - zalogowani. Za kontrolę dostępu do metod odpowiada before_filter :request(_no)_user.

Mam takie testy - pierwszy nie przekierowuje.

[code]require ‘test_helper’

class UsersControllerTest < ActionController::TestCase
fixtures :users

def setup
Authlogic::Session::Base.controller = Authlogic::ControllerAdapters::RailsAdapter.new(self)
end

nie powinen przejsc do strony “new” ponieważ jest zalogowany, powinen przekierować na account_url - nie przechodzi testu

test “shouldn’t get new” do
UserSession.create(users(:user10).to_param)
get :new
assert_redirected_to account_url
end
end[/code]
Test zwraca 200, zamiast przekierować. Nie wiem jak zalogować użytkownika w teście, czy jest coś takiego jak login_as [tu_obiekt] w authlogic?
Szukałem w sieci i znalazłem, że authlogic trzeba aktywować do testów (w setup jest ta aktywacja), ale nic więcej.

Najlepiej w test_helper umieść aktywację authlogica i metodę login_as:

[code=Ruby]require “authlogic/test_case”

class ActiveSupport::TestCase
def login_as(user_login)
user = users( user_login )
success = UserSession.create( user )
if !success
errors = user.errors.full_messages.to_sentence
message = ‘User has not been activated’ if !user.active?
raise “could not login as #{user.to_param}. Please make sure the user is valid. #{message} #{errors}”
end
UserSession.find
end
end

class ActionController::TestCase
setup :activate_authlogic
end[/code]
I wtedy:

test "shouldn't get new" do login_as :user10 get :new assert_redirected_to account_url end

Dzięki pomogłeś mi, szczególnie, że poświęciłem trochę czasu żeby poczytać co jest w komentarzach authlogic :slight_smile: .

[code] # === How to use

Just require the file in your test_helper.rb file.

require “authlogic/test_case”[/code]

Robię tak jak w komentarzu (i tak samo jak napisałeś), ale nie działa:

/usr/lib64/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- authlogic/test_case (LoadError)

Czemu tak się dzieje?

Edit

Dobra sam sobie odpowiem: nie ustawiłem gem’a w configu

próbuje dodać testy funkcjonalne dla jednego z kontrolerów, dodałem metode login_as do test_helper, tak jak tjeden wyżej napisał

[code=ruby]require ‘test_helper’

class SurveysController; def rescue_action(e) raise e end; end

class SurveysControllerTest < ActionController::TestCase

test “surveys_index” do

login_as :valid_user
assert_not_nil session["user_credentials"]
get :new, :locale => "pl"
assert_response :success

end

end[/code]
Niestety dostaje błąd

1) Failure: test_surveys_index(SurveysControllerTest) [/test/functional/surveys_controller_test.rb:11]: <nil> expected to not be nil.
Czyli tak jakby użytkownik był niezalogowany, coś robię źle ? Czy w teście też powinienem sprawdzić czy po logowaniu nastąpiło przekierowanie do głównej strony a dopiero potem get :new ?
test.log wygląda dla tego testu tak

[code] SQL (0.1ms) BEGIN
User Load (0.5ms) SELECT * FROM users WHERE (users.id = 1)

Processing SurveysController#new (for 0.0.0.0 at 2010-01-24 15:55:20) [GET]
Parameters: {“action”=>“new”, “controller”=>“surveys”, “locale”=>“pl”}
Redirected to http://test.host/sesje-uzytkownika/utworz
Filter chain halted as [:require_user] rendered_or_redirected.
Completed in 4ms (DB: 29) | 302 Found [http://test.host/moje-ankiety/utworz]
SQL (0.3ms) ROLLBACK
Translating routes (default locale: pl)
SQL (0.1ms) SET NAMES ‘utf8’
SQL (0.1ms) SET SQL_AUTO_IS_NULL=0
User Columns (1.4ms) SHOW FIELDS FROM users
SQL (0.1ms) BEGIN
User Load (0.3ms) SELECT * FROM users WHERE (users.id = 1)
SQL (0.1ms) ROLLBACK
Translating routes (default locale: pl)
SQL (0.1ms) SET NAMES ‘utf8’
SQL (0.1ms) SET SQL_AUTO_IS_NULL=0
User Columns (1.2ms) SHOW FIELDS FROM users
SQL (0.1ms) BEGIN
User Load (0.4ms) SELECT * FROM users WHERE (users.id = 1)
SQL (0.1ms) ROLLBACK[/code]

jak mogę w teście funkcjonalnym pobrać jakieś dane zalogowanego użytkownika po to żeby je sobie porównać z czymś np

[code=ruby]require ‘test_helper’

class UsersController; def rescue_action(e) raise e end; end

class UsersControllerTest < ActionController::TestCase

test “user_profile” do

login_as :stefan

get :profile, :locale => "pl"
assert_response :success

assert_tag :tag => "input",
  :attributes => {
    :type => "text",
   :value => user.email}

end[/code]
daje mi błąd user not defined. Czy coś takiego powinno wogóle znależć się w teście funkcjonalnym czy raczej w integracyjnym ? Czy może bardziej ma sens porównać :value => users(:stefan).email ?