wrest 0.0.9-java → 0.1.0-java
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 +34 -0
- data/README.rdoc +16 -10
- data/Rakefile +362 -124
- 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 +168 -0
- metadata +60 -164
- 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
|