josevalim-inherited_resources 0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +4 -0
- data/MIT-LICENSE +21 -0
- data/README +362 -0
- data/Rakefile +19 -0
- data/init.rb +1 -0
- data/lib/inherited_resources.rb +4 -0
- data/lib/inherited_resources/base.rb +272 -0
- data/lib/inherited_resources/base_helpers.rb +199 -0
- data/lib/inherited_resources/belongs_to.rb +227 -0
- data/lib/inherited_resources/belongs_to_helpers.rb +89 -0
- data/lib/inherited_resources/class_methods.rb +155 -0
- data/lib/inherited_resources/polymorphic_helpers.rb +19 -0
- data/lib/inherited_resources/respond_to.rb +324 -0
- data/lib/inherited_resources/singleton_helpers.rb +53 -0
- data/lib/inherited_resources/url_helpers.rb +147 -0
- data/test/aliases_test.rb +71 -0
- data/test/base_helpers_test.rb +130 -0
- data/test/base_test.rb +219 -0
- data/test/belongs_to_base_test.rb +268 -0
- data/test/belongs_to_test.rb +109 -0
- data/test/class_methods_test.rb +73 -0
- data/test/fixtures/en.yml +9 -0
- data/test/nested_belongs_to_test.rb +138 -0
- data/test/polymorphic_base_test.rb +282 -0
- data/test/respond_to_test.rb +282 -0
- data/test/singleton_base_test.rb +226 -0
- data/test/test_helper.rb +37 -0
- data/test/url_helpers_test.rb +284 -0
- data/test/views/cities/edit.html.erb +1 -0
- data/test/views/cities/index.html.erb +1 -0
- data/test/views/cities/new.html.erb +1 -0
- data/test/views/cities/show.html.erb +1 -0
- data/test/views/comments/edit.html.erb +1 -0
- data/test/views/comments/index.html.erb +1 -0
- data/test/views/comments/new.html.erb +1 -0
- data/test/views/comments/show.html.erb +1 -0
- data/test/views/employees/edit.html.erb +1 -0
- data/test/views/employees/index.html.erb +1 -0
- data/test/views/employees/new.html.erb +1 -0
- data/test/views/employees/show.html.erb +1 -0
- data/test/views/managers/edit.html.erb +1 -0
- data/test/views/managers/new.html.erb +1 -0
- data/test/views/managers/show.html.erb +1 -0
- data/test/views/pets/edit.html.erb +1 -0
- data/test/views/professors/edit.html.erb +1 -0
- data/test/views/professors/index.html.erb +1 -0
- data/test/views/professors/new.html.erb +1 -0
- data/test/views/professors/show.html.erb +1 -0
- data/test/views/projects/index.html.erb +1 -0
- data/test/views/projects/respond_to_with_resource.html.erb +1 -0
- data/test/views/students/edit.html.erb +1 -0
- data/test/views/students/new.html.erb +1 -0
- data/test/views/users/edit.html.erb +1 -0
- data/test/views/users/index.html.erb +1 -0
- data/test/views/users/new.html.erb +1 -0
- data/test/views/users/show.html.erb +1 -0
- metadata +108 -0
@@ -0,0 +1,138 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class Country
|
4
|
+
end
|
5
|
+
|
6
|
+
class State
|
7
|
+
end
|
8
|
+
|
9
|
+
class City
|
10
|
+
def self.human_name; 'City'; end
|
11
|
+
end
|
12
|
+
|
13
|
+
class CitiesController < InheritedResources::Base
|
14
|
+
belongs_to :country, :state
|
15
|
+
end
|
16
|
+
|
17
|
+
# Create a TestHelper module with some helpers
|
18
|
+
class NestedBelongsToTest < Test::Unit::TestCase
|
19
|
+
|
20
|
+
def setup
|
21
|
+
@controller = CitiesController.new
|
22
|
+
@controller.request = @request = ActionController::TestRequest.new
|
23
|
+
@controller.response = @response = ActionController::TestResponse.new
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_assigns_country_and_state_and_city_on_create
|
27
|
+
Country.expects(:find).with('13').returns(mock_country)
|
28
|
+
mock_country.expects(:states).returns(State)
|
29
|
+
State.expects(:find).with('37').returns(mock_state)
|
30
|
+
mock_state.expects(:cities).returns(City)
|
31
|
+
City.expects(:find).with(:all).returns([mock_city])
|
32
|
+
|
33
|
+
get :index, :state_id => '37', :country_id => '13'
|
34
|
+
|
35
|
+
assert_equal mock_country, assigns(:country)
|
36
|
+
assert_equal mock_state, assigns(:state)
|
37
|
+
assert_equal [mock_city], assigns(:cities)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_assigns_country_and_state_and_city_on_show
|
41
|
+
Country.expects(:find).with('13').returns(mock_country)
|
42
|
+
mock_country.expects(:states).returns(State)
|
43
|
+
State.expects(:find).with('37').returns(mock_state)
|
44
|
+
mock_state.expects(:cities).returns(City)
|
45
|
+
City.expects(:find).with('42').returns(mock_city)
|
46
|
+
|
47
|
+
get :show, :id => '42', :state_id => '37', :country_id => '13'
|
48
|
+
|
49
|
+
assert_equal mock_country, assigns(:country)
|
50
|
+
assert_equal mock_state, assigns(:state)
|
51
|
+
assert_equal mock_city, assigns(:city)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_assigns_country_and_state_and_city_on_new
|
55
|
+
Country.expects(:find).with('13').returns(mock_country)
|
56
|
+
mock_country.expects(:states).returns(State)
|
57
|
+
State.expects(:find).with('37').returns(mock_state)
|
58
|
+
mock_state.expects(:cities).returns(City)
|
59
|
+
City.expects(:build).returns(mock_city)
|
60
|
+
|
61
|
+
get :new, :state_id => '37', :country_id => '13'
|
62
|
+
|
63
|
+
assert_equal mock_country, assigns(:country)
|
64
|
+
assert_equal mock_state, assigns(:state)
|
65
|
+
assert_equal mock_city, assigns(:city)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_assigns_country_and_state_and_city_on_edit
|
69
|
+
Country.expects(:find).with('13').returns(mock_country)
|
70
|
+
mock_country.expects(:states).returns(State)
|
71
|
+
State.expects(:find).with('37').returns(mock_state)
|
72
|
+
mock_state.expects(:cities).returns(City)
|
73
|
+
City.expects(:find).with('42').returns(mock_city)
|
74
|
+
|
75
|
+
get :edit, :id => '42', :state_id => '37', :country_id => '13'
|
76
|
+
|
77
|
+
assert_equal mock_country, assigns(:country)
|
78
|
+
assert_equal mock_state, assigns(:state)
|
79
|
+
assert_equal mock_city, assigns(:city)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_assigns_country_and_state_and_city_on_create
|
83
|
+
Country.expects(:find).with('13').returns(mock_country)
|
84
|
+
mock_country.expects(:states).returns(State)
|
85
|
+
State.expects(:find).with('37').returns(mock_state)
|
86
|
+
mock_state.expects(:cities).returns(City)
|
87
|
+
City.expects(:build).with({'these' => 'params'}).returns(mock_city(:save => true))
|
88
|
+
|
89
|
+
post :create, :state_id => '37', :country_id => '13', :city => {:these => 'params'}
|
90
|
+
|
91
|
+
assert_equal mock_country, assigns(:country)
|
92
|
+
assert_equal mock_state, assigns(:state)
|
93
|
+
assert_equal mock_city, assigns(:city)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_assigns_country_and_state_and_city_on_update
|
97
|
+
Country.expects(:find).with('13').returns(mock_country)
|
98
|
+
mock_country.expects(:states).returns(State)
|
99
|
+
State.expects(:find).with('37').returns(mock_state)
|
100
|
+
mock_state.expects(:cities).returns(City)
|
101
|
+
City.expects(:find).with('42').returns(mock_city)
|
102
|
+
mock_city.expects(:update_attributes).with({'these' => 'params'}).returns(true)
|
103
|
+
|
104
|
+
put :update, :id => '42', :state_id => '37', :country_id => '13', :city => {:these => 'params'}
|
105
|
+
|
106
|
+
assert_equal mock_country, assigns(:country)
|
107
|
+
assert_equal mock_state, assigns(:state)
|
108
|
+
assert_equal mock_city, assigns(:city)
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_assigns_country_and_state_and_city_on_destroy
|
112
|
+
Country.expects(:find).with('13').returns(mock_country)
|
113
|
+
mock_country.expects(:states).returns(State)
|
114
|
+
State.expects(:find).with('37').returns(mock_state)
|
115
|
+
mock_state.expects(:cities).returns(City)
|
116
|
+
City.expects(:find).with('42').returns(mock_city)
|
117
|
+
mock_city.expects(:destroy)
|
118
|
+
|
119
|
+
delete :destroy, :id => '42', :state_id => '37', :country_id => '13'
|
120
|
+
|
121
|
+
assert_equal mock_country, assigns(:country)
|
122
|
+
assert_equal mock_state, assigns(:state)
|
123
|
+
assert_equal mock_city, assigns(:city)
|
124
|
+
end
|
125
|
+
|
126
|
+
protected
|
127
|
+
def mock_country(stubs={})
|
128
|
+
@mock_country ||= mock(stubs)
|
129
|
+
end
|
130
|
+
|
131
|
+
def mock_state(stubs={})
|
132
|
+
@mock_state ||= mock(stubs)
|
133
|
+
end
|
134
|
+
|
135
|
+
def mock_city(stubs={})
|
136
|
+
@mock_city ||= mock(stubs)
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,282 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class Factory; end
|
4
|
+
class Company; end
|
5
|
+
|
6
|
+
class Employee
|
7
|
+
def self.human_name; 'Employee'; end
|
8
|
+
end
|
9
|
+
|
10
|
+
class EmployeesController < InheritedResources::Base
|
11
|
+
belongs_to :factory, :company, :polymorphic => true
|
12
|
+
end
|
13
|
+
|
14
|
+
# Create a TestHelper module with some helpers
|
15
|
+
module EmployeeTestHelper
|
16
|
+
def setup
|
17
|
+
@controller = EmployeesController.new
|
18
|
+
@controller.request = @request = ActionController::TestRequest.new
|
19
|
+
@controller.response = @response = ActionController::TestResponse.new
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
def mock_factory(stubs={})
|
24
|
+
@mock_factory ||= mock(stubs)
|
25
|
+
end
|
26
|
+
|
27
|
+
def mock_employee(stubs={})
|
28
|
+
@mock_employee ||= mock(stubs)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class IndexActionPolymorphicTest < Test::Unit::TestCase
|
33
|
+
include EmployeeTestHelper
|
34
|
+
|
35
|
+
def test_expose_all_employees_as_instance_variable
|
36
|
+
Factory.expects(:find).with('37').returns(mock_factory)
|
37
|
+
mock_factory.expects(:employees).returns(Employee)
|
38
|
+
Employee.expects(:find).with(:all).returns([mock_employee])
|
39
|
+
get :index, :factory_id => '37'
|
40
|
+
assert_equal mock_factory, assigns(:factory)
|
41
|
+
assert_equal [mock_employee], assigns(:employees)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_controller_should_render_index
|
45
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
46
|
+
Employee.stubs(:find).returns([mock_employee])
|
47
|
+
get :index, :factory_id => '37'
|
48
|
+
assert_response :success
|
49
|
+
assert_equal 'Index HTML', @response.body.strip
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_render_all_employees_as_xml_when_mime_type_is_xml
|
53
|
+
@request.accept = 'application/xml'
|
54
|
+
Factory.expects(:find).with('37').returns(mock_factory)
|
55
|
+
mock_factory.expects(:employees).returns(Employee)
|
56
|
+
Employee.expects(:find).with(:all).returns(mock_employee)
|
57
|
+
mock_employee.expects(:to_xml).returns('Generated XML')
|
58
|
+
get :index, :factory_id => '37'
|
59
|
+
assert_response :success
|
60
|
+
assert_equal 'Generated XML', @response.body
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class ShowActionPolymorphicTest < Test::Unit::TestCase
|
65
|
+
include EmployeeTestHelper
|
66
|
+
|
67
|
+
def test_expose_the_resquested_employee
|
68
|
+
Factory.expects(:find).with('37').returns(mock_factory)
|
69
|
+
mock_factory.expects(:employees).returns(Employee)
|
70
|
+
Employee.expects(:find).with('42').returns(mock_employee)
|
71
|
+
get :show, :id => '42', :factory_id => '37'
|
72
|
+
assert_equal mock_factory, assigns(:factory)
|
73
|
+
assert_equal mock_employee, assigns(:employee)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_controller_should_render_show
|
77
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
78
|
+
Employee.stubs(:find).returns(mock_employee)
|
79
|
+
get :show, :factory_id => '37'
|
80
|
+
assert_response :success
|
81
|
+
assert_equal 'Show HTML', @response.body.strip
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_render_exposed_employee_as_xml_when_mime_type_is_xml
|
85
|
+
@request.accept = 'application/xml'
|
86
|
+
Factory.expects(:find).with('37').returns(mock_factory)
|
87
|
+
mock_factory.expects(:employees).returns(Employee)
|
88
|
+
Employee.expects(:find).with('42').returns(mock_employee)
|
89
|
+
mock_employee.expects(:to_xml).returns("Generated XML")
|
90
|
+
get :show, :id => '42', :factory_id => '37'
|
91
|
+
assert_response :success
|
92
|
+
assert_equal 'Generated XML', @response.body
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
class NewActionPolymorphicTest < Test::Unit::TestCase
|
97
|
+
include EmployeeTestHelper
|
98
|
+
|
99
|
+
def test_expose_a_new_employee
|
100
|
+
Factory.expects(:find).with('37').returns(mock_factory)
|
101
|
+
mock_factory.expects(:employees).returns(Employee)
|
102
|
+
Employee.expects(:build).returns(mock_employee)
|
103
|
+
get :new, :factory_id => '37'
|
104
|
+
assert_equal mock_factory, assigns(:factory)
|
105
|
+
assert_equal mock_employee, assigns(:employee)
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_controller_should_render_new
|
109
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
110
|
+
Employee.stubs(:build).returns(mock_employee)
|
111
|
+
get :new, :factory_id => '37'
|
112
|
+
assert_response :success
|
113
|
+
assert_equal 'New HTML', @response.body.strip
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_render_exposed_a_new_employee_as_xml_when_mime_type_is_xml
|
117
|
+
@request.accept = 'application/xml'
|
118
|
+
Factory.expects(:find).with('37').returns(mock_factory)
|
119
|
+
mock_factory.expects(:employees).returns(Employee)
|
120
|
+
Employee.expects(:build).returns(mock_employee)
|
121
|
+
mock_employee.expects(:to_xml).returns("Generated XML")
|
122
|
+
get :new, :factory_id => '37'
|
123
|
+
assert_equal 'Generated XML', @response.body
|
124
|
+
assert_response :success
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
class EditActionPolymorphicTest < Test::Unit::TestCase
|
129
|
+
include EmployeeTestHelper
|
130
|
+
|
131
|
+
def test_expose_the_resquested_employee
|
132
|
+
Factory.expects(:find).with('37').returns(mock_factory)
|
133
|
+
mock_factory.expects(:employees).returns(Employee)
|
134
|
+
Employee.expects(:find).with('42').returns(mock_employee)
|
135
|
+
get :edit, :id => '42', :factory_id => '37'
|
136
|
+
assert_equal mock_factory, assigns(:factory)
|
137
|
+
assert_equal mock_employee, assigns(:employee)
|
138
|
+
assert_response :success
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_controller_should_render_edit
|
142
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
143
|
+
Employee.stubs(:find).returns(mock_employee)
|
144
|
+
get :edit, :factory_id => '37'
|
145
|
+
assert_response :success
|
146
|
+
assert_equal 'Edit HTML', @response.body.strip
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
class CreateActionPolymorphicTest < Test::Unit::TestCase
|
151
|
+
include EmployeeTestHelper
|
152
|
+
|
153
|
+
def test_expose_a_newly_create_employee_when_saved_with_success
|
154
|
+
Factory.expects(:find).with('37').returns(mock_factory)
|
155
|
+
mock_factory.expects(:employees).returns(Employee)
|
156
|
+
Employee.expects(:build).with({'these' => 'params'}).returns(mock_employee(:save => true))
|
157
|
+
post :create, :factory_id => '37', :employee => {:these => 'params'}
|
158
|
+
assert_equal mock_factory, assigns(:factory)
|
159
|
+
assert_equal mock_employee, assigns(:employee)
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_redirect_to_the_created_employee
|
163
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
164
|
+
Employee.stubs(:build).returns(mock_employee(:save => true))
|
165
|
+
@controller.expects(:resource_url).returns('http://test.host/').times(2)
|
166
|
+
post :create, :factory_id => '37'
|
167
|
+
assert_redirected_to 'http://test.host/'
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_show_flash_message_when_success
|
171
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
172
|
+
Employee.stubs(:build).returns(mock_employee(:save => true))
|
173
|
+
post :create, :factory_id => '37'
|
174
|
+
assert_equal flash[:notice], 'Employee was successfully created.'
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_render_new_template_when_employee_cannot_be_saved
|
178
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
179
|
+
Employee.stubs(:build).returns(mock_employee(:save => false, :errors => []))
|
180
|
+
post :create, :factory_id => '37'
|
181
|
+
assert_response :success
|
182
|
+
assert_template 'new'
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_dont_show_flash_message_when_employee_cannot_be_saved
|
186
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
187
|
+
Employee.stubs(:build).returns(mock_employee(:save => false, :errors => []))
|
188
|
+
post :create, :factory_id => '37'
|
189
|
+
assert flash.empty?
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
class UpdateActionPolymorphicTest < Test::Unit::TestCase
|
194
|
+
include EmployeeTestHelper
|
195
|
+
|
196
|
+
def test_update_the_requested_object
|
197
|
+
Factory.expects(:find).with('37').returns(mock_factory)
|
198
|
+
mock_factory.expects(:employees).returns(Employee)
|
199
|
+
Employee.expects(:find).with('42').returns(mock_employee)
|
200
|
+
mock_employee.expects(:update_attributes).with({'these' => 'params'}).returns(true)
|
201
|
+
put :update, :id => '42', :factory_id => '37', :employee => {:these => 'params'}
|
202
|
+
assert_equal mock_factory, assigns(:factory)
|
203
|
+
assert_equal mock_employee, assigns(:employee)
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_redirect_to_the_created_employee
|
207
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
208
|
+
Employee.stubs(:find).returns(mock_employee(:update_attributes => true))
|
209
|
+
@controller.expects(:resource_url).returns('http://test.host/')
|
210
|
+
put :update, :factory_id => '37'
|
211
|
+
assert_redirected_to 'http://test.host/'
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_show_flash_message_when_success
|
215
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
216
|
+
Employee.stubs(:find).returns(mock_employee(:update_attributes => true))
|
217
|
+
put :update, :factory_id => '37'
|
218
|
+
assert_equal flash[:notice], 'Employee was successfully updated.'
|
219
|
+
end
|
220
|
+
|
221
|
+
def test_render_edit_template_when_employee_cannot_be_saved
|
222
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
223
|
+
Employee.stubs(:find).returns(mock_employee(:update_attributes => false, :errors => []))
|
224
|
+
put :update, :factory_id => '37'
|
225
|
+
assert_response :success
|
226
|
+
assert_template 'edit'
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_dont_show_flash_message_when_employee_cannot_be_saved
|
230
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
231
|
+
Employee.stubs(:find).returns(mock_employee(:update_attributes => false, :errors => []))
|
232
|
+
put :update, :factory_id => '37'
|
233
|
+
assert flash.empty?
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
class DestroyActionPolymorphicTest < Test::Unit::TestCase
|
238
|
+
include EmployeeTestHelper
|
239
|
+
|
240
|
+
def test_the_resquested_employee_is_destroyed
|
241
|
+
Factory.expects(:find).with('37').returns(mock_factory)
|
242
|
+
mock_factory.expects(:employees).returns(Employee)
|
243
|
+
Employee.expects(:find).with('42').returns(mock_employee)
|
244
|
+
mock_employee.expects(:destroy)
|
245
|
+
delete :destroy, :id => '42', :factory_id => '37'
|
246
|
+
assert_equal mock_factory, assigns(:factory)
|
247
|
+
assert_equal mock_employee, assigns(:employee)
|
248
|
+
end
|
249
|
+
|
250
|
+
def test_show_flash_message
|
251
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
252
|
+
Employee.stubs(:find).returns(mock_employee(:destroy => true))
|
253
|
+
delete :destroy, :factory_id => '37'
|
254
|
+
assert_equal flash[:notice], 'Employee was successfully destroyed.'
|
255
|
+
end
|
256
|
+
|
257
|
+
def test_redirects_to_employees_list
|
258
|
+
Factory.stubs(:find).returns(mock_factory(:employees => Employee))
|
259
|
+
Employee.stubs(:find).returns(mock_employee(:destroy => true))
|
260
|
+
@controller.expects(:collection_url).returns('http://test.host/')
|
261
|
+
delete :destroy, :factory_id => '37'
|
262
|
+
assert_redirected_to 'http://test.host/'
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
include EmployeeTestHelper
|
267
|
+
|
268
|
+
def test_polymorphic_helpers
|
269
|
+
new_factory = Factory.new
|
270
|
+
Factory.expects(:find).with('37').returns(new_factory)
|
271
|
+
new_factory.expects(:employees).returns(Employee)
|
272
|
+
Employee.expects(:find).with(:all).returns([mock_employee])
|
273
|
+
get :index, :factory_id => '37'
|
274
|
+
|
275
|
+
assert @controller.send(:parent?)
|
276
|
+
assert_equal :factory, assigns(:parent_type)
|
277
|
+
assert_equal :factory, @controller.send(:parent_type)
|
278
|
+
assert_equal Factory, @controller.send(:parent_class)
|
279
|
+
assert_equal new_factory, assigns(:factory)
|
280
|
+
assert_equal new_factory, @controller.send(:parent_instance)
|
281
|
+
end
|
282
|
+
end
|
@@ -0,0 +1,282 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class Project
|
4
|
+
def to_html
|
5
|
+
'Generated HTML'
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_xml
|
9
|
+
'Generated XML'
|
10
|
+
end
|
11
|
+
|
12
|
+
[:to_json, :to_rss, :to_rjs].each do |method|
|
13
|
+
undef_method method if respond_to? method
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class ProjectsController < ActionController::Base
|
18
|
+
# Inherited respond_to definition is:
|
19
|
+
# respond_to :html
|
20
|
+
# respond_to :xml, :except => :edit
|
21
|
+
respond_to :html
|
22
|
+
respond_to :rjs => :edit
|
23
|
+
respond_to :rss, :only => 'index'
|
24
|
+
respond_to :json, :except => :index
|
25
|
+
|
26
|
+
def index
|
27
|
+
respond_with(Project.new)
|
28
|
+
end
|
29
|
+
|
30
|
+
def respond_with_options
|
31
|
+
respond_with(Project.new, :to => [:xml, :json], :location => 'http://test.host/')
|
32
|
+
end
|
33
|
+
|
34
|
+
def skip_not_acceptable
|
35
|
+
respond_with(Project.new, :skip_not_acceptable => true)
|
36
|
+
render :text => 'Will not raise double render error.'
|
37
|
+
end
|
38
|
+
|
39
|
+
def respond_to_with_resource
|
40
|
+
respond_to(:with => Project.new)
|
41
|
+
end
|
42
|
+
|
43
|
+
def respond_to_with_resource_and_blocks
|
44
|
+
respond_to(:with => Project.new) do |format|
|
45
|
+
format.json { render :text => 'Render JSON' }
|
46
|
+
format.rss { render :text => 'Render RSS' }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class SuperProjectsController < ProjectsController
|
52
|
+
end
|
53
|
+
|
54
|
+
class RespondToUnitTest < Test::Unit::TestCase
|
55
|
+
def setup(class_controller = ProjectsController)
|
56
|
+
@controller = class_controller.new
|
57
|
+
@controller.request = @request = ActionController::TestRequest.new
|
58
|
+
@controller.response = @response = ActionController::TestResponse.new
|
59
|
+
|
60
|
+
@formats = @controller.formats_for_respond_to
|
61
|
+
@responder = ActionController::MimeResponds::Responder.new(@controller)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_respond_to_class_method_without_options
|
65
|
+
assert_nil @formats[:html][:only]
|
66
|
+
assert_nil @formats[:html][:except]
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_respond_to_class_method_inheritance
|
70
|
+
assert_nil @formats[:xml][:only]
|
71
|
+
assert_equal [:edit], @formats[:xml][:except]
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_respond_to_class_method_with_implicit_only
|
75
|
+
assert_equal [:edit], @formats[:rjs][:only]
|
76
|
+
assert_nil @formats[:rjs][:except]
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_respond_to_class_method_with_explicit_only
|
80
|
+
assert_equal [:index], @formats[:rss][:only]
|
81
|
+
assert_nil @formats[:rss][:except]
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_respond_to_class_method_with_explicit_except
|
85
|
+
assert_nil @formats[:json][:only]
|
86
|
+
assert_equal [:index], @formats[:json][:except]
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_action_respond_to_format
|
90
|
+
@controller.action_name = 'index'
|
91
|
+
assert @responder.action_respond_to_format?('html') # defined
|
92
|
+
assert @responder.action_respond_to_format?('xml') # inherited
|
93
|
+
assert @responder.action_respond_to_format?('rss') # explicit only
|
94
|
+
assert !@responder.action_respond_to_format?('json') # exception
|
95
|
+
|
96
|
+
@controller.action_name = 'edit'
|
97
|
+
assert !@responder.action_respond_to_format?('xml') # inherited
|
98
|
+
assert @responder.action_respond_to_format?('rjs') # implicit only
|
99
|
+
assert @responder.action_respond_to_format?('json') # exception
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_action_respond_to_format_with_additional_mimes
|
103
|
+
assert @responder.action_respond_to_format?('html', [:xml, :html, :json])
|
104
|
+
assert !@responder.action_respond_to_format?('html', [:xml, :rss, :json])
|
105
|
+
|
106
|
+
@controller.action_name = 'index'
|
107
|
+
assert @responder.action_respond_to_format?('html', [])
|
108
|
+
assert !@responder.action_respond_to_format?('json', [])
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_clear_respond_to
|
112
|
+
setup(SuperProjectsController)
|
113
|
+
|
114
|
+
# Those responses are inherited from ProjectsController
|
115
|
+
@controller.action_name = 'index'
|
116
|
+
assert @responder.action_respond_to_format?('html') # defined
|
117
|
+
assert @responder.action_respond_to_format?('xml') # inherited
|
118
|
+
assert @responder.action_respond_to_format?('rss') # explicit only
|
119
|
+
|
120
|
+
# Let's clear respond_to definitions
|
121
|
+
SuperProjectsController.send(:clear_respond_to!)
|
122
|
+
|
123
|
+
assert !@responder.action_respond_to_format?('html')
|
124
|
+
assert !@responder.action_respond_to_format?('xml')
|
125
|
+
assert !@responder.action_respond_to_format?('rss')
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_respond_to_block_does_not_respond_to_mime_all
|
129
|
+
prepare_responder_to_respond!
|
130
|
+
|
131
|
+
@responder.respond_to_block
|
132
|
+
assert !@performed
|
133
|
+
assert !@responder.responded?
|
134
|
+
|
135
|
+
@responder.respond
|
136
|
+
assert @performed
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_respond_to_all_responds_to_mime_all
|
140
|
+
prepare_responder_to_respond!
|
141
|
+
|
142
|
+
@responder.respond_to_all
|
143
|
+
assert @performed
|
144
|
+
assert @responder.responded?
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_respond_to_all_responds_only_to_all
|
148
|
+
prepare_responder_to_respond!('text/html')
|
149
|
+
|
150
|
+
@responder.respond_to_all
|
151
|
+
assert !@performed
|
152
|
+
assert !@responder.responded?
|
153
|
+
end
|
154
|
+
|
155
|
+
protected
|
156
|
+
def prepare_responder_to_respond!(content_type = '*/*')
|
157
|
+
@request.accept = content_type
|
158
|
+
@responder = ActionController::MimeResponds::Responder.new(@controller)
|
159
|
+
@performed = false
|
160
|
+
|
161
|
+
# Mock template
|
162
|
+
template = mock()
|
163
|
+
@response.stubs(:template).returns(template)
|
164
|
+
template.stubs(:template_format=).returns(true)
|
165
|
+
|
166
|
+
respond_to_declaration = proc { |format|
|
167
|
+
format.html { @performed = true }
|
168
|
+
format.xml { }
|
169
|
+
}
|
170
|
+
|
171
|
+
respond_to_declaration.call(@responder)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
class RespondToFunctionalTest < Test::Unit::TestCase
|
176
|
+
def setup
|
177
|
+
@controller = ProjectsController.new
|
178
|
+
@controller.request = @request = ActionController::TestRequest.new
|
179
|
+
@controller.response = @response = ActionController::TestResponse.new
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_respond_with_layout_rendering
|
183
|
+
@request.accept = 'text/html'
|
184
|
+
get :index
|
185
|
+
assert_equal 'Index HTML', @response.body.strip
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_respond_with_calls_to_format_on_resource
|
189
|
+
@request.accept = 'application/xml'
|
190
|
+
get :index
|
191
|
+
assert_equal 'Generated XML', @response.body.strip
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_respond_with_inherits_format
|
195
|
+
@request.accept = 'application/xml'
|
196
|
+
get :index
|
197
|
+
assert_equal 'Generated XML', @response.body.strip
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_respond_with_renders_status_not_acceptable_if_mime_type_is_not_registered
|
201
|
+
@request.accept = 'application/json'
|
202
|
+
get :index
|
203
|
+
assert_equal '406 Not Acceptable', @response.status
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_respond_with_renders_not_found_when_mime_type_is_valid_but_could_not_render
|
207
|
+
@request.accept = 'application/rss+xml'
|
208
|
+
get :index
|
209
|
+
assert_equal '404 Not Found', @response.status
|
210
|
+
end
|
211
|
+
|
212
|
+
def test_respond_to_all
|
213
|
+
@request.accept = '*/*'
|
214
|
+
get :index
|
215
|
+
assert_equal 'Index HTML', @response.body.strip
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_respond_with_sets_content_type_properly
|
219
|
+
@request.accept = 'text/html'
|
220
|
+
get :index
|
221
|
+
assert_equal 'text/html', @response.content_type
|
222
|
+
assert_equal :html, @response.template.template_format
|
223
|
+
|
224
|
+
@request.accept = 'application/xml'
|
225
|
+
get :index
|
226
|
+
assert_equal 'application/xml', @response.content_type
|
227
|
+
assert_equal :xml, @response.template.template_format
|
228
|
+
end
|
229
|
+
|
230
|
+
def test_respond_with_when_to_is_given_as_option
|
231
|
+
@request.accept = 'text/html'
|
232
|
+
get :respond_with_options
|
233
|
+
assert_equal '406 Not Acceptable', @response.status
|
234
|
+
|
235
|
+
@request.accept = 'application/xml'
|
236
|
+
get :respond_with_options
|
237
|
+
assert_equal 'Generated XML', @response.body.strip
|
238
|
+
end
|
239
|
+
|
240
|
+
def test_respond_with_forwads_extra_options_to_render
|
241
|
+
@request.accept = 'application/xml'
|
242
|
+
get :respond_with_options
|
243
|
+
assert_equal 'Generated XML', @response.body.strip
|
244
|
+
assert_equal 'http://test.host/', @response.headers['Location']
|
245
|
+
end
|
246
|
+
|
247
|
+
def test_respond_with_skips_head_when_skip_not_acceptable_is_given
|
248
|
+
@request.accept = 'application/rss+xml'
|
249
|
+
get :skip_not_acceptable
|
250
|
+
assert_equal 'Will not raise double render error.', @response.body.strip
|
251
|
+
end
|
252
|
+
|
253
|
+
def test_respond_to_when_a_resource_is_given_as_option
|
254
|
+
@request.accept = 'text/html'
|
255
|
+
get :respond_to_with_resource
|
256
|
+
assert_equal 'RespondTo HTML', @response.body.strip
|
257
|
+
|
258
|
+
@request.accept = 'application/xml'
|
259
|
+
get :respond_to_with_resource
|
260
|
+
assert_equal 'Generated XML', @response.body.strip
|
261
|
+
|
262
|
+
@request.accept = 'application/json'
|
263
|
+
get :respond_to_with_resource
|
264
|
+
assert_equal '404 Not Found', @response.status
|
265
|
+
|
266
|
+
@request.accept = 'application/rss+xml'
|
267
|
+
get :respond_to_with_resource
|
268
|
+
assert_equal '406 Not Acceptable', @response.status
|
269
|
+
end
|
270
|
+
|
271
|
+
def test_respond_to_overwrite_class_method_definition
|
272
|
+
@request.accept = 'application/rss+xml'
|
273
|
+
get :respond_to_with_resource_and_blocks
|
274
|
+
assert_equal 'Render RSS', @response.body.strip
|
275
|
+
end
|
276
|
+
|
277
|
+
def test_respond_to_fallback_to_first_block_when_mime_type_is_all
|
278
|
+
@request.accept = '*/*'
|
279
|
+
get :respond_to_with_resource_and_blocks
|
280
|
+
assert_equal 'Render JSON', @response.body.strip
|
281
|
+
end
|
282
|
+
end
|