assert-url 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +13 -5
- data/README.md +62 -0
- data/assert_url.gemspec +1 -1
- data/lib/assert_url.rb +34 -9
- data/test/assert_url_test.rb +40 -24
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NDY2MTI0ZTRmY2NiYWE1MjA0M2RkYWU4Y2MxZDc3YTQ2ZTgyMDhiYQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YTRkNDAzMTU3ZjAxMjkyNTQ2YzQ4NWU1ZGE3NDdhMGM3NTIwNzE0Mw==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZDY3OGY4ZTFmOTU4MzBmYmRlOTQxZWRjYzUyMDYwMjQyNjJjOTc0ZmFmNjUy
|
10
|
+
Y2ZmYzE1MTcxYjQzNmMxOWZmMmMzOGQ4NjUwZDAxOGQ0YTUwYzA5Y2RlZDMx
|
11
|
+
NDUyMTgxM2QxYTQ4M2U3NGM2M2FjYjYzYzhhOWY1ZGM5MWEyODA=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ODZjYThmNzAwM2RlYmNiNzdhZjM2NmIwNTNkZTM3NjZhOTU5Nzg4MDVjODNk
|
14
|
+
NDZhMjcyNTkxYjQzZDMzNDk0NDgxMGE2ZDZlYmNkMmYyZThjOTIzZWNlZTZl
|
15
|
+
ZDcyZjc5MDg0NThiZTg0NjIzNmFjYjA4NThhNzUzZGI1NTA4YTI=
|
data/README.md
CHANGED
@@ -2,3 +2,65 @@ assert-url
|
|
2
2
|
==========
|
3
3
|
|
4
4
|
Semantical helpers to test your URLs in Ruby
|
5
|
+
|
6
|
+
## Usage
|
7
|
+
|
8
|
+
Ok, say you're writing a Web app with Ruby (who isn't?) and need to test your routing with `Rack::Test`.
|
9
|
+
|
10
|
+
### The old way
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
def test_some_resource
|
14
|
+
get "/some/resource"
|
15
|
+
|
16
|
+
assert last_response.ok?
|
17
|
+
assert_equal "http://example.org/some/resource", last_response.url
|
18
|
+
end
|
19
|
+
```
|
20
|
+
|
21
|
+
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.
|
22
|
+
|
23
|
+
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.
|
24
|
+
|
25
|
+
### Enter AssertUrl!
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
include AssertUrl
|
29
|
+
|
30
|
+
def test_some_resource
|
31
|
+
get "/some/resource"
|
32
|
+
|
33
|
+
assert last_response.ok?
|
34
|
+
assert_path_equal "/some/resource", last_response.url
|
35
|
+
end
|
36
|
+
```
|
37
|
+
|
38
|
+
BAM! Now you're only testing what you need. You can change the port, host, even the query and the test will be fine.
|
39
|
+
|
40
|
+
`AssertUrl` provides the following assertions in the form of `expected, value`:
|
41
|
+
* `assert_scheme_equal [String or Symbol], [String or URI]`
|
42
|
+
* `assert_host_equal [String], [String or URI]`
|
43
|
+
* `assert_port_equal [Integer], [String or URI]`
|
44
|
+
* `assert_path_equal [String starting with "/"], [String or URI]`
|
45
|
+
* `assert_query_equal [Hash], [String or URI]`
|
46
|
+
* `assert_query_include [Hash], [String or URI]`
|
47
|
+
* `assert_fragment_equal [String], [String or URI]`
|
48
|
+
* `assert_url_equal [String or URI], [String or URI]`
|
49
|
+
|
50
|
+
### But...
|
51
|
+
|
52
|
+
Can't I just do something like...?
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
assert_equal "/some/resource", URI(last_response.url).path
|
56
|
+
```
|
57
|
+
|
58
|
+
Well, yes! sure you can. In fact, this is very close to how `AssertUrl` is implemented.
|
59
|
+
|
60
|
+
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!
|
61
|
+
|
62
|
+
## Installation
|
63
|
+
|
64
|
+
```
|
65
|
+
gem install assert-url
|
66
|
+
```
|
data/assert_url.gemspec
CHANGED
data/lib/assert_url.rb
CHANGED
@@ -1,29 +1,54 @@
|
|
1
1
|
require "uri"
|
2
2
|
|
3
3
|
module AssertUrl
|
4
|
-
PARTS = %W[scheme host port path query]
|
4
|
+
PARTS = %W[scheme host port path query fragment]
|
5
5
|
|
6
6
|
PARTS.each do |part|
|
7
7
|
error = const_set("#{part.capitalize}Error", Class.new(StandardError))
|
8
8
|
|
9
|
-
define_method(:"assert_#{part}") do |expected, value|
|
10
|
-
expected
|
9
|
+
define_method(:"assert_#{part}_equal") do |expected, value|
|
10
|
+
expected = normalize(part, expected)
|
11
|
+
value = urify(value).send(part.to_sym)
|
11
12
|
|
12
13
|
expected == value || (raise error, "expected #{expected}, got #{value}")
|
13
14
|
end
|
14
15
|
end
|
15
16
|
|
16
|
-
|
17
|
+
def assert_url_equal(expected, value)
|
18
|
+
expected, value = urify(expected), urify(value)
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
+
PARTS.map { |part| send(:"assert_#{part}_equal", expected.send(part.to_sym), value) }.reduce(:&)
|
21
|
+
end
|
22
|
+
|
23
|
+
def assert_query_include(expected, value)
|
24
|
+
value = Hash[URI.decode_www_form(urify(value).query)]
|
25
|
+
|
26
|
+
includes?(expected.to_a, value) || (raise QueryError, "expected #{value} to include #{expected}")
|
27
|
+
end
|
20
28
|
|
21
|
-
|
29
|
+
def includes?(expected, got)
|
30
|
+
expected.all? do |(key, value)|
|
31
|
+
key = key.to_s
|
32
|
+
got.has_key?(key) && got[key] == value
|
33
|
+
end
|
22
34
|
end
|
35
|
+
private :includes?
|
23
36
|
|
24
|
-
def urify(
|
25
|
-
|
37
|
+
def urify(arg)
|
38
|
+
arg.kind_of?(URI) ? arg : URI(arg)
|
26
39
|
end
|
27
40
|
private :urify
|
41
|
+
|
42
|
+
def normalize(part, expected)
|
43
|
+
case part
|
44
|
+
when "scheme"
|
45
|
+
expected.kind_of?(Symbol) ? expected.to_s : expected
|
46
|
+
when "query"
|
47
|
+
URI.encode_www_form(expected) rescue expected
|
48
|
+
else
|
49
|
+
expected
|
50
|
+
end
|
51
|
+
end
|
52
|
+
private :normalize
|
28
53
|
end
|
29
54
|
|
data/test/assert_url_test.rb
CHANGED
@@ -5,54 +5,70 @@ require_relative "../lib/assert_url"
|
|
5
5
|
include AssertUrl
|
6
6
|
|
7
7
|
setup do
|
8
|
-
"http://sub.example.org:8080/path/to/resource?foo=bar"
|
8
|
+
"http://sub.example.org:8080/path/to/resource?foo=bar#fragment"
|
9
9
|
end
|
10
10
|
|
11
|
-
test "
|
12
|
-
assert
|
13
|
-
|
14
|
-
assert_raise do
|
15
|
-
assert_scheme("https://example.org", url)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
test "assert_scheme" do |url|
|
20
|
-
assert assert_scheme("http://example.org", url)
|
11
|
+
test "assert_scheme_equal" do |url|
|
12
|
+
assert assert_scheme_equal("http", url)
|
13
|
+
assert assert_scheme_equal(:http, url)
|
21
14
|
|
22
15
|
assert_raise(AssertUrl::SchemeError) do
|
23
|
-
|
16
|
+
assert_scheme_equal("ftp", url)
|
24
17
|
end
|
25
18
|
end
|
26
19
|
|
27
|
-
test "
|
28
|
-
assert
|
20
|
+
test "assert_host_equal" do |url|
|
21
|
+
assert assert_host_equal("sub.example.org", url)
|
29
22
|
|
30
23
|
assert_raise(AssertUrl::HostError) do
|
31
|
-
|
24
|
+
assert_host_equal("example.org", url)
|
32
25
|
end
|
33
26
|
end
|
34
27
|
|
35
|
-
test "
|
36
|
-
assert
|
28
|
+
test "assert_port_equal" do |url|
|
29
|
+
assert assert_port_equal(8080, url)
|
37
30
|
|
38
31
|
assert_raise(AssertUrl::PortError) do
|
39
|
-
|
32
|
+
assert_port_equal(80, url)
|
40
33
|
end
|
41
34
|
end
|
42
35
|
|
43
|
-
test "
|
44
|
-
assert
|
36
|
+
test "assert_path_equal" do |url|
|
37
|
+
assert assert_path_equal("/path/to/resource", url)
|
45
38
|
|
46
39
|
assert_raise(AssertUrl::PathError) do
|
47
|
-
|
40
|
+
assert_path_equal("/not/the/resource", url)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
test "assert_query_equal" do |url|
|
45
|
+
assert assert_query_equal({foo: "bar"}, url)
|
46
|
+
|
47
|
+
assert_raise(AssertUrl::QueryError) do
|
48
|
+
assert_query_equal("", url)
|
48
49
|
end
|
49
50
|
end
|
50
51
|
|
51
|
-
test "
|
52
|
-
assert
|
52
|
+
test "assert_query_include" do
|
53
|
+
assert assert_query_include({foo: "bar"}, "http://example.org/?foo=bar&baz=wat")
|
53
54
|
|
54
55
|
assert_raise(AssertUrl::QueryError) do
|
55
|
-
|
56
|
+
assert_query_include({foo: "wat"}, "http://example.org/?foo=bar&baz=wat")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
test "assert_fragment_equal" do |url|
|
61
|
+
assert assert_fragment_equal("fragment", url)
|
62
|
+
|
63
|
+
assert_raise(AssertUrl::FragmentError) do
|
64
|
+
assert_fragment_equal("not", url)
|
56
65
|
end
|
57
66
|
end
|
58
67
|
|
68
|
+
test "assert_url_equal" do |url|
|
69
|
+
assert assert_url_equal(url, url)
|
70
|
+
|
71
|
+
assert_raise do
|
72
|
+
assert_url_equal("https://example.org", url)
|
73
|
+
end
|
74
|
+
end
|
metadata
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: assert-url
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lucas Tolchinsky
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cutest
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ! '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
description: Semantical helpers to test your URLs in Ruby
|
@@ -46,17 +46,17 @@ require_paths:
|
|
46
46
|
- lib
|
47
47
|
required_ruby_version: !ruby/object:Gem::Requirement
|
48
48
|
requirements:
|
49
|
-
- -
|
49
|
+
- - ! '>='
|
50
50
|
- !ruby/object:Gem::Version
|
51
51
|
version: '0'
|
52
52
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
|
-
- -
|
54
|
+
- - ! '>='
|
55
55
|
- !ruby/object:Gem::Version
|
56
56
|
version: '0'
|
57
57
|
requirements: []
|
58
58
|
rubyforge_project:
|
59
|
-
rubygems_version: 2.2.
|
59
|
+
rubygems_version: 2.2.2
|
60
60
|
signing_key:
|
61
61
|
specification_version: 4
|
62
62
|
summary: Semantical helpers to test your URLs in Ruby
|