assert-url

Semantical helpers to test your URLs in Ruby

Usage

Ok, say you're writing a Web app with Ruby (who isn't?) and need to test your routing with Rack::Test.

The old way

def test_some_resource
  get "/some/resource"

  assert last_response.ok?
  assert_equal "http://example.org/some/resource", last_response.url
end

What's wrong with this, you ask? Well, in most cases when you write a test like this, you only care about testing the /some/resource path, but the rest (scheme, port, etc) doesn't really matter. Still we're used to use assert_equal on the whole url.

Now imagine that you need to change the port, scheme or host. Now imagine you have hundreds of tests. It's grep day, my friend.

Enter AssertUrl!

include AssertUrl

def test_some_resource
  get "/some/resource"

  assert last_response.ok?
  assert_path_equal "/some/resource", last_response.url
end

BAM! Now you're only testing what you need. You can change the port, host, even the query and the test will be fine.

AssertUrl provides the following assertions in the form of expected, value:

  • assert_scheme_equal [String or Symbol], [String or URI]
  • assert_host_equal [String], [String or URI]
  • assert_port_equal [Integer], [String or URI]
  • assert_path_equal [String starting with "/"], [String or URI]
  • assert_query_equal [Hash], [String or URI]
  • assert_query_include [Hash], [String or URI]
  • assert_fragment_equal [String], [String or URI]
  • assert_url_equal [String or URI], [String or URI]

But...

Can't I just do something like...?

assert_equal "/some/resource", URI(last_response.url).path

Well, yes! sure you can. In fact, this is very close to how AssertUrl is implemented.

My point here is not to sell you this gem but to make a statement that we need a better habit when testing URLs. And if AssertUrl helps you with it, great!

Installation

gem install assert-url