rc_rails 2.1.0
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/.gitignore +7 -0
- data/CHANGELOG +355 -0
- data/Gemfile +5 -0
- data/Gemfile.lock.development +117 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +71 -0
- data/Rakefile +33 -0
- data/Todo.txt +1 -0
- data/lib/rc_rails.rb +9 -0
- data/lib/resources_controller/actions.rb +147 -0
- data/lib/resources_controller/active_record/saved.rb +15 -0
- data/lib/resources_controller/helper.rb +123 -0
- data/lib/resources_controller/include_actions.rb +37 -0
- data/lib/resources_controller/named_route_helper.rb +154 -0
- data/lib/resources_controller/railtie.rb +14 -0
- data/lib/resources_controller/request_path_introspection.rb +83 -0
- data/lib/resources_controller/resource_methods.rb +32 -0
- data/lib/resources_controller/singleton_actions.rb +21 -0
- data/lib/resources_controller/specification.rb +119 -0
- data/lib/resources_controller/version.rb +3 -0
- data/lib/resources_controller.rb +849 -0
- data/resources_controller.gemspec +29 -0
- data/spec/app/database.yml +5 -0
- data/spec/app/views/accounts/show.html.erb +0 -0
- data/spec/app/views/addresses/edit.html.erb +0 -0
- data/spec/app/views/addresses/index.html.erb +0 -0
- data/spec/app/views/addresses/new.html.erb +0 -0
- data/spec/app/views/addresses/show.html.erb +0 -0
- data/spec/app/views/admin/forums/create.html.erb +0 -0
- data/spec/app/views/admin/forums/destroy.html.erb +0 -0
- data/spec/app/views/admin/forums/edit.html.erb +0 -0
- data/spec/app/views/admin/forums/index.html.erb +0 -0
- data/spec/app/views/admin/forums/new.html.erb +0 -0
- data/spec/app/views/admin/forums/show.html.erb +0 -0
- data/spec/app/views/admin/forums/update.html.erb +0 -0
- data/spec/app/views/comments/edit.html.erb +0 -0
- data/spec/app/views/comments/index.html.erb +0 -0
- data/spec/app/views/comments/new.html.erb +0 -0
- data/spec/app/views/comments/show.html.erb +0 -0
- data/spec/app/views/forum_posts/edit.html.erb +0 -0
- data/spec/app/views/forum_posts/index.html.erb +0 -0
- data/spec/app/views/forum_posts/new.html.erb +0 -0
- data/spec/app/views/forum_posts/show.html.erb +0 -0
- data/spec/app/views/forums/create.html.erb +0 -0
- data/spec/app/views/forums/destroy.html.erb +0 -0
- data/spec/app/views/forums/edit.html.erb +0 -0
- data/spec/app/views/forums/index.html.erb +0 -0
- data/spec/app/views/forums/new.html.erb +0 -0
- data/spec/app/views/forums/show.html.erb +0 -0
- data/spec/app/views/forums/update.html.erb +0 -0
- data/spec/app/views/infos/edit.html.erb +0 -0
- data/spec/app/views/infos/show.html.erb +0 -0
- data/spec/app/views/interests/index.html.erb +0 -0
- data/spec/app/views/interests/show.html.erb +0 -0
- data/spec/app/views/owners/edit.html.erb +0 -0
- data/spec/app/views/owners/new.html.erb +0 -0
- data/spec/app/views/owners/show.html.erb +0 -0
- data/spec/app/views/tags/index.html.erb +0 -0
- data/spec/app/views/tags/new.html.erb +0 -0
- data/spec/app/views/tags/show.html.erb +0 -0
- data/spec/app/views/users/edit.html.erb +0 -0
- data/spec/app/views/users/index.html.erb +0 -0
- data/spec/app/views/users/show.html.erb +0 -0
- data/spec/app.rb +315 -0
- data/spec/controllers/accounts_controller_spec.rb +77 -0
- data/spec/controllers/addresses_controller_spec.rb +346 -0
- data/spec/controllers/admin_forums_controller_spec.rb +638 -0
- data/spec/controllers/comments_controller_spec.rb +380 -0
- data/spec/controllers/comments_controller_with_models_spec.rb +202 -0
- data/spec/controllers/forum_posts_controller_spec.rb +426 -0
- data/spec/controllers/forums_controller_spec.rb +694 -0
- data/spec/controllers/infos_controller_spec.rb +71 -0
- data/spec/controllers/interests_controller_via_forum_spec.rb +80 -0
- data/spec/controllers/interests_controller_via_user_spec.rb +114 -0
- data/spec/controllers/owners_controller_spec.rb +277 -0
- data/spec/controllers/resource_saved_spec.rb +47 -0
- data/spec/controllers/resource_service_in_forums_controller_spec.rb +37 -0
- data/spec/controllers/resource_service_in_infos_controller_spec.rb +36 -0
- data/spec/controllers/resource_service_in_interests_controller_via_forum_spec.rb +51 -0
- data/spec/controllers/tags_controller_spec.rb +83 -0
- data/spec/controllers/tags_controller_via_account_info_spec.rb +131 -0
- data/spec/controllers/tags_controller_via_forum_post_comment_spec.rb +144 -0
- data/spec/controllers/tags_controller_via_forum_post_spec.rb +133 -0
- data/spec/controllers/tags_controller_via_forum_spec.rb +173 -0
- data/spec/controllers/tags_controller_via_user_address_spec.rb +130 -0
- data/spec/controllers/users_controller_spec.rb +248 -0
- data/spec/lib/action_view_helper_spec.rb +143 -0
- data/spec/lib/bug_0001_spec.rb +22 -0
- data/spec/lib/include_actions_spec.rb +35 -0
- data/spec/lib/load_enclosing_resources_spec.rb +245 -0
- data/spec/lib/request_path_introspection_spec.rb +130 -0
- data/spec/lib/resource_methods_spec.rb +204 -0
- data/spec/lib/resources_controller_spec.rb +57 -0
- data/spec/models/comment_saved_spec.rb +24 -0
- data/spec/rspec_generator_task.rb +105 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/verify_rcov.rb +52 -0
- metadata +193 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Bug0001Spec
|
|
4
|
+
class Thing < ActiveRecord::Base
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
class MyController < ActionController::Base
|
|
8
|
+
def respond_to_with_cruft?(method)
|
|
9
|
+
respond_to_without_cruft?(method)
|
|
10
|
+
end
|
|
11
|
+
alias_method_chain :respond_to?, :cruft
|
|
12
|
+
|
|
13
|
+
resources_controller_for :things, :class => Thing
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe "Calling respond_to? when it has an old signature buried in there [#1]" do
|
|
17
|
+
it "should work just fine" do
|
|
18
|
+
c = MyController.new
|
|
19
|
+
c.respond_to?(:foo).should == false
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module IncludeActionsSpec
|
|
4
|
+
module Actions
|
|
5
|
+
def foo; end
|
|
6
|
+
def bar; end
|
|
7
|
+
def faz; end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class ActionsController < ActionController::Base
|
|
11
|
+
include_actions Actions
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class OnlyFooController < ActionController::Base
|
|
15
|
+
include_actions Actions, :only => :foo
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class ExceptFooBarController < ActionController::Base
|
|
19
|
+
include_actions Actions, :except => [:foo, :bar]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe "Include actions use case" do
|
|
23
|
+
it "ActionController should have actions from actions module" do
|
|
24
|
+
ActionsController.action_methods.should == ['foo', 'bar', 'faz'].to_set
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "OnlyFooController should have only :foo from actions module" do
|
|
28
|
+
OnlyFooController.action_methods.should == ['foo'].to_set
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "ExceptFooBarController should not have :foo, :bar from actions module" do
|
|
32
|
+
ExceptFooBarController.action_methods.should == ['faz'].to_set
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module LoadEnclosingResourcesSpecHelper
|
|
4
|
+
def setup_tags_controller(options = {})
|
|
5
|
+
@klass = Class.new(ActionController::Base)
|
|
6
|
+
@klass.stub!(:anonymous?).and_return(false)
|
|
7
|
+
@klass.resources_controller_for :tags, options
|
|
8
|
+
@klass.stub!(:name).and_return 'ATestController'
|
|
9
|
+
setup_common
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def setup_common
|
|
13
|
+
@controller = @klass.new
|
|
14
|
+
@controller.stub!(:request_path).and_return('')
|
|
15
|
+
# stub :load_enclosing_resource_from_specification, increase enclosing_resources by one, and return a mock resource
|
|
16
|
+
@controller.stub!(:load_enclosing_resource_from_specification).and_return do |name, _|
|
|
17
|
+
mock("resource: #{name}").tap do |resource|
|
|
18
|
+
@controller.enclosing_resources << resource
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe "#load_enclosing_resources for resources_controller_for :tags (when nesting_segments is [{:segment => 'users', :singleton => false}])" do
|
|
25
|
+
include LoadEnclosingResourcesSpecHelper
|
|
26
|
+
|
|
27
|
+
before do
|
|
28
|
+
setup_tags_controller
|
|
29
|
+
@controller.stub!(:nesting_segments).and_return [{:segment => 'users', :singleton => false}]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "should call load_wildcard once" do
|
|
33
|
+
@controller.should_receive(:load_wildcard).once
|
|
34
|
+
@controller.send(:load_enclosing_resources)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should call Specification.new('user', :singleton => false, :as => nil)" do
|
|
38
|
+
ResourcesController::Specification.should_receive(:new).with('user', :singleton => false, :as => nil)
|
|
39
|
+
@controller.send(:load_enclosing_resources)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe "#load_enclosing_resources for resources_controller_for :tags, with :account mapping (when nesting_segments is [{:segment => 'account', :singleton => true}])" do
|
|
44
|
+
include LoadEnclosingResourcesSpecHelper
|
|
45
|
+
|
|
46
|
+
before do
|
|
47
|
+
setup_tags_controller
|
|
48
|
+
@klass.map_resource :account, :singleton => true, :class => User
|
|
49
|
+
@account_spec = @controller.resource_specification_map['account']
|
|
50
|
+
@controller.stub!(:nesting_segments).and_return [{:segment => 'account', :singleton => true}]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "should call load_wildcard once" do
|
|
54
|
+
@controller.should_receive(:load_wildcard).once
|
|
55
|
+
@controller.send(:load_enclosing_resources)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "should call load_enclosing_resource_from_specification with account specification" do
|
|
59
|
+
@controller.should_receive(:load_enclosing_resource_from_specification).with(@account_spec)
|
|
60
|
+
@controller.send(:load_enclosing_resources)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "should not call Specification.new" do
|
|
64
|
+
ResourcesController::Specification.should_not_receive(:new)
|
|
65
|
+
@controller.send(:load_enclosing_resources)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
describe "#load_enclosing_resources for resources_controller_for :tags (when nesting_segments is [{:segment =>'users', :singleton => false}, {:segment =>'forums', :singleton => false}])" do
|
|
70
|
+
include LoadEnclosingResourcesSpecHelper
|
|
71
|
+
|
|
72
|
+
before do
|
|
73
|
+
setup_tags_controller
|
|
74
|
+
@controller.stub!(:nesting_segments).and_return [{:segment =>'users', :singleton => false}, {:segment => 'forums', :singleton => false}]
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "should call load_wildcard twice" do
|
|
78
|
+
@controller.should_receive(:load_wildcard).twice
|
|
79
|
+
@controller.send(:load_enclosing_resources)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "should call Specification.new with ('user', :singleton => false, :as => nil), then ('forum', :singleton => false, :as => nil)" do
|
|
83
|
+
ResourcesController::Specification.should_receive(:new).with('user', :singleton => false, :as => nil).ordered
|
|
84
|
+
ResourcesController::Specification.should_receive(:new).with('forum', :singleton => false, :as => nil).ordered
|
|
85
|
+
@controller.send(:load_enclosing_resources)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
describe "#load_enclosing_resources for resources_controller_for :tags, :in => ['*', :comment] (when nesting_segments is [{:segment => 'comments', :singleton => false}])" do
|
|
90
|
+
include LoadEnclosingResourcesSpecHelper
|
|
91
|
+
|
|
92
|
+
before do
|
|
93
|
+
setup_tags_controller :in => ['*', :comment]
|
|
94
|
+
@controller.stub!(:nesting_segments).and_return [{:segment => 'comments', :singleton => false}]
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "should not call load_wildcard" do
|
|
98
|
+
@controller.should_not_receive(:load_wildcard)
|
|
99
|
+
@controller.send(:load_enclosing_resources)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "should not call Specification.new" do
|
|
103
|
+
ResourcesController::Specification.should_not_receive(:new)
|
|
104
|
+
@controller.send(:load_enclosing_resources)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
describe "#load_enclosing_resources for resources_controller_for :tags, :in => ['*', :comment] (when nesting_segments is [{:segment => 'users', :singleton => false}, {:segment => 'forums', :singleton => false}, {:segment =>'comments', :singleton => false}])" do
|
|
109
|
+
include LoadEnclosingResourcesSpecHelper
|
|
110
|
+
|
|
111
|
+
before do
|
|
112
|
+
setup_tags_controller :in => ['*', :comment]
|
|
113
|
+
@controller.stub!(:nesting_segments).and_return [{:segment => 'users', :singleton => false}, {:segment => 'forums', :singleton => false}, {:segment =>'comments', :singleton => false}]
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "should call load_wildcard twice" do
|
|
117
|
+
@controller.should_receive(:load_wildcard).twice
|
|
118
|
+
@controller.send(:load_enclosing_resources)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "should call Specification.new with ('user', :singleton => false, :as => nil), then ('forum', :singleton => false, :as => nil)" do
|
|
122
|
+
ResourcesController::Specification.should_receive(:new).with('user', :singleton => false, :as => nil).ordered
|
|
123
|
+
ResourcesController::Specification.should_receive(:new).with('forum', :singleton => false, :as => nil).ordered
|
|
124
|
+
@controller.send(:load_enclosing_resources)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
describe "#load_enclosing_resources for resources_controller_for :tags, :in => ['*', '?commentable', :comment] (when nesting_segments is [{:segment => 'users', :singleton => false}, {:segment => 'comments', :singleton => false}])" do
|
|
129
|
+
include LoadEnclosingResourcesSpecHelper
|
|
130
|
+
|
|
131
|
+
before do
|
|
132
|
+
setup_tags_controller :in => ['*', '?commentable', :comment]
|
|
133
|
+
@controller.stub!(:nesting_segments).and_return [{:segment => 'users', :singleton => false}, {:segment => 'comments', :singleton => false}]
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it "should call load_wildcard once with 'commentable'" do
|
|
137
|
+
@controller.should_receive(:load_wildcard).with('commentable').once
|
|
138
|
+
@controller.send(:load_enclosing_resources)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it "should call Specification.new with ('user', :singleton => false, :as => 'commentable')" do
|
|
142
|
+
ResourcesController::Specification.should_receive(:new).with('user', :singleton => false, :as => 'commentable').ordered
|
|
143
|
+
@controller.send(:load_enclosing_resources)
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
describe "#load_enclosing_resources for resources_controller_for :tags, :in => ['*', '?commentable', :comment] (when nesting_segments is [{:segment => 'users', :singleton => false}, {:segment => 'forums', :singleton => false}, {:segment => 'comments', :singleton => false}])" do
|
|
148
|
+
include LoadEnclosingResourcesSpecHelper
|
|
149
|
+
|
|
150
|
+
before do
|
|
151
|
+
setup_tags_controller :in => ['*', '?commentable', :comment]
|
|
152
|
+
@controller.stub!(:nesting_segments).and_return [{:segment => 'users', :singleton => false}, {:segment => 'forums', :singleton => false}, {:segment => 'comments', :singleton => false}]
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it "should call load_wildcard twice" do
|
|
156
|
+
@controller.should_receive(:load_wildcard).with().once.ordered
|
|
157
|
+
@controller.should_receive(:load_wildcard).with('commentable').once.ordered
|
|
158
|
+
@controller.send(:load_enclosing_resources)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
it "should call Specification.new with ('user', :singleton => false, :as => nil), ('forum', :singleton => false, :as => 'commentable')" do
|
|
162
|
+
ResourcesController::Specification.should_receive(:new).with('user', :singleton => false, :as => nil).once.ordered
|
|
163
|
+
ResourcesController::Specification.should_receive(:new).with('forum', :singleton => false, :as => 'commentable').once.ordered
|
|
164
|
+
@controller.send(:load_enclosing_resources)
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
describe "#load_enclosing_resources for resources_controller_for :tags, :in => ['*', '?commentable', :comment] (when nesting_segments is [{:segment => 'users', :singleton => false}, {:segment => 'forums', :singleton => false}, {:segment => 'posts', :singleton => false}, {:segment => 'comments', :singleton => false}])" do
|
|
169
|
+
include LoadEnclosingResourcesSpecHelper
|
|
170
|
+
|
|
171
|
+
before do
|
|
172
|
+
setup_tags_controller :in => ['*', '?commentable', :comment]
|
|
173
|
+
@controller.stub!(:nesting_segments).and_return [{:segment => 'users', :singleton => false}, {:segment => 'forums', :singleton => false}, {:segment => 'posts', :singleton => false}, {:segment => 'comments', :singleton => false}]
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
it "should call load_wildcard twice, then once with 'commentable'" do
|
|
177
|
+
@controller.should_receive(:load_wildcard).with().twice.ordered
|
|
178
|
+
@controller.should_receive(:load_wildcard).with('commentable').once.ordered
|
|
179
|
+
@controller.send(:load_enclosing_resources)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
it "should call Specification.new with ('user', :singleton => false, :as => nil), ('forum', :singleton => false, :as => nil), then ('post', :singleton => false, :as => 'commentable')" do
|
|
183
|
+
ResourcesController::Specification.should_receive(:new).with('user', :singleton => false, :as => nil).once.ordered
|
|
184
|
+
ResourcesController::Specification.should_receive(:new).with('forum', :singleton => false, :as => nil).once.ordered
|
|
185
|
+
ResourcesController::Specification.should_receive(:new).with('post', :singleton => false, :as => 'commentable').once.ordered
|
|
186
|
+
@controller.send(:load_enclosing_resources)
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
describe "#load_enclosing_resources for resources_controller_for :tags, :in => ['user', '*', '?taggable'] (when nesting_segments is [{:segment => 'users', :singleton => false}, {:segment => 'comments', :singleton => false}])" do
|
|
191
|
+
include LoadEnclosingResourcesSpecHelper
|
|
192
|
+
|
|
193
|
+
before do
|
|
194
|
+
setup_tags_controller :in => ['user', '*', '?taggable']
|
|
195
|
+
@user_spec = @controller.send(:specifications)[1]
|
|
196
|
+
@controller.stub!(:nesting_segments).and_return [{:segment => 'users', :singleton => false}, {:segment => 'comments', :singleton => false}]
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it "should call load_enclosing_resource_from_specification with user spec, then load_wildcard once with 'taggable'" do
|
|
200
|
+
@controller.should_receive(:load_enclosing_resource_from_specification).with(@user_spec).once.ordered do
|
|
201
|
+
mock('user').tap {|r| @controller.enclosing_resources << r }
|
|
202
|
+
end
|
|
203
|
+
@controller.should_receive(:load_wildcard).with('taggable').once.ordered
|
|
204
|
+
@controller.send(:load_enclosing_resources)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
it "should call Specification.new with ('comment', :singleton => false, :as => 'taggable')" do
|
|
208
|
+
ResourcesController::Specification.should_receive(:new).with('comment', :singleton => false, :as => 'taggable')
|
|
209
|
+
@controller.send(:load_enclosing_resources)
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# specing some branching BC code
|
|
214
|
+
# find_filter dissapeared from edge, but we want to support it for 2.0-stable
|
|
215
|
+
describe "ResourcesController.load_enclosing_resources_filter_exists?" do
|
|
216
|
+
before do
|
|
217
|
+
@klass = Class.new(ActionController::Base)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
describe "when :find_filter defined" do
|
|
221
|
+
before do
|
|
222
|
+
class<<@klass
|
|
223
|
+
def find_filter; end
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
it "should call :find_filter with :load_enclosing_resources" do
|
|
228
|
+
@klass.should_receive(:find_filter).with(:load_enclosing_resources)
|
|
229
|
+
@klass.send(:load_enclosing_resources_filter_exists?)
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
describe "when :find_filter not defined" do
|
|
234
|
+
before do
|
|
235
|
+
class<<@klass
|
|
236
|
+
undef_method(:find_filter) rescue nil
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
it "should call :_process_action_callbacks" do
|
|
241
|
+
@klass.should_receive(:_process_action_callbacks).and_return([])
|
|
242
|
+
@klass.send(:load_enclosing_resources_filter_exists?)
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module RequestPathIntrospectionSpec
|
|
4
|
+
class Forum < ActiveRecord::Base; end
|
|
5
|
+
|
|
6
|
+
class User < ActiveRecord::Base; end
|
|
7
|
+
|
|
8
|
+
describe "RequestPathIntrospection" do
|
|
9
|
+
before do
|
|
10
|
+
@klass = Class.new(ActionController::Base)
|
|
11
|
+
@controller = @klass.new
|
|
12
|
+
@controller.stub!(:controller_name).and_return('forums')
|
|
13
|
+
@controller.stub!(:controller_path).and_return('forums')
|
|
14
|
+
@controller.stub!(:params).and_return({})
|
|
15
|
+
@controller.stub!(:request).and_return(mock('request', :path => '/forums'))
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe "#request_path" do
|
|
19
|
+
it "should default to request.path" do
|
|
20
|
+
@controller.send(:request_path).should == '/forums'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it " should be params[:resource_path], when set" do
|
|
24
|
+
@controller.params[:resource_path] = '/foo'
|
|
25
|
+
@controller.send(:request_path).should == '/foo'
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "#nesting_request_path" do
|
|
30
|
+
it "should remove the controller_name segment" do
|
|
31
|
+
@controller.stub!(:request_path).and_return('/users/1/forums/2')
|
|
32
|
+
@controller.send(:nesting_request_path).should == '/users/1'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "when resource_specification present, whould remove taht segment" do
|
|
36
|
+
@controller.stub!(:resource_specification).and_return(ResourcesController::Specification.new(:forum, :class => RequestPathIntrospectionSpec::Forum, :segment => 'foromas'))
|
|
37
|
+
@controller.stub!(:request_path).and_return('/users/1/foromas/2')
|
|
38
|
+
@controller.send(:nesting_request_path).should == '/users/1'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should remove only the controller_name segment, when nesting is same name" do
|
|
42
|
+
@controller.stub!(:request_path).and_return('/forums/1/forums/2')
|
|
43
|
+
@controller.send(:nesting_request_path).should == '/forums/1'
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "should remove the controller_name segment, even when id matches controller name" do
|
|
47
|
+
@controller.stub!(:request_path).and_return('/forums/1/forums/forums.atom')
|
|
48
|
+
@controller.send(:nesting_request_path).should == '/forums/1'
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should remove only the controller_name segment even when nesting is same name" do
|
|
52
|
+
@controller.stub!(:resource_specification).and_return(ResourcesController::Specification.new(:forum, :class => RequestPathIntrospectionSpec::Forum, :singleton => true))
|
|
53
|
+
@controller.stub!(:request_path).and_return('/users/1/forum/forum.atom')
|
|
54
|
+
@controller.send(:nesting_request_path).should == '/users/1/forum'
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should remove any controller namespace" do
|
|
58
|
+
@controller.stub!(:controller_path).and_return('some/name/space/forums')
|
|
59
|
+
@controller.stub!(:request_path).and_return('/some/name/space/users/1/secret/forums')
|
|
60
|
+
@controller.send(:nesting_request_path).should == '/users/1/secret'
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "#namespace_segments should return [] segments if NOT present in request_path" do
|
|
65
|
+
@controller.stub!(:controller_path).and_return('some/name/space/forums')
|
|
66
|
+
@controller.stub!(:request_path).and_return('/SAM/name/space/users/1/secret/forums')
|
|
67
|
+
@controller.send(:namespace_segments).should == []
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "#namespace_segments should return namespace segments if present in request_path" do
|
|
71
|
+
@controller.stub!(:controller_path).and_return('some/name/space/forums')
|
|
72
|
+
@controller.stub!(:request_path).and_return('/some/name/space/users/1/secret/forums')
|
|
73
|
+
@controller.send(:namespace_segments).should == ['some', 'name', 'space']
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
describe "#nesting_segments" do
|
|
77
|
+
describe "when params include :user_id" do
|
|
78
|
+
before do
|
|
79
|
+
@controller.params[:user_id] = '1'
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "and request path is '/users/1/forums', should return [{:segment => 'users', :singleton => false}]" do
|
|
83
|
+
@controller.request.stub!(:path).and_return('/users/1/forums')
|
|
84
|
+
@controller.send(:nesting_segments).should == [{:segment => 'users', :singleton => false}]
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "and request path is '/account/users/1/forums', should return [{:segment => 'account', :singleton => true}, {:segment => 'users', :singleton => false}]" do
|
|
88
|
+
@controller.request.stub!(:path).and_return('/account/users/1/forums')
|
|
89
|
+
@controller.send(:nesting_segments).should == [{:segment => 'account', :singleton => true}, {:segment => 'users', :singleton => false}]
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
describe "when controller has nesting for :user => 'muchachos'" do
|
|
93
|
+
before do
|
|
94
|
+
@klass.resources_controller_for :forums, :class => RequestPathIntrospectionSpec::Forum
|
|
95
|
+
@klass.nested_in :user, :segment => "muchachos", :class => RequestPathIntrospectionSpec::User
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "and request path is '/muchachos/1/forums', should return [{:segment => 'muchachos', :singleton => false}]" do
|
|
99
|
+
@controller.request.stub!(:path).and_return('/muchachos/1/forums')
|
|
100
|
+
@controller.send(:nesting_segments).should == [{:segment => 'muchachos', :singleton => false}]
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
describe "when enclosing resource has mapping for :user => 'muchachos'" do
|
|
105
|
+
before do
|
|
106
|
+
@klass.map_enclosing_resource :user, :segment => "muchachos", :class => RequestPathIntrospectionSpec::User
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "and request path is '/muchachos/1/forums', should return [{:segment => 'muchachos', :singleton => false}]" do
|
|
110
|
+
@controller.request.stub!(:path).and_return('/muchachos/1/forums')
|
|
111
|
+
@controller.send(:nesting_segments).should == [{:segment => 'muchachos', :singleton => false}]
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
describe "#segment_for_key" do
|
|
118
|
+
describe "when controller has map {:user, :singelton => true}" do
|
|
119
|
+
before do
|
|
120
|
+
@klass.resources_controller_for :forums, :class => RequestPathIntrospectionSpec::Forum
|
|
121
|
+
@klass.map_enclosing_resource :user, :singleton => true, :class => RequestPathIntrospectionSpec::User
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it "('user_id') should return 'users'" do
|
|
125
|
+
@controller.send(:segment_for_key, 'user_id').should == 'users'
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module ResourceMethodsSpec
|
|
4
|
+
class MyController < ActionController::Base
|
|
5
|
+
resources_controller_for :users
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
if Rails.respond_to?(:version) && Rails.version >= "2.3"
|
|
9
|
+
describe "#new_resource" do
|
|
10
|
+
it "should accept block syntax" do
|
|
11
|
+
c = MyController.new
|
|
12
|
+
c.resource_service = User
|
|
13
|
+
c.stub!(:params).and_return({})
|
|
14
|
+
r = c.send(:new_resource) do |u|
|
|
15
|
+
u.login = "Fred"
|
|
16
|
+
end
|
|
17
|
+
r.should be_kind_of User
|
|
18
|
+
r.login.should == "Fred"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe "An rc for collection :users" do
|
|
24
|
+
before do
|
|
25
|
+
@controller = MyController.new
|
|
26
|
+
@controller.stub!(:params).and_return({})
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "when no enclosing resource" do
|
|
30
|
+
it "#find_resource(<id>) should call User.find(<id>)" do
|
|
31
|
+
User.should_receive(:find).with("42")
|
|
32
|
+
@controller.send(:find_resource, "42")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "#find_resources should call User.find(:all)" do
|
|
36
|
+
User.should_receive(:all)
|
|
37
|
+
@controller.send(:find_resources)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "#new_resource({}) should call User.new({})" do
|
|
41
|
+
User.should_receive(:new).with({})
|
|
42
|
+
@controller.send(:new_resource, {})
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "#destroy_resource(<id>) should call User.find(<id>).destroy" do
|
|
46
|
+
User.should_receive(:find).with("42").and_return(user = mock)
|
|
47
|
+
user.should_receive(:destroy).and_return(user)
|
|
48
|
+
@controller.send(:destroy_resource, "42").should == user
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe "when an enclosing resource is added (a forum)" do
|
|
53
|
+
before do
|
|
54
|
+
@forum = Forum.create!
|
|
55
|
+
@controller.send :add_enclosing_resource, @forum
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "#find_resource(<id>) should call forum.users.find(<id>)" do
|
|
59
|
+
@forum.users.should_receive(:find).with("42")
|
|
60
|
+
@controller.send(:find_resource, "42")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "#find_resources should call forum.users.find(:all)" do
|
|
64
|
+
@forum.users.should_receive(:all)
|
|
65
|
+
@controller.send(:find_resources)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "#new_resource({}) should call forum.users.build({})" do
|
|
69
|
+
@forum.users.should_receive(:build).with({})
|
|
70
|
+
@controller.send :new_resource, {}
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "#destroy_resource(<id>) should call forum.users.find(<id>) and forum.users.destroy(<id>)" do
|
|
74
|
+
@forum.users.should_receive(:find).with("42").and_return(user = mock)
|
|
75
|
+
@forum.users.should_receive(:destroy).with("42").and_return(useless_array = mock)
|
|
76
|
+
@controller.send(:destroy_resource, "42").should == user
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
class MySingletonController < ActionController::Base
|
|
82
|
+
resources_controller_for :info, :singleton => true
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
describe "An rc for singleton :info" do
|
|
86
|
+
before do
|
|
87
|
+
@controller = MySingletonController.new
|
|
88
|
+
@controller.stub!(:params).and_return({})
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
describe "with an enclosing resource (a user)" do
|
|
92
|
+
before do
|
|
93
|
+
@user = User.create!
|
|
94
|
+
@controller.send :add_enclosing_resource, @user
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "#find_resource should call user.info" do
|
|
98
|
+
@user.should_receive(:info)
|
|
99
|
+
@controller.send(:find_resource)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "#new_resource({}) should call user.build_info({})" do
|
|
103
|
+
@user.should_receive(:build_info).with({})
|
|
104
|
+
@controller.send :new_resource, {}
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it "#destroy_resource should call user.info.destroy" do
|
|
108
|
+
@user.should_receive(:info).and_return(info = mock)
|
|
109
|
+
info.should_receive(:destroy)
|
|
110
|
+
@controller.send(:destroy_resource)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
module MyResourceMethods
|
|
116
|
+
protected
|
|
117
|
+
def new_resource(attrs = (params[resource_name] || {}), &block)
|
|
118
|
+
"my new_resource"
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def find_resource(id = params[:id])
|
|
122
|
+
"my find_resource"
|
|
123
|
+
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def find_resources
|
|
127
|
+
"my find_resources"
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def destroy_resource(id = params[:id])
|
|
131
|
+
"my destroy_resource"
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
shared_examples_for "A controller with its own resource methods" do
|
|
136
|
+
it "#new_resource should call MyResourceMethods#new_resource" do
|
|
137
|
+
@controller.send(:new_resource, {}).should == 'my new_resource'
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it "#find_resource should call MyResourceMethods#find_resource" do
|
|
141
|
+
@controller.send(:find_resource, 1).should == 'my find_resource'
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it "#find_resources should call MyResourceMethods#new_resource" do
|
|
145
|
+
@controller.send(:find_resources).should == 'my find_resources'
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it "#destroy_resource should call MyResourceMethods#destroy_resource" do
|
|
149
|
+
@controller.send(:destroy_resource, 1).should == 'my destroy_resource'
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
class MyControllerWithMyResourceMethodsMixedIn < ActionController::Base
|
|
154
|
+
resources_controller_for :users
|
|
155
|
+
include MyResourceMethods
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
describe "A controller with resource methods mixed in after resources_controller_for" do
|
|
159
|
+
before do
|
|
160
|
+
@controller = MyControllerWithMyResourceMethodsMixedIn.new
|
|
161
|
+
@controller.resource_service = User
|
|
162
|
+
@controller.stub!(:params).and_return({})
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it_should_behave_like "A controller with its own resource methods"
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
class MyAbstractControllerWithOwnResourceMethods < ActionController::Base
|
|
169
|
+
include MyResourceMethods
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
class InhertedMyAbstractControllerWithOwnResourceMethods < MyAbstractControllerWithOwnResourceMethods
|
|
173
|
+
resources_controller_for :users, :resource_methods => false
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
describe "A controller inheriting resource methods which declares :resource_methods => false" do
|
|
177
|
+
before do
|
|
178
|
+
@controller = InhertedMyAbstractControllerWithOwnResourceMethods.new
|
|
179
|
+
@controller.resource_service = User
|
|
180
|
+
@controller.stub!(:params).and_return({})
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it_should_behave_like "A controller with its own resource methods"
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
class MyAbstractControllerWithResourceMethodsOverridden < ActionController::Base
|
|
187
|
+
include ResourcesController::ResourceMethods
|
|
188
|
+
include MyResourceMethods
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
class InhertedMyAbstractControllerWithResourceMethodsOverridden < MyAbstractControllerWithResourceMethodsOverridden
|
|
192
|
+
resources_controller_for :users
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
describe "A controller inheriting from a controller which mixes in ResourceMethods, and overrides them" do
|
|
196
|
+
before do
|
|
197
|
+
@controller = InhertedMyAbstractControllerWithResourceMethodsOverridden.new
|
|
198
|
+
@controller.resource_service = User
|
|
199
|
+
@controller.stub!(:params).and_return({})
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
it_should_behave_like "A controller with its own resource methods"
|
|
203
|
+
end
|
|
204
|
+
end
|