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.
Files changed (131) hide show
  1. data/README.rdoc +24 -17
  2. data/Rakefile +6 -6
  3. data/VERSION.yml +1 -1
  4. data/examples/delicious.rb +7 -3
  5. data/examples/redirection.rb +27 -0
  6. data/examples/twitter.rb +78 -0
  7. data/{spec/wrest/http/request_spec.rb → examples/twitter_public_timeline.rb} +15 -12
  8. data/examples/wow_realm_status.rb +7 -3
  9. data/lib/wrest/components/attributes_container.rb +23 -5
  10. data/lib/wrest/components/attributes_container/alias_accessors.rb +66 -0
  11. data/lib/wrest/components/attributes_container/typecaster.rb +44 -38
  12. data/lib/wrest/components/mutators/base.rb +1 -1
  13. data/lib/wrest/components/translators.rb +1 -1
  14. data/lib/wrest/core_ext/string/conversions.rb +1 -1
  15. data/lib/wrest/exceptions.rb +14 -2
  16. data/lib/wrest/http.rb +1 -0
  17. data/lib/wrest/http/get.rb +2 -0
  18. data/lib/wrest/http/redirection.rb +35 -0
  19. data/lib/wrest/http/request.rb +37 -13
  20. data/lib/wrest/http/response.rb +17 -0
  21. data/lib/wrest/resource/base.rb +1 -2
  22. data/lib/wrest/uri.rb +2 -0
  23. data/lib/wrest/version.rb +1 -1
  24. data/spec/functional/sample_rails_app/README +3 -0
  25. data/spec/functional/sample_rails_app/Rakefile +10 -0
  26. data/spec/functional/sample_rails_app/app/controllers/application_controller.rb +10 -0
  27. data/spec/functional/sample_rails_app/app/controllers/lead_bottles_controller.rb +7 -0
  28. data/spec/functional/sample_rails_app/app/helpers/application_helper.rb +3 -0
  29. data/spec/functional/sample_rails_app/app/models/bottle.rb +3 -0
  30. data/spec/functional/sample_rails_app/app/models/glass_bottle.rb +3 -0
  31. data/spec/functional/sample_rails_app/app/models/lead_bottle.rb +3 -0
  32. data/spec/functional/sample_rails_app/config/boot.rb +110 -0
  33. data/spec/functional/sample_rails_app/config/database.yml +16 -0
  34. data/spec/functional/sample_rails_app/config/environment.rb +42 -0
  35. data/spec/functional/sample_rails_app/config/environments/development.rb +17 -0
  36. data/spec/functional/sample_rails_app/config/environments/production.rb +28 -0
  37. data/spec/functional/sample_rails_app/config/environments/test.rb +28 -0
  38. data/spec/functional/sample_rails_app/config/initializers/backtrace_silencers.rb +7 -0
  39. data/spec/functional/sample_rails_app/config/initializers/inflections.rb +10 -0
  40. data/spec/functional/sample_rails_app/config/initializers/mime_types.rb +5 -0
  41. data/spec/functional/sample_rails_app/config/initializers/new_rails_defaults.rb +19 -0
  42. data/spec/functional/sample_rails_app/config/initializers/session_store.rb +15 -0
  43. data/spec/functional/sample_rails_app/config/locales/en.yml +5 -0
  44. data/spec/functional/sample_rails_app/config/routes.rb +3 -0
  45. data/spec/functional/sample_rails_app/db/development.sqlite3 +0 -0
  46. data/spec/functional/sample_rails_app/db/migrate/20090319115628_create_bottle.rb +13 -0
  47. data/spec/functional/sample_rails_app/db/schema.rb +20 -0
  48. data/spec/functional/sample_rails_app/db/test.sqlite3 +0 -0
  49. data/spec/functional/sample_rails_app/log/development.log +1 -0
  50. data/spec/functional/sample_rails_app/public/404.html +30 -0
  51. data/spec/functional/sample_rails_app/public/422.html +30 -0
  52. data/spec/functional/sample_rails_app/public/500.html +30 -0
  53. data/spec/functional/sample_rails_app/public/favicon.ico +0 -0
  54. data/spec/functional/sample_rails_app/public/images/rails.png +0 -0
  55. data/spec/functional/sample_rails_app/public/index.html +275 -0
  56. data/spec/functional/sample_rails_app/public/robots.txt +5 -0
  57. data/spec/functional/sample_rails_app/script/about +4 -0
  58. data/spec/functional/sample_rails_app/script/autospec +6 -0
  59. data/spec/functional/sample_rails_app/script/console +3 -0
  60. data/spec/functional/sample_rails_app/script/dbconsole +3 -0
  61. data/spec/functional/sample_rails_app/script/destroy +3 -0
  62. data/spec/functional/sample_rails_app/script/generate +3 -0
  63. data/spec/functional/sample_rails_app/script/performance/benchmarker +3 -0
  64. data/spec/functional/sample_rails_app/script/performance/profiler +3 -0
  65. data/spec/functional/sample_rails_app/script/plugin +3 -0
  66. data/spec/functional/sample_rails_app/script/runner +3 -0
  67. data/spec/functional/sample_rails_app/script/server +3 -0
  68. data/spec/functional/sample_rails_app/script/spec +10 -0
  69. data/spec/functional/sample_rails_app/script/spec_server +9 -0
  70. data/spec/functional/sample_rails_app/test/performance/browsing_test.rb +9 -0
  71. data/spec/functional/sample_rails_app/test/test_helper.rb +38 -0
  72. data/spec/functional/sample_rails_app/tmtags +2559 -0
  73. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/MIT-LICENSE +20 -0
  74. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/README.rdoc +100 -0
  75. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/Rakefile +18 -0
  76. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/init.rb +5 -0
  77. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/install.rb +1 -0
  78. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full.rb +14 -0
  79. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/base.rb +140 -0
  80. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/controllers/resources.rb +16 -0
  81. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/controllers/resources_controller.rb +26 -0
  82. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/controllers/routes_controller.rb +16 -0
  83. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/core_extensions/api.rb +26 -0
  84. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/core_extensions/exception.rb +23 -0
  85. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/core_extensions/from_json.rb +15 -0
  86. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/dispatch.rb +235 -0
  87. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/models/resourced_route.rb +84 -0
  88. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/query.rb +337 -0
  89. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/render.rb +63 -0
  90. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/render/html.rb +50 -0
  91. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/render/json.rb +75 -0
  92. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/render/xml.rb +65 -0
  93. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/retrieve.rb +74 -0
  94. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/lib/resource_full/version.rb +9 -0
  95. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/base_spec.rb +88 -0
  96. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/controllers/resources_spec.rb +29 -0
  97. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/dispatch_spec.rb +262 -0
  98. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/models/resourced_route_spec.rb +62 -0
  99. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/query/parameter_spec.rb +57 -0
  100. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/query_spec.rb +462 -0
  101. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/render/html_spec.rb +4 -0
  102. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/render/json_spec.rb +107 -0
  103. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/render/xml_spec.rb +98 -0
  104. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/render_spec.rb +5 -0
  105. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/resource_full/retrieve_spec.rb +173 -0
  106. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/spec/spec_helper.rb +98 -0
  107. data/spec/functional/sample_rails_app/vendor/plugins/resource_full/uninstall.rb +1 -0
  108. data/spec/functional/spec_helper.rb +0 -0
  109. data/spec/{spec_helper.rb → unit/spec_helper.rb} +2 -2
  110. data/spec/unit/wrest/components/attributes_container/alias_accessors_spec.rb +49 -0
  111. data/spec/{wrest → unit/wrest}/components/attributes_container/typecaster_spec.rb +28 -8
  112. data/spec/{wrest → unit/wrest}/components/attributes_container_spec.rb +42 -15
  113. data/spec/{wrest → unit/wrest}/components/mutators/base_spec.rb +1 -1
  114. data/spec/{wrest → unit/wrest}/components/mutators/camel_to_snake_spec.rb +0 -0
  115. data/spec/{wrest → unit/wrest}/components/mutators/xml_mini_type_caster_spec.rb +0 -0
  116. data/spec/{wrest → unit/wrest}/components/mutators/xml_simple_type_caster_spec.rb +0 -0
  117. data/spec/{wrest → unit/wrest}/components/mutators_spec.rb +0 -0
  118. data/spec/{wrest → unit/wrest}/components/translators/xml_spec.rb +0 -0
  119. data/spec/{wrest → unit/wrest}/components/translators_spec.rb +1 -1
  120. data/spec/{wrest → unit/wrest}/core_ext/hash/conversions_spec.rb +0 -0
  121. data/spec/{wrest → unit/wrest}/core_ext/string/conversions_spec.rb +14 -0
  122. data/spec/unit/wrest/http/redirection_spec.rb +42 -0
  123. data/spec/unit/wrest/http/request_spec.rb +70 -0
  124. data/spec/unit/wrest/http/response_spec.rb +45 -0
  125. data/spec/{wrest → unit/wrest}/resource/base_spec.rb +5 -4
  126. data/spec/{wrest → unit/wrest}/uri_spec.rb +68 -67
  127. data/spec/{wrest → unit/wrest}/uri_template_spec.rb +0 -0
  128. metadata +188 -39
  129. data/lib/wrest/exceptions/method_not_overridden_exception.rb +0 -17
  130. data/lib/wrest/exceptions/unsupported_content_type_exception.rb +0 -17
  131. data/spec/wrest/http/response_spec.rb +0 -21
@@ -0,0 +1,4 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe "ResourceFull::Render::HTML" , :type => :controller do
4
+ end
@@ -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,5 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "ResourceFull::Render", :type => :controller do
4
+ end
5
+
@@ -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