roar 0.11.4 → 0.11.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.markdown +5 -1
- data/Gemfile +1 -1
- data/README.textile +22 -21
- data/lib/roar/representer.rb +1 -1
- data/lib/roar/representer/feature/client.rb +3 -3
- data/lib/roar/representer/feature/coercion.rb +1 -1
- data/lib/roar/representer/feature/http_verbs.rb +8 -9
- data/lib/roar/representer/feature/hypermedia.rb +83 -63
- data/lib/roar/representer/json.rb +12 -12
- data/lib/roar/representer/json/hal.rb +98 -25
- data/lib/roar/representer/transport/faraday.rb +5 -11
- data/lib/roar/representer/transport/net_http.rb +5 -5
- data/lib/roar/representer/xml.rb +11 -11
- data/lib/roar/version.rb +1 -1
- data/roar.gemspec +2 -2
- data/test/client_test.rb +2 -2
- data/test/coercion_feature_test.rb +2 -2
- data/test/dummy/app/controllers/albums_controller.rb +6 -6
- data/test/dummy/app/models/album.rb +1 -1
- data/test/dummy/app/representers/representer/xml/album.rb +3 -3
- data/test/dummy/app/representers/representer/xml/song.rb +1 -1
- data/test/dummy/config/boot.rb +1 -1
- data/test/fake_server.rb +14 -15
- data/test/faraday_http_transport_test.rb +25 -10
- data/test/hal_json_test.rb +73 -31
- data/test/http_verbs_feature_test.rb +12 -12
- data/test/hypermedia_feature_test.rb +38 -145
- data/test/hypermedia_test.rb +100 -0
- data/test/integration_test.rb +22 -22
- data/test/json_representer_test.rb +31 -31
- data/test/net_http_transport_test.rb +24 -10
- data/test/order_representers.rb +11 -11
- data/test/rails/controller_methods_test.rb +25 -25
- data/test/rails/rails_representer_methods_test.rb +3 -3
- data/test/representer_test.rb +6 -6
- data/test/test_helper.rb +33 -4
- data/test/xml_representer_test.rb +47 -47
- metadata +3 -3
- data/lib/roar/rails.rb +0 -21
@@ -2,15 +2,15 @@ module Representer
|
|
2
2
|
module XML
|
3
3
|
class Album < Roar::Representer::XML
|
4
4
|
self.representation_name= :album
|
5
|
-
|
5
|
+
|
6
6
|
property :id
|
7
7
|
property :year
|
8
8
|
collection :songs
|
9
|
-
|
9
|
+
|
10
10
|
link :self do
|
11
11
|
album_url(represented.id)
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
link "album-search" do
|
15
15
|
album_search_url
|
16
16
|
end
|
data/test/dummy/config/boot.rb
CHANGED
data/test/fake_server.rb
CHANGED
@@ -7,46 +7,45 @@ class FakeServer < Sinatra::Base
|
|
7
7
|
|
8
8
|
module BandRepresenter
|
9
9
|
include Roar::Representer::JSON
|
10
|
-
|
10
|
+
|
11
11
|
property :name
|
12
12
|
property :label
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
class Band
|
16
16
|
attr_reader :name, :label
|
17
|
-
|
17
|
+
|
18
18
|
def name=(value)
|
19
19
|
@name = value.upcase
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def label=(value)
|
23
23
|
@label = value.upcase
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def consume_band
|
28
28
|
Band.new.extend(BandRepresenter).from_json(request.body.string)
|
29
29
|
end
|
30
|
-
|
31
|
-
|
30
|
+
|
32
31
|
get "/method" do
|
33
32
|
"<method>get</method>"
|
34
33
|
end
|
35
34
|
|
36
35
|
post "/method" do
|
37
|
-
"<method>post</method>"
|
36
|
+
"<method>post - #{request.body.read}</method>"
|
38
37
|
end
|
39
|
-
|
38
|
+
|
40
39
|
put "/method" do
|
41
|
-
"<method>put</method>"
|
40
|
+
"<method>put - #{request.body.read}</method>"
|
42
41
|
end
|
43
|
-
|
42
|
+
|
44
43
|
delete "/method" do
|
45
44
|
"<method>delete</method>"
|
46
45
|
end
|
47
|
-
|
46
|
+
|
48
47
|
patch "/method" do
|
49
|
-
"<method>patch</method>"
|
48
|
+
"<method>patch - #{request.body.read}</method>"
|
50
49
|
end
|
51
50
|
|
52
51
|
get '/deliberate-error' do
|
@@ -56,10 +55,10 @@ class FakeServer < Sinatra::Base
|
|
56
55
|
post "/bands" do
|
57
56
|
#if request.content_type =~ /xml/
|
58
57
|
body consume_band.to_json
|
59
|
-
|
58
|
+
|
60
59
|
status 201
|
61
60
|
end
|
62
|
-
|
61
|
+
|
63
62
|
put "/bands/strungout" do
|
64
63
|
# DISCUSS: as long as we don't agree on what to return in PUT/PATCH, let's return an updated document.
|
65
64
|
body consume_band.to_json
|
@@ -3,28 +3,31 @@ require 'roar/representer/transport/faraday'
|
|
3
3
|
|
4
4
|
class FaradayHttpTransportTest < MiniTest::Spec
|
5
5
|
describe 'FaradayHttpTransport' do
|
6
|
+
let(:url) { "http://roar.example.com/method" }
|
7
|
+
let(:body) { "booty" }
|
8
|
+
let(:as) { "application/xml" }
|
6
9
|
before do
|
7
10
|
@transport = Roar::Representer::Transport::Faraday.new
|
8
11
|
end
|
9
12
|
|
10
13
|
it "#get_uri returns response" do
|
11
|
-
|
14
|
+
@transport.get_uri(url, as).must_match_faraday_response :get, url, as
|
12
15
|
end
|
13
16
|
|
14
17
|
it "#post_uri returns response" do
|
15
|
-
|
18
|
+
@transport.post_uri(url, body, as).must_match_faraday_response :post, url, as, body
|
16
19
|
end
|
17
20
|
|
18
21
|
it "#put_uri returns response" do
|
19
|
-
|
22
|
+
@transport.put_uri(url, body, as).must_match_faraday_response :put, url, as, body
|
20
23
|
end
|
21
24
|
|
22
25
|
it "#delete_uri returns response" do
|
23
|
-
|
26
|
+
@transport.delete_uri(url, as).must_match_faraday_response :delete, url, as
|
24
27
|
end
|
25
28
|
|
26
29
|
it "#patch_uri returns response" do
|
27
|
-
|
30
|
+
@transport.patch_uri(url, body, as).must_match_faraday_response :patch, url, as, body
|
28
31
|
end
|
29
32
|
|
30
33
|
describe 'non-existent resource' do
|
@@ -34,25 +37,25 @@ class FaradayHttpTransportTest < MiniTest::Spec
|
|
34
37
|
|
35
38
|
it '#get_uri raises a ResourceNotFound error' do
|
36
39
|
assert_raises(Faraday::Error::ResourceNotFound) do
|
37
|
-
@transport.get_uri(@not_found_url,
|
40
|
+
@transport.get_uri(@not_found_url, as).body
|
38
41
|
end
|
39
42
|
end
|
40
43
|
|
41
44
|
it '#post_uri raises a ResourceNotFound error' do
|
42
45
|
assert_raises(Faraday::Error::ResourceNotFound) do
|
43
|
-
@transport.post_uri(@not_found_url,
|
46
|
+
@transport.post_uri(@not_found_url, body, as).body
|
44
47
|
end
|
45
48
|
end
|
46
49
|
|
47
50
|
it '#post_uri raises a ResourceNotFound error' do
|
48
51
|
assert_raises(Faraday::Error::ResourceNotFound) do
|
49
|
-
@transport.post_uri(@not_found_url,
|
52
|
+
@transport.post_uri(@not_found_url, body, as).body
|
50
53
|
end
|
51
54
|
end
|
52
55
|
|
53
56
|
it '#delete_uri raises a ResourceNotFound error' do
|
54
57
|
assert_raises(Faraday::Error::ResourceNotFound) do
|
55
|
-
@transport.delete_uri(@not_found_url,
|
58
|
+
@transport.delete_uri(@not_found_url, as).body
|
56
59
|
end
|
57
60
|
end
|
58
61
|
end
|
@@ -60,10 +63,22 @@ class FaradayHttpTransportTest < MiniTest::Spec
|
|
60
63
|
describe 'server errors (500 Internal Server Error)' do
|
61
64
|
it '#get_uri raises a ClientError' do
|
62
65
|
assert_raises(Faraday::Error::ClientError) do
|
63
|
-
@transport.get_uri('http://roar.example.com/deliberate-error',
|
66
|
+
@transport.get_uri('http://roar.example.com/deliberate-error', as).body
|
64
67
|
end
|
65
68
|
end
|
66
69
|
end
|
67
70
|
|
68
71
|
end
|
69
72
|
end
|
73
|
+
|
74
|
+
module MiniTest::Assertions
|
75
|
+
|
76
|
+
def assert_faraday_response(type, response, url, as, body = nil)
|
77
|
+
headers = response.env[:request_headers]
|
78
|
+
assert_equal [as, as], [headers["Accept"], headers["Content-Type"]]
|
79
|
+
assert_equal "<method>#{type}#{(' - ' + body) if body}</method>", response.body
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
Faraday::Response.infect_an_assertion :assert_faraday_response, :must_match_faraday_response
|
data/test/hal_json_test.rb
CHANGED
@@ -2,37 +2,65 @@ require 'test_helper'
|
|
2
2
|
require 'roar/representer/json/hal'
|
3
3
|
|
4
4
|
class HalJsonTest < MiniTest::Spec
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
5
|
+
let(:rpr) do
|
6
|
+
Module.new do
|
7
|
+
include Roar::Representer::JSON
|
8
|
+
include Roar::Representer::JSON::HAL
|
9
|
+
|
10
|
+
links :self do
|
11
|
+
[{:lang => "en", :href => "http://en.hit"},
|
12
|
+
{:lang => "de", :href => "http://de.hit"}]
|
13
|
+
end
|
14
|
+
|
15
|
+
link :next do
|
16
|
+
"http://next"
|
17
|
+
end
|
15
18
|
end
|
16
19
|
end
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
20
|
+
|
21
|
+
subject { Object.new.extend(rpr) }
|
22
|
+
|
23
|
+
describe "#links" do
|
24
|
+
it "parses link array" do # TODO: remove me.
|
25
|
+
obj = subject.from_json("{\"_links\":{\"self\":[{\"lang\":\"en\",\"href\":\"http://en.hit\"},{\"lang\":\"de\",\"href\":\"http://de.hit\"}]}}")
|
26
|
+
obj.links.must_equal "self" => [link(:rel => :self, :href => "http://en.hit", :lang => :en), link(:rel => :self, :href => "http://de.hit", :lang => :de)]
|
27
|
+
end
|
28
|
+
|
29
|
+
it "parses single links" do # TODO: remove me.
|
30
|
+
obj = subject.from_json("{\"_links\":{\"next\":{\"href\":\"http://next\"}}}")
|
31
|
+
obj.links.must_equal "next" => link(:rel => :next, :href => "http://next")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "parses link and link array" do
|
35
|
+
obj = subject.from_json("{\"_links\":{\"next\":{\"href\":\"http://next\"}, \"self\":[{\"lang\":\"en\",\"href\":\"http://en.hit\"},{\"lang\":\"de\",\"href\":\"http://de.hit\"}]}}")
|
36
|
+
obj.links.must_equal "next" => link(:rel => :next, :href => "http://next"), "self" => [link(:rel => :self, :href => "http://en.hit", :lang => :en), link(:rel => :self, :href => "http://de.hit", :lang => :de)]
|
37
|
+
end
|
38
|
+
|
39
|
+
it "rejects single links declared as array when parsing" do
|
40
|
+
assert_raises TypeError do
|
41
|
+
subject.from_json("{\"_links\":{\"self\":{\"href\":\"http://next\"}}}")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
it "renders link and link array" do
|
46
|
+
subject.to_json.must_equal "{\"_links\":{\"self\":[{\"lang\":\"en\",\"href\":\"http://en.hit\"},{\"lang\":\"de\",\"href\":\"http://de.hit\"}],\"next\":{\"href\":\"http://next\"}}}"
|
21
47
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#prepare_links!" do
|
51
|
+
it "should map link arrays correctly" do
|
52
|
+
subject.send :prepare_links!
|
53
|
+
subject.links.must_equal "self" => [link(:rel => :self, :href => "http://en.hit", :lang => "en"),link(:rel => :self, :href => "http://de.hit", :lang => "de")], "next" => link(:href => "http://next", :rel => :next)
|
25
54
|
end
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
assert_equal nil, @song.links[:next]
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#link_array_rels" do
|
58
|
+
it "returns list of rels for array links" do
|
59
|
+
subject.send(:link_array_rels).must_equal [:self]
|
32
60
|
end
|
33
61
|
end
|
34
|
-
|
35
|
-
|
62
|
+
|
63
|
+
|
36
64
|
describe "HAL/JSON" do
|
37
65
|
before do
|
38
66
|
Bla = Module.new do
|
@@ -42,7 +70,7 @@ class HalJsonTest < MiniTest::Spec
|
|
42
70
|
"http://items/#{value}"
|
43
71
|
end
|
44
72
|
end
|
45
|
-
|
73
|
+
|
46
74
|
@order_rep = Module.new do
|
47
75
|
include Roar::Representer::JSON::HAL
|
48
76
|
property :id
|
@@ -51,14 +79,14 @@ class HalJsonTest < MiniTest::Spec
|
|
51
79
|
"http://orders/#{id}"
|
52
80
|
end
|
53
81
|
end
|
54
|
-
|
82
|
+
|
55
83
|
@order = Order.new(:items => [Item.new(:value => "Beer")], :id => 1).extend(@order_rep)
|
56
84
|
end
|
57
|
-
|
85
|
+
|
58
86
|
it "render links and embedded resources according to HAL" do
|
59
87
|
assert_equal "{\"id\":1,\"_embedded\":{\"items\":[{\"value\":\"Beer\",\"_links\":{\"self\":{\"href\":\"http://items/Beer\"}}}]},\"_links\":{\"self\":{\"href\":\"http://orders/1\"}}}", @order.to_json
|
60
88
|
end
|
61
|
-
|
89
|
+
|
62
90
|
it "parses links and resources following the mighty HAL" do
|
63
91
|
@order.from_json("{\"id\":2,\"_embedded\":{\"items\":[{\"value\":\"Coffee\",\"_links\":{\"self\":{\"href\":\"http://items/Coffee\"}}}]},\"_links\":{\"self\":{\"href\":\"http://orders/2\"}}}")
|
64
92
|
assert_equal 2, @order.id
|
@@ -66,12 +94,26 @@ class HalJsonTest < MiniTest::Spec
|
|
66
94
|
assert_equal "http://items/Coffee", @order.items.first.links[:self].href
|
67
95
|
assert_equal "http://orders/2", @order.links[:self].href
|
68
96
|
end
|
69
|
-
|
97
|
+
|
70
98
|
it "doesn't require _links and _embedded to be present" do
|
71
99
|
@order.from_json("{\"id\":2}")
|
72
100
|
assert_equal 2, @order.id
|
73
101
|
assert_equal [], @order.items
|
74
|
-
|
102
|
+
@order.links.must_equal({})
|
75
103
|
end
|
76
104
|
end
|
77
105
|
end
|
106
|
+
|
107
|
+
class LinkCollectionTest < MiniTest::Spec
|
108
|
+
subject { Roar::Representer::JSON::HAL::LinkCollection.new([:self, "next"]) }
|
109
|
+
describe "#is_array?" do
|
110
|
+
it "returns true for array link" do
|
111
|
+
subject.is_array?(:self).must_equal true
|
112
|
+
subject.is_array?("self").must_equal true
|
113
|
+
end
|
114
|
+
|
115
|
+
it "returns false otherwise" do
|
116
|
+
subject.is_array?("prev").must_equal false
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -4,38 +4,38 @@ require 'roar/representer/json'
|
|
4
4
|
|
5
5
|
class HttpVerbsTest < MiniTest::Spec
|
6
6
|
BandRepresenter = FakeServer::BandRepresenter
|
7
|
-
|
7
|
+
|
8
8
|
# keep this class clear of Roar modules.
|
9
9
|
class Band
|
10
10
|
attr_accessor :name, :label
|
11
11
|
end
|
12
|
-
|
13
|
-
|
12
|
+
|
13
|
+
|
14
14
|
describe "HttpVerbs" do
|
15
15
|
before do
|
16
16
|
@band = Band.new
|
17
17
|
@band.extend(BandRepresenter)
|
18
18
|
@band.extend(Roar::Representer::Feature::HttpVerbs)
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
describe "transport_engine" do
|
22
22
|
before do
|
23
23
|
@http_verbs = Roar::Representer::Feature::HttpVerbs
|
24
24
|
@net_http = Roar::Representer::Transport::NetHTTP
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
it "has a default set in the transport module level" do
|
28
28
|
assert_equal @net_http, @band.transport_engine
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
it "allows changing on instance level" do
|
32
32
|
@band.transport_engine = :soap
|
33
33
|
assert_equal @net_http, @http_verbs.transport_engine
|
34
34
|
assert_equal :soap, @band.transport_engine
|
35
35
|
end
|
36
36
|
end
|
37
|
-
|
38
|
-
|
37
|
+
|
38
|
+
|
39
39
|
describe "HttpVerbs.get" do
|
40
40
|
it "returns instance from incoming representation" do
|
41
41
|
band = @band.get("http://roar.example.com/bands/slayer", "application/json")
|
@@ -68,18 +68,18 @@ class HttpVerbsTest < MiniTest::Spec
|
|
68
68
|
assert_equal "Canadian Maple", @band.label
|
69
69
|
end
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
describe "#post" do
|
73
73
|
it "updates instance with incoming representation" do
|
74
74
|
@band.name = "Strung Out"
|
75
75
|
assert_equal nil, @band.label
|
76
|
-
|
76
|
+
|
77
77
|
@band.post("http://roar.example.com/bands", "application/xml")
|
78
78
|
assert_equal "STRUNG OUT", @band.name
|
79
79
|
assert_equal nil, @band.label
|
80
80
|
end
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
describe "#put" do
|
84
84
|
it "updates instance with incoming representation" do
|
85
85
|
@band.name = "Strung Out"
|
@@ -89,7 +89,7 @@ class HttpVerbsTest < MiniTest::Spec
|
|
89
89
|
assert_equal "FAT WRECK", @band.label
|
90
90
|
end
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
describe "#patch" do
|
94
94
|
it 'does something' do
|
95
95
|
@band.label = 'Fat Mike'
|
@@ -4,59 +4,11 @@ require 'roar/representer/json'
|
|
4
4
|
|
5
5
|
class HypermediaTest
|
6
6
|
describe "Hypermedia Feature" do
|
7
|
-
describe "Hypermedia.link" do
|
8
|
-
before do
|
9
|
-
@mod = Module.new do
|
10
|
-
include Roar::Representer::JSON
|
11
|
-
include Roar::Representer::Feature::Hypermedia
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
it "accepts rel symbol, only" do
|
16
|
-
@mod.class_eval do
|
17
|
-
link :self do
|
18
|
-
"http://self"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
assert_equal "{\"links\":[{\"rel\":\"self\",\"href\":\"http://self\"}]}", Object.new.extend(@mod).to_json
|
23
|
-
end
|
24
|
-
|
25
|
-
it "accepts any options" do
|
26
|
-
@mod.class_eval do
|
27
|
-
link :rel => :self, :title => "Hey, @myabc" do
|
28
|
-
"http://self"
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
assert_equal "{\"links\":[{\"rel\":\"self\",\"title\":\"Hey, @myabc\",\"href\":\"http://self\"}]}", Object.new.extend(@mod).to_json
|
33
|
-
end
|
34
|
-
|
35
|
-
it "receives options from to_*" do
|
36
|
-
@mod.class_eval do
|
37
|
-
link :self do |opts|
|
38
|
-
"http://self/#{opts[:id]}"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
assert_equal "{\"links\":[{\"rel\":\"self\",\"href\":\"http://self/1\"}]}", Object.new.extend(@mod).to_json(:id => 1)
|
43
|
-
end
|
44
|
-
|
45
|
-
it "supports returning hash" do
|
46
|
-
@mod.class_eval do
|
47
|
-
link :self do
|
48
|
-
{:href => "http://self", :type => "image/jpg"}
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
assert_equal "{\"links\":[{\"rel\":\"self\",\"href\":\"http://self\",\"type\":\"image/jpg\"}]}", Object.new.extend(@mod).to_json
|
53
|
-
end
|
54
|
-
end
|
55
7
|
|
56
8
|
|
57
9
|
before do
|
58
10
|
@bookmarks = Class.new do
|
59
|
-
include
|
11
|
+
include AttributesConstructor
|
60
12
|
include Roar::Representer::XML
|
61
13
|
include Roar::Representer::Feature::Hypermedia
|
62
14
|
|
@@ -111,7 +63,7 @@ class HypermediaTest
|
|
111
63
|
|
112
64
|
it "sets up links even when nested" do
|
113
65
|
class Page
|
114
|
-
include
|
66
|
+
include AttributesConstructor
|
115
67
|
include Roar::Representer::JSON
|
116
68
|
property :note, :class => Note
|
117
69
|
attr_accessor :note
|
@@ -133,109 +85,52 @@ class HypermediaTest
|
|
133
85
|
|
134
86
|
assert_kind_of Roar::Representer::Feature::Hypermedia::LinkCollection, doc.links
|
135
87
|
assert_equal 1, doc.links.size
|
136
|
-
assert_equal(["self", "http://bookmarks"], [doc.
|
88
|
+
assert_equal(["self", "http://bookmarks"], [doc.links_array.first.rel, doc.links_array.first.href])
|
137
89
|
end
|
138
90
|
|
139
91
|
it "sets up an empty link list if no links found in the document" do
|
140
|
-
assert_equal [], @bookmarks_with_links.from_xml(%{<bookmarks/>}).
|
92
|
+
assert_equal [], @bookmarks_with_links.from_xml(%{<bookmarks/>}).links_array
|
141
93
|
end
|
142
94
|
end
|
143
95
|
|
144
96
|
|
145
97
|
describe "#links" do
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
@set.links = [
|
151
|
-
{:rel => "self", :href => "http://self"},
|
152
|
-
{:rel => "next", :href => "http://next"}].collect do |config|
|
153
|
-
link = hyper.new
|
154
|
-
link.rel = config[:rel]
|
155
|
-
link.href = config[:href]
|
156
|
-
link
|
157
|
-
end
|
158
|
-
end
|
98
|
+
subject { Object.new.extend(rpr).tap do |obj|
|
99
|
+
obj.send :prepare_links!
|
100
|
+
end }
|
159
101
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
assert_equal 2, @set.links.size
|
164
|
-
end
|
102
|
+
representer_for do
|
103
|
+
link(:self) { "//self" }
|
104
|
+
link(:next) { "//next" }
|
165
105
|
end
|
166
106
|
|
167
|
-
describe "#link[]" do
|
168
107
|
it "returns link object" do
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
it "returns an empty list when no links present" do
|
177
|
-
assert_equal Roar::Representer::Feature::Hypermedia::LinkCollection.new, @bookmarks.new.links
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
|
182
|
-
describe "#find_links_definition" do
|
183
|
-
it "returns Definition if links are present" do
|
184
|
-
@bookmarks.class_eval do
|
185
|
-
property :id
|
186
|
-
link :self
|
108
|
+
subject.links["self"].href.must_equal "//self"
|
109
|
+
subject.links[:self].href.must_equal "//self"
|
110
|
+
subject.links[:next].href.must_equal "//next"
|
111
|
+
subject.links["unknown"].must_equal nil
|
187
112
|
end
|
188
113
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
it "returns nil if no links defined" do
|
193
|
-
assert_equal nil, @bookmarks.find_links_definition
|
194
|
-
end
|
114
|
+
# it "returns an empty list when no links present" do
|
115
|
+
# assert_equal Roar::Representer::Feature::Hypermedia::LinkCollection.new, @bookmarks.new.links
|
116
|
+
# end
|
195
117
|
end
|
196
118
|
end
|
197
119
|
end
|
198
120
|
|
199
|
-
class LinksDefinitionTest < MiniTest::Spec
|
200
|
-
describe "LinksDefinition" do
|
201
|
-
before do
|
202
|
-
@d = Roar::Representer::Feature::Hypermedia::LinksDefinition.new(:links)
|
203
|
-
end
|
204
|
-
|
205
|
-
it "accepts options in constructor" do
|
206
|
-
assert_equal [], @d.rel2block
|
207
|
-
end
|
208
|
-
|
209
|
-
it "accepts configuration" do
|
210
|
-
@d.rel2block << {:rel => :self}
|
211
|
-
assert_equal [{:rel=>:self}], @d.rel2block
|
212
|
-
end
|
213
|
-
|
214
|
-
it "responds to #clone" do
|
215
|
-
@d.rel2block << {:rel => :self}
|
216
|
-
assert @d.clone.rel2block.object_id != @d.rel2block.object_id
|
217
|
-
end
|
218
|
-
|
219
|
-
|
220
|
-
it "responds to #each to iterate rel2block" do
|
221
|
-
end
|
222
|
-
|
223
|
-
end
|
224
|
-
end
|
225
121
|
|
226
122
|
class LinkCollectionTest < MiniTest::Spec
|
227
123
|
describe "LinkCollection" do
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
assert_equal 1, collection.size
|
124
|
+
subject { Roar::Representer::Feature::Hypermedia::LinkCollection.new }
|
125
|
+
|
126
|
+
describe "#add" do
|
127
|
+
it "keys by using rel string" do
|
128
|
+
subject.size.must_equal 0
|
129
|
+
subject.add(link = link(:rel => :self))
|
130
|
+
subject.values.must_equal [link]
|
131
|
+
subject.add(link = link(:rel => "self"))
|
132
|
+
subject.values.must_equal [link]
|
133
|
+
end
|
239
134
|
end
|
240
135
|
end
|
241
136
|
end
|
@@ -243,30 +138,28 @@ end
|
|
243
138
|
class HyperlinkTest < MiniTest::Spec
|
244
139
|
Hyperlink = Roar::Representer::Feature::Hypermedia::Hyperlink
|
245
140
|
describe "Hyperlink" do
|
246
|
-
|
247
|
-
@link = Hyperlink.new(:rel => "self", "href" => "http://self", "data-whatever" => "Hey, @myabc")
|
248
|
-
end
|
141
|
+
subject { Hyperlink.new(:rel => "self", "href" => "http://self", "data-whatever" => "Hey, @myabc") }
|
249
142
|
|
250
143
|
it "accepts string keys in constructor" do
|
251
|
-
assert_equal "Hey, @myabc",
|
144
|
+
assert_equal "Hey, @myabc", subject.send("data-whatever")
|
252
145
|
end
|
253
146
|
|
254
147
|
it "responds to #rel" do
|
255
|
-
assert_equal "self",
|
148
|
+
assert_equal "self", subject.rel
|
256
149
|
end
|
257
150
|
|
258
151
|
it "responds to #href" do
|
259
|
-
assert_equal "http://self",
|
152
|
+
assert_equal "http://self", subject.href
|
260
153
|
end
|
261
|
-
|
154
|
+
|
262
155
|
it "responds to #replace with string keys" do
|
263
|
-
|
264
|
-
assert_equal nil,
|
265
|
-
assert_equal "next",
|
156
|
+
subject.replace("rel" => "next")
|
157
|
+
assert_equal nil, subject.href
|
158
|
+
assert_equal "next", subject.rel
|
266
159
|
end
|
267
|
-
|
160
|
+
|
268
161
|
it "responds to #each and implements Enumerable" do
|
269
|
-
assert_equal ["rel:self", "href:http://self", "data-whatever:Hey, @myabc"],
|
162
|
+
assert_equal ["rel:self", "href:http://self", "data-whatever:Hey, @myabc"], subject.collect { |k,v| "#{k}:#{v}" }
|
270
163
|
end
|
271
164
|
end
|
272
165
|
end
|
@@ -300,7 +193,7 @@ class HyperlinkInheritanceTest < MiniTest::Spec
|
|
300
193
|
|
301
194
|
it "should inherit parent links" do
|
302
195
|
foo = Object.new.extend(Foo)
|
303
|
-
|
196
|
+
|
304
197
|
assert_equal "{\"links\":[{\"rel\":\"base\",\"href\":\"http://base\"},{\"rel\":\"foo\",\"href\":\"http://foo\"}]}", foo.to_json
|
305
198
|
end
|
306
199
|
|