wrest 1.0.0.beta1 → 1.0.0.beta2
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/CHANGELOG +14 -2
- data/LICENCE +7 -0
- data/README.rdoc +15 -69
- data/lib/wrest/components/container/alias_accessors.rb +1 -1
- data/lib/wrest/components/container/alias_accessors.rbc +905 -0
- data/lib/wrest/components/container/typecaster.rb +5 -5
- data/lib/wrest/components/container/typecaster.rbc +1985 -0
- data/lib/wrest/components/container.rb +11 -12
- data/lib/wrest/components/container.rbc +2466 -0
- data/lib/wrest/components/mutators/base.rbc +702 -0
- data/lib/wrest/components/mutators/camel_to_snake_case.rbc +360 -0
- data/lib/wrest/components/mutators/xml_mini_type_caster.rbc +679 -0
- data/lib/wrest/components/mutators/xml_simple_type_caster.rbc +559 -0
- data/lib/wrest/components/mutators.rbc +650 -0
- data/lib/wrest/components/translators/content_types.rbc +339 -0
- data/lib/wrest/components/translators/json.rbc +462 -0
- data/lib/wrest/components/translators/xml.rbc +457 -0
- data/lib/wrest/components/translators.rbc +517 -0
- data/lib/wrest/components.rbc +217 -0
- data/lib/wrest/core_ext/hash/conversions.rbc +501 -0
- data/lib/wrest/core_ext/hash.rbc +182 -0
- data/lib/wrest/core_ext/string/conversions.rbc +471 -0
- data/lib/wrest/core_ext/string.rbc +182 -0
- data/lib/wrest/curl/response.rb +8 -0
- data/lib/wrest/curl.rbc +704 -0
- data/lib/wrest/exceptions.rbc +312 -0
- data/lib/wrest/http_shared/headers.rb +0 -7
- data/lib/wrest/http_shared/headers.rbc +353 -0
- data/lib/wrest/http_shared/standard_headers.rbc +336 -0
- data/lib/wrest/http_shared/standard_tokens.rbc +316 -0
- data/lib/wrest/http_shared.rbc +279 -0
- data/lib/wrest/native/connection_factory.rbc +445 -0
- data/lib/wrest/native/delete.rbc +371 -0
- data/lib/wrest/native/get.rb +26 -0
- data/lib/wrest/native/get.rbc +855 -0
- data/lib/wrest/native/options.rbc +347 -0
- data/lib/wrest/native/post.rbc +388 -0
- data/lib/wrest/native/put.rbc +388 -0
- data/lib/wrest/native/redirection.rbc +520 -0
- data/lib/wrest/native/request.rb +4 -2
- data/lib/wrest/native/request.rbc +1675 -0
- data/lib/wrest/native/response.rb +53 -2
- data/lib/wrest/native/response.rbc +2150 -0
- data/lib/wrest/native/session.rbc +1372 -0
- data/lib/wrest/native.rbc +513 -0
- data/lib/wrest/resource/base.rbc +2115 -0
- data/lib/wrest/resource.rbc +163 -0
- data/lib/wrest/uri.rbc +2599 -0
- data/lib/wrest/uri_template.rbc +505 -0
- data/lib/wrest/version.rb +1 -1
- data/lib/wrest/version.rbc +372 -0
- data/lib/wrest.rb +1 -1
- data/lib/wrest.rbc +1900 -0
- metadata +99 -102
- data/Rakefile +0 -495
- data/VERSION.yml +0 -5
- data/bin/jwrest +0 -3
- data/examples/delicious.rb +0 -72
- data/examples/facebook.rb +0 -101
- data/examples/imgur_multipart.rb +0 -24
- data/examples/keep_alive.rb +0 -37
- data/examples/redirection.rb +0 -27
- data/examples/twitter.rb +0 -78
- data/examples/twitter_public_timeline.rb +0 -32
- data/examples/wow_realm_status.rb +0 -67
- data/init.rb +0 -0
- data/spec/custom_matchers/custom_matchers.rb +0 -2
- data/spec/rcov.opts +0 -4
- data/spec/spec.opts.disable +0 -6
- data/spec/unit/spec_helper.rb +0 -35
- data/spec/unit/wrest/components/attributes_container/alias_accessors_spec.rb +0 -49
- data/spec/unit/wrest/components/attributes_container/typecaster_spec.rb +0 -83
- data/spec/unit/wrest/components/attributes_container_spec.rb +0 -254
- data/spec/unit/wrest/components/mutators/base_spec.rb +0 -42
- data/spec/unit/wrest/components/mutators/camel_to_snake_spec.rb +0 -22
- data/spec/unit/wrest/components/mutators/xml_mini_type_caster_spec.rb +0 -75
- data/spec/unit/wrest/components/mutators/xml_simple_type_caster_spec.rb +0 -47
- data/spec/unit/wrest/components/mutators_spec.rb +0 -21
- data/spec/unit/wrest/components/translators/xml_spec.rb +0 -16
- data/spec/unit/wrest/components/translators_spec.rb +0 -18
- data/spec/unit/wrest/core_ext/hash/conversions_spec.rb +0 -22
- data/spec/unit/wrest/core_ext/string/conversions_spec.rb +0 -39
- data/spec/unit/wrest/curl/request_spec.rb +0 -19
- data/spec/unit/wrest/curl/response_spec.rb +0 -16
- data/spec/unit/wrest/http/response_spec.rb +0 -24
- data/spec/unit/wrest/native/redirection_spec.rb +0 -42
- data/spec/unit/wrest/native/request_spec.rb +0 -71
- data/spec/unit/wrest/native/response_spec.rb +0 -72
- data/spec/unit/wrest/native/session_spec.rb +0 -74
- data/spec/unit/wrest/resource/base_spec.rb +0 -274
- data/spec/unit/wrest/uri_spec.rb +0 -273
- data/spec/unit/wrest/uri_template_spec.rb +0 -38
- data/wrest.gemspec +0 -168
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Wrest::Native::Redirection do
|
|
4
|
-
|
|
5
|
-
it "should make a request to the url in its location header and return the response" do
|
|
6
|
-
mock_net_http_response = mock(Net::HTTPRedirection)
|
|
7
|
-
redirect_url = 'http://redirect.com'
|
|
8
|
-
redirect_uri = redirect_url.to_uri
|
|
9
|
-
mock_net_http_response.should_receive(:[]).with('location').and_return(redirect_url)
|
|
10
|
-
mock_net_http_response.should_receive(:code).and_return('200')
|
|
11
|
-
|
|
12
|
-
Wrest::Uri.should_receive(:new).with(redirect_url, anything).and_return(redirect_uri)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
after_redirect_request = Wrest::Native::Get.new(redirect_uri)
|
|
16
|
-
final_mock_response = mock(Wrest::Native::Response)
|
|
17
|
-
after_redirect_request.should_receive(:invoke).and_return(final_mock_response)
|
|
18
|
-
|
|
19
|
-
Wrest::Native::Get.should_receive(:new).with(redirect_uri, {}, {}, {:username=>nil, :password=>nil}).and_return(after_redirect_request)
|
|
20
|
-
|
|
21
|
-
response = Wrest::Native::Redirection.new(mock_net_http_response)
|
|
22
|
-
response.follow(:follow_redirects_count => 0, :follow_redirects_limit => 5).should == final_mock_response
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it "should raise a Wrest::Exceptions::AutoRedirectLimitExceeded if there are more redirections than the limit" do
|
|
26
|
-
request_url = 'http://redirect.com'
|
|
27
|
-
|
|
28
|
-
response = mock(Net::HTTPRedirection)
|
|
29
|
-
response.stub!(:code).and_return('301')
|
|
30
|
-
response.stub!(:message).and_return('')
|
|
31
|
-
response.stub!(:body).and_return('')
|
|
32
|
-
response.should_receive(:[]).with('location').exactly(5).times.and_return(request_url)
|
|
33
|
-
|
|
34
|
-
http_connection = mock(Net::HTTP)
|
|
35
|
-
http_connection.stub!(:read_timeout=)
|
|
36
|
-
http_connection.should_receive(:request).exactly(5).times.and_return(response)
|
|
37
|
-
|
|
38
|
-
Net::HTTP.should_receive(:new).exactly(5).times.and_return(http_connection)
|
|
39
|
-
|
|
40
|
-
lambda{ request_url.to_uri(:follow_redirects_limit => 5).get }.should raise_error(Wrest::Exceptions::AutoRedirectLimitExceeded)
|
|
41
|
-
end
|
|
42
|
-
end
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
# Copyright 2009 Sidu Ponnappa
|
|
2
|
-
|
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
# you may not use this file except in compliance with the License.
|
|
5
|
-
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
-
# Unless required by applicable law or agreed to in writing, software distributed under the License
|
|
7
|
-
# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
8
|
-
# See the License for the specific language governing permissions and limitations under the License.
|
|
9
|
-
|
|
10
|
-
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
11
|
-
|
|
12
|
-
describe Wrest::Native::Request do
|
|
13
|
-
it "should convert all symbols in header keys to strings" do
|
|
14
|
-
Wrest::Native::Request.new(
|
|
15
|
-
'http://localhost/foo'.to_uri, Net::HTTP::Get, {},
|
|
16
|
-
nil, 'Content-Type' => 'application/xml', :per_page => '10'
|
|
17
|
-
).headers.should == {
|
|
18
|
-
'Content-Type' => 'application/xml',
|
|
19
|
-
'per_page' => '10'
|
|
20
|
-
}
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
it "should default the 'follow_redirects' option to true for a Get" do
|
|
24
|
-
Wrest::Native::Get.new('http://localhost/foo'.to_uri).follow_redirects.should be_true
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
it "should default the 'follow_redirects_count' option to 0" do
|
|
28
|
-
Wrest::Native::Get.new('http://localhost/foo'.to_uri).follow_redirects_count.should == 0
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
it "should default the 'follow_redirects_limit' option to 5" do
|
|
32
|
-
Wrest::Native::Get.new('http://localhost/foo'.to_uri).follow_redirects_limit.should == 5
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
it "should allow Gets to disable redirect follows" do
|
|
36
|
-
Wrest::Native::Get.new('http://localhost/foo'.to_uri, {}, {}, {:follow_redirects => false}).follow_redirects.should be_false
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
it "should increment the follow_redirects_count for every redirect leving the count unaffected in previous requests" do
|
|
40
|
-
uri = 'http://localhost/foo'.to_uri
|
|
41
|
-
request = Wrest::Native::Get.new(uri)
|
|
42
|
-
redirect_location = 'http://coathangers.com'
|
|
43
|
-
redirected_request = mock('Request to http://coathangers.com')
|
|
44
|
-
|
|
45
|
-
mock_connection = mock('Http Connection')
|
|
46
|
-
uri.stub!(:create_connection).and_return(mock_connection)
|
|
47
|
-
|
|
48
|
-
raw_response = mock(Net::HTTPRedirection)
|
|
49
|
-
raw_response.stub!(:code).and_return('301')
|
|
50
|
-
raw_response.stub!(:message).and_return('')
|
|
51
|
-
raw_response.stub!(:body).and_return('')
|
|
52
|
-
raw_response.stub!(:[]).with('location').and_return(redirect_location)
|
|
53
|
-
|
|
54
|
-
response = Wrest::Native::Redirection.new(raw_response)
|
|
55
|
-
|
|
56
|
-
mock_connection.should_receive(:request).and_return(raw_response)
|
|
57
|
-
|
|
58
|
-
Wrest::Native::Response.should_receive(:new).and_return(response)
|
|
59
|
-
redirected_request.stub!(:get)
|
|
60
|
-
redirect_location.should_receive(:to_uri).with(hash_including(:follow_redirects_count=>1)).and_return(redirected_request)
|
|
61
|
-
|
|
62
|
-
request.invoke
|
|
63
|
-
request.follow_redirects_count.should == 0
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
it "should default the 'follow_redirects' option to false for a Post, Put or Delete" do
|
|
67
|
-
Wrest::Native::Post.new('http://localhost/foo'.to_uri).follow_redirects.should_not be_true
|
|
68
|
-
Wrest::Native::Put.new('http://localhost/foo'.to_uri).follow_redirects.should_not be_true
|
|
69
|
-
Wrest::Native::Delete.new('http://localhost/foo'.to_uri).follow_redirects.should_not be_true
|
|
70
|
-
end
|
|
71
|
-
end
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
-
|
|
3
|
-
module Wrest
|
|
4
|
-
describe Native::Response do
|
|
5
|
-
it "should build a Redirection instead of a normal response if the code is 301..303 or 305..3xx" do
|
|
6
|
-
http_response = mock(Net::HTTPRedirection)
|
|
7
|
-
http_response.stub!(:code).and_return('301')
|
|
8
|
-
|
|
9
|
-
Native::Response.new(http_response).class.should == Wrest::Native::Redirection
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
it "should build a normal response if the code is 304" do
|
|
13
|
-
http_response = mock(Net::HTTPRedirection)
|
|
14
|
-
http_response.stub!(:code).and_return('304')
|
|
15
|
-
|
|
16
|
-
Native::Response.new(http_response).class.should == Wrest::Native::Response
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it "should build a normal Response for non 3xx codes" do
|
|
20
|
-
http_response = mock(Net::HTTPResponse)
|
|
21
|
-
http_response.stub!(:code).and_return('200')
|
|
22
|
-
|
|
23
|
-
Native::Response.new(http_response).class.should == Wrest::Native::Response
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it "should know how to delegate to a translator" do
|
|
27
|
-
http_response = mock('response')
|
|
28
|
-
http_response.stub!(:code).and_return('200')
|
|
29
|
-
Components::Translators::Xml.should_receive(:deserialise).with(http_response)
|
|
30
|
-
Native::Response.new(http_response).deserialise_using(Components::Translators::Xml)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it "should know how to load a translator based on content type" do
|
|
34
|
-
http_response = mock('response')
|
|
35
|
-
http_response.stub!(:code).and_return('422')
|
|
36
|
-
http_response.should_receive(:content_type).and_return('application/xml')
|
|
37
|
-
|
|
38
|
-
response = Native::Response.new(http_response)
|
|
39
|
-
response.should_receive(:deserialise_using).with(Components::Translators::Xml)
|
|
40
|
-
|
|
41
|
-
response.deserialise
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
it "should simply return itself when asked to follow (null object behaviour - see MovedPermanently for more context)" do
|
|
45
|
-
http_response = mock('response')
|
|
46
|
-
http_response.stub!(:code).and_return('422')
|
|
47
|
-
|
|
48
|
-
response = Native::Response.new(http_response)
|
|
49
|
-
response.follow.equal?(response).should be_true
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
describe 'Keep-Alive' do
|
|
53
|
-
it "should know when a connection has been closed" do
|
|
54
|
-
http_response = mock('response')
|
|
55
|
-
http_response.stub!(:code).and_return('200')
|
|
56
|
-
http_response.should_receive(:[]).with(Wrest::H::Connection).and_return('Close')
|
|
57
|
-
|
|
58
|
-
response = Native::Response.new(http_response)
|
|
59
|
-
response.should be_connection_closed
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
it "should know when a keep-alive connection has been estalished" do
|
|
63
|
-
http_response = mock('response')
|
|
64
|
-
http_response.stub!(:code).and_return('200')
|
|
65
|
-
http_response.should_receive(:[]).with(Wrest::H::Connection).and_return('')
|
|
66
|
-
|
|
67
|
-
response = Native::Response.new(http_response)
|
|
68
|
-
response.should_not be_connection_closed
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
-
|
|
3
|
-
module Wrest
|
|
4
|
-
describe Native::Session do
|
|
5
|
-
describe 'Construction' do
|
|
6
|
-
it "should accept a string uri and convert it to a Wrest::Uri" do
|
|
7
|
-
uri = "http://localhost:3000"
|
|
8
|
-
Native::Session.new(uri).uri.should == uri.to_uri
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
it "should accept a Wrest::Uri" do
|
|
12
|
-
uri = "http://localhost:3000"
|
|
13
|
-
Native::Session.new(uri.to_uri).uri.should == uri.to_uri
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it "should know how to use the connection provided to make requests" do
|
|
18
|
-
uri = "http://localhost:3000".to_uri
|
|
19
|
-
uri.should_not be_https
|
|
20
|
-
|
|
21
|
-
http = mock(Net::HTTP)
|
|
22
|
-
Net::HTTP.should_receive(:new).with('localhost', 3000).and_return(http)
|
|
23
|
-
http.should_receive(:read_timeout=).with(60)
|
|
24
|
-
|
|
25
|
-
request_one = Net::HTTP::Get.new('/glassware?owner=Kai&type=bottle', {H::Connection=>T::KeepAlive})
|
|
26
|
-
request_two = Net::HTTP::Get.new('/bottles.xml', {H::Connection=>T::KeepAlive})
|
|
27
|
-
|
|
28
|
-
Net::HTTP::Get.should_receive(:new).with('/glassware?owner=Kai&type=bottle', {H::Connection=>T::KeepAlive}).and_return(request_one)
|
|
29
|
-
Net::HTTP::Get.should_receive(:new).with('/bottles.xml', {H::Connection=>T::KeepAlive}).and_return(request_two)
|
|
30
|
-
|
|
31
|
-
ok_response = build_ok_response
|
|
32
|
-
ok_response.should_receive(:[]).with(Native::StandardHeaders::Connection).twice.and_return(Native::StandardTokens::KeepAlive)
|
|
33
|
-
|
|
34
|
-
http.should_receive(:request).with(request_one, nil).and_return(ok_response)
|
|
35
|
-
http.should_receive(:request).with(request_two, nil).and_return(ok_response)
|
|
36
|
-
|
|
37
|
-
Native::Session.new(uri) do |session|
|
|
38
|
-
session.get('/glassware', ActiveSupport::OrderedHash.new.merge!([[:owner, 'Kai'],[:type, 'bottle']]))
|
|
39
|
-
session.get '/bottles.xml'
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it "should destroy the current connection if a response is returned with a Connection: Close" do
|
|
44
|
-
uri = "http://localhost:3000".to_uri
|
|
45
|
-
uri.should_not be_https
|
|
46
|
-
|
|
47
|
-
http = mock(Net::HTTP)
|
|
48
|
-
Net::HTTP.should_receive(:new).with('localhost', 3000).and_return(http)
|
|
49
|
-
http.should_receive(:read_timeout=).with(60)
|
|
50
|
-
|
|
51
|
-
request_one = Net::HTTP::Get.new('/glassware?owner=Kai&type=bottle', {H::Connection=>T::KeepAlive})
|
|
52
|
-
request_two = Net::HTTP::Get.new('/bottles.xml', {H::Connection=>T::KeepAlive})
|
|
53
|
-
|
|
54
|
-
Net::HTTP::Get.should_receive(:new).with('/glassware?owner=Kai&type=bottle', {H::Connection=>T::KeepAlive}).and_return(request_one)
|
|
55
|
-
Net::HTTP::Get.should_receive(:new).with('/bottles.xml', {H::Connection=>T::KeepAlive}).and_return(request_two)
|
|
56
|
-
|
|
57
|
-
ok_response = build_ok_response
|
|
58
|
-
ok_response.should_receive(:[]).with(Native::StandardHeaders::Connection).once.and_return(Native::StandardTokens::KeepAlive)
|
|
59
|
-
|
|
60
|
-
ok_response_with_connection_close = build_ok_response
|
|
61
|
-
ok_response_with_connection_close.should_receive(:[]).with(Native::StandardHeaders::Connection).once.and_return(Native::StandardTokens::Close)
|
|
62
|
-
|
|
63
|
-
http.should_receive(:request).with(request_one, nil).and_return(ok_response)
|
|
64
|
-
http.should_receive(:request).with(request_two, nil).and_return(ok_response_with_connection_close)
|
|
65
|
-
|
|
66
|
-
Native::Session.new(uri) do |session|
|
|
67
|
-
session.get('/glassware', ActiveSupport::OrderedHash.new.merge!([[:owner, 'Kai'],[:type, 'bottle']]))
|
|
68
|
-
session.instance_variable_get('@connection').should == http
|
|
69
|
-
session.get '/bottles.xml'
|
|
70
|
-
session.instance_variable_get('@connection').should be_nil
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
-
|
|
3
|
-
class Glassware < Wrest::Resource::Base
|
|
4
|
-
set_host "http://localhost:3000"
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
class BottledUniverse < Glassware
|
|
8
|
-
set_host "http://localhost:3001"
|
|
9
|
-
set_default_format :xml
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
module Wrest
|
|
13
|
-
describe Wrest::Resource::Base do
|
|
14
|
-
it "should not affect other classes when setting up its macros" do
|
|
15
|
-
Class.should_not respond_to(:host=)
|
|
16
|
-
Object.should_not respond_to(:host=)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it "should not affect itself when subclasses use its macros" do
|
|
20
|
-
Resource::Base.should_not respond_to(:host)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe 'subclasses' do
|
|
24
|
-
before(:each) do
|
|
25
|
-
@BottledUniverse = Class.new(Wrest::Resource::Base)
|
|
26
|
-
@BottledUniverse.class_eval do
|
|
27
|
-
set_resource_name 'BottledUniverse'
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
describe 'equality' do
|
|
32
|
-
it "should be equal if it is the same instance" do
|
|
33
|
-
universe = @BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1)
|
|
34
|
-
(universe == universe).should be_true
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
it "should be equal if it has the same state" do
|
|
38
|
-
(
|
|
39
|
-
@BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1) == @BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1)
|
|
40
|
-
).should be_true
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it "should not be equal to nil" do
|
|
44
|
-
(@BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1) == nil).should be_false
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it "should not be equal if it is not the same class" do
|
|
48
|
-
(
|
|
49
|
-
@BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1) == Glassware.new(:universe_id=>nil, :name=>"Wooz", :id=>1)
|
|
50
|
-
).should be_false
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
it "should not be equal if it is has a different state" do
|
|
54
|
-
(
|
|
55
|
-
@BottledUniverse.new(:universe_id=>3, :name=>"Wooz", :id=>1) == @BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1)
|
|
56
|
-
).should be_false
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
it "should be symmetric" do
|
|
60
|
-
universe_one = @BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1)
|
|
61
|
-
universe_two = @BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1)
|
|
62
|
-
(universe_one == universe_one).should be_true
|
|
63
|
-
(universe_two == universe_two).should be_true
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
it "should be transitive" do
|
|
67
|
-
universe_one = @BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1)
|
|
68
|
-
universe_two = @BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1)
|
|
69
|
-
universe_three = @BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1)
|
|
70
|
-
(universe_one == universe_two).should be_true
|
|
71
|
-
(universe_two == universe_three).should be_true
|
|
72
|
-
(universe_one == universe_three).should be_true
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
it "should ensure that the hashcode is a fixnum" do
|
|
76
|
-
@BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1).hash.should be_kind_of(Fixnum)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
it "should ensure that instances with the same ids have the same hashcode" do
|
|
80
|
-
universe_one = @BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1)
|
|
81
|
-
universe_two = @BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1)
|
|
82
|
-
universe_one.hash.should == universe_two.hash
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
it "should ensure that instances with different ids have the different hashcodes" do
|
|
86
|
-
universe_one = @BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1)
|
|
87
|
-
universe_two = @BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>2)
|
|
88
|
-
universe_one.hash.should_not == universe_two.hash
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
it "should know its name as a resource by default" do
|
|
93
|
-
BottledUniverse.resource_name.should == 'bottled_universe'
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it "should allow its name as a resource to be configured for anonymous classes" do
|
|
97
|
-
@BottledUniverse.resource_name.should == 'bottled_universe'
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
it "should know how to create an instance using deserialised attributes" do
|
|
101
|
-
universe = @BottledUniverse.new "name"=>"Wooz", "id"=>'1', "universe_id"=>nil, 'owner_id'=>nil
|
|
102
|
-
universe.name.should == "Wooz"
|
|
103
|
-
universe.owner_id.should be_nil
|
|
104
|
-
universe.id.should == 1
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
it "should allow instantiation with no attributes" do
|
|
108
|
-
lambda{ @BottledUniverse.new }.should_not raise_error
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
it "should have a method to set the host url" do
|
|
112
|
-
@BottledUniverse.should respond_to(:set_host)
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
it "should have a method to retrive the host url after it is set" do
|
|
116
|
-
@BottledUniverse.class_eval{ set_host "http://localhost:3000" }
|
|
117
|
-
@BottledUniverse.should respond_to(:host)
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
it "should know what its site is" do
|
|
121
|
-
@BottledUniverse.class_eval{ set_host "http://localhost:3000" }
|
|
122
|
-
@BottledUniverse.host.should == "http://localhost:3000"
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
it "should not use the same string" do
|
|
126
|
-
url = "http://localhost:3000"
|
|
127
|
-
@BottledUniverse.class_eval{ set_host url }
|
|
128
|
-
url.upcase!
|
|
129
|
-
@BottledUniverse.host.should == "http://localhost:3000"
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
it "should know its resource collection name" do
|
|
133
|
-
Glassware.resource_collection_name.should == 'glasswares'
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
it "should know its uri template for find one" do
|
|
137
|
-
Glassware.find_one_uri_template.to_uri(
|
|
138
|
-
:host => 'http://localhost:3000',
|
|
139
|
-
:resource_collection_name => 'glasswares',
|
|
140
|
-
:id => 1,
|
|
141
|
-
:format => 'json'
|
|
142
|
-
).should == 'http://localhost:3000/glasswares/1.json'.to_uri
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
it "should know how to serialise itself to xml" do
|
|
146
|
-
BottledUniverse.new(:name => 'Foo').to_xml.should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bottled-universe>\n <name>Foo</name>\n</bottled-universe>\n"
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
describe 'finders' do
|
|
150
|
-
# Json =>
|
|
151
|
-
# body => {"lead_bottle": {"name": "Wooz", "id": 1, "universe_id": null}}
|
|
152
|
-
# hash => {"lead_bottle"=>{"name"=>"Wooz", "id"=>1, "universe_id"=>nil}}
|
|
153
|
-
# Xml =>
|
|
154
|
-
# body =>
|
|
155
|
-
# <?xml version="1.0" encoding="UTF-8"?>
|
|
156
|
-
# <lead-bottle>
|
|
157
|
-
# <id type="integer">1</id>
|
|
158
|
-
# <name>Wooz</name>
|
|
159
|
-
# <universe-id type="integer" nil="true"></universe-id>
|
|
160
|
-
# </lead-bottle>
|
|
161
|
-
# hash =>
|
|
162
|
-
# {"lead-bottle"=>{"name"=>{"__content__"=>"Wooz"}, "universe-id"=>{"type"=>"integer", "nil"=>"true"}, "id"=>{"__content__"=>"1", "type"=>"integer"}}}
|
|
163
|
-
# typecast =>
|
|
164
|
-
# {"lead_bottle"=>{"name"=>"Wooz", "id"=>1, "universe_id"=>nil}}
|
|
165
|
-
it "should know how to find a resource by id" do
|
|
166
|
-
uri = 'http://localhost:3001/bottled_universe/1.xml'.to_uri
|
|
167
|
-
Wrest::Uri.should_receive(:new).with('http://localhost:3001/bottled_universes/1.xml', {}).and_return(uri)
|
|
168
|
-
response = mock(Wrest::Native::Response)
|
|
169
|
-
uri.should_receive(:get).with(no_args).and_return(response)
|
|
170
|
-
response.should_receive(:deserialise).and_return({"bottled-universe"=>{"name"=>{"__content__"=>"Wooz"}, "universe-id"=>{"type"=>"integer", "nil"=>"true"}, "id"=>{"__content__"=>"1", "type"=>"integer"}}})
|
|
171
|
-
|
|
172
|
-
BottledUniverse.find(1).should == BottledUniverse.new(:universe_id=>nil, :name=>"Wooz", :id=>1)
|
|
173
|
-
end
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
describe 'subclasses of sublasses' do
|
|
178
|
-
it "should configure its host without affecting its superclass" do
|
|
179
|
-
Glassware.host.should == "http://localhost:3000"
|
|
180
|
-
BottledUniverse.host.should == "http://localhost:3001"
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
it "should know its resource collection name when it is a subclass of a subclass" do
|
|
184
|
-
BottledUniverse.resource_collection_name.should == 'bottled_universes'
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
it "should know how to create a new resource" do
|
|
189
|
-
uri = mock(Uri)
|
|
190
|
-
mock_http_response = mock(Net::HTTPResponse)
|
|
191
|
-
mock_http_response.stub!(:code).and_return('201')
|
|
192
|
-
mock_http_response.stub!(:content_type).and_return('application/xml')
|
|
193
|
-
mock_http_response.stub!(:body).and_return("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bottled-universe>\n <name>Woot</name>\n <id>1</id>\n </bottled-universe>\n")
|
|
194
|
-
|
|
195
|
-
Uri.should_receive(:new).with("http://localhost:3001/bottled_universes.xml", {}).and_return(uri)
|
|
196
|
-
uri.should_receive(:post).with(
|
|
197
|
-
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bottled-universe>\n <name>Woot</name>\n</bottled-universe>\n",
|
|
198
|
-
'Content-Type' => 'application/xml'
|
|
199
|
-
).and_return(Wrest::Native::Response.new(mock_http_response))
|
|
200
|
-
ware = BottledUniverse.create(:name => 'Woot')
|
|
201
|
-
end
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
describe 'attribute interface' do
|
|
205
|
-
it "should fail when getter methods for attributes that don't exist are invoked" do
|
|
206
|
-
universe = Glassware.new(:owner => 'Kai Wren', :guardian => 'Lung Shan')
|
|
207
|
-
lambda{ universe.ooga }.should raise_error(NoMethodError)
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
it "should provide getter methods for attributes" do
|
|
211
|
-
universe = Glassware.new(:owner => 'Kai Wren', :guardian => 'Lung Shan')
|
|
212
|
-
universe.owner.should == 'Kai Wren'
|
|
213
|
-
universe.guardian.should == 'Lung Shan'
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
it "should respond to getter methods for attributes" do
|
|
217
|
-
universe = Glassware.new(:owner => 'Kai Wren', :guardian => 'Lung Shan')
|
|
218
|
-
universe.should respond_to(:owner)
|
|
219
|
-
universe.should respond_to(:guardian)
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
it "should not respond to getter methods for attributes that don't exist" do
|
|
223
|
-
universe = Glassware.new(:owner => 'Kai Wren', :guardian => 'Lung Shan')
|
|
224
|
-
universe.should_not respond_to(:theronic)
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
it "should create a setter method when one is invoked for attributes that don't exist" do
|
|
228
|
-
universe = Glassware.new(:owner => 'Kai Wren', :guardian => 'Lung Shan')
|
|
229
|
-
universe.fu_dog = 'Shiriki'
|
|
230
|
-
universe.attributes[:fu_dog].should == 'Shiriki'
|
|
231
|
-
universe.fu_dog.should == 'Shiriki'
|
|
232
|
-
end
|
|
233
|
-
|
|
234
|
-
it "should provide setter methods for attributes" do
|
|
235
|
-
universe = Glassware.new(:owner => 'Kai Wren', :guardian => 'Lung Shan')
|
|
236
|
-
universe.guardian = 'Effervescent Tiger'
|
|
237
|
-
universe.attributes[:guardian].should == 'Effervescent Tiger'
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
it "should respond to setter methods for attributes" do
|
|
241
|
-
universe = Glassware.new(:owner => 'Kai Wren', :guardian => 'Lung Shan')
|
|
242
|
-
universe.should respond_to(:owner=)
|
|
243
|
-
universe.should respond_to(:guardian=)
|
|
244
|
-
end
|
|
245
|
-
|
|
246
|
-
it "should not respond to setter methods for attributes that don't exist" do
|
|
247
|
-
universe = Glassware.new(:owner => 'Kai Wren', :guardian => 'Lung Shan')
|
|
248
|
-
universe.should_not respond_to(:theronic=)
|
|
249
|
-
end
|
|
250
|
-
|
|
251
|
-
it "should return false when query methods for attributes that don't exist are invoked" do
|
|
252
|
-
universe = Glassware.new(:owner => 'Kai Wren', :guardian => 'Lung Shan')
|
|
253
|
-
universe.ooga?.should be_false
|
|
254
|
-
end
|
|
255
|
-
|
|
256
|
-
it "should provide query methods for attributes" do
|
|
257
|
-
universe = Glassware.new(:owner => 'Kai Wren', :guardian => nil)
|
|
258
|
-
universe.owner?.should be_true
|
|
259
|
-
universe.guardian?.should be_false
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
it "should respond to query methods for attributes" do
|
|
263
|
-
universe = Glassware.new(:owner => 'Kai Wren', :guardian => 'Lung Shan')
|
|
264
|
-
universe.should respond_to(:owner?)
|
|
265
|
-
universe.should respond_to(:guardian?)
|
|
266
|
-
end
|
|
267
|
-
|
|
268
|
-
it "should not respond to query methods for attributes that don't exist" do
|
|
269
|
-
universe = Glassware.new(:owner => 'Kai Wren', :guardian => 'Lung Shan')
|
|
270
|
-
universe.should_not respond_to(:theronic?)
|
|
271
|
-
end
|
|
272
|
-
end
|
|
273
|
-
end
|
|
274
|
-
end
|