rspec-rails-w-factory_girl 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. data/.document +7 -0
  2. data/Contribute.rdoc +4 -0
  3. data/History.rdoc +310 -0
  4. data/License.txt +33 -0
  5. data/Manifest.txt +166 -0
  6. data/README.rdoc +45 -0
  7. data/Rakefile +72 -0
  8. data/TODO.txt +17 -0
  9. data/Upgrade.rdoc +148 -0
  10. data/generators/integration_spec/integration_spec_generator.rb +10 -0
  11. data/generators/integration_spec/templates/integration_spec.rb +4 -0
  12. data/generators/rspec/CHANGES +1 -0
  13. data/generators/rspec/rspec_generator.rb +73 -0
  14. data/generators/rspec/templates/previous_failures.txt +0 -0
  15. data/generators/rspec/templates/rcov.opts +2 -0
  16. data/generators/rspec/templates/rspec.rake +144 -0
  17. data/generators/rspec/templates/script/autospec +6 -0
  18. data/generators/rspec/templates/script/spec +10 -0
  19. data/generators/rspec/templates/spec.opts +4 -0
  20. data/generators/rspec/templates/spec_helper.rb +54 -0
  21. data/generators/rspec_controller/USAGE +33 -0
  22. data/generators/rspec_controller/rspec_controller_generator.rb +47 -0
  23. data/generators/rspec_controller/templates/controller_spec.rb +25 -0
  24. data/generators/rspec_controller/templates/helper_spec.rb +11 -0
  25. data/generators/rspec_controller/templates/view_spec.rb +12 -0
  26. data/generators/rspec_default_values.rb +28 -0
  27. data/generators/rspec_model/USAGE +18 -0
  28. data/generators/rspec_model/rspec_model_generator.rb +34 -0
  29. data/generators/rspec_model/templates/factories.rb +8 -0
  30. data/generators/rspec_model/templates/model_spec.rb +13 -0
  31. data/generators/rspec_scaffold/rspec_scaffold_generator.rb +154 -0
  32. data/generators/rspec_scaffold/templates/controller_spec.rb +131 -0
  33. data/generators/rspec_scaffold/templates/edit_erb_spec.rb +25 -0
  34. data/generators/rspec_scaffold/templates/helper_spec.rb +11 -0
  35. data/generators/rspec_scaffold/templates/index_erb_spec.rb +27 -0
  36. data/generators/rspec_scaffold/templates/new_erb_spec.rb +25 -0
  37. data/generators/rspec_scaffold/templates/routing_spec.rb +33 -0
  38. data/generators/rspec_scaffold/templates/show_erb_spec.rb +22 -0
  39. data/init.rb +9 -0
  40. data/lib/autotest/discover.rb +5 -0
  41. data/lib/autotest/rails_rspec.rb +76 -0
  42. data/lib/spec/rails/example/assigns_hash_proxy.rb +39 -0
  43. data/lib/spec/rails/example/controller_example_group.rb +285 -0
  44. data/lib/spec/rails/example/cookies_proxy.rb +29 -0
  45. data/lib/spec/rails/example/functional_example_group.rb +106 -0
  46. data/lib/spec/rails/example/helper_example_group.rb +153 -0
  47. data/lib/spec/rails/example/integration_example_group.rb +16 -0
  48. data/lib/spec/rails/example/model_example_group.rb +15 -0
  49. data/lib/spec/rails/example/render_observer.rb +80 -0
  50. data/lib/spec/rails/example/routing_example_group.rb +13 -0
  51. data/lib/spec/rails/example/routing_helpers.rb +66 -0
  52. data/lib/spec/rails/example/view_example_group.rb +199 -0
  53. data/lib/spec/rails/example.rb +48 -0
  54. data/lib/spec/rails/extensions/action_controller/rescue.rb +42 -0
  55. data/lib/spec/rails/extensions/action_controller/test_case.rb +16 -0
  56. data/lib/spec/rails/extensions/action_controller/test_response.rb +21 -0
  57. data/lib/spec/rails/extensions/action_view/base.rb +35 -0
  58. data/lib/spec/rails/extensions/active_record/base.rb +45 -0
  59. data/lib/spec/rails/extensions/active_support/test_case.rb +7 -0
  60. data/lib/spec/rails/extensions/spec/matchers/have.rb +23 -0
  61. data/lib/spec/rails/extensions/spec/runner/configuration.rb +44 -0
  62. data/lib/spec/rails/extensions.rb +11 -0
  63. data/lib/spec/rails/interop/testcase.rb +14 -0
  64. data/lib/spec/rails/matchers/ar_be_valid.rb +27 -0
  65. data/lib/spec/rails/matchers/assert_select.rb +180 -0
  66. data/lib/spec/rails/matchers/change.rb +13 -0
  67. data/lib/spec/rails/matchers/have_text.rb +57 -0
  68. data/lib/spec/rails/matchers/include_text.rb +54 -0
  69. data/lib/spec/rails/matchers/redirect_to.rb +126 -0
  70. data/lib/spec/rails/matchers/render_template.rb +129 -0
  71. data/lib/spec/rails/matchers/route_to.rb +149 -0
  72. data/lib/spec/rails/matchers.rb +32 -0
  73. data/lib/spec/rails/mocks.rb +136 -0
  74. data/lib/spec/rails/version.rb +16 -0
  75. data/lib/spec/rails.rb +26 -0
  76. data/spec/autotest/mappings_spec.rb +86 -0
  77. data/spec/rails_suite.rb +7 -0
  78. data/spec/resources/controllers/action_view_base_spec_controller.rb +2 -0
  79. data/spec/resources/controllers/application.rb +9 -0
  80. data/spec/resources/controllers/controller_spec_controller.rb +127 -0
  81. data/spec/resources/controllers/example.txt +1 -0
  82. data/spec/resources/controllers/redirect_spec_controller.rb +70 -0
  83. data/spec/resources/controllers/render_spec_controller.rb +34 -0
  84. data/spec/resources/controllers/rjs_spec_controller.rb +58 -0
  85. data/spec/resources/helpers/addition_helper.rb +5 -0
  86. data/spec/resources/helpers/explicit_helper.rb +46 -0
  87. data/spec/resources/helpers/more_explicit_helper.rb +5 -0
  88. data/spec/resources/helpers/plugin_application_helper.rb +6 -0
  89. data/spec/resources/helpers/view_spec_helper.rb +13 -0
  90. data/spec/resources/models/animal.rb +4 -0
  91. data/spec/resources/models/person.rb +18 -0
  92. data/spec/resources/models/thing.rb +3 -0
  93. data/spec/resources/views/controller_spec/_partial.html.erb +0 -0
  94. data/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.html.erb +1 -0
  95. data/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.html.erb +1 -0
  96. data/spec/resources/views/controller_spec/action_setting_the_assigns_hash.html.erb +0 -0
  97. data/spec/resources/views/controller_spec/action_with_errors_in_template.html.erb +1 -0
  98. data/spec/resources/views/controller_spec/action_with_template.html.erb +1 -0
  99. data/spec/resources/views/layouts/application.html.erb +0 -0
  100. data/spec/resources/views/layouts/simple.html.erb +0 -0
  101. data/spec/resources/views/objects/_object.html.erb +1 -0
  102. data/spec/resources/views/render_spec/_a_partial.html.erb +0 -0
  103. data/spec/resources/views/render_spec/action_with_alternate_layout.html.erb +0 -0
  104. data/spec/resources/views/render_spec/some_action.html.erb +0 -0
  105. data/spec/resources/views/render_spec/some_action.js.rjs +1 -0
  106. data/spec/resources/views/rjs_spec/_replacement_partial.html.erb +1 -0
  107. data/spec/resources/views/rjs_spec/hide_div.js.rjs +1 -0
  108. data/spec/resources/views/rjs_spec/hide_page_element.js.rjs +1 -0
  109. data/spec/resources/views/rjs_spec/insert_html.js.rjs +1 -0
  110. data/spec/resources/views/rjs_spec/replace.js.rjs +1 -0
  111. data/spec/resources/views/rjs_spec/replace_html.js.rjs +1 -0
  112. data/spec/resources/views/rjs_spec/replace_html_with_partial.js.rjs +1 -0
  113. data/spec/resources/views/rjs_spec/visual_effect.js.rjs +1 -0
  114. data/spec/resources/views/rjs_spec/visual_toggle_effect.js.rjs +1 -0
  115. data/spec/resources/views/tag_spec/no_tags.html.erb +1 -0
  116. data/spec/resources/views/tag_spec/single_div_with_no_attributes.html.erb +1 -0
  117. data/spec/resources/views/tag_spec/single_div_with_one_attribute.html.erb +1 -0
  118. data/spec/resources/views/view_spec/_partial.html.erb +2 -0
  119. data/spec/resources/views/view_spec/_partial_used_twice.html.erb +0 -0
  120. data/spec/resources/views/view_spec/_partial_with_local_variable.html.erb +1 -0
  121. data/spec/resources/views/view_spec/_partial_with_sub_partial.html.erb +1 -0
  122. data/spec/resources/views/view_spec/_spacer.html.erb +1 -0
  123. data/spec/resources/views/view_spec/accessor.html.erb +6 -0
  124. data/spec/resources/views/view_spec/block_helper.html.erb +3 -0
  125. data/spec/resources/views/view_spec/entry_form.html.erb +2 -0
  126. data/spec/resources/views/view_spec/explicit_helper.html.erb +2 -0
  127. data/spec/resources/views/view_spec/foo/show.html.erb +1 -0
  128. data/spec/resources/views/view_spec/implicit_helper.html.erb +2 -0
  129. data/spec/resources/views/view_spec/multiple_helpers.html.erb +3 -0
  130. data/spec/resources/views/view_spec/path_params.html.erb +1 -0
  131. data/spec/resources/views/view_spec/should_not_receive.html.erb +3 -0
  132. data/spec/resources/views/view_spec/template_with_partial.html.erb +5 -0
  133. data/spec/resources/views/view_spec/template_with_partial_using_collection.html.erb +3 -0
  134. data/spec/resources/views/view_spec/template_with_partial_with_array.html.erb +1 -0
  135. data/spec/resources/views/view_spec/view_helpers.html.erb +1 -0
  136. data/spec/spec/rails/example/assigns_hash_proxy_spec.rb +109 -0
  137. data/spec/spec/rails/example/configuration_spec.rb +65 -0
  138. data/spec/spec/rails/example/controller_example_group_spec.rb +307 -0
  139. data/spec/spec/rails/example/controller_isolation_spec.rb +75 -0
  140. data/spec/spec/rails/example/cookies_proxy_spec.rb +87 -0
  141. data/spec/spec/rails/example/error_handling_spec.rb +90 -0
  142. data/spec/spec/rails/example/example_group_factory_spec.rb +112 -0
  143. data/spec/spec/rails/example/helper_example_group_spec.rb +247 -0
  144. data/spec/spec/rails/example/model_example_group_spec.rb +32 -0
  145. data/spec/spec/rails/example/routing_example_group_spec.rb +10 -0
  146. data/spec/spec/rails/example/shared_routing_example_group_examples.rb +237 -0
  147. data/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb +33 -0
  148. data/spec/spec/rails/example/view_example_group_spec.rb +346 -0
  149. data/spec/spec/rails/extensions/action_view_base_spec.rb +79 -0
  150. data/spec/spec/rails/extensions/active_record_spec.rb +14 -0
  151. data/spec/spec/rails/interop/testcase_spec.rb +70 -0
  152. data/spec/spec/rails/matchers/ar_be_valid_spec.rb +19 -0
  153. data/spec/spec/rails/matchers/assert_select_spec.rb +835 -0
  154. data/spec/spec/rails/matchers/errors_on_spec.rb +37 -0
  155. data/spec/spec/rails/matchers/have_text_spec.rb +69 -0
  156. data/spec/spec/rails/matchers/include_text_spec.rb +62 -0
  157. data/spec/spec/rails/matchers/redirect_to_spec.rb +253 -0
  158. data/spec/spec/rails/matchers/render_template_spec.rb +208 -0
  159. data/spec/spec/rails/matchers/should_change_spec.rb +15 -0
  160. data/spec/spec/rails/mocks/ar_classes.rb +10 -0
  161. data/spec/spec/rails/mocks/mock_model_spec.rb +109 -0
  162. data/spec/spec/rails/mocks/stub_model_spec.rb +80 -0
  163. data/spec/spec/rails/sample_modified_fixture.rb +8 -0
  164. data/spec/spec/rails/sample_spec.rb +8 -0
  165. data/spec/spec/rails/spec_spec.rb +11 -0
  166. data/spec/spec_helper.rb +78 -0
  167. metadata +301 -0
@@ -0,0 +1,66 @@
1
+ require 'rack/utils'
2
+
3
+ module Spec
4
+ module Rails
5
+ module Example
6
+ module RoutingHelpers
7
+
8
+ class RouteFor
9
+ def initialize(example, options)
10
+ @example, @options = example, options
11
+ end
12
+
13
+ def ==(expected)
14
+ if Hash === expected
15
+ path, querystring = expected[:path].split('?')
16
+ path_string = path
17
+ path = expected.merge(:path => path)
18
+ else
19
+ path, querystring = expected.split('?')
20
+ path_string = path
21
+ path = { :path => path, :method => :get }
22
+ end
23
+ params = querystring.blank? ? {} : Rack::Utils.parse_query(querystring).symbolize_keys!
24
+ begin
25
+ @example.assert_routing(path, @options, {}, params)
26
+ true
27
+ rescue ActionController::RoutingError, ::Test::Unit::AssertionFailedError => e
28
+ raise e.class, "#{e}\nIf you're expecting this failure, we suggest {:#{path[:method]}=>\"#{path[:path]}\"}.should_not be_routable"
29
+ end
30
+ end
31
+ end
32
+ # Uses ActionController::Routing::Routes to generate
33
+ # the correct route for a given set of options.
34
+ # == Examples
35
+ # route_for(:controller => 'registrations', :action => 'edit', :id => '1')
36
+ # => '/registrations/1/edit'
37
+ # route_for(:controller => 'registrations', :action => 'create')
38
+ # => {:path => "/registrations", :method => :post}
39
+ def route_for(options)
40
+ RouteFor.new(self, options)
41
+ end
42
+
43
+ # Uses ActionController::Routing::Routes to parse
44
+ # an incoming path so the parameters it generates can be checked
45
+ #
46
+ # Note that this method is obsoleted by the route_to matcher.
47
+ # == Example
48
+ # params_from(:get, '/registrations/1/edit')
49
+ # => :controller => 'registrations', :action => 'edit', :id => '1'
50
+ def params_from(method, path)
51
+ ensure_that_routes_are_loaded
52
+ path, querystring = path.split('?')
53
+ params = ActionController::Routing::Routes.recognize_path(path, :method => method)
54
+ querystring.blank? ? params : params.merge(Rack::Utils.parse_query(querystring).symbolize_keys!)
55
+ end
56
+
57
+ private
58
+
59
+ def ensure_that_routes_are_loaded
60
+ ActionController::Routing::Routes.reload if ActionController::Routing::Routes.empty?
61
+ end
62
+
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,199 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+ class ViewExampleGroupController < ApplicationController #:nodoc:
5
+ include Spec::Rails::Example::RenderObserver
6
+ attr_reader :template
7
+
8
+ def add_helper_for(template_path)
9
+ add_helper(template_path.split('/')[0])
10
+ end
11
+
12
+ def add_helper(name)
13
+ begin
14
+ helper_module = "#{name}_helper".camelize.constantize
15
+ rescue
16
+ return
17
+ end
18
+ (class << template; self; end).class_eval do
19
+ include helper_module
20
+ end
21
+ end
22
+
23
+ def forget_variables_added_to_assigns
24
+ end
25
+ end
26
+
27
+ # View Examples live in $RAILS_ROOT/spec/views/.
28
+ #
29
+ # View Specs use Spec::Rails::Example::ViewExampleGroup,
30
+ # which provides access to views without invoking any of your controllers.
31
+ # See Spec::Rails::Expectations::Matchers for information about specific
32
+ # expectations that you can set on views.
33
+ #
34
+ # == Example
35
+ #
36
+ # describe "login/login" do
37
+ # before do
38
+ # render 'login/login'
39
+ # end
40
+ #
41
+ # it "should display login form" do
42
+ # response.should have_tag("form[action=/login]") do
43
+ # with_tag("input[type=text][name=email]")
44
+ # with_tag("input[type=password][name=password]")
45
+ # with_tag("input[type=submit][value=Login]")
46
+ # end
47
+ # end
48
+ # end
49
+ class ViewExampleGroup < FunctionalExampleGroup
50
+ if ActionView::Base.respond_to?(:load_helpers) # Rails 2.0.x
51
+ ActionView::Helpers.constants.each do |name|
52
+ const = ActionView::Helpers.const_get(name)
53
+ include const if name.include?("Helper") && Module === const
54
+ end
55
+ elsif ActionView::Base.respond_to?(:helper_modules) # Rails 2.1.x
56
+ ActionView::Base.helper_modules.each do |helper_module|
57
+ include helper_module
58
+ end
59
+ else # Rails 2.2.x
60
+ include ActionView::Helpers
61
+ end
62
+
63
+ tests ViewExampleGroupController
64
+ class << self
65
+ def inherited(klass) # :nodoc:
66
+ klass.subject { template }
67
+ super
68
+ end
69
+ end
70
+
71
+ before {ensure_that_flash_and_session_work_properly}
72
+ after {ensure_that_base_view_path_is_not_set_across_example_groups}
73
+
74
+ def ensure_that_flash_and_session_work_properly #:nodoc:
75
+ @controller.class.__send__ :public, :flash
76
+ @controller.__send__ :initialize_template_class, @response
77
+ @controller.__send__ :assign_shortcuts, @request, @response
78
+ @controller.__send__ :initialize_current_url
79
+ @session = @controller.session
80
+ end
81
+
82
+ def ensure_that_base_view_path_is_not_set_across_example_groups #:nodoc:
83
+ ActionView::Base.base_view_path = nil
84
+ end
85
+
86
+ def set_base_view_path(options) #:nodoc:
87
+ ActionView::Base.base_view_path = base_view_path(options)
88
+ end
89
+
90
+ def base_view_path(options) #:nodoc:
91
+ "/#{derived_controller_name(options)}/"
92
+ end
93
+
94
+ def derived_controller_name(options) #:nodoc:
95
+ parts = subject_of_render(options).split('/').reject { |part| part.empty? }
96
+ "#{parts[0..-2].join('/')}"
97
+ end
98
+
99
+ def derived_action_name(options) #:nodoc:
100
+ parts = subject_of_render(options).split('/').reject { |part| part.empty? }
101
+ "#{parts.last}".split('.').first
102
+ end
103
+
104
+ def subject_of_render(options) #:nodoc:
105
+ [:template, :partial, :file].each do |render_type|
106
+ if options.has_key?(render_type)
107
+ return options[render_type]
108
+ end
109
+ end
110
+ return ""
111
+ end
112
+
113
+ def add_helpers(options) #:nodoc:
114
+ @controller.add_helper("application")
115
+ @controller.add_helper(derived_controller_name(options))
116
+ @controller.add_helper(options[:helper]) if options[:helper]
117
+ options[:helpers].each { |helper| @controller.add_helper(helper) } if options[:helpers]
118
+ end
119
+
120
+ # Renders a template for a View Spec, which then provides access to the result
121
+ # through the +response+. Also supports render with :inline, which you can
122
+ # use to spec custom form builders, helpers, etc, in the context of a view.
123
+ #
124
+ # == Examples
125
+ #
126
+ # render('/people/list')
127
+ # render('/people/list', :helper => MyHelper)
128
+ # render('/people/list', :helpers => [MyHelper, MyOtherHelper])
129
+ # render(:partial => '/people/_address')
130
+ # render(:inline => "<% custom_helper 'argument', 'another argument' %>")
131
+ #
132
+ # See Spec::Rails::Example::ViewExampleGroup for more information.
133
+ def render(*args)
134
+ options = Hash === args.last ? args.pop : {}
135
+
136
+ if args.empty?
137
+ unless [:partial, :inline, :file, :template, :xml, :json, :update].any? {|k| options.has_key? k}
138
+ args << self.class.description_parts.first
139
+ end
140
+ end
141
+
142
+ options[:template] = args.first.to_s.sub(/^\//,'') unless args.empty?
143
+
144
+ set_base_view_path(options)
145
+ add_helpers(options)
146
+
147
+ assigns[:action_name] = @action_name
148
+
149
+ @request.path_parameters = @request.path_parameters.merge(
150
+ :controller => derived_controller_name(options),
151
+ :action => derived_action_name(options)
152
+ ).merge(options[:path_parameters] || {})
153
+
154
+ defaults = { :layout => false }
155
+ options = defaults.merge options
156
+
157
+ @controller.__send__(:params).reverse_merge! @request.parameters
158
+
159
+ @controller.class.instance_eval %{
160
+ def controller_path
161
+ "#{derived_controller_name(options)}"
162
+ end
163
+
164
+ def controller_name
165
+ "#{derived_controller_name(options).split('/').last}"
166
+ end
167
+ }
168
+
169
+ @controller.__send__ :forget_variables_added_to_assigns
170
+ @controller.__send__ :render, options
171
+ @controller.__send__ :process_cleanup
172
+ end
173
+
174
+ # This provides the template. Use this to set mock
175
+ # expectations for dealing with partials
176
+ #
177
+ # == Example
178
+ #
179
+ # describe "/person/new" do
180
+ # it "should use the form partial" do
181
+ # template.should_receive(:render).with(:partial => 'form')
182
+ # render "/person/new"
183
+ # end
184
+ # end
185
+ def template
186
+ @controller.template
187
+ end
188
+
189
+ Spec::Example::ExampleGroupFactory.register(:view, self)
190
+
191
+ protected
192
+ def _assigns_hash_proxy
193
+ @_assigns_hash_proxy ||= AssignsHashProxy.new(self) {@response.template}
194
+ end
195
+ end
196
+
197
+ end
198
+ end
199
+ end
@@ -0,0 +1,48 @@
1
+ dir = File.dirname(__FILE__)
2
+
3
+ require 'spec/rails/example/routing_helpers'
4
+ require 'spec/rails/example/assigns_hash_proxy'
5
+ require "spec/rails/example/render_observer"
6
+ require "spec/rails/example/model_example_group"
7
+ require "spec/rails/example/functional_example_group"
8
+ require "spec/rails/example/controller_example_group"
9
+ require "spec/rails/example/helper_example_group"
10
+ require "spec/rails/example/view_example_group"
11
+ require "spec/rails/example/routing_example_group"
12
+ require "spec/rails/example/integration_example_group"
13
+ require "spec/rails/example/cookies_proxy"
14
+
15
+ module Spec
16
+ module Rails
17
+ # Spec::Rails::Example extends Spec::Example (RSpec's core Example module) to provide
18
+ # Rails-specific contexts for describing Rails Models, Views, Controllers and Helpers.
19
+ #
20
+ # == Model Examples
21
+ #
22
+ # These are the equivalent of unit tests in Rails' built in testing. Ironically (for the traditional TDD'er) these are the only specs that we feel should actually interact with the database.
23
+ #
24
+ # See Spec::Rails::Example::ModelExampleGroup
25
+ #
26
+ # == Controller Examples
27
+ #
28
+ # These align somewhat with functional tests in rails, except that they do not actually render views (though you can force rendering of views if you prefer). Instead of setting expectations about what goes on a page, you set expectations about what templates get rendered.
29
+ #
30
+ # See Spec::Rails::Example::ControllerExampleGroup
31
+ #
32
+ # == View Examples
33
+ #
34
+ # This is the other half of Rails functional testing. View specs allow you to set up assigns and render
35
+ # a template. By assigning mock model data, you can specify view behaviour with no dependency on a database
36
+ # or your real models.
37
+ #
38
+ # See Spec::Rails::Example::ViewExampleGroup
39
+ #
40
+ # == Helper Examples
41
+ #
42
+ # These let you specify directly methods that live in your helpers.
43
+ #
44
+ # See Spec::Rails::Example::HelperExampleGroup
45
+ module Example
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,42 @@
1
+ module ActionController
2
+ module Rescue
3
+ def use_rails_error_handling!
4
+ Kernel.warn <<-WARNING
5
+ DEPRECATION NOTICE: controller.use_rails_error_handling! is
6
+ deprecated and will be removed from a future version of
7
+ rspec-rails.
8
+
9
+ Use rescue_action_in_public!, which is defined directly in
10
+ rails' testing framework, instead.
11
+ WARNING
12
+ if ::Rails::VERSION::STRING =~ /^2\.0/
13
+ @use_rails_error_handling = true
14
+ else
15
+ # anything but 0.0.0.0 - borrowed from rails own rescue_action_in_public!
16
+ request.remote_addr = '208.77.188.166'
17
+ end
18
+ end
19
+
20
+ def use_rails_error_handling?
21
+ @use_rails_error_handling ||= false
22
+ end
23
+
24
+ protected
25
+
26
+ if ::Rails::VERSION::STRING =~ /^2\.0/
27
+ def rescue_action_in_public?
28
+ request.respond_to?(:rescue_action_in_public?) and request.rescue_action_in_public?
29
+ end
30
+
31
+ def rescue_action_with_handler_with_fast_errors(exception)
32
+ if (use_rails_error_handling? || rescue_action_in_public?) & !handler_for_rescue(exception)
33
+ rescue_action_in_public(exception)
34
+ else
35
+ rescue_action_with_handler_without_fast_errors(exception)
36
+ end
37
+ end
38
+ alias_method_chain :rescue_action_with_handler, :fast_errors
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,16 @@
1
+ module ActionController
2
+ class TestCase
3
+ include ::Spec::Rails::Example::RoutingHelpers
4
+
5
+ if ::Rails::VERSION::STRING =~ /2\.0/
6
+ # Introduced in Rails 2.1, but we need it for 2.0
7
+ def rescue_action_in_public!
8
+ # See rescue.rb in this same directory
9
+ def request.rescue_action_in_public?
10
+ true
11
+ end
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ module ActionController #:nodoc:
2
+ class TestResponse #:nodoc:
3
+ attr_writer :controller_path
4
+
5
+ def capture(name)
6
+ template.instance_variable_get "@content_for_#{name.to_s}"
7
+ end
8
+
9
+ if ::Rails::VERSION::STRING < "2.3"
10
+ def [](name)
11
+ Kernel.warn <<-WARNING
12
+ DEPRECATION NOTICE: [](name) as an alias for capture(name) (TestResponse
13
+ extension in rspec-rails) is deprecated and will not be defined by rspec-rails
14
+ when working with rails >= 2.3.0. It will also be removed entirely from
15
+ a future version of rspec-rails.
16
+ WARNING
17
+ capture(name)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,35 @@
1
+ module ActionView #:nodoc:
2
+ class Base #:nodoc:
3
+ include Spec::Rails::Example::RenderObserver
4
+ cattr_accessor :base_view_path
5
+
6
+ def render_partial_with_base_view_path_handling(partial_path, local_assigns = nil, deprecated_local_assigns = nil) #:nodoc:
7
+ if partial_path.is_a?(String)
8
+ unless partial_path.include?("/")
9
+ unless self.class.base_view_path.nil?
10
+ partial_path = "#{self.class.base_view_path}/#{partial_path}"
11
+ end
12
+ end
13
+ end
14
+ begin
15
+ render_partial_without_base_view_path_handling(partial_path, local_assigns, deprecated_local_assigns)
16
+ rescue ArgumentError # edge rails > 2.1 changed render_partial to accept only one arg
17
+ render_partial_without_base_view_path_handling(partial_path)
18
+ end
19
+ end
20
+ alias_method_chain :render_partial, :base_view_path_handling
21
+
22
+ def render_with_mock_proxy(options = {}, old_local_assigns = {}, &block)
23
+ if render_proxy.__send__(:__mock_proxy).__send__(:find_matching_expectation, :render, options, old_local_assigns)
24
+ render_proxy.render(options, old_local_assigns)
25
+ elsif render_proxy.__send__(:__mock_proxy).__send__(:find_matching_expectation, :render, options)
26
+ render_proxy.render(options)
27
+ else
28
+ unless render_proxy.__send__(:__mock_proxy).__send__(:find_matching_method_stub, :render, options)
29
+ render_without_mock_proxy(options, old_local_assigns, &block)
30
+ end
31
+ end
32
+ end
33
+ alias_method_chain :render, :mock_proxy
34
+ end
35
+ end
@@ -0,0 +1,45 @@
1
+ if defined?(ActiveRecord::Base)
2
+ module Spec
3
+ module Rails
4
+ module Extensions
5
+ module ActiveRecord
6
+ module ClassMethods
7
+ # :call-seq:
8
+ # ModelClass.should have(:no).records
9
+ # ModelClass.should have(1).record
10
+ # ModelClass.should have(n).records
11
+ #
12
+ # Extension to enhance <tt>should have</tt> on AR Model classes
13
+ def records
14
+ find(:all)
15
+ end
16
+ alias :record :records
17
+ end
18
+
19
+ module InstanceMethods
20
+ # :call-seq:
21
+ # model.should have(:no).errors_on(:attribute)
22
+ # model.should have(1).error_on(:attribute)
23
+ # model.should have(n).errors_on(:attribute)
24
+ #
25
+ # Extension to enhance <tt>should have</tt> on AR Model instances.
26
+ # Calls model.valid? in order to prepare the object's errors
27
+ # object.
28
+ def errors_on(attribute)
29
+ self.valid?
30
+ [self.errors.on(attribute)].flatten.compact
31
+ end
32
+ alias :error_on :errors_on
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ module ActiveRecord #:nodoc:
40
+ class Base
41
+ extend Spec::Rails::Extensions::ActiveRecord::ClassMethods
42
+ include Spec::Rails::Extensions::ActiveRecord::InstanceMethods
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,7 @@
1
+ module ActiveSupport
2
+ class TestCase
3
+ include ::Spec::Rails::Matchers
4
+ include ::Spec::Rails::Mocks
5
+ end
6
+ end
7
+
@@ -0,0 +1,23 @@
1
+ require 'spec/matchers/have'
2
+
3
+ module Spec #:nodoc:
4
+ module Matchers #:nodoc:
5
+ class Have #:nodoc:
6
+
7
+ def failure_message_for_should_with_errors_on_extensions
8
+ return "expected #{relativities[@relativity]}#{@expected} errors on :#{@args[0]}, got #{@actual}" if @collection_name == :errors_on
9
+ return "expected #{relativities[@relativity]}#{@expected} error on :#{@args[0]}, got #{@actual}" if @collection_name == :error_on
10
+ return failure_message_for_should_without_errors_on_extensions
11
+ end
12
+ alias_method_chain :failure_message_for_should, :errors_on_extensions
13
+
14
+ def description_with_errors_on_extensions
15
+ return "have #{relativities[@relativity]}#{@expected} errors on :#{@args[0]}" if @collection_name == :errors_on
16
+ return "have #{relativities[@relativity]}#{@expected} error on :#{@args[0]}" if @collection_name == :error_on
17
+ return description_without_errors_on_extensions
18
+ end
19
+ alias_method_chain :description, :errors_on_extensions
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec/runner/configuration'
2
+ require 'test_help'
3
+
4
+ if defined?(ActiveRecord::Base)
5
+ module Spec
6
+ module Runner
7
+ class Configuration
8
+
9
+ def initialize
10
+ super
11
+ self.fixture_path = RAILS_ROOT + '/spec/fixtures'
12
+ end
13
+
14
+ def use_transactional_fixtures
15
+ ActiveSupport::TestCase.use_transactional_fixtures
16
+ end
17
+ def use_transactional_fixtures=(value)
18
+ ActiveSupport::TestCase.use_transactional_fixtures = value
19
+ end
20
+
21
+ def use_instantiated_fixtures
22
+ ActiveSupport::TestCase.use_instantiated_fixtures
23
+ end
24
+ def use_instantiated_fixtures=(value)
25
+ ActiveSupport::TestCase.use_instantiated_fixtures = value
26
+ end
27
+
28
+ def fixture_path
29
+ ActiveSupport::TestCase.fixture_path
30
+ end
31
+ def fixture_path=(path)
32
+ ActiveSupport::TestCase.fixture_path = path
33
+ end
34
+
35
+ def global_fixtures
36
+ ActiveSupport::TestCase.fixture_table_names
37
+ end
38
+ def global_fixtures=(fixtures)
39
+ ActiveSupport::TestCase.fixtures(*fixtures)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec'
2
+
3
+ require 'spec/rails/extensions/spec/runner/configuration'
4
+ require 'spec/rails/extensions/spec/matchers/have'
5
+
6
+ require 'spec/rails/extensions/active_support/test_case'
7
+ require 'spec/rails/extensions/active_record/base'
8
+ require 'spec/rails/extensions/action_controller/rescue'
9
+ require 'spec/rails/extensions/action_controller/test_case'
10
+ require 'spec/rails/extensions/action_controller/test_response'
11
+ require 'spec/rails/extensions/action_view/base'
@@ -0,0 +1,14 @@
1
+ module Test
2
+ module Unit
3
+ class TestCase
4
+ # Edge rails (r8664) introduces class-wide setup & teardown callbacks for Test::Unit::TestCase.
5
+ # Make sure these still get run when running TestCases under rspec:
6
+ prepend_before(:each) do
7
+ run_callbacks :setup if respond_to?(:run_callbacks)
8
+ end
9
+ append_after(:each) do
10
+ run_callbacks :teardown if respond_to?(:run_callbacks)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,27 @@
1
+ if defined?(ActiveRecord::Base)
2
+ module Spec
3
+ module Rails
4
+ module Matchers
5
+ # :call-seq:
6
+ # response.should be_valid
7
+ # response.should_not be_valid
8
+ def be_valid
9
+ ::Spec::Matchers::Matcher.new :be_valid do
10
+ match do |actual|
11
+ actual.valid?
12
+ end
13
+
14
+ failure_message_for_should do |actual|
15
+ if actual.respond_to?(:errors) && ActiveRecord::Errors === actual.errors
16
+ "Expected #{actual.inspect} to be valid, but it was not\nErrors: " + actual.errors.full_messages.join(", ")
17
+ else
18
+ "Expected #{actual.inspect} to be valid"
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+ end