rspec-hal 1.3.2 → 1.4.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 +4 -4
- data/README.md +57 -21
- data/lib/rspec/hal.rb +1 -0
- data/lib/rspec/hal/helpers.rb +32 -0
- data/lib/rspec/hal/matchers.rb +11 -11
- data/lib/rspec/hal/matchers/hal_matcher_helpers.rb +8 -1
- data/lib/rspec/hal/matchers/have_property_matcher.rb +1 -1
- data/lib/rspec/hal/matchers/relation_matcher.rb +1 -1
- data/lib/rspec/hal/matchers/templated_relation_matcher.rb +1 -1
- data/lib/rspec/hal/matchers/uri_template_has_variables_matcher.rb +1 -1
- data/lib/rspec/hal/version.rb +1 -1
- data/spec/rspec/hal/helpers_spec.rb +25 -0
- data/spec/rspec/hal/matchers/have_property_matcher_spec.rb +7 -0
- data/spec/rspec/hal/matchers/relation_matcher_spec.rb +7 -1
- data/spec/rspec/hal/matchers/templated_relation_matcher_spec.rb +7 -0
- data/spec/rspec/hal/matchers/uri_template_has_variables_matcher_spec.rb +7 -0
- data/spec/rspec/hal/matchers_spec.rb +8 -2
- metadata +6 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1c835ecfb6c798d5dfb5c41101dd5c61cde75c1e
|
|
4
|
+
data.tar.gz: ab13e80124286588ddc088a3ff1cb773544a84d8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2e3fd356bb643b6dd6ac9edcc16dfea03bee88fe2cca2039b6a75709ebd340be389b035e6ebd623fe56ea12c6498bd3de52a53831ee7deb97544ff5a4ea5ab4f
|
|
7
|
+
data.tar.gz: a08fd297f02eb699afaa48b3298aedb14603d3c7fe1e45441de4c633e45d24b70bb6f78550eb1f9ce15608a5923f17ef5ea81b7058600c318a0844206104ac35
|
data/README.md
CHANGED
|
@@ -7,37 +7,55 @@ Provides matchers and convenience methods for verifying HAL documents.
|
|
|
7
7
|
|
|
8
8
|
## Usage
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Given the following string stored in `a_user_doc`.
|
|
11
|
+
|
|
12
|
+
```json
|
|
13
|
+
{
|
|
14
|
+
"name": "Alice",
|
|
15
|
+
"hobbies": [{"name": "Basketball", "type": "sport"},
|
|
16
|
+
{"name": "Basket weaving", "type": "craft"}],
|
|
17
|
+
"_links": {
|
|
18
|
+
"self": { "href": "http://example.com/alice" },
|
|
19
|
+
"knows": [{ "href": "http://example.com/bob" },
|
|
20
|
+
{ "href": "http://example.com/jane" }],
|
|
21
|
+
"checkBusy": { "href": "http://example.com/is_alice_busy{?at}",
|
|
22
|
+
"templated": true }
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Rspec Hal allows very expressive validation of documents.
|
|
11
28
|
|
|
12
29
|
```ruby
|
|
13
|
-
|
|
14
|
-
```
|
|
30
|
+
expect(a_user_doc).to be_hal
|
|
15
31
|
|
|
16
|
-
(
|
|
32
|
+
expect(a_user_doc).not_to be_hal_collection
|
|
33
|
+
|
|
34
|
+
expect(a_user_doc).to have_property "name"
|
|
35
|
+
expect(a_user_doc).to have_property 'name', eq("Alice")
|
|
36
|
+
expect(a_user_doc).to have_property :name, matching(/ice$/)
|
|
37
|
+
expect(a_user_doc).to have_property 'hobbies', including(a_hash_including('type' => 'sport'))
|
|
17
38
|
|
|
18
|
-
|
|
39
|
+
expect(a_user_doc).to have_relation "knows"
|
|
40
|
+
expect(a_user_doc).to have_relation "knows", eq("http://example.com/jane")
|
|
19
41
|
|
|
20
|
-
|
|
21
|
-
|
|
42
|
+
expect(a_user_doc).to have_templated_relation "checkBusy"
|
|
43
|
+
expect(a_user_doc).to have_templated_relation "checkBusy", with_variable("at")
|
|
44
|
+
expect(a_user_doc).to have_templated_relation("checkBusy").with_variables("at")
|
|
45
|
+
|
|
46
|
+
expect(parse_hal(users_collection_doc).first).to have_property "name"
|
|
22
47
|
```
|
|
23
48
|
|
|
24
|
-
|
|
49
|
+
Any matcher (actually anything that responds to `#===`) can
|
|
50
|
+
be passed as the second argument and will be used to verify the
|
|
51
|
+
property value or the link href.
|
|
25
52
|
|
|
26
|
-
|
|
27
|
-
|
|
53
|
+
`be_hal_collection` checks that the document is both a valid HAL
|
|
54
|
+
document and is a page of an RFC 6573 collection
|
|
28
55
|
|
|
29
|
-
|
|
56
|
+
`be_hal` checks that the document is both a valid HAL
|
|
57
|
+
document.
|
|
30
58
|
|
|
31
|
-
expect(a_user_doc).to have_property "name"
|
|
32
|
-
expect(a_user_doc).to have_property('name').matching(/ice$/)
|
|
33
|
-
expect(a_user_doc).to have_property('name').matching(end_with('ice'))
|
|
34
|
-
expect(a_user_doc).to have_property('hobbies')
|
|
35
|
-
.including(a_hash_including('type' => 'sport'))
|
|
36
|
-
|
|
37
|
-
expect(a_user_doc).to have_relation('tag')
|
|
38
|
-
expect(a_user_doc).to have_templated_relation("search")
|
|
39
|
-
expect(a_user_doc).to have_templated_relation("search").with_variables("q", "limit")
|
|
40
|
-
```
|
|
41
59
|
|
|
42
60
|
## Installation
|
|
43
61
|
|
|
@@ -53,6 +71,24 @@ Or install it yourself as:
|
|
|
53
71
|
|
|
54
72
|
$ gem install rspec-hal
|
|
55
73
|
|
|
74
|
+
Then include the matchers by adding this to your spec_helper
|
|
75
|
+
|
|
76
|
+
```ruby
|
|
77
|
+
RSpec.configuration.include RSpec::Hal::Matchers
|
|
78
|
+
RSpec.configuration.include RSpec::Hal::Helpers
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
(Don't forget to `require "rspec-hal"` if you are not using bundler.)
|
|
82
|
+
|
|
83
|
+
If you want to only include the matchers for certain type of specs
|
|
84
|
+
(say, view specs for example)
|
|
85
|
+
|
|
86
|
+
```ruby
|
|
87
|
+
RSpec.configuration.include RSpec::Hal::Matchers, type: 'view'
|
|
88
|
+
RSpec.configuration.include RSpec::Hal::Helpers, type: 'view'
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
|
|
56
92
|
## Contributing
|
|
57
93
|
|
|
58
94
|
1. Fork it ( http://github.com/pezra/rspec-hal/fork )
|
data/lib/rspec/hal.rb
CHANGED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Hal
|
|
3
|
+
module Helpers
|
|
4
|
+
# Returns HalClient::Representation for `jsonish` (or
|
|
5
|
+
# HalClient::Collection if `jsonish` is a RFC 6573 collection)
|
|
6
|
+
#
|
|
7
|
+
# jsonish - A HAL document (as a string or pre-parsed hash) or
|
|
8
|
+
# an object that can be converted into one via its `#to_hal`
|
|
9
|
+
# or `#to_json` methods.
|
|
10
|
+
def parse_hal(jsonish)
|
|
11
|
+
json = if jsonish.kind_of? String
|
|
12
|
+
jsonish
|
|
13
|
+
|
|
14
|
+
elsif jsonish.respond_to? :to_hal
|
|
15
|
+
jsonish.to_hal
|
|
16
|
+
|
|
17
|
+
else jsonish.respond_to? :to_json
|
|
18
|
+
jsonish.to_json
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
repr = HalClient::Representation.new(parsed_json: MultiJson.load(json))
|
|
22
|
+
|
|
23
|
+
if repr.has_related? "item"
|
|
24
|
+
HalClient::Collection.new(repr)
|
|
25
|
+
else
|
|
26
|
+
repr
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
data/lib/rspec/hal/matchers.rb
CHANGED
|
@@ -51,18 +51,15 @@ module RSpec
|
|
|
51
51
|
# Signature
|
|
52
52
|
#
|
|
53
53
|
# expect(a_uri_template_str).to have_variables "q", "limit"
|
|
54
|
-
def have_variables(*args)
|
|
55
|
-
UriTemplateHasVariablesMatcher.new(*args)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Signature
|
|
59
|
-
#
|
|
60
54
|
# expect(a_uri_template_str).to has_variable "q"
|
|
61
|
-
def
|
|
55
|
+
def have_variables(*args)
|
|
62
56
|
UriTemplateHasVariablesMatcher.new(*args)
|
|
63
57
|
end
|
|
58
|
+
alias_method :has_variable, :have_variables
|
|
59
|
+
alias_method :with_variables, :have_variables
|
|
60
|
+
alias_method :with_variable, :have_variables
|
|
64
61
|
|
|
65
|
-
module
|
|
62
|
+
module DocumentMatchers
|
|
66
63
|
extend RSpec::Matchers::DSL
|
|
67
64
|
|
|
68
65
|
# Provide a 3.0 compatible DSL methods for 2.x RSpec.
|
|
@@ -97,10 +94,12 @@ module RSpec
|
|
|
97
94
|
failure_message do |a_json_doc|
|
|
98
95
|
message = begin
|
|
99
96
|
JSON.load(a_json_doc)
|
|
100
|
-
rescue err
|
|
97
|
+
rescue => err
|
|
101
98
|
err.message
|
|
102
99
|
end
|
|
103
|
-
|
|
100
|
+
|
|
101
|
+
"Expected a HAL document but it wasn't because #{message} in:\n" +
|
|
102
|
+
a_json_doc
|
|
104
103
|
end
|
|
105
104
|
end
|
|
106
105
|
|
|
@@ -122,7 +121,8 @@ module RSpec
|
|
|
122
121
|
end
|
|
123
122
|
end
|
|
124
123
|
end
|
|
125
|
-
|
|
124
|
+
|
|
125
|
+
include DocumentMatchers
|
|
126
126
|
end
|
|
127
127
|
end
|
|
128
128
|
end
|
|
@@ -2,6 +2,9 @@ module RSpec
|
|
|
2
2
|
module Hal
|
|
3
3
|
module Matchers
|
|
4
4
|
module HalMatcherHelpers
|
|
5
|
+
|
|
6
|
+
# A matcher that always matches. Useful for avoiding special
|
|
7
|
+
# cases in value testing logic.
|
|
5
8
|
NullMatcher = Class.new do
|
|
6
9
|
def matches?(*args)
|
|
7
10
|
true
|
|
@@ -58,16 +61,20 @@ module RSpec
|
|
|
58
61
|
HalClient::Representation.new(parsed_json: MultiJson.load(json))
|
|
59
62
|
end
|
|
60
63
|
|
|
64
|
+
# Returns `expected` coerced into an RSpec matcher
|
|
61
65
|
def matcherize(expected)
|
|
62
66
|
if matcher? expected
|
|
63
67
|
expected
|
|
64
|
-
|
|
68
|
+
|
|
69
|
+
elsif expected.respond_to? :===
|
|
65
70
|
RSpec::Matchers::BuiltIn::Match.new(expected)
|
|
71
|
+
|
|
66
72
|
else
|
|
67
73
|
RSpec::Matchers::BuiltIn::Eq.new(expected)
|
|
68
74
|
end
|
|
69
75
|
end
|
|
70
76
|
|
|
77
|
+
# Returns true if object is an RSpec matcher
|
|
71
78
|
def matcher?(obj)
|
|
72
79
|
obj.respond_to?(:matches?) and (obj.respond_to?(:failure_message) or
|
|
73
80
|
obj.respond_to?(:failure_message_for_should))
|
|
@@ -17,7 +17,7 @@ module RSpec
|
|
|
17
17
|
# expect(doc).to have_relation link_rel, template_variables
|
|
18
18
|
# expect(doc).to have_relation link_rel, template_variables, href_matcher
|
|
19
19
|
def initialize(link_rel, *args)
|
|
20
|
-
@link_rel = link_rel
|
|
20
|
+
@link_rel = link_rel.to_s
|
|
21
21
|
|
|
22
22
|
@tmpl_vars, @expected = *if args.empty?
|
|
23
23
|
[{},NullMatcher]
|
data/lib/rspec/hal/version.rb
CHANGED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require_relative "../../spec_helper"
|
|
2
|
+
require "rspec/version"
|
|
3
|
+
|
|
4
|
+
describe RSpec::Hal::Helpers do
|
|
5
|
+
subject { Class.new do
|
|
6
|
+
include RSpec::Hal::Helpers
|
|
7
|
+
end.new }
|
|
8
|
+
|
|
9
|
+
specify { expect(subject.parse_hal(hal_doc)).to be_kind_of HalClient::Representation }
|
|
10
|
+
specify { expect(subject.parse_hal(hal_collection)).to be_kind_of HalClient::Collection }
|
|
11
|
+
|
|
12
|
+
# Background/Support
|
|
13
|
+
# ---
|
|
14
|
+
|
|
15
|
+
let(:hal_collection) { <<-HAL }
|
|
16
|
+
{ "_embedded": { "item": [
|
|
17
|
+
#{hal_doc}
|
|
18
|
+
]}}
|
|
19
|
+
HAL
|
|
20
|
+
|
|
21
|
+
let(:hal_doc) { <<-HAL }
|
|
22
|
+
{ "name": "Alice"
|
|
23
|
+
}
|
|
24
|
+
HAL
|
|
25
|
+
end
|
|
@@ -88,6 +88,13 @@ describe RSpec::Hal::Matchers::HavePropertyMatcher do
|
|
|
88
88
|
specify { expect(matcher.failure_message).to match(/eq "hector"/) }
|
|
89
89
|
end
|
|
90
90
|
|
|
91
|
+
context "name as symbol" do
|
|
92
|
+
subject(:matcher) { described_class.new(a_prop_name.to_sym) }
|
|
93
|
+
|
|
94
|
+
specify { expect(matcher.matches?(json_str_w_property)).to be_truthy}
|
|
95
|
+
specify { expect(matcher.matches?(json_str_wo_property)).to be_falsey}
|
|
96
|
+
end
|
|
97
|
+
|
|
91
98
|
|
|
92
99
|
# Background
|
|
93
100
|
# ---
|
|
@@ -13,6 +13,13 @@ describe RSpec::Hal::Matchers::RelationMatcher do
|
|
|
13
13
|
specify{ expect(matcher.matches?(json_str_w_link)).to be_truthy }
|
|
14
14
|
specify{ expect(matcher.matches?(json_str_wo_link)).to be_falsey }
|
|
15
15
|
|
|
16
|
+
context "name as symbol" do
|
|
17
|
+
subject(:matcher) { described_class.new(a_link_rel.to_sym) }
|
|
18
|
+
|
|
19
|
+
specify{ expect(matcher.matches?(json_str_w_link)).to be_truthy }
|
|
20
|
+
specify{ expect(matcher.matches?(json_str_wo_link)).to be_falsey }
|
|
21
|
+
end
|
|
22
|
+
|
|
16
23
|
context "curries" do
|
|
17
24
|
let(:a_link_rel) { "http://example.com/rels/foo" }
|
|
18
25
|
specify{ expect(matcher.matches?(json_str_w_curied_link)).to be_truthy }
|
|
@@ -78,7 +85,6 @@ describe RSpec::Hal::Matchers::RelationMatcher do
|
|
|
78
85
|
specify{ expect(matcher.matches? json_str_w_link).to be_falsy }
|
|
79
86
|
end
|
|
80
87
|
|
|
81
|
-
|
|
82
88
|
context "failed due to missing relation matcher" do
|
|
83
89
|
before do
|
|
84
90
|
matcher.matches? json_str_wo_link
|
|
@@ -26,6 +26,13 @@ describe RSpec::Hal::Matchers::TemplatedRelationMatcher do
|
|
|
26
26
|
specify { expect(matcher.with_variables("since", "before")).to be_a_matcher }
|
|
27
27
|
specify { expect(matcher.with_variable("since")).to be_a_matcher }
|
|
28
28
|
|
|
29
|
+
context "symbol rel name" do
|
|
30
|
+
subject(:matcher) { described_class.new(a_link_rel.to_sym) }
|
|
31
|
+
|
|
32
|
+
specify{ expect(matcher.matches?(json_str_w_link)).to be }
|
|
33
|
+
specify{ expect(matcher.matches?(json_str_wo_link)).not_to be }
|
|
34
|
+
end
|
|
35
|
+
|
|
29
36
|
context "failed due to missing relation matcher" do
|
|
30
37
|
before do
|
|
31
38
|
matcher.matches? json_str_wo_link
|
|
@@ -13,6 +13,13 @@ describe RSpec::Hal::Matchers::UriTemplateHasVariablesMatcher do
|
|
|
13
13
|
specify { expect(matcher.matches?("http://example.com{?foo}")).to be_falsy }
|
|
14
14
|
specify { expect(matcher.description).to match /foo, bar/ }
|
|
15
15
|
|
|
16
|
+
context "names as symbol" do
|
|
17
|
+
subject(:matcher) { described_class.new([:foo, :bar]) }
|
|
18
|
+
|
|
19
|
+
specify { expect(matcher.matches?("http://example.com{?foo,bar}")).to be_truthy }
|
|
20
|
+
specify { expect(matcher.matches?("http://example.com{?foo}")).to be_falsy }
|
|
21
|
+
end
|
|
22
|
+
|
|
16
23
|
describe "failed matcher" do
|
|
17
24
|
before do matcher.matches?("http://example.com{?foo}") end
|
|
18
25
|
|
|
@@ -22,12 +22,18 @@ describe RSpec::Hal::Matchers do
|
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
describe RSpec::Hal::Matchers::
|
|
25
|
+
describe RSpec::Hal::Matchers::DocumentMatchers do
|
|
26
26
|
describe "be_hal" do
|
|
27
27
|
subject(:matcher) { be_hal }
|
|
28
28
|
|
|
29
29
|
specify { expect(matcher.matches?(hal_doc)).to be_truthy }
|
|
30
30
|
specify { expect(matcher.matches?("What's HAL?")).to be_falsey }
|
|
31
|
+
|
|
32
|
+
context "failed matcher" do
|
|
33
|
+
before do matcher.matches?("What's HAL?") end
|
|
34
|
+
|
|
35
|
+
specify { expect(matcher.failure_message).to match "unexpected token" }
|
|
36
|
+
end
|
|
31
37
|
end
|
|
32
38
|
|
|
33
39
|
describe "be_hal_collection" do
|
|
@@ -39,7 +45,7 @@ describe RSpec::Hal::Matchers::Document do
|
|
|
39
45
|
end
|
|
40
46
|
|
|
41
47
|
before do
|
|
42
|
-
extend
|
|
48
|
+
extend described_class
|
|
43
49
|
end
|
|
44
50
|
|
|
45
51
|
let(:hal_collection) { <<-HAL }
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rspec-hal
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter Williams
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2014-
|
|
11
|
+
date: 2014-11-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -109,6 +109,7 @@ files:
|
|
|
109
109
|
- gemfiles/rspec3_0.gemfile
|
|
110
110
|
- lib/rspec-hal.rb
|
|
111
111
|
- lib/rspec/hal.rb
|
|
112
|
+
- lib/rspec/hal/helpers.rb
|
|
112
113
|
- lib/rspec/hal/matchers.rb
|
|
113
114
|
- lib/rspec/hal/matchers/hal_matcher_helpers.rb
|
|
114
115
|
- lib/rspec/hal/matchers/have_property_matcher.rb
|
|
@@ -117,6 +118,7 @@ files:
|
|
|
117
118
|
- lib/rspec/hal/matchers/uri_template_has_variables_matcher.rb
|
|
118
119
|
- lib/rspec/hal/version.rb
|
|
119
120
|
- rspec-hal.gemspec
|
|
121
|
+
- spec/rspec/hal/helpers_spec.rb
|
|
120
122
|
- spec/rspec/hal/matchers/have_property_matcher_spec.rb
|
|
121
123
|
- spec/rspec/hal/matchers/relation_matcher_spec.rb
|
|
122
124
|
- spec/rspec/hal/matchers/templated_relation_matcher_spec.rb
|
|
@@ -148,9 +150,11 @@ signing_key:
|
|
|
148
150
|
specification_version: 4
|
|
149
151
|
summary: Matchers and helpers for specing HAL documents.
|
|
150
152
|
test_files:
|
|
153
|
+
- spec/rspec/hal/helpers_spec.rb
|
|
151
154
|
- spec/rspec/hal/matchers/have_property_matcher_spec.rb
|
|
152
155
|
- spec/rspec/hal/matchers/relation_matcher_spec.rb
|
|
153
156
|
- spec/rspec/hal/matchers/templated_relation_matcher_spec.rb
|
|
154
157
|
- spec/rspec/hal/matchers/uri_template_has_variables_matcher_spec.rb
|
|
155
158
|
- spec/rspec/hal/matchers_spec.rb
|
|
156
159
|
- spec/spec_helper.rb
|
|
160
|
+
has_rdoc:
|