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
endWhat'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
endBAM! 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).pathWell, 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