wrest 1.0.0.beta1 → 1.0.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|