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,107 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "ResourceFull::Render::JSON" , :type => :controller do
|
|
4
|
+
controller_name "resource_full_mock_users"
|
|
5
|
+
|
|
6
|
+
before :each do
|
|
7
|
+
ResourceFullMockUser.delete_all
|
|
8
|
+
ResourceFullMockUsersController.resource_identifier = :id
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
if ([Rails::VERSION::MAJOR, Rails::VERSION::MINOR] <=> [2,1]) >= 0 # if the rails version is 2.1 or greater...
|
|
12
|
+
it "renders the model object" do
|
|
13
|
+
user = ResourceFullMockUser.create!
|
|
14
|
+
get :show, :id => user.id, :format => 'json'
|
|
15
|
+
user.to_json.should == response.body
|
|
16
|
+
hash = Hash.from_json(response.body)
|
|
17
|
+
hash["resource_full_mock_user"].should_not be_nil
|
|
18
|
+
response.code.should == '200'
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "renders the appropriate error message if it can't find the model object" do
|
|
23
|
+
get :show, :id => 1, :format => 'json'
|
|
24
|
+
hash = Hash.from_json(response.body)
|
|
25
|
+
hash["error"]["text"].should == "ActiveRecord::RecordNotFound: not found: 1"
|
|
26
|
+
response.code.should == '404'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "renders all model objects" do
|
|
30
|
+
2.times { ResourceFullMockUser.create! }
|
|
31
|
+
get :index, :format => 'json'
|
|
32
|
+
hash = Hash.from_json(response.body)
|
|
33
|
+
hash.size.should == 2
|
|
34
|
+
response.code.should == '200'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "creates and renders a new model object with an empty body" do
|
|
38
|
+
put :create, :resource_full_mock_user => { 'first_name' => 'brian' }, :format => 'json'
|
|
39
|
+
response.body.should == ResourceFullMockUser.find(:first).to_json
|
|
40
|
+
ResourceFullMockUser.find(:first).first_name.should == 'brian'
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "creates a new model object and returns a status code of 201 (created)" do
|
|
44
|
+
put :create, :resource_full_mock_user => { 'first_name' => 'brian' }, :format => 'json'
|
|
45
|
+
response.code.should == '201'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "creates a new model object and places the location of the new object in the Location header" do
|
|
49
|
+
put :create, :resource_full_mock_user => {}, :format => 'json'
|
|
50
|
+
response.headers['Location'].should == resource_full_mock_user_url(ResourceFullMockUser.find(:first))
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "renders appropriate errors if a model validation fails" do
|
|
54
|
+
ResourceFullMockUser.send :define_method, :validate do
|
|
55
|
+
errors.add :first_name, "can't be blank" if self.first_name.blank?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
put :create, :resource_full_mock_user => {}, :format => 'json'
|
|
59
|
+
hash = Hash.from_json(response.body)
|
|
60
|
+
hash["resource_full_mock_user"]["errors"]["full_messages"][0].should == "First name can't be blank"
|
|
61
|
+
|
|
62
|
+
ResourceFullMockUser.send :remove_method, :validate
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "renders the JSON for a new model object" do
|
|
66
|
+
get :new, :format => 'json'
|
|
67
|
+
response.body.should == ResourceFullMockUser.new.to_json
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
class SomeNonsenseException < Exception; end
|
|
71
|
+
|
|
72
|
+
it "rescues all unhandled exceptions with an JSON response" do
|
|
73
|
+
ResourceFullMockUser.expects(:find).raises SomeNonsenseException, "sparrow farts"
|
|
74
|
+
get :index, :format => 'json'
|
|
75
|
+
hash = Hash.from_json(response.body)
|
|
76
|
+
hash["error"]["text"].should == "SomeNonsenseException: sparrow farts"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "it sends an exception notification email if ExceptionNotifier is enabled and still renders the JSON error response" do
|
|
80
|
+
cleanup = unless defined? ExceptionNotifier
|
|
81
|
+
module ExceptionNotifier; end
|
|
82
|
+
module ExceptionNotifiable; end
|
|
83
|
+
true
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
ResourceFullMockUsersController.send :include, ExceptionNotifiable
|
|
87
|
+
ResourceFullMockUser.expects(:find).raises SomeNonsenseException, "sparrow farts"
|
|
88
|
+
ResourceFullMockUsersController.stubs(:exception_data).returns(nil)
|
|
89
|
+
ResourceFullMockUsersController.any_instance.stubs(:consider_all_requests_local).returns(false)
|
|
90
|
+
ResourceFullMockUsersController.any_instance.stubs(:local_request?).returns(false)
|
|
91
|
+
ExceptionNotifier.expects(:deliver_exception_notification)
|
|
92
|
+
get :index, :format => 'json'
|
|
93
|
+
hash = Hash.from_json(response.body)
|
|
94
|
+
hash["error"]["text"].should == "SomeNonsenseException: sparrow farts"
|
|
95
|
+
|
|
96
|
+
if cleanup
|
|
97
|
+
Object.send :remove_const, :ExceptionNotifier
|
|
98
|
+
Object.send :remove_const, :ExceptionNotifiable
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "retains the generic error 500 when re-rendering unhandled exceptions" do
|
|
103
|
+
ResourceFullMockUser.expects(:find).raises SomeNonsenseException, "sparrow farts"
|
|
104
|
+
get :index, :format => 'json'
|
|
105
|
+
response.code.should == '500'
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "ResourceFull::Render::XML" , :type => :controller do
|
|
4
|
+
controller_name "resource_full_mock_users"
|
|
5
|
+
|
|
6
|
+
before :each do
|
|
7
|
+
ResourceFullMockUser.delete_all
|
|
8
|
+
ResourceFullMockUsersController.resource_identifier = :id
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "renders the model object" do
|
|
12
|
+
user = ResourceFullMockUser.create!
|
|
13
|
+
get :show, :id => user.id, :format => 'xml'
|
|
14
|
+
response.body.should have_tag("resource-full-mock-user")
|
|
15
|
+
response.code.should == '200'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "renders the appropriate error message if it can't find the model object" do
|
|
19
|
+
get :show, :id => 1, :format => 'xml'
|
|
20
|
+
response.body.should have_tag("errors") { with_tag("error", "ActiveRecord::RecordNotFound: not found: 1") }
|
|
21
|
+
response.code.should == '404'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "renders all model objects" do
|
|
25
|
+
2.times { ResourceFullMockUser.create! }
|
|
26
|
+
get :index, :format => 'xml'
|
|
27
|
+
Hash.from_xml(response.body)['resource_full_mock_users'].size.should == 2
|
|
28
|
+
response.code.should == '200'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "creates and renders a new model object with an empty body" do
|
|
32
|
+
put :create, :resource_full_mock_user => { 'first_name' => 'brian' }, :format => 'xml'
|
|
33
|
+
response.body.should == ResourceFullMockUser.find(:first).to_xml
|
|
34
|
+
ResourceFullMockUser.find(:first).first_name.should == 'brian'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "creates a new model object and returns a status code of 201 (created)" do
|
|
38
|
+
put :create, :resource_full_mock_user => { 'first_name' => 'brian' }, :format => 'xml'
|
|
39
|
+
response.code.should == '201'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "creates a new model object and places the location of the new object in the Location header" do
|
|
43
|
+
put :create, :resource_full_mock_user => {}, :format => 'xml'
|
|
44
|
+
response.headers['Location'].should == resource_full_mock_user_url(ResourceFullMockUser.find(:first))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "renders appropriate errors if a model validation fails" do
|
|
48
|
+
ResourceFullMockUser.send :define_method, :validate do
|
|
49
|
+
errors.add :first_name, "can't be blank" if self.first_name.blank?
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
put :create, :resource_full_mock_user => {}, :format => 'xml'
|
|
53
|
+
response.should have_tag("errors") { with_tag("error", "First name can't be blank")}
|
|
54
|
+
|
|
55
|
+
ResourceFullMockUser.send :remove_method, :validate
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "renders the XML for a new model object" do
|
|
59
|
+
get :new, :format => 'xml'
|
|
60
|
+
response.body.should == ResourceFullMockUser.new.to_xml
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
class SomeNonsenseException < Exception; end
|
|
64
|
+
|
|
65
|
+
it "rescues all unhandled exceptions with an XML response" do
|
|
66
|
+
ResourceFullMockUser.expects(:find).raises SomeNonsenseException, "sparrow farts"
|
|
67
|
+
get :index, :format => 'xml'
|
|
68
|
+
response.should have_tag("errors") { with_tag("error", "SomeNonsenseException: sparrow farts") }
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "it sends an exception notification email if ExceptionNotifier is enabled and still renders the XML error response" do
|
|
72
|
+
cleanup = unless defined? ExceptionNotifier
|
|
73
|
+
module ExceptionNotifier; end
|
|
74
|
+
module ExceptionNotifiable; end
|
|
75
|
+
true
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
ResourceFullMockUsersController.send :include, ExceptionNotifiable
|
|
79
|
+
ResourceFullMockUser.expects(:find).raises SomeNonsenseException, "sparrow farts"
|
|
80
|
+
ResourceFullMockUsersController.stubs(:exception_data).returns(nil)
|
|
81
|
+
ResourceFullMockUsersController.any_instance.stubs(:consider_all_requests_local).returns(false)
|
|
82
|
+
ResourceFullMockUsersController.any_instance.stubs(:local_request?).returns(false)
|
|
83
|
+
ExceptionNotifier.expects(:deliver_exception_notification)
|
|
84
|
+
get :index, :format => 'xml'
|
|
85
|
+
response.should have_tag("errors") { with_tag("error", "SomeNonsenseException: sparrow farts") }
|
|
86
|
+
|
|
87
|
+
if cleanup
|
|
88
|
+
Object.send :remove_const, :ExceptionNotifier
|
|
89
|
+
Object.send :remove_const, :ExceptionNotifiable
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "retains the generic error 500 when re-rendering unhandled exceptions" do
|
|
94
|
+
ResourceFullMockUser.expects(:find).raises SomeNonsenseException, "sparrow farts"
|
|
95
|
+
get :index, :format => 'xml'
|
|
96
|
+
response.code.should == '500'
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "ResourceFull::Retrieve", :type => :controller do
|
|
4
|
+
controller_name "resource_full_mock_users"
|
|
5
|
+
|
|
6
|
+
before :each do
|
|
7
|
+
ResourceFullMockUser.delete_all
|
|
8
|
+
ResourceFullMockUsersController.resource_identifier = :id
|
|
9
|
+
ResourceFullMockUsersController.queryable_params = []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "defines custom methods based on the class name" do
|
|
13
|
+
controller.should respond_to(
|
|
14
|
+
:find_resource_full_mock_user,
|
|
15
|
+
:find_all_resource_full_mock_users,
|
|
16
|
+
:update_resource_full_mock_user,
|
|
17
|
+
:destroy_resource_full_mock_user,
|
|
18
|
+
:new_resource_full_mock_user
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "changes the custom methods if the model name is changed" do
|
|
23
|
+
controller.class.exposes ResourceFullMock
|
|
24
|
+
controller.should respond_to(:find_resource_full_mock)
|
|
25
|
+
controller.should_not respond_to(:find_resource_full_mock_user)
|
|
26
|
+
controller.class.exposes ResourceFullMockUser # cleanup
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "finds the requested model object" do
|
|
30
|
+
user = ResourceFullMockUser.create!
|
|
31
|
+
get :show, :id => user.id
|
|
32
|
+
assigns(:resource_full_mock_user).should == user
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
describe "resource_identifier and identified_by" do
|
|
36
|
+
controller_name "resource_full_mock_users"
|
|
37
|
+
|
|
38
|
+
before :each do
|
|
39
|
+
ResourceFullMockUser.delete_all
|
|
40
|
+
ResourceFullMockUsersController.resource_identifier = :id
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def get_should_retrieve_by_first_name
|
|
44
|
+
eustace = ResourceFullMockUser.create! :first_name => "eustace"
|
|
45
|
+
eustace_noise = ResourceFullMockUser.create! :first_name => eustace.id
|
|
46
|
+
get :show, :id => "eustace"
|
|
47
|
+
assigns(:resource_full_mock_user).should == eustace
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def get_should_retrieve_by_id
|
|
51
|
+
jimbo = ResourceFullMockUser.create! :first_name => "jimbo"
|
|
52
|
+
jimbo_noise = ResourceFullMockUser.create! :first_name => jimbo.id
|
|
53
|
+
get :show, :id => jimbo.id
|
|
54
|
+
assigns(:resource_full_mock_user).should == jimbo
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "finds the requested model object using the correct column if the resource_identifier attribute has been overridden" do
|
|
58
|
+
ResourceFullMockUsersController.resource_identifier = :first_name
|
|
59
|
+
get_should_retrieve_by_first_name
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "doesn't find the requested model object if there are none to find" do
|
|
63
|
+
ResourceFullMockUsersController.resource_identifier = :first_name
|
|
64
|
+
get :show, :id => "eustace"
|
|
65
|
+
assigns(:resource_full_mock_user).should be_nil
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "finds the requested model object using the correct column if a block is provided to resource_identifier" do
|
|
69
|
+
ResourceFullMockUsersController.resource_identifier = lambda do |id|
|
|
70
|
+
if id =~ /[0-9]+/
|
|
71
|
+
:id
|
|
72
|
+
else :first_name end
|
|
73
|
+
end
|
|
74
|
+
get_should_retrieve_by_first_name
|
|
75
|
+
get_should_retrieve_by_id
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "finds the requested model object only if the optional block provided to identifed_by is true" do
|
|
79
|
+
ResourceFullMockUsersController.identified_by :first_name, :if => lambda { |id| id =~ /[a-zA-Z]+/ }
|
|
80
|
+
get_should_retrieve_by_first_name
|
|
81
|
+
get_should_retrieve_by_id
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "finds the requested model object unless the optional block provided to identifed_by is true" do
|
|
85
|
+
ResourceFullMockUsersController.identified_by :first_name, :unless => lambda { |id| id =~ /[0-9]+/ }
|
|
86
|
+
get_should_retrieve_by_first_name
|
|
87
|
+
get_should_retrieve_by_id
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it "finds the requested model object unless it requests a fallback to a numeric id" do
|
|
91
|
+
ResourceFullMockUsersController.identified_by :first_name, :unless => :id_numeric
|
|
92
|
+
get_should_retrieve_by_first_name
|
|
93
|
+
get_should_retrieve_by_id
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "updates the requested model object based on the given parameters" do
|
|
98
|
+
user = ResourceFullMockUser.create! :last_name => "threepwood"
|
|
99
|
+
post :update, :id => user.id, :resource_full_mock_user => { :last_name => "guybrush" }
|
|
100
|
+
user.reload.last_name.should == "guybrush"
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it "updates the requested model object using the correct column if the resource_identifier attribute has been overridden" do
|
|
104
|
+
ResourceFullMockUsersController.resource_identifier = :first_name
|
|
105
|
+
user = ResourceFullMockUser.create! :first_name => "guybrush"
|
|
106
|
+
post :update, :id => "guybrush", :resource_full_mock_user => { :last_name => "threepwood" }
|
|
107
|
+
user.reload.last_name.should == "threepwood"
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it "creates a new model object based on the given parameters" do
|
|
111
|
+
put :create, :resource_full_mock_user => { :first_name => "guybrush", :last_name => "threepwood" }
|
|
112
|
+
ResourceFullMockUser.count.should == 1
|
|
113
|
+
ResourceFullMockUser.find(:first).first_name.should == "guybrush"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "creates a new model object appropriately if a creational parameter is queryable but not placed in the model object params, as with a nested route" do
|
|
117
|
+
ResourceFullMockUsersController.queryable_with :first_name
|
|
118
|
+
put :create, :first_name => "guybrush", :resource_full_mock_user => { :last_name => "threepwood" }
|
|
119
|
+
ResourceFullMockUser.count.should == 1
|
|
120
|
+
user = ResourceFullMockUser.find :first
|
|
121
|
+
user.first_name.should == "guybrush"
|
|
122
|
+
user.last_name.should == "threepwood"
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "deletes the requested model object" do
|
|
126
|
+
user = ResourceFullMockUser.create!
|
|
127
|
+
delete :destroy, :id => user.id
|
|
128
|
+
ResourceFullMockUser.exists?(user.id).should be_false
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "deletes the requested model object using the correct column if the resource_identifier attribute has been overridden" do
|
|
132
|
+
ResourceFullMockUsersController.resource_identifier = :first_name
|
|
133
|
+
user = ResourceFullMockUser.create! :first_name => "guybrush"
|
|
134
|
+
delete :destroy, :id => "guybrush"
|
|
135
|
+
ResourceFullMockUser.exists?(user.id).should be_false
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
describe "with pagination" do
|
|
139
|
+
controller_name "resource_full_mock_users"
|
|
140
|
+
|
|
141
|
+
before :each do
|
|
142
|
+
ResourceFullMockUser.delete_all
|
|
143
|
+
@users = (1..6).collect { ResourceFullMockUser.create! }
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
after :all do
|
|
147
|
+
ResourceFullMockUser.delete_all
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
it "limits the query to the correct number of records given that parameter" do
|
|
151
|
+
ResourceFullMockUsersController.queryable_with :limit, :scope => lambda {|limit| { :limit => limit }}
|
|
152
|
+
get :index, :limit => 2
|
|
153
|
+
assigns(:resource_full_mock_users).should == @users[0..1]
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it "offsets the query by the correct number of records" do
|
|
157
|
+
ResourceFullMockUsersController.queryable_with :limit, :scope => lambda {|limit| { :limit => limit }}
|
|
158
|
+
ResourceFullMockUsersController.queryable_with :offset, :scope => lambda {|offset| { :offset => offset }}
|
|
159
|
+
get :index, :offset => 4, :limit => 2
|
|
160
|
+
assigns(:resource_full_mock_users).should == @users[4..5]
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
xit "doesn't attempt to paginate if pagination is disabled" do
|
|
164
|
+
ResourceFullMockUsersController.queryable_with :limit, :scope => lambda {|limit| { :limit => limit }}
|
|
165
|
+
ResourceFullMockUsersController.queryable_with :offset, :scope => lambda {|offset| { :offset => offset }}
|
|
166
|
+
ResourceFullMockUsersController.paginatable = false
|
|
167
|
+
get :index, :offset => 4, :limit => 2
|
|
168
|
+
assigns(:resource_full_mock_users).should == @users
|
|
169
|
+
ResourceFullMockUsersController.paginatable = true # cleanup
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# This file is copied to ~/spec when you run 'ruby script/generate rspec'
|
|
2
|
+
# from the project root directory.
|
|
3
|
+
ENV["RAILS_ENV"] = "test"
|
|
4
|
+
|
|
5
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../../config/environment')
|
|
6
|
+
require 'spec'
|
|
7
|
+
require 'spec/rails'
|
|
8
|
+
require 'resource_full/core_extensions/from_json'
|
|
9
|
+
|
|
10
|
+
Spec::Runner.configure do |config|
|
|
11
|
+
# If you're not using ActiveRecord you should remove these
|
|
12
|
+
# lines, delete config/database.yml and disable :active_record
|
|
13
|
+
# in your config/boot.rb
|
|
14
|
+
config.use_transactional_fixtures = true
|
|
15
|
+
config.use_instantiated_fixtures = false
|
|
16
|
+
config.fixture_path = RAILS_ROOT + '/vendor/plugins/resource_full/spec/fixtures/'
|
|
17
|
+
config.mock_with :mocha
|
|
18
|
+
|
|
19
|
+
config.before(:all) do
|
|
20
|
+
ActiveRecord::Base.connection.create_table "resource_full_mock_addresses", :force => true do |t|
|
|
21
|
+
t.string "street"
|
|
22
|
+
t.string "city"
|
|
23
|
+
t.string "state_code"
|
|
24
|
+
t.integer "zip"
|
|
25
|
+
t.integer "resource_full_mock_user_id"
|
|
26
|
+
t.timestamps
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
ActiveRecord::Base.connection.create_table "resource_full_mock_users", :force => true do |t|
|
|
30
|
+
t.string "first_name"
|
|
31
|
+
t.string "last_name"
|
|
32
|
+
t.date "birthdate"
|
|
33
|
+
t.string "email"
|
|
34
|
+
t.string "join_date"
|
|
35
|
+
t.integer "income"
|
|
36
|
+
t.integer "resource_full_mock_employer_id"
|
|
37
|
+
t.timestamps
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
ActiveRecord::Base.connection.create_table "resource_full_mock_employers", :force => true do |t|
|
|
41
|
+
t.string "name"
|
|
42
|
+
t.string "email"
|
|
43
|
+
t.timestamps
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
ActionController::Routing::Routes.draw do |map|
|
|
49
|
+
map.foo '/foo', :controller => 'resource_full_mocks', :action => 'foo'
|
|
50
|
+
map.resources :resource_full_mocks, :resource_full_sub_mocks, :resource_full_mock_addresses
|
|
51
|
+
map.resources :resource_full_mock_users, :collection => {:count => :get} do |users|
|
|
52
|
+
users.resources :resource_full_mock_addresses
|
|
53
|
+
end
|
|
54
|
+
map.resources :resources, :controller => 'resource_full/controllers/resources' do |resource|
|
|
55
|
+
resource.resources :routes, :controller => 'resource_full/controllers/routes'
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
class ResourceFullMock
|
|
60
|
+
def self.table_name; "mock"; end
|
|
61
|
+
end
|
|
62
|
+
class ResourceFullSubMock < ResourceFullMock; end
|
|
63
|
+
|
|
64
|
+
# TODO Remove these or find a better way to handle ActiveRecord dependencies.
|
|
65
|
+
class ResourceFullMockEmployer < ActiveRecord::Base
|
|
66
|
+
has_many :resource_full_mock_users
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
class ResourceFullMockUser < ActiveRecord::Base
|
|
70
|
+
belongs_to :resource_full_mock_employer
|
|
71
|
+
has_many :resource_full_mock_addresses
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
class ResourceFullMockAddress < ActiveRecord::Base
|
|
75
|
+
belongs_to :resource_full_mock_user
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
class ResourceFullMocksController < ResourceFull::Base
|
|
79
|
+
# dispatch_spec custom methods spec, approx. line 98
|
|
80
|
+
def foo
|
|
81
|
+
render :xml => { :foo => "bar" }.to_xml
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
class ResourceFullSubMocksController < ResourceFullMocksController; end
|
|
85
|
+
class ResourceFullMockUsersController < ResourceFull::Base; end
|
|
86
|
+
class ResourceFullMockAddressesController < ResourceFull::Base; end
|
|
87
|
+
|
|
88
|
+
ActionController::Routing.use_controllers! %w{
|
|
89
|
+
resource_full_mock_users
|
|
90
|
+
resource_full_mock_addresses
|
|
91
|
+
resource_full_mocks
|
|
92
|
+
resource_full_sub_mocks
|
|
93
|
+
resource_full/controllers/routes
|
|
94
|
+
resource_full/controllers/resources
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
def putsh(stuff); puts ERB::Util.h(stuff) + "<br/>"; end
|
|
98
|
+
def ph(stuff); puts ERB::Util.h(stuff.inspect) + "<br/>"; end
|