diff --git a/lib/sawyer/agent.rb b/lib/sawyer/agent.rb index 8f5c67d..8dd6954 100644 --- a/lib/sawyer/agent.rb +++ b/lib/sawyer/agent.rb @@ -15,6 +15,20 @@ def initialize(endpoint, conn = nil) yield @conn if block_given? end + # Public: Retains a reference to the root relations of the API. + # + # Returns a Sawyer::Relation::Map. + def rels + @rels ||= root.data.rels + end + + # Public: Retains a reference to the root response of the API. + # + # Returns a Sawyer::Response. + def root + @root ||= start + end + # Public: Hits the root of the API to get the initial actions. # # Returns a Sawyer::Response. diff --git a/test/agent_test.rb b/test/agent_test.rb index 2fb3230..244e55f 100644 --- a/test/agent_test.rb +++ b/test/agent_test.rb @@ -10,6 +10,30 @@ def setup end end + def test_accesses_root_relations + @stubs.get '/a/' do |env| + assert_equal 'foo.com', env[:url].host + + [200, {}, Yajl.dump( + :_links => { + :users => {:href => '/users'}})] + end + + assert_equal 200, @agent.root.status + + assert_equal '/users', @agent.rels[:users].href + assert_equal :get, @agent.rels[:users].method + end + + def test_saves_root_endpoint + @stubs.get '/a/' do |env| + [200, {}, '{}'] + end + + assert_kind_of Sawyer::Response, @agent.root + assert_not_equal @agent.root.time, @agent.start.time + end + def test_starts_a_session @stubs.get '/a/' do |env| assert_equal 'foo.com', env[:url].host