Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I easily parse a URL with parameters in a Rails test?

I have a some code that embeds a return_to URL into a redirect (like OpenID) that I want to test:

def test_uses_referrer_for_return_to
  expected_return_to = 'http://test.com/foo'
  @request.env['HTTP_REFERER'] = expected_return_to
  get :fazbot
  # @response.redirected_to looks like http://service.com?...&return_to=[URI-encoded version of URL above]&...
  encoded_return_to = (something_here)[:return_to]
  assert_equal expected_return_to, URI.unencode(encoded_return_to)
end

It's a Rails ActionController::TestCase, so I have access to all sorts of helper methods; I just can't find the right one.

Of course I could use URI.parse to get the params part of the URL, then split it on /&|?/ and then split again on '=', but I'm hoping this is already done for me. Plus, what if I miss some obscure rule in URL escaping or parameter parsing? There has to be something in ActionPack or ActiveSupport to do this, but I can't find it.

Thanks :)

like image 398
James A. Rosen Avatar asked May 27 '09 14:05

James A. Rosen


1 Answers

CGI::parse(querystring) will parse a querystring into a hash. Then, CGI::unescape(string) will undo any URL-encoding in the value.

Alternatively, you can use Rack::Utils.parse_query and Rack::Utils.unescape if you're on a recent Rack-based version of Rails, and want to be super-modern.

I'm not aware of any Rails-specific helper methods that wrap these utility functions, but they're pretty simple to use, and CGI or Rack is already loaded in the Rails environment anyway.

like image 155
chrismear Avatar answered Sep 27 '22 21:09

chrismear