richzhou-rspec-rails 1.3.4
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/.document +7 -0
- data/.gitignore +8 -0
- data/Contribute.rdoc +4 -0
- data/Gemfile +4 -0
- data/History.rdoc +321 -0
- data/License.txt +33 -0
- data/Manifest.txt +165 -0
- data/README.rdoc +48 -0
- data/Rakefile +12 -0
- data/TODO.txt +17 -0
- data/Upgrade.rdoc +148 -0
- data/generators/integration_spec/integration_spec_generator.rb +10 -0
- data/generators/integration_spec/templates/integration_spec.rb +4 -0
- data/generators/rspec/CHANGES +1 -0
- data/generators/rspec/rspec_generator.rb +72 -0
- data/generators/rspec/templates/previous_failures.txt +0 -0
- data/generators/rspec/templates/rcov.opts +2 -0
- data/generators/rspec/templates/rspec.rake +146 -0
- data/generators/rspec/templates/script/autospec +6 -0
- data/generators/rspec/templates/script/spec +10 -0
- data/generators/rspec/templates/spec.opts +4 -0
- data/generators/rspec/templates/spec_helper.rb +54 -0
- data/generators/rspec_controller/USAGE +33 -0
- data/generators/rspec_controller/rspec_controller_generator.rb +47 -0
- data/generators/rspec_controller/templates/controller_spec.rb +25 -0
- data/generators/rspec_controller/templates/helper_spec.rb +11 -0
- data/generators/rspec_controller/templates/view_spec.rb +12 -0
- data/generators/rspec_default_values.rb +28 -0
- data/generators/rspec_model/USAGE +18 -0
- data/generators/rspec_model/rspec_model_generator.rb +35 -0
- data/generators/rspec_model/templates/model_spec.rb +13 -0
- data/generators/rspec_scaffold/rspec_scaffold_generator.rb +154 -0
- data/generators/rspec_scaffold/templates/controller_spec.rb +131 -0
- data/generators/rspec_scaffold/templates/edit_erb_spec.rb +25 -0
- data/generators/rspec_scaffold/templates/helper_spec.rb +11 -0
- data/generators/rspec_scaffold/templates/index_erb_spec.rb +27 -0
- data/generators/rspec_scaffold/templates/new_erb_spec.rb +25 -0
- data/generators/rspec_scaffold/templates/routing_spec.rb +33 -0
- data/generators/rspec_scaffold/templates/show_erb_spec.rb +22 -0
- data/init.rb +9 -0
- data/lib/autotest/discover.rb +5 -0
- data/lib/autotest/rails_rspec.rb +76 -0
- data/lib/spec/rails.rb +26 -0
- data/lib/spec/rails/example.rb +48 -0
- data/lib/spec/rails/example/assigns_hash_proxy.rb +39 -0
- data/lib/spec/rails/example/controller_example_group.rb +285 -0
- data/lib/spec/rails/example/cookies_proxy.rb +29 -0
- data/lib/spec/rails/example/functional_example_group.rb +106 -0
- data/lib/spec/rails/example/helper_example_group.rb +153 -0
- data/lib/spec/rails/example/integration_example_group.rb +16 -0
- data/lib/spec/rails/example/model_example_group.rb +15 -0
- data/lib/spec/rails/example/render_observer.rb +82 -0
- data/lib/spec/rails/example/routing_example_group.rb +16 -0
- data/lib/spec/rails/example/routing_helpers.rb +66 -0
- data/lib/spec/rails/example/view_example_group.rb +203 -0
- data/lib/spec/rails/extensions.rb +11 -0
- data/lib/spec/rails/extensions/action_controller/rescue.rb +42 -0
- data/lib/spec/rails/extensions/action_controller/test_case.rb +16 -0
- data/lib/spec/rails/extensions/action_controller/test_response.rb +21 -0
- data/lib/spec/rails/extensions/action_view/base.rb +35 -0
- data/lib/spec/rails/extensions/active_record/base.rb +45 -0
- data/lib/spec/rails/extensions/active_support/test_case.rb +7 -0
- data/lib/spec/rails/extensions/spec/matchers/have.rb +23 -0
- data/lib/spec/rails/extensions/spec/runner/configuration.rb +45 -0
- data/lib/spec/rails/interop/testcase.rb +14 -0
- data/lib/spec/rails/matchers.rb +32 -0
- data/lib/spec/rails/matchers/ar_be_valid.rb +27 -0
- data/lib/spec/rails/matchers/assert_select.rb +180 -0
- data/lib/spec/rails/matchers/change.rb +13 -0
- data/lib/spec/rails/matchers/have_text.rb +57 -0
- data/lib/spec/rails/matchers/include_text.rb +54 -0
- data/lib/spec/rails/matchers/redirect_to.rb +126 -0
- data/lib/spec/rails/matchers/render_template.rb +129 -0
- data/lib/spec/rails/matchers/route_to.rb +149 -0
- data/lib/spec/rails/mocks.rb +140 -0
- data/lib/spec/rails/version.rb +16 -0
- data/rspec-rails.gemspec +25 -0
- data/spec/autotest/mappings_spec.rb +86 -0
- data/spec/rails_suite.rb +7 -0
- data/spec/resources/controllers/action_view_base_spec_controller.rb +2 -0
- data/spec/resources/controllers/application.rb +9 -0
- data/spec/resources/controllers/controller_spec_controller.rb +127 -0
- data/spec/resources/controllers/example.txt +1 -0
- data/spec/resources/controllers/redirect_spec_controller.rb +70 -0
- data/spec/resources/controllers/render_spec_controller.rb +34 -0
- data/spec/resources/controllers/rjs_spec_controller.rb +58 -0
- data/spec/resources/helpers/addition_helper.rb +5 -0
- data/spec/resources/helpers/explicit_helper.rb +46 -0
- data/spec/resources/helpers/more_explicit_helper.rb +5 -0
- data/spec/resources/helpers/plugin_application_helper.rb +6 -0
- data/spec/resources/helpers/view_spec_helper.rb +13 -0
- data/spec/resources/models/animal.rb +4 -0
- data/spec/resources/models/person.rb +18 -0
- data/spec/resources/models/thing.rb +3 -0
- data/spec/resources/views/controller_spec/_partial.html.erb +0 -0
- data/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.html.erb +1 -0
- data/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.html.erb +1 -0
- data/spec/resources/views/controller_spec/action_setting_the_assigns_hash.html.erb +0 -0
- data/spec/resources/views/controller_spec/action_with_errors_in_template.html.erb +1 -0
- data/spec/resources/views/controller_spec/action_with_template.html.erb +1 -0
- data/spec/resources/views/controller_spec/non_existent_action_with_existent_template.html.erb +1 -0
- data/spec/resources/views/layouts/application.html.erb +0 -0
- data/spec/resources/views/layouts/simple.html.erb +0 -0
- data/spec/resources/views/objects/_object.html.erb +1 -0
- data/spec/resources/views/render_spec/_a_partial.html.erb +0 -0
- data/spec/resources/views/render_spec/action_with_alternate_layout.html.erb +0 -0
- data/spec/resources/views/render_spec/some_action.html.erb +0 -0
- data/spec/resources/views/render_spec/some_action.js.rjs +1 -0
- data/spec/resources/views/rjs_spec/_replacement_partial.html.erb +1 -0
- data/spec/resources/views/rjs_spec/hide_div.js.rjs +1 -0
- data/spec/resources/views/rjs_spec/hide_page_element.js.rjs +1 -0
- data/spec/resources/views/rjs_spec/insert_html.js.rjs +1 -0
- data/spec/resources/views/rjs_spec/replace.js.rjs +1 -0
- data/spec/resources/views/rjs_spec/replace_html.js.rjs +1 -0
- data/spec/resources/views/rjs_spec/replace_html_with_partial.js.rjs +1 -0
- data/spec/resources/views/rjs_spec/visual_effect.js.rjs +1 -0
- data/spec/resources/views/rjs_spec/visual_toggle_effect.js.rjs +1 -0
- data/spec/resources/views/tag_spec/no_tags.html.erb +1 -0
- data/spec/resources/views/tag_spec/single_div_with_no_attributes.html.erb +1 -0
- data/spec/resources/views/tag_spec/single_div_with_one_attribute.html.erb +1 -0
- data/spec/resources/views/view_spec/_partial.html.erb +2 -0
- data/spec/resources/views/view_spec/_partial_used_twice.html.erb +0 -0
- data/spec/resources/views/view_spec/_partial_with_local_variable.html.erb +1 -0
- data/spec/resources/views/view_spec/_partial_with_sub_partial.html.erb +1 -0
- data/spec/resources/views/view_spec/_spacer.html.erb +1 -0
- data/spec/resources/views/view_spec/accessor.html.erb +6 -0
- data/spec/resources/views/view_spec/block_helper.html.erb +3 -0
- data/spec/resources/views/view_spec/entry_form.html.erb +2 -0
- data/spec/resources/views/view_spec/explicit_helper.html.erb +2 -0
- data/spec/resources/views/view_spec/foo/show.html.erb +1 -0
- data/spec/resources/views/view_spec/implicit_helper.html.erb +2 -0
- data/spec/resources/views/view_spec/multiple_helpers.html.erb +3 -0
- data/spec/resources/views/view_spec/path_params.html.erb +1 -0
- data/spec/resources/views/view_spec/should_not_receive.html.erb +3 -0
- data/spec/resources/views/view_spec/template_with_partial.html.erb +5 -0
- data/spec/resources/views/view_spec/template_with_partial_using_collection.html.erb +3 -0
- data/spec/resources/views/view_spec/template_with_partial_with_array.html.erb +1 -0
- data/spec/resources/views/view_spec/view_helpers.html.erb +1 -0
- data/spec/spec/rails/example/assigns_hash_proxy_spec.rb +109 -0
- data/spec/spec/rails/example/configuration_spec.rb +67 -0
- data/spec/spec/rails/example/controller_example_group_spec.rb +307 -0
- data/spec/spec/rails/example/controller_isolation_spec.rb +75 -0
- data/spec/spec/rails/example/cookies_proxy_spec.rb +87 -0
- data/spec/spec/rails/example/error_handling_spec.rb +90 -0
- data/spec/spec/rails/example/example_group_factory_spec.rb +112 -0
- data/spec/spec/rails/example/helper_example_group_spec.rb +247 -0
- data/spec/spec/rails/example/model_example_group_spec.rb +32 -0
- data/spec/spec/rails/example/routing_example_group_spec.rb +9 -0
- data/spec/spec/rails/example/shared_routing_example_group_examples.rb +241 -0
- data/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb +33 -0
- data/spec/spec/rails/example/view_example_group_spec.rb +346 -0
- data/spec/spec/rails/extensions/action_view_base_spec.rb +79 -0
- data/spec/spec/rails/extensions/active_record_spec.rb +14 -0
- data/spec/spec/rails/interop/testcase_spec.rb +70 -0
- data/spec/spec/rails/matchers/ar_be_valid_spec.rb +19 -0
- data/spec/spec/rails/matchers/assert_select_spec.rb +835 -0
- data/spec/spec/rails/matchers/errors_on_spec.rb +37 -0
- data/spec/spec/rails/matchers/have_text_spec.rb +69 -0
- data/spec/spec/rails/matchers/include_text_spec.rb +62 -0
- data/spec/spec/rails/matchers/redirect_to_spec.rb +253 -0
- data/spec/spec/rails/matchers/render_template_spec.rb +208 -0
- data/spec/spec/rails/matchers/should_change_spec.rb +15 -0
- data/spec/spec/rails/mocks/ar_classes.rb +10 -0
- data/spec/spec/rails/mocks/mock_model_spec.rb +112 -0
- data/spec/spec/rails/mocks/stub_model_spec.rb +80 -0
- data/spec/spec/rails/sample_modified_fixture.rb +8 -0
- data/spec/spec/rails/sample_spec.rb +8 -0
- data/spec/spec/rails/spec_spec.rb +11 -0
- data/spec/spec_helper.rb +78 -0
- metadata +363 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Rails
|
5
|
+
module Example
|
6
|
+
describe ModelExampleGroup do
|
7
|
+
accesses_configured_helper_methods
|
8
|
+
|
9
|
+
if defined?(ActiveRecord::TestCase)
|
10
|
+
it "derives from ActiveRecord::TestCase" do
|
11
|
+
group = describe("foo", :type => :model) do; end
|
12
|
+
group.ancestors.should include(ActiveRecord::TestCase)
|
13
|
+
end
|
14
|
+
else
|
15
|
+
it "derives from ActiveSupport::TestCase" do
|
16
|
+
group = describe("foo", :type => :model) do; end
|
17
|
+
group.ancestors.should include(ActiveSupport::TestCase)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it "clears its name from the description" do
|
22
|
+
group = describe("foo", :type => :model) do
|
23
|
+
$nested_group = describe("bar") do
|
24
|
+
end
|
25
|
+
end
|
26
|
+
group.description.to_s.should == "foo"
|
27
|
+
$nested_group.description.to_s.should == "foo bar"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'controller_spec_controller'
|
3
|
+
require File.join(File.dirname(__FILE__), "/shared_routing_example_group_examples.rb")
|
4
|
+
|
5
|
+
describe "Routing Examples", :type => :routing do
|
6
|
+
it_should_behave_like "a routing example"
|
7
|
+
it_should_behave_like "a be routable spec"
|
8
|
+
it_should_behave_like "a route to spec"
|
9
|
+
end
|
@@ -0,0 +1,241 @@
|
|
1
|
+
class CustomRouteSpecController < ActionController::Base; end
|
2
|
+
class RspecOnRailsSpecsController < ActionController::Base; end
|
3
|
+
|
4
|
+
shared_examples_for "a routing example" do
|
5
|
+
describe "using backward compatible route_for()" do
|
6
|
+
it "translates GET-only paths to be explicit" do
|
7
|
+
self.should_receive(:assert_routing).with(hash_including(:method => :get), anything, {}, anything)
|
8
|
+
route_for(:controller => "controller_spec", :action => "some_action").
|
9
|
+
should == "/controller_spec/some_action"
|
10
|
+
end
|
11
|
+
|
12
|
+
it "uses assert_routing to specify that the :controller and :action are involved" do
|
13
|
+
@route = { :controller => "controller_spec", :action => "some_action" }
|
14
|
+
self.should_receive(:assert_routing).with(anything, @route, {}, anything)
|
15
|
+
route_for(@route).
|
16
|
+
should == "/controller_spec/some_action"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "passes extra args through to assert_routing" do
|
20
|
+
@route = { :controller => "controller_spec", :action => "some_action" }
|
21
|
+
self.should_receive(:assert_routing).with(anything, anything, {}, { :a => "1", :b => "2" } )
|
22
|
+
route_for(@route).
|
23
|
+
should == "/controller_spec/some_action?a=1&b=2"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "passes with an existing route" do
|
27
|
+
route_for(:controller => "controller_spec", :action => "some_action").
|
28
|
+
should == "/controller_spec/some_action"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "passes with an existing route with additional parameters" do
|
32
|
+
route_for(:controller => "controller_spec", :action => "some_action", :param => '1').
|
33
|
+
should == "/controller_spec/some_action?param=1"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "recognizes routes with methods besides :get" do
|
37
|
+
should_receive(:assert_routing).with(hash_including(:method => :put), anything, {}, anything)
|
38
|
+
|
39
|
+
route_for(:controller => "rspec_on_rails_specs", :action => "update", :id => "37").
|
40
|
+
should == {:path => "/rspec_on_rails_specs/37", :method => :put}
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "failing due to bad path:" do
|
44
|
+
it "raises routing error and suggests should_not be_routeable()" do
|
45
|
+
lambda {
|
46
|
+
route_for(:controller => "rspec_on_rails_specs", :action => "nonexistent", :id => "37") ==
|
47
|
+
{:path => "/rspec_on_rails_specs/bad_route/37", :method => :put}
|
48
|
+
}.should raise_error( ActionController::RoutingError, /suggest.*should_not be_routable/ )
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "failing due to params mismatch:" do
|
53
|
+
it "re-raises assertion and suggests should_not be_routeable()" do
|
54
|
+
lambda {
|
55
|
+
route_for(:controller => "rspec_on_rails_specs", :action => "nonexistent", :id => "37") ==
|
56
|
+
{:path => "/rspec_on_rails_specs/37", :method => :put}
|
57
|
+
}.should raise_error( ::Test::Unit::AssertionFailedError, /suggest.*should_not be_routable/ )
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "failing due to wrong HTTP method" do
|
62
|
+
it "raises method error and suggest should_not be_routable()" do
|
63
|
+
lambda {
|
64
|
+
route_for(:controller => "rspec_on_rails_specs", :action => "update", :id => "37").
|
65
|
+
should == {:path => "/rspec_on_rails_specs/37", :method => :post}
|
66
|
+
}.should raise_error(ActionController::MethodNotAllowed) { |error| error.should_not =~ /should_not be_routable/ }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
it "generates params for custom routes" do
|
71
|
+
# redundant, deprecated
|
72
|
+
params_from(:get, '/custom_route').
|
73
|
+
should == {:controller => "custom_route_spec", :action => "custom_route"}
|
74
|
+
end
|
75
|
+
|
76
|
+
it "generates params for existing routes" do
|
77
|
+
# redundant, deprecated
|
78
|
+
params_from(:get, '/controller_spec/some_action').
|
79
|
+
should == {:controller => "controller_spec", :action => "some_action"}
|
80
|
+
end
|
81
|
+
|
82
|
+
it "generates params for existing routes with a query parameters" do
|
83
|
+
# redundant, deprecated
|
84
|
+
params_from(:get, '/controller_spec/some_action?param=1').
|
85
|
+
should == {:controller => "controller_spec", :action => "some_action", :param => '1'}
|
86
|
+
end
|
87
|
+
|
88
|
+
it "generates params for existing routes with multiple query parameters" do
|
89
|
+
# redundant, deprecated
|
90
|
+
params_from(:get, '/controller_spec/some_action?param1=1¶m2=2').
|
91
|
+
should == {:controller => "controller_spec", :action => "some_action", :param1 => '1', :param2 => '2' }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
shared_examples_for "a be routable spec" do
|
97
|
+
describe "using should_not be_routable()" do
|
98
|
+
it "passes for a bad route" do
|
99
|
+
{ :put => "/rspec_on_rails_specs/bad_route/37" }.
|
100
|
+
should_not be_routable
|
101
|
+
end
|
102
|
+
it "passes for a bad route having an arg" do
|
103
|
+
{ :put => "/rspec_on_rails_specs/bad_route/37?some_arg=1" }.
|
104
|
+
should_not be_routable
|
105
|
+
end
|
106
|
+
describe "when assert_recognizes throws exceptions:" do
|
107
|
+
[ ActionController::RoutingError, ActionController::MethodNotAllowed ].each do |e|
|
108
|
+
it "passes on #{e}" do
|
109
|
+
self.stub!( :assert_recognizes ).and_return { raise e, "stubbed exception" }
|
110
|
+
{ :get => "/rspec_on_rails_spec/bad_route/37" }.should_not be_routable
|
111
|
+
end
|
112
|
+
it "should be_routable on usual Test::Unit::AssertionFailedError" do
|
113
|
+
# <{}> is predictable because of the way we call assert_recognizes during be_routable().
|
114
|
+
self.stub!( :assert_recognizes ).and_return { raise ::Test::Unit::AssertionFailedError, "<{a}> did not match <{}>" }
|
115
|
+
{ :get => "/rspec_on_rails_spec/arguably_bad_route" }.should be_routable
|
116
|
+
end
|
117
|
+
it "should be_routable even when Test::Unit::AssertionFailedError has line breaks in the message" do
|
118
|
+
self.stub!( :assert_recognizes ).and_return { raise ::Test::Unit::AssertionFailedError, "<{a => b,\nc => d}> did not match <{}>" }
|
119
|
+
{ :get => "/rspec_on_rails_spec/arguably_bad_route" }.should be_routable
|
120
|
+
end
|
121
|
+
it "should re-raise on unusual Test::Unit::AssertionFailedError" do
|
122
|
+
self.stub!( :assert_recognizes ).and_return { raise ::Test::Unit::AssertionFailedError, "some other message" }
|
123
|
+
expect { { :get => "/rspec_on_rails_spec/weird_case_route/" }.should be_routable }.
|
124
|
+
to raise_error
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
it "test should be_routable" do
|
129
|
+
{ :get => "/custom_route" }.
|
130
|
+
should be_routable
|
131
|
+
end
|
132
|
+
|
133
|
+
it "recommends route_to() on failure with should()" do
|
134
|
+
lambda {
|
135
|
+
{ :get => "/nonexisting_route" }.
|
136
|
+
should be_routable
|
137
|
+
}.should raise_error( /route_to\(/)
|
138
|
+
end
|
139
|
+
|
140
|
+
it "shows actual route that was generated on failure with should_not()" do
|
141
|
+
begin
|
142
|
+
{ :get => "/custom_route" }.should_not be_routable
|
143
|
+
rescue Exception => e
|
144
|
+
ensure
|
145
|
+
# Different versions of ruby order these differently
|
146
|
+
e.message.should =~ /"action"=>"custom_route"/
|
147
|
+
e.message.should =~ /"controller"=>"custom_route_spec"/
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
it "works with routeable (alternate spelling)" do
|
152
|
+
{ :put => "/nonexisting_route" }.
|
153
|
+
should_not be_routeable
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
shared_examples_for "a route to spec" do
|
159
|
+
describe "using should[_not] route_to()" do
|
160
|
+
it "supports existing routes" do
|
161
|
+
{ :get => "/controller_spec/some_action" }.
|
162
|
+
should route_to( :controller => "controller_spec", :action => "some_action" )
|
163
|
+
end
|
164
|
+
|
165
|
+
it "translates GET-only paths to be explicit, when matching against a string (for parity with route_for().should == '/path')" do
|
166
|
+
self.should_receive(:assert_routing).with(hash_including(:method => :get), anything, {}, anything)
|
167
|
+
"/controller_spec/some_action".
|
168
|
+
should route_to({})
|
169
|
+
end
|
170
|
+
|
171
|
+
it "asserts, using assert_routing, that the :controller and :action are involved" do
|
172
|
+
@route = { :controller => "controller_spec", :action => "some_action" }
|
173
|
+
self.should_receive(:assert_routing).with(anything, @route, {}, anything)
|
174
|
+
"/controller_spec/some_action".
|
175
|
+
should route_to(@route)
|
176
|
+
end
|
177
|
+
|
178
|
+
it "sends extra args through" do
|
179
|
+
@route = { :controller => "controller_spec", :action => "some_action" }
|
180
|
+
self.should_receive(:assert_routing).with(anything, anything, {}, { :a => "1", :b => "2" } )
|
181
|
+
"/controller_spec/some_action?a=1&b=2".
|
182
|
+
should route_to( @route )
|
183
|
+
end
|
184
|
+
|
185
|
+
it "supports routes with additional parameters" do
|
186
|
+
{ :get => "/controller_spec/some_action?param=1" }.
|
187
|
+
should route_to( :controller => "controller_spec", :action => "some_action", :param => '1' )
|
188
|
+
end
|
189
|
+
|
190
|
+
it "recognizes routes with methods besides :get" do
|
191
|
+
self.should_receive(:assert_routing).with(hash_including(:method => :put), anything, {}, anything)
|
192
|
+
{ :put => "/rspec_on_rails_specs/37" }.
|
193
|
+
should route_to(:controller => "rspec_on_rails_specs", :action => "update", :id => "37")
|
194
|
+
end
|
195
|
+
|
196
|
+
it "allows only one key/value in the path - :method => path" do
|
197
|
+
lambda {
|
198
|
+
{ :a => "b" ,:c => "d" }.
|
199
|
+
should route_to("anything")
|
200
|
+
}.should raise_error( ArgumentError, /usage/ )
|
201
|
+
end
|
202
|
+
|
203
|
+
describe "failing due to bad path" do
|
204
|
+
it "raises routing error, and suggests should_not be_routeable()" do
|
205
|
+
lambda {
|
206
|
+
{ :put => "/rspec_on_rails_specs/nonexistent/37" }.
|
207
|
+
should route_to(:controller => "rspec_on_rails_specs", :action => "nonexistent", :id => "37")
|
208
|
+
}.should raise_error( ActionController::RoutingError, /suggest.*nonexistent.*should_not be_routable/ )
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
describe "failing due to params mismatch" do
|
213
|
+
it "raises assertion, and suggests should_not be_routeable()" do
|
214
|
+
lambda {
|
215
|
+
{ :put => "/rspec_on_rails_specs/37" }.
|
216
|
+
should route_to(:controller => "rspec_on_rails_specs", :action => "nonexistent", :id => "37")
|
217
|
+
}.should raise_error( ::Test::Unit::AssertionFailedError, /suggest.*rspec_on_rails_specs\/37.*should_not be_routable/ )
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
describe "passing when expected failure" do
|
222
|
+
it "suggests should_not be_routable()" do
|
223
|
+
self.stub!(:assert_routing).and_return true
|
224
|
+
lambda {
|
225
|
+
{ :put => "/rspec_on_rails_specs/37" }.
|
226
|
+
should_not route_to(:controller => "rspec_on_rails_specs", :action => "update", :id => "37")
|
227
|
+
}.should raise_error( /expected a routing error.*be_routable/im )
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
describe "failing due to wrong HTTP method" do
|
232
|
+
it "raises method error and suggests should_not be_routable()" do
|
233
|
+
self.stub!(:assert_routing) { raise ActionController::MethodNotAllowed }
|
234
|
+
lambda {
|
235
|
+
{ :post => "/rspec_on_rails_specs/37" }.
|
236
|
+
should route_to(:controller => "rspec_on_rails_specs", :action => "update", :id => "37" )
|
237
|
+
}.should raise_error(ActionController::MethodNotAllowed, /rspec_on_rails_specs\/37.*should_not be_routable/ )
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "assert_equal", :shared => true do
|
4
|
+
it "like assert_equal" do
|
5
|
+
assert_equal 1, 1
|
6
|
+
lambda {
|
7
|
+
assert_equal 1, 2
|
8
|
+
}.should raise_error(::Test::Unit::AssertionFailedError)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "A model spec should be able to access 'test/unit' assertions", :type => :model do
|
13
|
+
it_should_behave_like "assert_equal"
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "A view spec should be able to access 'test/unit' assertions", :type => :view do
|
17
|
+
it_should_behave_like "assert_equal"
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "A helper spec should be able to access 'test/unit' assertions", :type => :helper do
|
21
|
+
it_should_behave_like "assert_equal"
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "A controller spec with integrated views should be able to access 'test/unit' assertions", :type => :controller do
|
25
|
+
controller_name :controller_spec
|
26
|
+
integrate_views
|
27
|
+
it_should_behave_like "assert_equal"
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "A controller spec should be able to access 'test/unit' assertions", :type => :controller do
|
31
|
+
controller_name :controller_spec
|
32
|
+
it_should_behave_like "assert_equal"
|
33
|
+
end
|
@@ -0,0 +1,346 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "A template with an implicit helper", :type => :view do
|
4
|
+
before(:each) do
|
5
|
+
render "view_spec/implicit_helper"
|
6
|
+
end
|
7
|
+
|
8
|
+
accesses_configured_helper_methods
|
9
|
+
|
10
|
+
it "should include the helper" do
|
11
|
+
response.should have_tag('div', :content => "This is text from a method in the ViewSpecHelper")
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should include the application helper" do
|
15
|
+
response.should have_tag('div', :content => "This is text from a method in the ApplicationHelper")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should have access to named routes" do
|
19
|
+
rspec_on_rails_specs_url.should == "http://test.host/rspec_on_rails_specs"
|
20
|
+
rspec_on_rails_specs_path.should == "/rspec_on_rails_specs"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "A template requiring an explicit helper", :type => :view do
|
25
|
+
before(:each) do
|
26
|
+
render "view_spec/explicit_helper", :helper => 'explicit'
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should include the helper if specified" do
|
30
|
+
response.should have_tag('div', :content => "This is text from a method in the ExplicitHelper")
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should include the application helper" do
|
34
|
+
response.should have_tag('div', :content => "This is text from a method in the ApplicationHelper")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "A template requiring multiple explicit helpers", :type => :view do
|
39
|
+
before(:each) do
|
40
|
+
render "view_spec/multiple_helpers", :helpers => ['explicit', 'more_explicit']
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should include all specified helpers" do
|
44
|
+
response.should have_tag('div', :content => "This is text from a method in the ExplicitHelper")
|
45
|
+
response.should have_tag('div', :content => "This is text from a method in the MoreExplicitHelper")
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should include the application helper" do
|
49
|
+
response.should have_tag('div', :content => "This is text from a method in the ApplicationHelper")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "Message Expectations on helper methods", :type => :view do
|
54
|
+
it "should work" do
|
55
|
+
template.should_receive(:method_in_plugin_application_helper).and_return('alternate message 1')
|
56
|
+
render "view_spec/implicit_helper"
|
57
|
+
response.body.should =~ /alternate message 1/
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should work twice" do
|
61
|
+
template.should_receive(:method_in_plugin_application_helper).and_return('alternate message 2')
|
62
|
+
render "view_spec/implicit_helper"
|
63
|
+
response.body.should =~ /alternate message 2/
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "A template that includes a partial", :type => :view do
|
68
|
+
def render!
|
69
|
+
render "view_spec/template_with_partial"
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should render the enclosing template" do
|
73
|
+
render!
|
74
|
+
response.should have_tag('div', "method_in_partial in ViewSpecHelper")
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should render the partial" do
|
78
|
+
render!
|
79
|
+
response.should have_tag('div', "method_in_template_with_partial in ViewSpecHelper")
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should include the application helper" do
|
83
|
+
render!
|
84
|
+
response.should have_tag('div', "This is text from a method in the ApplicationHelper")
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should pass should_receive(:render) with the right partial" do
|
88
|
+
template.should_receive(:render).with(:partial => 'partial')
|
89
|
+
render!
|
90
|
+
template.verify_rendered
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should fail should_receive(:render) with the wrong partial" do
|
94
|
+
template.should_receive(:render).with(:partial => 'non_existent')
|
95
|
+
render!
|
96
|
+
begin
|
97
|
+
template.verify_rendered
|
98
|
+
rescue Spec::Mocks::MockExpectationError => e
|
99
|
+
ensure
|
100
|
+
e.backtrace.find{|line| line =~ /#{__FILE__}\:#{__LINE__ - 6}/}.should_not be_nil
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should pass should_receive(:render) when a partial is expected twice and happens twice" do
|
105
|
+
template.should_receive(:render).with(:partial => 'partial_used_twice').twice
|
106
|
+
render!
|
107
|
+
template.verify_rendered
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should pass should_receive(:render) when a partial is expected once and happens twice" do
|
111
|
+
template.should_receive(:render).with(:partial => 'partial_used_twice')
|
112
|
+
render!
|
113
|
+
begin
|
114
|
+
template.verify_rendered
|
115
|
+
rescue Spec::Mocks::MockExpectationError => e
|
116
|
+
ensure
|
117
|
+
e.backtrace.find{|line| line =~ /#{__FILE__}\:#{__LINE__ - 6}/}.should_not be_nil
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should fail should_receive(:render) with the right partial but wrong options" do
|
122
|
+
template.should_receive(:render).with(:partial => 'partial', :locals => {:thing => Object.new})
|
123
|
+
render!
|
124
|
+
lambda {template.verify_rendered}.should raise_error(Spec::Mocks::MockExpectationError)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe "A partial that includes a partial", :type => :view do
|
129
|
+
it "should support should_receive(:render) with nested partial" do
|
130
|
+
obj = Object.new
|
131
|
+
template.should_receive(:render).with(:partial => 'partial', :object => obj)
|
132
|
+
render :partial => "view_spec/partial_with_sub_partial", :locals => { :partial => obj }
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
describe "A view that includes a partial using :collection and :spacer_template", :type => :view do
|
137
|
+
it "should render the partial w/ spacer_tamplate" do
|
138
|
+
render "view_spec/template_with_partial_using_collection"
|
139
|
+
response.should have_tag('div',/method_in_partial/)
|
140
|
+
response.should have_tag('div',/ApplicationHelper/)
|
141
|
+
response.should have_tag('div',/ViewSpecHelper/)
|
142
|
+
response.should have_tag('hr#spacer')
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should render the partial" do
|
146
|
+
template.should_receive(:render).with(:partial => 'partial',
|
147
|
+
:collection => ['Alice', 'Bob'],
|
148
|
+
:spacer_template => 'spacer')
|
149
|
+
render "view_spec/template_with_partial_using_collection"
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
describe "A view that includes a partial using an array as partial_path", :type => :view do
|
155
|
+
before(:each) do
|
156
|
+
renderable_object = Object.new
|
157
|
+
renderable_object.stub!(:name).and_return("Renderable Object")
|
158
|
+
assigns[:array] = [renderable_object]
|
159
|
+
end
|
160
|
+
|
161
|
+
it "should render the array passed through to render_partial without modification" do
|
162
|
+
render "view_spec/template_with_partial_with_array"
|
163
|
+
response.body.should match(/^Renderable Object$/)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
describe "Different types of renders (not :template)", :type => :view do
|
168
|
+
it "should render partial with local" do
|
169
|
+
render :partial => "view_spec/partial_with_local_variable", :locals => {:x => "Ender"}
|
170
|
+
response.should have_tag('div', :content => "Ender")
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
describe "A view", :type => :view do
|
175
|
+
before(:each) do
|
176
|
+
session[:key] = "session"
|
177
|
+
params[:key] = "params"
|
178
|
+
flash[:key] = "flash"
|
179
|
+
flash.now[:now_key] = "flash.now"
|
180
|
+
render "view_spec/accessor"
|
181
|
+
end
|
182
|
+
|
183
|
+
it "uses the template as the implicit subject" do
|
184
|
+
subject.should == template
|
185
|
+
end
|
186
|
+
|
187
|
+
it "has access to session data" do
|
188
|
+
response.should have_tag("div#session", "session")
|
189
|
+
end
|
190
|
+
|
191
|
+
it "has access to params data" do
|
192
|
+
response.should have_tag("div#params", "params")
|
193
|
+
end
|
194
|
+
|
195
|
+
it "has access to flash" do
|
196
|
+
response.should have_tag("div#flash", "flash")
|
197
|
+
end
|
198
|
+
|
199
|
+
it "has access to flash.now" do
|
200
|
+
response.should have_tag("div#flash_now", "flash.now")
|
201
|
+
end
|
202
|
+
|
203
|
+
it "has a controller param" do
|
204
|
+
response.should have_tag("div#controller", "view_spec")
|
205
|
+
end
|
206
|
+
|
207
|
+
it "has an action param" do
|
208
|
+
response.should have_tag("div#action", "accessor")
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
describe "A view with a form_tag", :type => :view do
|
213
|
+
it "should render the right action" do
|
214
|
+
render "view_spec/entry_form"
|
215
|
+
response.should have_tag("form[action=?]","/view_spec/entry_form")
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
describe "An instantiated ViewExampleGroupController", :type => :view do
|
220
|
+
before do
|
221
|
+
render "view_spec/foo/show"
|
222
|
+
end
|
223
|
+
|
224
|
+
it "should return the name of the real controller that it replaces" do
|
225
|
+
@controller.controller_name.should == 'foo'
|
226
|
+
end
|
227
|
+
|
228
|
+
it "should return the path of the real controller that it replaces" do
|
229
|
+
@controller.controller_path.should == 'view_spec/foo'
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
describe "a block helper", :type => :view do
|
234
|
+
it "should not yield when not told to in the example" do
|
235
|
+
template.should_receive(:if_allowed)
|
236
|
+
render "view_spec/block_helper"
|
237
|
+
response.should_not have_tag("div","block helper was rendered")
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should yield when told to in the example" do
|
241
|
+
template.should_receive(:if_allowed).and_yield
|
242
|
+
render "view_spec/block_helper"
|
243
|
+
response.should have_tag("div","block helper was rendered")
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
describe "render :inline => ...", :type => :view do
|
248
|
+
it "should render ERB right in the spec" do
|
249
|
+
render :inline => %|<%= text_field_tag('field_name', 'Value') %>|
|
250
|
+
response.should have_tag("input[type=?][name=?][value=?]","text","field_name","Value")
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
describe "render 'view_spec/foo/show'", :type => :view do
|
255
|
+
it "should derive action name using the first part of the template name" do
|
256
|
+
render 'view_spec/foo/show'
|
257
|
+
request.path_parameters[:action].should == 'show'
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
describe "view_spec/foo/show", :type => :view do
|
262
|
+
context "rendered with no args" do
|
263
|
+
it "renders just fine" do
|
264
|
+
render
|
265
|
+
request.path_parameters[:action].should == 'show'
|
266
|
+
end
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
describe "setting path parameters", :type => :view do
|
271
|
+
describe "(controller)" do
|
272
|
+
it "should supercede the default path parameters" do
|
273
|
+
render "view_spec/entry_form", :path_parameters => {:controller => 'foo'}
|
274
|
+
request.path_parameters[:controller].should == 'foo'
|
275
|
+
end
|
276
|
+
end
|
277
|
+
describe "(action)" do
|
278
|
+
it "should supercede the default path parameters" do
|
279
|
+
render "view_spec/entry_form", :path_parameters => {:action => 'foo'}
|
280
|
+
request.path_parameters[:action].should == 'foo'
|
281
|
+
end
|
282
|
+
end
|
283
|
+
describe "(something arbitrary)" do
|
284
|
+
it "should supercede the default path parameters" do
|
285
|
+
render "view_spec/entry_form", :path_parameters => {:foo => 'bar'}
|
286
|
+
request.path_parameters[:foo].should == 'bar'
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
describe "route helpers", :type => :view do
|
292
|
+
it "should be available before render is called" do
|
293
|
+
custom_route_path.should == '/custom_route'
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
module Spec
|
298
|
+
module Rails
|
299
|
+
module Example
|
300
|
+
describe ViewExampleGroup do
|
301
|
+
it "should clear its name from the description" do
|
302
|
+
group = describe("foo", :type => :view) do
|
303
|
+
$nested_group = describe("bar") do
|
304
|
+
end
|
305
|
+
end
|
306
|
+
group.description.to_s.should == "foo"
|
307
|
+
$nested_group.description.to_s.should == "foo bar"
|
308
|
+
end
|
309
|
+
|
310
|
+
it "should clear ActionView::Base.base_view_path on teardown" do
|
311
|
+
group = describe("base_view_path_cleared flag", :type => :view) {}
|
312
|
+
example = group.new(Spec::Example::ExampleProxy.new) {}
|
313
|
+
|
314
|
+
ActionView::Base.should_receive(:base_view_path=).with(nil)
|
315
|
+
example.run_after_each
|
316
|
+
end
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
describe "bug http://rspec.lighthouseapp.com/projects/5645/tickets/510", :type => :view do
|
323
|
+
describe "a view example with should_not_receive" do
|
324
|
+
it "should render the view" do
|
325
|
+
obj = mock('model')
|
326
|
+
obj.should_receive(:render_partial?).and_return false
|
327
|
+
assigns[:obj] = obj
|
328
|
+
template.should_not_receive(:render).with(:partial => 'some_partial')
|
329
|
+
render "view_spec/should_not_receive"
|
330
|
+
end
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
describe "bug https://rspec.lighthouseapp.com/projects/5645/tickets/787", :type => :view do
|
335
|
+
describe "a view example checking a link" do
|
336
|
+
it "should have access to link_to" do
|
337
|
+
render "view_spec/view_helpers"
|
338
|
+
response.body.should include(link_to("edit", "this_is_the_link"))
|
339
|
+
end
|
340
|
+
|
341
|
+
it "should use link_to within have_tag" do
|
342
|
+
render "view_spec/view_helpers"
|
343
|
+
response.body.should have_tag("span", :html => link_to("edit", "this_is_the_link"))
|
344
|
+
end
|
345
|
+
end
|
346
|
+
end
|