foudfou
2008-Apr-07 01:28 UTC
response_assertions.rb: TypeError: can''t convert Hash into String
Hello,
I''m getting an error while testing my AWDWR2 application :
1) Error:
test_login(LoginControllerTest):
TypeError: can''t convert Hash into String
/home/foudil/src/ror/depot/vendor/rails/actionpack/lib/
action_controller/assertions/response_assertions.rb:115:in `=~''
/home/foudil/src/ror/depot/vendor/rails/actionpack/lib/
action_controller/assertions/response_assertions.rb:115:in
`assert_redirected_to''
/home/foudil/src/ror/depot/vendor/rails/actionpack/lib/
action_controller/assertions/response_assertions.rb:114:in `collect''
/home/foudil/src/ror/depot/vendor/rails/actionpack/lib/
action_controller/assertions/response_assertions.rb:114:in
`assert_redirected_to''
/home/foudil/src/ror/depot/vendor/rails/actionpack/lib/
action_controller/assertions.rb:54:in `clean_backtrace''
/home/foudil/src/ror/depot/vendor/rails/actionpack/lib/
action_controller/assertions/response_assertions.rb:54:in
`assert_redirected_to''
./test/functional/login_controller_test.rb:25:in `test_login''
/home/foudil/src/ror/depot/vendor/rails/activerecord/lib/../../
activesupport/lib/active_support/testing/default.rb:7:in `run''
in test/functional/login_controller_test.rb:
#...
def test_login
dave = users(:dave)
post :login, :name => dave.name, :password =>
''secret''
assert_redirected_to :action => "index"
assert_equal dave.id, session[:user_id]
end
#...
in response_assertions.rb:
#...
112 rescue ActionController::RoutingError # routing failed
us, so match the strings only.
113 msg = build_message(message, "expected a redirect to
<?>, found one to <?>", options, @response.redirect_url)
114 url_regexp = %r{^(\w+://.*?(/|$|\?))(.*)$}
115 eurl, epath, url, path = [options,
@response.redirect_url].collect do |url|
116 u, p = (url_regexp =~ url) ? [$1, $3] : [nil, url]
117 [u, (p.first == ''/'') ? p :
''/'' + p]
118 end.flatten
#...
The problem seems to be that the "option" variable is a hash, in my
case :
{:action => :login}
and thus, it can not be matched against a regex
Is this a bug, or am I misusing something ?
Ruby version 1.8.6
Rails version 2.0.2
--~--~---------~--~----~------------~-------~--~----~
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
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
foudfou
2008-Apr-08 16:32 UTC
Re: response_assertions.rb: TypeError: can''t convert Hash into String
Ok I think I found it : the problem comes from the "post" instruction,
not from "assert_redirect_to" !
I should have written :
post :login, {}, { :name => dave.name, :password =>
''secret'' }
--~--~---------~--~----~------------~-------~--~----~
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
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
foudfou
2008-Apr-09 15:20 UTC
Re: response_assertions.rb: TypeError: can''t convert Hash into String
No. This was a wrong solution.
because the parameters are passed as session information (non-sense).
The original problem comes from ssl_requirement used in the login
controller, which redirects to the same URI, but with ssl.
Thus making the assert_redirected_to break down.
Which leads me to another question : how to test redirection to https://...
in the functional tests ?
:-)
Further information underneath :
#...
class LoginController < ApplicationController
layout "products"
before_filter :authorize, :except => :login
ssl_required :login, :add_user
#...
def login
session[:user_id] = nil
if request.post?
user = User.authenticate(params[:name], params[:password])
if user
session[:user_id] = user.id
uri = session[:original_uri]
session[:original_uri] = nil
redirect_to(uri || { :action => "index" })
else
flash[:notice] = "Nom de l''utilisateur ou mot de passe
incorrect"
end
end
end
#...
@request.headers:
REQUEST_URI: /login/login?name=dave&password=secret
SERVER_PORT: 80
REQUEST_METHOD: POST
@request.response:
Status: 302 Found
X-Runtime: 0.00129
Location: https://test.host/login/login?name=dave&password=secret
type: text/html; charset=utf-8
cookie:
Cache-Control: no-cache
Content-Length: 121
--~--~---------~--~----~------------~-------~--~----~
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
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Frederick Cheung
2008-Apr-09 15:27 UTC
Re: response_assertions.rb: TypeError: can''t convert Hash into String
On 9 Apr 2008, at 16:20, foudfou wrote:> > No. This was a wrong solution. > > because the parameters are passed as session information (non-sense). > > The original problem comes from ssl_requirement used in the login > controller, which redirects to the same URI, but with ssl. > Thus making the assert_redirected_to break down. >This seems vaguely familiar. IIRC, if the parameter passed to redirect_to is a string, then the parameter passed to assert_redirected_to also needs to be a string: rails knows how to compare strings, it knows how to compare hashes, but it won''t compare a string to a hash for you. Fred> Which leads me to another question : how to test redirection to https:// > ... > in the functional tests ? > :-) > > Further information underneath : > > #... > class LoginController < ApplicationController > > layout "products" > before_filter :authorize, :except => :login > ssl_required :login, :add_user > #... > def login > session[:user_id] = nil > if request.post? > user = User.authenticate(params[:name], params[:password]) > if user > session[:user_id] = user.id > uri = session[:original_uri] > session[:original_uri] = nil > redirect_to(uri || { :action => "index" }) > else > flash[:notice] = "Nom de l''utilisateur ou mot de passe > incorrect" > end > end > end > #... > > @request.headers: > > REQUEST_URI: /login/login?name=dave&password=secret > SERVER_PORT: 80 > REQUEST_METHOD: POST > > @request.response: > > Status: 302 Found > X-Runtime: 0.00129 > Location: https://test.host/login/login?name=dave&password=secret > type: text/html; charset=utf-8 > cookie: > Cache-Control: no-cache > Content-Length: 121 > > >--~--~---------~--~----~------------~-------~--~----~ 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---