wrest 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +34 -0
- data/README.rdoc +16 -10
- data/Rakefile +361 -123
- data/VERSION.yml +2 -2
- data/examples/delicious.rb +17 -7
- data/examples/facebook.rb +101 -0
- data/examples/keep_alive.rb +37 -0
- data/examples/twitter.rb +3 -3
- data/examples/twitter_public_timeline.rb +11 -4
- data/examples/wow_realm_status.rb +8 -2
- data/{spec/functional/sample_rails_app/public/favicon.ico → init.rb} +0 -0
- data/lib/wrest/components/{attributes_container → container}/alias_accessors.rb +4 -4
- data/lib/wrest/components/{attributes_container → container}/typecaster.rb +1 -1
- data/lib/wrest/components/{attributes_container.rb → container.rb} +46 -16
- data/lib/wrest/components/mutators.rb +4 -4
- data/lib/wrest/components/translators/json.rb +2 -2
- data/lib/wrest/components/translators/xml.rb +3 -2
- data/lib/wrest/components/translators.rb +3 -3
- data/lib/wrest/components.rb +3 -3
- data/lib/wrest/core_ext/hash.rb +1 -1
- data/lib/wrest/core_ext/string.rb +1 -1
- data/lib/wrest/curl/delete.rb +23 -0
- data/lib/wrest/curl/get.rb +23 -0
- data/lib/wrest/curl/options.rb +16 -0
- data/lib/wrest/curl/post.rb +23 -0
- data/lib/wrest/curl/put.rb +23 -0
- data/lib/wrest/curl/request.rb +95 -0
- data/lib/wrest/curl/response.rb +63 -0
- data/lib/wrest/curl/session.rb +57 -0
- data/lib/wrest/curl.rb +49 -0
- data/lib/wrest/exceptions.rb +16 -1
- data/lib/wrest/http_shared/headers.rb +350 -0
- data/lib/wrest/http_shared/standard_headers.rb +21 -0
- data/lib/wrest/http_shared/standard_tokens.rb +18 -0
- data/lib/wrest/http_shared.rb +24 -0
- data/lib/wrest/native/connection_factory.rb +23 -0
- data/lib/wrest/{http → native}/delete.rb +1 -1
- data/lib/wrest/{http → native}/get.rb +1 -1
- data/lib/wrest/{http → native}/options.rb +1 -1
- data/lib/wrest/{http → native}/post.rb +1 -1
- data/lib/wrest/{http → native}/put.rb +1 -1
- data/lib/wrest/{http → native}/redirection.rb +4 -1
- data/lib/wrest/{http → native}/request.rb +32 -20
- data/lib/wrest/{http → native}/response.rb +12 -4
- data/lib/wrest/native/session.rb +57 -0
- data/lib/wrest/native.rb +32 -0
- data/lib/wrest/resource/base.rb +1 -1
- data/lib/wrest/resource.rb +1 -1
- data/lib/wrest/test/request_patches.rb +5 -0
- data/lib/wrest/test.rb +1 -0
- data/lib/wrest/uri.rb +31 -3
- data/lib/wrest/version.rb +2 -2
- data/lib/wrest.rb +52 -16
- data/spec/unit/spec_helper.rb +12 -3
- data/spec/unit/wrest/components/attributes_container/alias_accessors_spec.rb +2 -2
- data/spec/unit/wrest/components/attributes_container/typecaster_spec.rb +6 -6
- data/spec/unit/wrest/components/attributes_container_spec.rb +44 -12
- data/spec/unit/wrest/components/translators/xml_spec.rb +7 -3
- data/spec/unit/wrest/curl/request_spec.rb +19 -0
- data/spec/unit/wrest/curl/response_spec.rb +16 -0
- data/spec/unit/wrest/http/response_spec.rb +17 -38
- data/spec/unit/wrest/{http → native}/redirection_spec.rb +5 -5
- data/spec/unit/wrest/{http → native}/request_spec.rb +15 -14
- data/spec/unit/wrest/native/response_spec.rb +72 -0
- data/spec/unit/wrest/native/session_spec.rb +74 -0
- data/spec/unit/wrest/resource/base_spec.rb +2 -2
- data/spec/unit/wrest/uri_spec.rb +51 -11
- data/wrest.gemspec +164 -0
- metadata +51 -165
- data/lib/wrest/http.rb +0 -25
- data/spec/functional/sample_rails_app/README +0 -3
- data/spec/functional/sample_rails_app/Rakefile +0 -10
- data/spec/functional/sample_rails_app/app/controllers/application_controller.rb +0 -10
- data/spec/functional/sample_rails_app/app/controllers/lead_bottles_controller.rb +0 -7
- data/spec/functional/sample_rails_app/app/helpers/application_helper.rb +0 -3
- data/spec/functional/sample_rails_app/app/models/bottle.rb +0 -3
- data/spec/functional/sample_rails_app/app/models/glass_bottle.rb +0 -3
- data/spec/functional/sample_rails_app/app/models/lead_bottle.rb +0 -3
- data/spec/functional/sample_rails_app/config/boot.rb +0 -110
- data/spec/functional/sample_rails_app/config/database.yml +0 -16
- data/spec/functional/sample_rails_app/config/environment.rb +0 -42
- data/spec/functional/sample_rails_app/config/environments/development.rb +0 -17
- data/spec/functional/sample_rails_app/config/environments/production.rb +0 -28
- data/spec/functional/sample_rails_app/config/environments/test.rb +0 -28
- data/spec/functional/sample_rails_app/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/functional/sample_rails_app/config/initializers/inflections.rb +0 -10
- data/spec/functional/sample_rails_app/config/initializers/mime_types.rb +0 -5
- data/spec/functional/sample_rails_app/config/initializers/new_rails_defaults.rb +0 -19
- data/spec/functional/sample_rails_app/config/initializers/session_store.rb +0 -15
- data/spec/functional/sample_rails_app/config/locales/en.yml +0 -5
- data/spec/functional/sample_rails_app/config/routes.rb +0 -3
- data/spec/functional/sample_rails_app/db/development.sqlite3 +0 -0
- data/spec/functional/sample_rails_app/db/migrate/20090319115628_create_bottle.rb +0 -13
- data/spec/functional/sample_rails_app/db/schema.rb +0 -20
- data/spec/functional/sample_rails_app/db/test.sqlite3 +0 -0
- data/spec/functional/sample_rails_app/log/development.log +0 -1
- data/spec/functional/sample_rails_app/public/404.html +0 -30
- data/spec/functional/sample_rails_app/public/422.html +0 -30
- data/spec/functional/sample_rails_app/public/500.html +0 -30
- data/spec/functional/sample_rails_app/public/images/rails.png +0 -0
- data/spec/functional/sample_rails_app/public/index.html +0 -275
- data/spec/functional/sample_rails_app/public/robots.txt +0 -5
- data/spec/functional/sample_rails_app/script/about +0 -4
- data/spec/functional/sample_rails_app/script/autospec +0 -6
- data/spec/functional/sample_rails_app/script/console +0 -3
- data/spec/functional/sample_rails_app/script/dbconsole +0 -3
- data/spec/functional/sample_rails_app/script/destroy +0 -3
- data/spec/functional/sample_rails_app/script/generate +0 -3
- data/spec/functional/sample_rails_app/script/performance/benchmarker +0 -3
- data/spec/functional/sample_rails_app/script/performance/profiler +0 -3
- data/spec/functional/sample_rails_app/script/plugin +0 -3
- data/spec/functional/sample_rails_app/script/runner +0 -3
- data/spec/functional/sample_rails_app/script/server +0 -3
- data/spec/functional/sample_rails_app/script/spec +0 -10
- data/spec/functional/sample_rails_app/script/spec_server +0 -9
- data/spec/functional/sample_rails_app/test/performance/browsing_test.rb +0 -9
- data/spec/functional/sample_rails_app/test/test_helper.rb +0 -38
- data/spec/functional/sample_rails_app/tmtags +0 -2559
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/MIT-LICENSE +0 -20
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/README.rdoc +0 -100
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/Rakefile +0 -18
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/init.rb +0 -5
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/install.rb +0 -1
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/base.rb +0 -140
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/controllers/resources.rb +0 -16
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/controllers/resources_controller.rb +0 -26
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/controllers/routes_controller.rb +0 -16
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/core_extensions/api.rb +0 -26
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/core_extensions/exception.rb +0 -23
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/core_extensions/from_json.rb +0 -15
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/dispatch.rb +0 -235
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/models/resourced_route.rb +0 -84
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/query.rb +0 -337
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/render/html.rb +0 -50
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/render/json.rb +0 -75
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/render/xml.rb +0 -65
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/render.rb +0 -63
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/retrieve.rb +0 -74
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/version.rb +0 -9
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full.rb +0 -14
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/base_spec.rb +0 -88
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/controllers/resources_spec.rb +0 -29
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/dispatch_spec.rb +0 -262
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/models/resourced_route_spec.rb +0 -62
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/query/parameter_spec.rb +0 -57
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/query_spec.rb +0 -462
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/render/html_spec.rb +0 -4
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/render/json_spec.rb +0 -107
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/render/xml_spec.rb +0 -98
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/render_spec.rb +0 -5
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/retrieve_spec.rb +0 -173
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/spec_helper.rb +0 -98
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/uninstall.rb +0 -1
- data/spec/functional/spec_helper.rb +0 -0
@@ -10,18 +10,54 @@
|
|
10
10
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
11
11
|
|
12
12
|
module Wrest::Components
|
13
|
-
describe
|
13
|
+
describe Container do
|
14
14
|
class HumanBeing
|
15
|
-
include Wrest::Components::
|
15
|
+
include Wrest::Components::Container
|
16
16
|
always_has :id
|
17
17
|
end
|
18
18
|
|
19
|
+
class WaterMagician < HumanBeing
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should allow instantiation with no attributes" do
|
23
|
+
lambda{ HumanBeing.new }.should_not raise_error
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'serialisation' do
|
27
|
+
it "should know its xml element name" do
|
28
|
+
HumanBeing.element_name.should == 'human_being'
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should know how to serialise itself given any of the Wrest::Components::Translators" do
|
32
|
+
result = HumanBeing.new(:age => "70", :name => 'Li Piao').serialise_using(Wrest::Components::Translators::Json)
|
33
|
+
expectedPermutationOne = "{\"age\":\"70\",\"name\":\"Li Piao\"}"
|
34
|
+
expectedPermutationTwo = "{\"name\":\"Li Piao\",\"age\":\"70\"}"
|
35
|
+
|
36
|
+
(result == expectedPermutationOne || result == expectedPermutationTwo).should be_true
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should have a to_xml helper that ensures that the name of the class is the root of the serilised form" do
|
40
|
+
result = HumanBeing.new(:age => "70", :name => 'Li Piao').to_xml
|
41
|
+
expectedPermutationOne = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<human-being>\n <age>70</age>\n <name>Li Piao</name>\n</human-being>\n"
|
42
|
+
expectedPermutationTwo = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<human-being>\n <name>Li Piao</name>\n <age>70</age>\n</human-being>\n"
|
43
|
+
|
44
|
+
(result == expectedPermutationOne || result == expectedPermutationTwo).should be_true
|
45
|
+
end
|
46
|
+
|
47
|
+
describe 'subclasses' do
|
48
|
+
it "should not allow cached element name to clash" do
|
49
|
+
WaterMagician.element_name.should == 'water_magician'
|
50
|
+
HumanBeing.element_name.should == 'human_being'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
19
55
|
describe "typecasting" do
|
20
56
|
before(:each) do
|
21
57
|
@Demon = Class.new
|
22
58
|
|
23
59
|
@Demon.class_eval do
|
24
|
-
include Wrest::Components::
|
60
|
+
include Wrest::Components::Container
|
25
61
|
end
|
26
62
|
end
|
27
63
|
|
@@ -31,7 +67,7 @@ module Wrest::Components
|
|
31
67
|
end
|
32
68
|
@Demon.new(:foo => '1').foo.should == 1
|
33
69
|
end
|
34
|
-
|
70
|
+
|
35
71
|
it "should provide helpers for common typecasts" do
|
36
72
|
@Demon.class_eval do
|
37
73
|
typecast :foo => as_integer
|
@@ -40,10 +76,6 @@ module Wrest::Components
|
|
40
76
|
end
|
41
77
|
end
|
42
78
|
|
43
|
-
it "should allow instantiation with no attributes" do
|
44
|
-
lambda{ HumanBeing.new }.should_not raise_error
|
45
|
-
end
|
46
|
-
|
47
79
|
describe 'always_has' do
|
48
80
|
describe 'method creation' do
|
49
81
|
before :each do
|
@@ -57,7 +89,7 @@ module Wrest::Components
|
|
57
89
|
kai_wren.methods.map(&:to_sym).should_not include(:trainer)
|
58
90
|
|
59
91
|
@Demon.class_eval{
|
60
|
-
include Wrest::Components::
|
92
|
+
include Wrest::Components::Container
|
61
93
|
always_has :trainer
|
62
94
|
}
|
63
95
|
|
@@ -69,7 +101,7 @@ module Wrest::Components
|
|
69
101
|
kai_wren.methods.map(&:to_sym).should_not include(:trainer=)
|
70
102
|
|
71
103
|
@Demon.class_eval{
|
72
|
-
include Wrest::Components::
|
104
|
+
include Wrest::Components::Container
|
73
105
|
always_has :trainer
|
74
106
|
}
|
75
107
|
|
@@ -81,7 +113,7 @@ module Wrest::Components
|
|
81
113
|
kai_wren.methods.map(&:to_sym).should_not include(:trainer?)
|
82
114
|
|
83
115
|
@Demon.class_eval{
|
84
|
-
include Wrest::Components::
|
116
|
+
include Wrest::Components::Container
|
85
117
|
always_has :trainer
|
86
118
|
}
|
87
119
|
kai_wren.methods.map(&:to_sym).should include(:trainer?)
|
@@ -92,7 +124,7 @@ module Wrest::Components
|
|
92
124
|
before :each do
|
93
125
|
@Demon = Class.new
|
94
126
|
@Demon.class_eval{
|
95
|
-
include Wrest::Components::
|
127
|
+
include Wrest::Components::Container
|
96
128
|
always_has :trainer
|
97
129
|
|
98
130
|
def method_missing(method_name, *args)
|
@@ -1,12 +1,16 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
2
|
|
3
3
|
module Wrest::Components::Translators
|
4
|
-
describe Xml do
|
4
|
+
describe Xml do
|
5
5
|
it "should know how to convert xml to a hashmap" do
|
6
6
|
http_response = mock('Http Reponse')
|
7
7
|
http_response.should_receive(:body).and_return("<ooga><age>12</age></ooga>")
|
8
8
|
|
9
|
-
Xml.deserialise(http_response).should == {"ooga"=>{"age"=>
|
9
|
+
Xml.deserialise(http_response).should == {"ooga"=>{"age"=> "12"}}
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should know how to convert a hashmap to xml" do
|
13
|
+
Xml.serialise({"ooga"=>{"age" => "12"}}).should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<hash>\n <ooga>\n <age>12</age>\n </ooga>\n</hash>\n"
|
10
14
|
end
|
11
15
|
end
|
12
|
-
end
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
unless RUBY_PLATFORM =~ /java/
|
4
|
+
module Wrest
|
5
|
+
describe Curl::Request do
|
6
|
+
before :all do
|
7
|
+
Wrest.use_curl
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should raise an exception if an options is invoked" do
|
11
|
+
lambda{ 'http://localhost:3000/bottles'.to_uri.options }.should raise_error(Wrest::Exceptions::UnsupportedHttpVerb)
|
12
|
+
end
|
13
|
+
|
14
|
+
after :all do
|
15
|
+
Wrest.use_native
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
unless RUBY_PLATFORM =~ /java/
|
4
|
+
module Wrest
|
5
|
+
describe Curl::Response do
|
6
|
+
describe 'Headers' do
|
7
|
+
it "should know how to retrieve content type irrespective of the casing" do
|
8
|
+
http_response = mock('Patron::Response')
|
9
|
+
http_response.stub!(:headers).and_return({'Content-type' => 'text/xml;charset=utf-8'})
|
10
|
+
response = Wrest::Curl::Response.new(http_response)
|
11
|
+
response.content_type.should == 'text/xml'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,45 +1,24 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
module Wrest
|
4
|
-
|
5
|
-
|
6
|
-
http_response = mock(Net::HTTPRedirection)
|
7
|
-
http_response.stub!(:code).and_return('301')
|
8
|
-
|
9
|
-
Http::Response.new(http_response).class.should == Wrest::Http::Redirection
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should build a normal Response for non 3xx codes" do
|
13
|
-
http_response = mock(Net::HTTPResponse)
|
14
|
-
http_response.stub!(:code).and_return('200')
|
15
|
-
|
16
|
-
Http::Response.new(http_response).class.should == Wrest::Http::Response
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should know how to delegate to a translator" do
|
20
|
-
http_response = mock('response')
|
21
|
-
http_response.stub!(:code).and_return('200')
|
22
|
-
Components::Translators::Xml.should_receive(:deserialise).with(http_response)
|
23
|
-
Http::Response.new(http_response).deserialise_using(Components::Translators::Xml)
|
24
|
-
end
|
25
|
-
|
26
|
-
it "should know how to load a translator based on content type" do
|
27
|
-
http_response = mock('response')
|
28
|
-
http_response.stub!(:code).and_return('422')
|
29
|
-
http_response.should_receive(:content_type).and_return('application/xml')
|
30
|
-
|
31
|
-
response = Http::Response.new(http_response)
|
32
|
-
response.should_receive(:deserialise_using).with(Components::Translators::Xml)
|
33
|
-
|
34
|
-
response.deserialise
|
35
|
-
end
|
4
|
+
libraries = [Wrest::Native]
|
5
|
+
libraries << Wrest::Curl unless RUBY_PLATFORM =~ /java/
|
36
6
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
7
|
+
libraries.each do |library|
|
8
|
+
describe "For #{library}" do
|
9
|
+
describe 'Response' do
|
10
|
+
describe 'Headers' do
|
11
|
+
it "should know how to retrieve content type irrespective of the casing" do
|
12
|
+
http_response = mock('Response')
|
13
|
+
http_response.stub!(:headers).and_return({'Content-type' => 'application/xml'})
|
14
|
+
http_response.stub!(:code).and_return('200')
|
15
|
+
http_response.stub!(:content_type).and_return('application/xml')
|
16
|
+
|
17
|
+
response = library::Response.new(http_response)
|
18
|
+
response.content_type.should == 'application/xml'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
43
22
|
end
|
44
23
|
end
|
45
24
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
|
-
describe Wrest::
|
3
|
+
describe Wrest::Native::Redirection do
|
4
4
|
|
5
5
|
it "should make a request to the url in its location header and return the response" do
|
6
6
|
mock_net_http_response = mock(Net::HTTPRedirection)
|
@@ -12,13 +12,13 @@ describe Wrest::Http::Redirection do
|
|
12
12
|
Wrest::Uri.should_receive(:new).with(redirect_url, anything).and_return(redirect_uri)
|
13
13
|
|
14
14
|
|
15
|
-
after_redirect_request = Wrest::
|
16
|
-
final_mock_response = mock(Wrest::
|
15
|
+
after_redirect_request = Wrest::Native::Get.new(redirect_uri)
|
16
|
+
final_mock_response = mock(Wrest::Native::Response)
|
17
17
|
after_redirect_request.should_receive(:invoke).and_return(final_mock_response)
|
18
18
|
|
19
|
-
Wrest::
|
19
|
+
Wrest::Native::Get.should_receive(:new).with(redirect_uri, {}, {}, {:username=>nil, :password=>nil}).and_return(after_redirect_request)
|
20
20
|
|
21
|
-
response = Wrest::
|
21
|
+
response = Wrest::Native::Redirection.new(mock_net_http_response)
|
22
22
|
response.follow(:follow_redirects_count => 0, :follow_redirects_limit => 5).should == final_mock_response
|
23
23
|
end
|
24
24
|
|
@@ -9,9 +9,9 @@
|
|
9
9
|
|
10
10
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
11
11
|
|
12
|
-
describe Wrest::
|
12
|
+
describe Wrest::Native::Request do
|
13
13
|
it "should convert all symbols in header keys to strings" do
|
14
|
-
Wrest::
|
14
|
+
Wrest::Native::Request.new(
|
15
15
|
'http://localhost/foo'.to_uri, Net::HTTP::Get, {},
|
16
16
|
nil, 'Content-Type' => 'application/xml', :per_page => '10'
|
17
17
|
).headers.should == {
|
@@ -21,28 +21,29 @@ describe Wrest::Http::Request do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should default the 'follow_redirects' option to true for a Get" do
|
24
|
-
Wrest::
|
24
|
+
Wrest::Native::Get.new('http://localhost/foo'.to_uri).follow_redirects.should be_true
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should default the 'follow_redirects_count' option to 0" do
|
28
|
-
Wrest::
|
28
|
+
Wrest::Native::Get.new('http://localhost/foo'.to_uri).follow_redirects_count.should == 0
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should default the 'follow_redirects_limit' option to 5" do
|
32
|
-
Wrest::
|
32
|
+
Wrest::Native::Get.new('http://localhost/foo'.to_uri).follow_redirects_limit.should == 5
|
33
33
|
end
|
34
34
|
|
35
35
|
it "should allow Gets to disable redirect follows" do
|
36
|
-
Wrest::
|
36
|
+
Wrest::Native::Get.new('http://localhost/foo'.to_uri, {}, {}, {:follow_redirects => false}).follow_redirects.should be_false
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should increment the follow_redirects_count for every redirect leving the count unaffected in previous requests" do
|
40
|
-
|
40
|
+
uri = 'http://localhost/foo'.to_uri
|
41
|
+
request = Wrest::Native::Get.new(uri)
|
41
42
|
redirect_location = 'http://coathangers.com'
|
42
43
|
redirected_request = mock('Request to http://coathangers.com')
|
43
44
|
|
44
45
|
mock_connection = mock('Http Connection')
|
45
|
-
|
46
|
+
uri.stub!(:create_connection).and_return(mock_connection)
|
46
47
|
|
47
48
|
raw_response = mock(Net::HTTPRedirection)
|
48
49
|
raw_response.stub!(:code).and_return('301')
|
@@ -50,11 +51,11 @@ describe Wrest::Http::Request do
|
|
50
51
|
raw_response.stub!(:body).and_return('')
|
51
52
|
raw_response.stub!(:[]).with('location').and_return(redirect_location)
|
52
53
|
|
53
|
-
response = Wrest::
|
54
|
+
response = Wrest::Native::Redirection.new(raw_response)
|
54
55
|
|
55
56
|
mock_connection.should_receive(:request).and_return(raw_response)
|
56
57
|
|
57
|
-
Wrest::
|
58
|
+
Wrest::Native::Response.should_receive(:new).and_return(response)
|
58
59
|
redirected_request.stub!(:get)
|
59
60
|
redirect_location.should_receive(:to_uri).with(hash_including(:follow_redirects_count=>1)).and_return(redirected_request)
|
60
61
|
|
@@ -63,8 +64,8 @@ describe Wrest::Http::Request do
|
|
63
64
|
end
|
64
65
|
|
65
66
|
it "should default the 'follow_redirects' option to false for a Post, Put or Delete" do
|
66
|
-
Wrest::
|
67
|
-
Wrest::
|
68
|
-
Wrest::
|
69
|
-
end
|
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
|
70
71
|
end
|
@@ -0,0 +1,72 @@
|
|
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
|
@@ -0,0 +1,74 @@
|
|
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', :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', :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
|
@@ -165,7 +165,7 @@ module Wrest
|
|
165
165
|
it "should know how to find a resource by id" do
|
166
166
|
uri = 'http://localhost:3001/bottled_universe/1.xml'.to_uri
|
167
167
|
Wrest::Uri.should_receive(:new).with('http://localhost:3001/bottled_universes/1.xml', {}).and_return(uri)
|
168
|
-
response = mock(Wrest::
|
168
|
+
response = mock(Wrest::Native::Response)
|
169
169
|
uri.should_receive(:get).with(no_args).and_return(response)
|
170
170
|
response.should_receive(:deserialise).and_return({"bottled-universe"=>{"name"=>{"__content__"=>"Wooz"}, "universe-id"=>{"type"=>"integer", "nil"=>"true"}, "id"=>{"__content__"=>"1", "type"=>"integer"}}})
|
171
171
|
|
@@ -196,7 +196,7 @@ module Wrest
|
|
196
196
|
uri.should_receive(:post).with(
|
197
197
|
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<bottled-universe>\n <name>Woot</name>\n</bottled-universe>\n",
|
198
198
|
'Content-Type' => 'application/xml'
|
199
|
-
).and_return(Wrest::
|
199
|
+
).and_return(Wrest::Native::Response.new(mock_http_response))
|
200
200
|
ware = BottledUniverse.create(:name => 'Woot')
|
201
201
|
end
|
202
202
|
end
|
data/spec/unit/wrest/uri_spec.rb
CHANGED
@@ -11,14 +11,6 @@ require File.dirname(__FILE__) + '/../spec_helper'
|
|
11
11
|
|
12
12
|
module Wrest
|
13
13
|
describe Wrest::Uri do
|
14
|
-
def build_ok_response(body = '')
|
15
|
-
returning mock(Net::HTTPOK) do |response|
|
16
|
-
response.stub!(:code).and_return('200')
|
17
|
-
response.stub!(:message).and_return('OK')
|
18
|
-
response.stub!(:body).and_return(body)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
14
|
it "should respond to the four http actions" do
|
23
15
|
uri = Uri.new('http://localhost')
|
24
16
|
uri.should respond_to(:get)
|
@@ -38,7 +30,7 @@ module Wrest
|
|
38
30
|
it "should know how to build a new uri from an existing one by appending a path" do
|
39
31
|
Uri.new('http://localhost:3000')['/ooga/booga'].should == Uri.new('http://localhost:3000/ooga/booga')
|
40
32
|
end
|
41
|
-
|
33
|
+
|
42
34
|
it "should know its full path" do
|
43
35
|
Uri.new('http://localhost:3000/ooga').full_path.should == '/ooga'
|
44
36
|
Uri.new('http://localhost:3000/ooga?foo=meh&bar=1').full_path.should == '/ooga?foo=meh&bar=1'
|
@@ -47,12 +39,12 @@ module Wrest
|
|
47
39
|
it "should know its host" do
|
48
40
|
Uri.new('http://localhost:3000/ooga').host.should == 'localhost'
|
49
41
|
end
|
50
|
-
|
42
|
+
|
51
43
|
it "should know its port" do
|
52
44
|
Uri.new('http://localhost:3000/ooga').port.should == 3000
|
53
45
|
Uri.new('http://localhost/ooga').port.should == 80
|
54
46
|
end
|
55
|
-
|
47
|
+
|
56
48
|
it "should include the username and password while building a new uri if no options are provided" do
|
57
49
|
Uri.new(
|
58
50
|
'http://localhost:3000',
|
@@ -73,6 +65,13 @@ module Wrest
|
|
73
65
|
extended_uri.password.should == 'baz'
|
74
66
|
end
|
75
67
|
|
68
|
+
it "should know how to produce its uri as a string" do
|
69
|
+
Uri.new('http://localhost:3000').uri_string.should == 'http://localhost:3000'
|
70
|
+
Uri.new('http://localhost:3000').to_s.should == 'http://localhost:3000'
|
71
|
+
Uri.new('http://localhost:3000', :username => 'foo', :password => 'bar').to_s.should == 'http://localhost:3000'
|
72
|
+
Uri.new('http://foo:bar@localhost:3000').to_s.should == 'http://foo:bar@localhost:3000'
|
73
|
+
end
|
74
|
+
|
76
75
|
describe 'Equals' do
|
77
76
|
it "should understand equality" do
|
78
77
|
Uri.new('https://localhost:3000/ooga').should_not == nil
|
@@ -105,6 +104,29 @@ module Wrest
|
|
105
104
|
end
|
106
105
|
end
|
107
106
|
|
107
|
+
describe 'Cloning' do
|
108
|
+
before :each do
|
109
|
+
@original = Uri.new('http://localhost:3000/ooga')
|
110
|
+
@clone = @original.clone
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should be equal to its clone" do
|
114
|
+
@original.should == @clone
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should not be the same object as the clone" do
|
118
|
+
@original.should_not be_equal(@clone)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should allow options to be changed when building the clone" do
|
122
|
+
clone = @original.clone(:username => 'kaiwren', :password => 'bottle')
|
123
|
+
@original.should_not == clone
|
124
|
+
clone.username.should == 'kaiwren'
|
125
|
+
clone.password.should == 'bottle'
|
126
|
+
@original.username.should be_nil
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
108
130
|
describe 'HTTP actions' do
|
109
131
|
def setup_http
|
110
132
|
returning mock(Net::HTTP) do |http|
|
@@ -168,6 +190,24 @@ module Wrest
|
|
168
190
|
|
169
191
|
uri.post '<ooga>Booga</ooga>', :page => '2', :per_page => '5'
|
170
192
|
end
|
193
|
+
|
194
|
+
it "should know how to post form-encoded parameters using Uri#post_form" do
|
195
|
+
uri = "http://localhost:3000/glassware".to_uri
|
196
|
+
uri.should_not be_https
|
197
|
+
|
198
|
+
http = setup_http
|
199
|
+
|
200
|
+
request = Net::HTTP::Post.new('/glassware', {'page' => '2', 'per_page' => '5'})
|
201
|
+
Net::HTTP::Post.should_receive(:new).with('/glassware',
|
202
|
+
'page' => '2', 'per_page' => '5', H::ContentType=>T::FormEncoded
|
203
|
+
).and_return(request)
|
204
|
+
|
205
|
+
http.should_receive(:request).with(request, "foo=bar&ooga=booga").and_return(build_ok_response)
|
206
|
+
params = ActiveSupport::OrderedHash.new
|
207
|
+
params[:ooga] = 'booga'
|
208
|
+
params[:foo] = 'bar'
|
209
|
+
uri.post_form(params, :page => '2', :per_page => '5')
|
210
|
+
end
|
171
211
|
|
172
212
|
it "should know how to put" do
|
173
213
|
uri = "http://localhost:3000/glassware".to_uri
|