wrest 0.0.8-java → 0.0.9-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/README.rdoc +24 -17
- data/Rakefile +6 -6
- data/VERSION.yml +1 -1
- data/examples/delicious.rb +7 -3
- data/examples/redirection.rb +27 -0
- data/examples/twitter.rb +78 -0
- data/{spec/wrest/http/request_spec.rb → examples/twitter_public_timeline.rb} +15 -12
- data/examples/wow_realm_status.rb +7 -3
- data/lib/wrest/components/attributes_container.rb +23 -5
- data/lib/wrest/components/attributes_container/alias_accessors.rb +66 -0
- data/lib/wrest/components/attributes_container/typecaster.rb +44 -38
- data/lib/wrest/components/mutators/base.rb +1 -1
- data/lib/wrest/components/translators.rb +1 -1
- data/lib/wrest/core_ext/string/conversions.rb +1 -1
- data/lib/wrest/exceptions.rb +14 -2
- data/lib/wrest/http.rb +1 -0
- data/lib/wrest/http/get.rb +2 -0
- data/lib/wrest/http/redirection.rb +35 -0
- data/lib/wrest/http/request.rb +37 -13
- data/lib/wrest/http/response.rb +17 -0
- data/lib/wrest/resource/base.rb +1 -2
- data/lib/wrest/uri.rb +2 -0
- data/lib/wrest/version.rb +1 -1
- data/spec/functional/sample_rails_app/README +3 -0
- data/spec/functional/sample_rails_app/Rakefile +10 -0
- data/spec/functional/sample_rails_app/app/controllers/application_controller.rb +10 -0
- data/spec/functional/sample_rails_app/app/controllers/lead_bottles_controller.rb +7 -0
- data/spec/functional/sample_rails_app/app/helpers/application_helper.rb +3 -0
- data/spec/functional/sample_rails_app/app/models/bottle.rb +3 -0
- data/spec/functional/sample_rails_app/app/models/glass_bottle.rb +3 -0
- data/spec/functional/sample_rails_app/app/models/lead_bottle.rb +3 -0
- data/spec/functional/sample_rails_app/config/boot.rb +110 -0
- data/spec/functional/sample_rails_app/config/database.yml +16 -0
- data/spec/functional/sample_rails_app/config/environment.rb +42 -0
- data/spec/functional/sample_rails_app/config/environments/development.rb +17 -0
- data/spec/functional/sample_rails_app/config/environments/production.rb +28 -0
- data/spec/functional/sample_rails_app/config/environments/test.rb +28 -0
- data/spec/functional/sample_rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/functional/sample_rails_app/config/initializers/inflections.rb +10 -0
- data/spec/functional/sample_rails_app/config/initializers/mime_types.rb +5 -0
- data/spec/functional/sample_rails_app/config/initializers/new_rails_defaults.rb +19 -0
- data/spec/functional/sample_rails_app/config/initializers/session_store.rb +15 -0
- data/spec/functional/sample_rails_app/config/locales/en.yml +5 -0
- data/spec/functional/sample_rails_app/config/routes.rb +3 -0
- data/spec/functional/sample_rails_app/db/development.sqlite3 +0 -0
- data/spec/functional/sample_rails_app/db/migrate/20090319115628_create_bottle.rb +13 -0
- data/spec/functional/sample_rails_app/db/schema.rb +20 -0
- data/spec/functional/sample_rails_app/db/test.sqlite3 +0 -0
- data/spec/functional/sample_rails_app/log/development.log +1 -0
- data/spec/functional/sample_rails_app/public/404.html +30 -0
- data/spec/functional/sample_rails_app/public/422.html +30 -0
- data/spec/functional/sample_rails_app/public/500.html +30 -0
- data/spec/functional/sample_rails_app/public/favicon.ico +0 -0
- data/spec/functional/sample_rails_app/public/images/rails.png +0 -0
- data/spec/functional/sample_rails_app/public/index.html +275 -0
- data/spec/functional/sample_rails_app/public/robots.txt +5 -0
- data/spec/functional/sample_rails_app/script/about +4 -0
- data/spec/functional/sample_rails_app/script/autospec +6 -0
- data/spec/functional/sample_rails_app/script/console +3 -0
- data/spec/functional/sample_rails_app/script/dbconsole +3 -0
- data/spec/functional/sample_rails_app/script/destroy +3 -0
- data/spec/functional/sample_rails_app/script/generate +3 -0
- data/spec/functional/sample_rails_app/script/performance/benchmarker +3 -0
- data/spec/functional/sample_rails_app/script/performance/profiler +3 -0
- data/spec/functional/sample_rails_app/script/plugin +3 -0
- data/spec/functional/sample_rails_app/script/runner +3 -0
- data/spec/functional/sample_rails_app/script/server +3 -0
- data/spec/functional/sample_rails_app/script/spec +10 -0
- data/spec/functional/sample_rails_app/script/spec_server +9 -0
- data/spec/functional/sample_rails_app/test/performance/browsing_test.rb +9 -0
- data/spec/functional/sample_rails_app/test/test_helper.rb +38 -0
- data/spec/functional/sample_rails_app/tmtags +2559 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/MIT-LICENSE +20 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/README.rdoc +100 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/Rakefile +18 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/init.rb +5 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/install.rb +1 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full.rb +14 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/base.rb +140 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/controllers/resources.rb +16 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/controllers/resources_controller.rb +26 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/controllers/routes_controller.rb +16 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/core_extensions/api.rb +26 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/core_extensions/exception.rb +23 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/core_extensions/from_json.rb +15 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/dispatch.rb +235 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/models/resourced_route.rb +84 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/query.rb +337 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/render.rb +63 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/render/html.rb +50 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/render/json.rb +75 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/render/xml.rb +65 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/retrieve.rb +74 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/version.rb +9 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/base_spec.rb +88 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/controllers/resources_spec.rb +29 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/dispatch_spec.rb +262 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/models/resourced_route_spec.rb +62 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/query/parameter_spec.rb +57 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/query_spec.rb +462 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/render/html_spec.rb +4 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/render/json_spec.rb +107 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/render/xml_spec.rb +98 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/render_spec.rb +5 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/retrieve_spec.rb +173 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/spec_helper.rb +98 -0
- data/spec/functional/sample_rails_app/vendor/plugins/resource_full/uninstall.rb +1 -0
- data/spec/functional/spec_helper.rb +0 -0
- data/spec/{spec_helper.rb → unit/spec_helper.rb} +2 -2
- data/spec/unit/wrest/components/attributes_container/alias_accessors_spec.rb +49 -0
- data/spec/{wrest → unit/wrest}/components/attributes_container/typecaster_spec.rb +28 -8
- data/spec/{wrest → unit/wrest}/components/attributes_container_spec.rb +42 -15
- data/spec/{wrest → unit/wrest}/components/mutators/base_spec.rb +1 -1
- data/spec/{wrest → unit/wrest}/components/mutators/camel_to_snake_spec.rb +0 -0
- data/spec/{wrest → unit/wrest}/components/mutators/xml_mini_type_caster_spec.rb +0 -0
- data/spec/{wrest → unit/wrest}/components/mutators/xml_simple_type_caster_spec.rb +0 -0
- data/spec/{wrest → unit/wrest}/components/mutators_spec.rb +0 -0
- data/spec/{wrest → unit/wrest}/components/translators/xml_spec.rb +0 -0
- data/spec/{wrest → unit/wrest}/components/translators_spec.rb +1 -1
- data/spec/{wrest → unit/wrest}/core_ext/hash/conversions_spec.rb +0 -0
- data/spec/{wrest → unit/wrest}/core_ext/string/conversions_spec.rb +14 -0
- data/spec/unit/wrest/http/redirection_spec.rb +42 -0
- data/spec/unit/wrest/http/request_spec.rb +70 -0
- data/spec/unit/wrest/http/response_spec.rb +45 -0
- data/spec/{wrest → unit/wrest}/resource/base_spec.rb +5 -4
- data/spec/{wrest → unit/wrest}/uri_spec.rb +68 -67
- data/spec/{wrest → unit/wrest}/uri_template_spec.rb +0 -0
- metadata +188 -39
- data/lib/wrest/exceptions/method_not_overridden_exception.rb +0 -17
- data/lib/wrest/exceptions/unsupported_content_type_exception.rb +0 -17
- data/spec/wrest/http/response_spec.rb +0 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Uninstall hook code here
|
|
File without changes
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + "
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../lib/wrest")
|
|
2
2
|
require 'spec'
|
|
3
3
|
|
|
4
|
-
[
|
|
4
|
+
['/../custom_matchers/**/*.rb'].each{|directory|
|
|
5
5
|
Dir["#{File.expand_path(File.dirname(__FILE__) + directory)}"].each { |file|
|
|
6
6
|
require file
|
|
7
7
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
|
2
|
+
|
|
3
|
+
module Wrest::Components
|
|
4
|
+
describe AttributesContainer::AliasAccessors do
|
|
5
|
+
before :each do
|
|
6
|
+
@Demon = Class.new
|
|
7
|
+
@Demon.class_eval do
|
|
8
|
+
include Wrest::Components::AttributesContainer
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "should provide a macro to enable aliasing accessors" do
|
|
13
|
+
lambda{ @Demon.class_eval{ alias_accessors :shiriki => :chambala } }.should_not raise_error(NoMethodError)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe 'aliasing' do
|
|
17
|
+
before :each do
|
|
18
|
+
@Demon.class_eval{ alias_accessors :sex => :gender, :age => :maturity }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should provide an accessor methods when we alias to an attribute" do
|
|
22
|
+
demon = @Demon.new
|
|
23
|
+
demon.should respond_to(:gender)
|
|
24
|
+
demon.should respond_to(:gender=)
|
|
25
|
+
demon.should respond_to(:gender?)
|
|
26
|
+
demon.should respond_to(:maturity)
|
|
27
|
+
demon.should respond_to(:maturity=)
|
|
28
|
+
demon.should respond_to(:maturity?)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "should ensure that the aliased getter method delegates to the actual getter" do
|
|
32
|
+
demon = @Demon.new :sex => 'male'
|
|
33
|
+
demon.gender.should == 'male'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "should ensure that the aliased setter method delegates to the actual getter" do
|
|
37
|
+
demon = @Demon.new
|
|
38
|
+
demon.should_receive(:sex=).with('male')
|
|
39
|
+
demon.gender = 'male'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "should ensure that the aliased query method delegates to the actual queryier" do
|
|
43
|
+
demon = @Demon.new :age => '1000'
|
|
44
|
+
demon.gender?.should be_false
|
|
45
|
+
demon.maturity?.should be_true
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -5,8 +5,8 @@ module Wrest::Components
|
|
|
5
5
|
before :each do
|
|
6
6
|
@Demon = Class.new
|
|
7
7
|
@Demon.class_eval do
|
|
8
|
-
include AttributesContainer
|
|
9
|
-
include AttributesContainer::Typecaster
|
|
8
|
+
include Wrest::Components::AttributesContainer
|
|
9
|
+
include Wrest::Components::AttributesContainer::Typecaster
|
|
10
10
|
end
|
|
11
11
|
end
|
|
12
12
|
|
|
@@ -16,10 +16,30 @@ module Wrest::Components
|
|
|
16
16
|
kai_wren.age.should == 1
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
describe "where the value is not a typecastable type" do
|
|
20
|
+
it "string should not typecast" do
|
|
21
|
+
@Demon.class_eval{ typecast :age => lambda{|id_string| id_string.to_i} }
|
|
22
|
+
kai_wren = @Demon.new('age' => :ooga)
|
|
23
|
+
kai_wren.age.should == :ooga
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "hash should not typecast" do
|
|
27
|
+
class TestUser
|
|
28
|
+
include Wrest::Components::AttributesContainer
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
@Demon.class_eval{ typecast :user => lambda{|user| TestUser.new(user)}}
|
|
32
|
+
|
|
33
|
+
kai_wren = @Demon.new('user' => {'foo' => 'bar'})
|
|
34
|
+
kai_wren.user.class.should == TestUser
|
|
35
|
+
kai_wren.user.foo.should == 'bar'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "array should not typecast" do
|
|
39
|
+
@Demon.class_eval{ typecast :addresses => lambda{|addresses| addresses.first} }
|
|
40
|
+
kai_wren = @Demon.new('addresses' => ['foo', 'bar'])
|
|
41
|
+
kai_wren.addresses.should == 'foo'
|
|
42
|
+
end
|
|
23
43
|
end
|
|
24
44
|
|
|
25
45
|
it "should leave nils unchanged" do
|
|
@@ -38,8 +58,8 @@ module Wrest::Components
|
|
|
38
58
|
before :each do
|
|
39
59
|
@Sidhe = Class.new
|
|
40
60
|
@Sidhe.class_eval do
|
|
41
|
-
include AttributesContainer
|
|
42
|
-
include AttributesContainer::Typecaster
|
|
61
|
+
include Wrest::Components::AttributesContainer
|
|
62
|
+
include Wrest::Components::AttributesContainer::Typecaster
|
|
43
63
|
|
|
44
64
|
typecast :age => as_integer
|
|
45
65
|
end
|
|
@@ -12,10 +12,34 @@ require File.dirname(__FILE__) + '/../../spec_helper'
|
|
|
12
12
|
module Wrest::Components
|
|
13
13
|
describe AttributesContainer do
|
|
14
14
|
class HumanBeing
|
|
15
|
-
include AttributesContainer
|
|
15
|
+
include Wrest::Components::AttributesContainer
|
|
16
16
|
always_has :id
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
+
describe "typecasting" do
|
|
20
|
+
before(:each) do
|
|
21
|
+
@Demon = Class.new
|
|
22
|
+
|
|
23
|
+
@Demon.class_eval do
|
|
24
|
+
include Wrest::Components::AttributesContainer
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "should delegate to AttributesContainer::Typecaster#typecast to actually do the typecasting" do
|
|
29
|
+
@Demon.class_eval do
|
|
30
|
+
typecast :foo => lambda{|value| value.to_i}
|
|
31
|
+
end
|
|
32
|
+
@Demon.new(:foo => '1').foo.should == 1
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should provide helpers for common typecasts" do
|
|
36
|
+
@Demon.class_eval do
|
|
37
|
+
typecast :foo => as_integer
|
|
38
|
+
end
|
|
39
|
+
@Demon.new(:foo => '1').foo.should == 1
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
19
43
|
it "should allow instantiation with no attributes" do
|
|
20
44
|
lambda{ HumanBeing.new }.should_not raise_error
|
|
21
45
|
end
|
|
@@ -26,39 +50,41 @@ module Wrest::Components
|
|
|
26
50
|
@Demon = Class.new
|
|
27
51
|
end
|
|
28
52
|
|
|
53
|
+
# Methods are string in 1.8 and symbols in 1.9. We'll use to_sym to
|
|
54
|
+
# allow us to build on both.
|
|
29
55
|
it "should define attribute getters at the class level" do
|
|
30
56
|
kai_wren = @Demon.new
|
|
31
|
-
kai_wren.methods.should_not include(
|
|
57
|
+
kai_wren.methods.map(&:to_sym).should_not include(:trainer)
|
|
32
58
|
|
|
33
59
|
@Demon.class_eval{
|
|
34
|
-
include AttributesContainer
|
|
60
|
+
include Wrest::Components::AttributesContainer
|
|
35
61
|
always_has :trainer
|
|
36
62
|
}
|
|
37
63
|
|
|
38
|
-
kai_wren.methods.should include(
|
|
64
|
+
kai_wren.methods.map(&:to_sym).should include(:trainer)
|
|
39
65
|
end
|
|
40
66
|
|
|
41
67
|
it "should define attribute setters at the class level" do
|
|
42
68
|
kai_wren = @Demon.new
|
|
43
|
-
kai_wren.methods.should_not include(
|
|
69
|
+
kai_wren.methods.map(&:to_sym).should_not include(:trainer=)
|
|
44
70
|
|
|
45
71
|
@Demon.class_eval{
|
|
46
|
-
include AttributesContainer
|
|
72
|
+
include Wrest::Components::AttributesContainer
|
|
47
73
|
always_has :trainer
|
|
48
74
|
}
|
|
49
75
|
|
|
50
|
-
kai_wren.methods.should include(
|
|
76
|
+
kai_wren.methods.map(&:to_sym).should include(:trainer=)
|
|
51
77
|
end
|
|
52
78
|
|
|
53
79
|
it "should define attribute query methods at the class level" do
|
|
54
80
|
kai_wren = @Demon.new
|
|
55
|
-
kai_wren.methods.should_not include(
|
|
81
|
+
kai_wren.methods.map(&:to_sym).should_not include(:trainer?)
|
|
56
82
|
|
|
57
83
|
@Demon.class_eval{
|
|
58
|
-
include AttributesContainer
|
|
84
|
+
include Wrest::Components::AttributesContainer
|
|
59
85
|
always_has :trainer
|
|
60
86
|
}
|
|
61
|
-
kai_wren.methods.should include(
|
|
87
|
+
kai_wren.methods.map(&:to_sym).should include(:trainer?)
|
|
62
88
|
end
|
|
63
89
|
end
|
|
64
90
|
|
|
@@ -66,7 +92,7 @@ module Wrest::Components
|
|
|
66
92
|
before :each do
|
|
67
93
|
@Demon = Class.new
|
|
68
94
|
@Demon.class_eval{
|
|
69
|
-
include AttributesContainer
|
|
95
|
+
include Wrest::Components::AttributesContainer
|
|
70
96
|
always_has :trainer
|
|
71
97
|
|
|
72
98
|
def method_missing(method_name, *args)
|
|
@@ -155,14 +181,15 @@ module Wrest::Components
|
|
|
155
181
|
@li_piao.should_not respond_to(:god=)
|
|
156
182
|
end
|
|
157
183
|
|
|
158
|
-
it "should
|
|
159
|
-
|
|
184
|
+
it "should return false when query methods for attributes that don't exist are invoked" do
|
|
185
|
+
@li_piao.ooga?.should be_false
|
|
160
186
|
end
|
|
161
187
|
|
|
162
188
|
it "should provide query methods for attributes" do
|
|
163
189
|
li_piao = HumanBeing.new( :profession => 'Natural Magician', :enhanced_by => nil)
|
|
164
190
|
li_piao.profession?.should be_true
|
|
165
191
|
li_piao.enhanced_by?.should be_false
|
|
192
|
+
li_piao.gender?.should be_false
|
|
166
193
|
end
|
|
167
194
|
|
|
168
195
|
it "should respond to query methods for attributes" do
|
|
@@ -179,14 +206,14 @@ module Wrest::Components
|
|
|
179
206
|
@li_piao.id = 6
|
|
180
207
|
@li_piao.id.should == 6
|
|
181
208
|
end
|
|
182
|
-
|
|
209
|
+
|
|
183
210
|
it "should provide getter and query methods to instance which has corresponding attribute" do
|
|
184
211
|
zotoh_zhaan = HumanBeing.new(:species => "Delvian")
|
|
185
212
|
zotoh_zhaan.species.should == "Delvian"
|
|
186
213
|
zotoh_zhaan.species?.should be_true
|
|
187
214
|
zotoh_zhaan.species = "Human"
|
|
188
215
|
lambda{@li_piao.species}.should raise_error(NoMethodError)
|
|
189
|
-
|
|
216
|
+
@li_piao.species?.should be_false
|
|
190
217
|
@li_piao.should_not respond_to(:species=)
|
|
191
218
|
@li_piao.methods.grep(/:species=/).should be_empty
|
|
192
219
|
end
|
|
@@ -12,7 +12,7 @@ require File.dirname(__FILE__) + '/../../../spec_helper'
|
|
|
12
12
|
module Wrest::Components
|
|
13
13
|
describe Mutators::Base do
|
|
14
14
|
it "should raise an exception if mutate is invoked without do_mutate being implemented in a subclass" do
|
|
15
|
-
lambda{ Class.new(Mutators::Base).new.mutate([]) }.should raise_error(Wrest::Exceptions::
|
|
15
|
+
lambda{ Class.new(Mutators::Base).new.mutate([]) }.should raise_error(Wrest::Exceptions::MethodNotOverridden)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
it "should ensure that the next mutator is invoked for a subclass" do
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -12,7 +12,7 @@ require File.dirname(__FILE__) + '/../../spec_helper'
|
|
|
12
12
|
module Wrest::Components
|
|
13
13
|
describe Translators do
|
|
14
14
|
it "should know how to raise an exception if the mime type doesn't exist" do
|
|
15
|
-
lambda{ Translators.lookup('weird/unknown')}.should raise_error(Wrest::Exceptions::
|
|
15
|
+
lambda{ Translators.lookup('weird/unknown')}.should raise_error(Wrest::Exceptions::UnsupportedContentType)
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
end
|
|
File without changes
|
|
@@ -22,4 +22,18 @@ describe String, 'conversions' do
|
|
|
22
22
|
uri.username.should == 'ooga'
|
|
23
23
|
uri.password.should == 'booga'
|
|
24
24
|
end
|
|
25
|
+
|
|
26
|
+
it "should strip leading spaces from a uri before building it" do
|
|
27
|
+
' http://localhost:3000'.to_uri.should == Wrest::Uri.new('http://localhost:3000')
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should strip trailing spaces from a uri before building it" do
|
|
31
|
+
'http://localhost:3000 '.to_uri.should == Wrest::Uri.new('http://localhost:3000')
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should levae the original string unchanged after building a uri from it" do
|
|
35
|
+
url = ' http://localhost:3000 '
|
|
36
|
+
url.to_uri.should == Wrest::Uri.new('http://localhost:3000')
|
|
37
|
+
url.should == ' http://localhost:3000 '
|
|
38
|
+
end
|
|
25
39
|
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Wrest::Http::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::Http::Get.new(redirect_uri)
|
|
16
|
+
final_mock_response = mock(Wrest::Http::Response)
|
|
17
|
+
after_redirect_request.should_receive(:invoke).and_return(final_mock_response)
|
|
18
|
+
|
|
19
|
+
Wrest::Http::Get.should_receive(:new).with(redirect_uri, {}, {}, {:username=>nil, :password=>nil}).and_return(after_redirect_request)
|
|
20
|
+
|
|
21
|
+
response = Wrest::Http::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
|
|
@@ -0,0 +1,70 @@
|
|
|
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::Http::Request do
|
|
13
|
+
it "should convert all symbols in header keys to strings" do
|
|
14
|
+
Wrest::Http::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::Http::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::Http::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::Http::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::Http::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
|
+
request = Wrest::Http::Get.new('http://localhost/foo'.to_uri)
|
|
41
|
+
redirect_location = 'http://coathangers.com'
|
|
42
|
+
redirected_request = mock('Request to http://coathangers.com')
|
|
43
|
+
|
|
44
|
+
mock_connection = mock('Http Connection')
|
|
45
|
+
request.stub!(:create_connection).and_return(mock_connection)
|
|
46
|
+
|
|
47
|
+
raw_response = mock(Net::HTTPRedirection)
|
|
48
|
+
raw_response.stub!(:code).and_return('301')
|
|
49
|
+
raw_response.stub!(:message).and_return('')
|
|
50
|
+
raw_response.stub!(:body).and_return('')
|
|
51
|
+
raw_response.stub!(:[]).with('location').and_return(redirect_location)
|
|
52
|
+
|
|
53
|
+
response = Wrest::Http::Redirection.new(raw_response)
|
|
54
|
+
|
|
55
|
+
mock_connection.should_receive(:request).and_return(raw_response)
|
|
56
|
+
|
|
57
|
+
Wrest::Http::Response.should_receive(:new).and_return(response)
|
|
58
|
+
redirected_request.stub!(:get)
|
|
59
|
+
redirect_location.should_receive(:to_uri).with(hash_including(:follow_redirects_count=>1)).and_return(redirected_request)
|
|
60
|
+
|
|
61
|
+
request.invoke
|
|
62
|
+
request.follow_redirects_count.should == 0
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should default the 'follow_redirects' option to false for a Post, Put or Delete" do
|
|
66
|
+
Wrest::Http::Post.new('http://localhost/foo'.to_uri).follow_redirects.should_not be_true
|
|
67
|
+
Wrest::Http::Put.new('http://localhost/foo'.to_uri).follow_redirects.should_not be_true
|
|
68
|
+
Wrest::Http::Delete.new('http://localhost/foo'.to_uri).follow_redirects.should_not be_true
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
|
|
3
|
+
module Wrest
|
|
4
|
+
describe Http::Response do
|
|
5
|
+
it "should build a Redirection instead of a normal response if the code is 3xx" do
|
|
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
|
|
36
|
+
|
|
37
|
+
it "should simply return itself when asked to follow (null object behaviour - see MovedPermanently for more context)" do
|
|
38
|
+
http_response = mock('response')
|
|
39
|
+
http_response.stub!(:code).and_return('422')
|
|
40
|
+
|
|
41
|
+
response = Http::Response.new(http_response)
|
|
42
|
+
response.follow.equal?(response).should be_true
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|