restfully 0.3.2 → 0.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.
data/spec/session_spec.rb CHANGED
@@ -1,9 +1,13 @@
1
1
  require File.expand_path(File.dirname(__FILE__)+'/spec_helper')
2
-
3
2
  restfully_version = File.read(File.dirname(__FILE__)+'/../VERSION').strip
4
3
 
5
4
  include Restfully
6
5
  describe Session do
6
+ before do
7
+ @session = Session.new(:base_uri => 'https://api.grid5000.fr/sid/', :root_path => '/grid5000', :user => 'crohr', :password => 'password', :default_headers => {})
8
+ @request = mock("restfully http request", :uri => mock("uri"), :headers => mock("headers"), :body => nil)
9
+ @response = mock("restfully http response", :status => 200, :headers => mock("headers"))
10
+ end
7
11
  describe "initialization" do
8
12
  it "should have a logger reader" do
9
13
  session = Session.new(:base_uri => 'https://api.grid5000.fr')
@@ -13,25 +17,21 @@ describe Session do
13
17
  it "should have a base_uri reader" do
14
18
  session = Session.new(:base_uri => 'https://api.grid5000.fr')
15
19
  session.should_not respond_to(:base_uri=)
16
- session.base_uri.should == 'https://api.grid5000.fr'
17
- end
18
- it "should have a root_path reader that returns the path of the root resource, relative to the base URI" do
19
- session = Session.new(:base_uri => 'https://api.grid5000.fr/sid', 'root_path' => '/grid5000')
20
- session.should_not respond_to(:root_path=)
21
- session.root_path.should == '/grid5000'
20
+ session.base_uri.should == URI.parse('https://api.grid5000.fr')
22
21
  end
23
- it "should set the default root_path to /" do
24
- session = Session.new(:base_uri => 'https://api.grid5000.fr')
25
- session.root_path.should == '/'
22
+ it "should raise an ArgumentError if the base_uri is not a valid URI" do
23
+ lambda{Session.new(:base_uri => '/home/crohr/whatever')}.should raise_error(ArgumentError, /\/home\/crohr\/whatever is not a valid URI/)
26
24
  end
27
25
  it "should log to NullLogger by default" do
28
- NullLogger.should_receive(:new).and_return(logger = mock(NullLogger, :debug => Proc.new{}))
26
+ NullLogger.should_receive(:new).and_return(logger = mock(NullLogger, :debug => Proc.new{}, :level => Logger::WARN))
27
+ logger.should_receive(:level=).with(Logger::WARN)
29
28
  session = Session.new(:base_uri => 'https://api.grid5000.fr')
30
29
  session.logger.should == logger
31
30
  end
32
31
  it "should use the given logger" do
33
32
  logger = mock("custom logger", :debug => Proc.new{})
34
- session = Session.new(:base_uri => 'https://api.grid5000.fr', 'logger' => logger)
33
+ logger.should_receive(:level=).with(Logger::DEBUG)
34
+ session = Session.new(:base_uri => 'https://api.grid5000.fr', 'logger' => logger, :verbose => true)
35
35
  session.logger.should == logger
36
36
  end
37
37
  it "should set a default Accept HTTP header if no default headers are given" do
@@ -49,17 +49,18 @@ describe Session do
49
49
  }
50
50
  end
51
51
  it "should correctly initialize the connection" do
52
- mock_logger = mock("logger", :debug => Proc.new{})
52
+ mock_logger = mock("logger", :debug => Proc.new{}, :level => Logger::DEBUG)
53
+ mock_logger.stub!(:level=)
53
54
  Restfully.adapter.should_receive(:new).with('https://api.grid5000.fr/sid', :user => 'crohr', :password => 'password', :logger => mock_logger).and_return(connection = mock("restfully connection"))
54
- session = Session.new(:base_uri => 'https://api.grid5000.fr/sid', 'root_path' => '/grid5000', :user => 'crohr', :password => 'password', :logger => mock_logger)
55
+ session = Session.new(:base_uri => 'https://api.grid5000.fr/sid', :user => 'crohr', :password => 'password', :logger => mock_logger)
55
56
  session.connection.should == connection
56
57
  end
57
58
 
58
59
  it "should initialize the root resource" do
59
- session = Session.new(:base_uri => 'https://api.grid5000.fr', 'root_path' => '/grid5000', :user => 'crohr', :password => 'password')
60
+ session = Session.new(:base_uri => 'https://api.grid5000.fr/grid5000', :user => 'crohr', :password => 'password')
60
61
  session.root.should be_a Restfully::Resource
61
- session.root.uri.to_s.should == '/grid5000'
62
- session.root.should_not be_loaded
62
+ session.root.uri.to_s.should == 'https://api.grid5000.fr/grid5000'
63
+ session.root.uri.path.should == '/grid5000'
63
64
  end
64
65
 
65
66
  it "should yield the loaded root resource and the session object" do
@@ -72,37 +73,72 @@ describe Session do
72
73
  end
73
74
  end
74
75
 
75
- describe "Getting resources" do
76
- before(:each) do
77
- @session = Session.new(:base_uri => 'https://api.grid5000.fr/sid', :root_path => '/grid5000', :user => 'crohr', :password => 'password', :default_headers => {})
78
- @request = mock("restfully http request", :uri => mock("uri"), :headers => mock("headers"))
76
+ describe "Transmitting requests" do
77
+ before do
79
78
  @request.should_receive(:add_headers).with("User-Agent"=>"Restfully/#{restfully_version}", "Accept"=>"application/json")
80
- @response = mock("restfully http response", :status => 200, :headers => mock("headers"))
81
79
  end
82
- it "should create a new Request object and pass it to the connection" do
83
- Restfully::HTTP::Request.should_receive(:new).with(URI.parse('https://api.grid5000.fr/sid/some/path'), :headers => {:cache_control => 'max-age=0'}, :query => {}).and_return(@request)
84
- @session.connection.should_receive(:get).with(@request).and_return(@response)
85
- @session.get('/some/path', :headers => {:cache_control => 'max-age=0'}).should == @response
80
+ it "should send a head" do
81
+ @session.connection.should_receive(:head).with(@request).and_return(@response)
82
+ @session.should_receive(:deal_with_eventual_errors).with(@response, @request).and_return(@response)
83
+ @session.send(:transmit, :head, @request).should == @response
86
84
  end
87
- it "should not use the base_url if the path is a complete url" do
88
- Restfully::HTTP::Request.should_receive(:new).with(URI.parse('http://somehost.com/some/path'), :headers => {}, :query => {}).and_return(@request)
85
+ it "should send a get" do
89
86
  @session.connection.should_receive(:get).with(@request).and_return(@response)
90
- @session.get('http://somehost.com/some/path').should == @response
87
+ @session.should_receive(:deal_with_eventual_errors).with(@response, @request).and_return(@response)
88
+ @session.send(:transmit, :get, @request).should == @response
91
89
  end
92
- it "should add the session's default headers to the request's headers" do
93
- Restfully::HTTP::Request.should_receive(:new).with(URI.parse('http://somehost.com/some/path'), :headers => {}, :query => {}).and_return(@request)
94
- @session.connection.should_receive(:get).with(@request).and_return(@response)
95
- @session.get('http://somehost.com/some/path').should == @response
90
+ it "should send a post" do
91
+ @session.connection.should_receive(:post).with(@request).and_return(@response)
92
+ @session.should_receive(:deal_with_eventual_errors).with(@response, @request).and_return(@response)
93
+ @session.send(:transmit, :post, @request).should == @response
96
94
  end
95
+ end
96
+
97
+ describe "URI construction" do
98
+ it "should not use the base_uri if the given path is a complete URI" do
99
+ @session.uri_for('http://somehost.com/some/path').should == URI.parse('http://somehost.com/some/path')
100
+ end
101
+ it "should combine the base_uri with the given path (absolute) if it is not a complete URI" do
102
+ @session.uri_for('/some/path').should == URI.parse('https://api.grid5000.fr/some/path')
103
+ end
104
+ it "should combine the base_uri with the given path (relative) if it is not a complete URI" do
105
+ @session.uri_for('some/path').should == URI.parse('https://api.grid5000.fr/sid/some/path')
106
+ end
107
+ end
108
+
109
+ describe "Dealing with errors" do
97
110
  it "should raise a Restfully::HTTP::ClientError error on 4xx errors" do
98
- Restfully::HTTP::Request.should_receive(:new).with(URI.parse('http://somehost.com/some/path'), :headers => {}, :query => {}).and_return(@request)
99
- @session.connection.should_receive(:get).with(@request).and_return(response = mock("404 response", :status => 404, :body => {'code' => 404, 'message' => 'The requested resource cannot be found.', 'title' => 'Not Found'}, :headers => mock("headers")))
100
- lambda{ @session.get('http://somehost.com/some/path') }.should raise_error(Restfully::HTTP::ClientError, "404 Not Found. The requested resource cannot be found.")
101
- end
102
- it "should raise a Restfully::HTTP::ServerError error on 4xx errors" do
103
- Restfully::HTTP::Request.should_receive(:new).with(URI.parse('http://somehost.com/some/path'), :headers => {}, :query => {}).and_return(@request)
104
- @session.connection.should_receive(:get).with(@request).and_return(response = mock("404 response", :status => 500, :body => {'code' => 500, 'message' => 'Something went wrong.', 'title' => 'Internal Server Error'}, :headers => mock("headers")))
105
- lambda{ @session.get('http://somehost.com/some/path') }.should raise_error(Restfully::HTTP::ServerError, "500 Internal Server Error. Something went wrong.")
111
+ response = mock("404 response", :status => 404, :body => {'code' => 404, 'message' => 'The requested resource cannot be found.', 'title' => 'Not Found'}, :headers => mock("headers"))
112
+ lambda{ @session.send(:deal_with_eventual_errors, response, @request) }.should raise_error(Restfully::HTTP::ClientError, "404 Not Found. The requested resource cannot be found.")
113
+ end
114
+
115
+ it "should raise a Restfully::HTTP::ServerError error on 5xx errors" do
116
+ response = mock("500 response", :status => 500, :body => {'code' => 500, 'message' => 'Something went wrong.', 'title' => 'Internal Server Error'}, :headers => mock("headers"))
117
+ lambda{ @session.send(:deal_with_eventual_errors, response, @request) }.should raise_error(Restfully::HTTP::ServerError, "500 Internal Server Error. Something went wrong.")
118
+ end
119
+ end
120
+
121
+ describe "HEADing resources" do
122
+ it "should create a new Request object and transmit it" do
123
+ Restfully::HTTP::Request.should_receive(:new).with(URI.parse('https://api.grid5000.fr/sid/some/path'), :headers => nil, :query => nil).and_return(@request)
124
+ @session.should_receive(:transmit).with(:head, @request)
125
+ @session.head('some/path')
126
+ end
127
+ end
128
+
129
+ describe "GETting resources" do
130
+ it "should create a new Request object and transmit it" do
131
+ Restfully::HTTP::Request.should_receive(:new).with(URI.parse('https://api.grid5000.fr/sid/some/path'), :headers => {:cache_control => 'max-age=0'}, :query => nil).and_return(@request)
132
+ @session.should_receive(:transmit).with(:get, @request)
133
+ @session.get('some/path', 'headers' => {:cache_control => 'max-age=0'})
134
+ end
135
+ end
136
+
137
+ describe "POSTing payload" do
138
+ it "should create a new Request object with a body, and transmit it" do
139
+ Restfully::HTTP::Request.should_receive(:new).with(URI.parse('https://api.grid5000.fr/sid/some/path'), :body => '{"a":"b"}', :headers => {:content_type => 'application/json'}, :query => nil).and_return(@request)
140
+ @session.should_receive(:transmit).with(:post, @request)
141
+ @session.post('some/path', {"a" => "b"}.to_json, 'headers' => {:content_type => 'application/json'})
106
142
  end
107
143
  end
108
144
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restfully
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyril Rohr
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-02 00:00:00 +01:00
12
+ date: 2009-11-16 00:00:00 +01:00
13
13
  default_executable: restfully
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -22,6 +22,16 @@ dependencies:
22
22
  - !ruby/object:Gem::Version
23
23
  version: "1.0"
24
24
  version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: backports
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
25
35
  description: Experimental code for auto-generation of wrappers on top of RESTful APIs that follow HATEOAS principles and provide OPTIONS methods and/or Allow headers.
26
36
  email: cyril.rohr@gmail.com
27
37
  executables:
@@ -34,6 +44,7 @@ extra_rdoc_files:
34
44
  files:
35
45
  - .document
36
46
  - .gitignore
47
+ - CHANGELOG
37
48
  - LICENSE
38
49
  - README.rdoc
39
50
  - Rakefile