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.
- data/.document +7 -0
- data/Contribute.rdoc +4 -0
- data/History.rdoc +310 -0
- data/License.txt +33 -0
- data/Manifest.txt +166 -0
- data/README.rdoc +45 -0
- data/Rakefile +72 -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 +73 -0
- data/generators/rspec/templates/previous_failures.txt +0 -0
- data/generators/rspec/templates/rcov.opts +2 -0
- data/generators/rspec/templates/rspec.rake +144 -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 +34 -0
- data/generators/rspec_model/templates/factories.rb +8 -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/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 +80 -0
- data/lib/spec/rails/example/routing_example_group.rb +13 -0
- data/lib/spec/rails/example/routing_helpers.rb +66 -0
- data/lib/spec/rails/example/view_example_group.rb +199 -0
- data/lib/spec/rails/example.rb +48 -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 +44 -0
- data/lib/spec/rails/extensions.rb +11 -0
- data/lib/spec/rails/interop/testcase.rb +14 -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/matchers.rb +32 -0
- data/lib/spec/rails/mocks.rb +136 -0
- data/lib/spec/rails/version.rb +16 -0
- data/lib/spec/rails.rb +26 -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/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 +65 -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 +10 -0
- data/spec/spec/rails/example/shared_routing_example_group_examples.rb +237 -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 +109 -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 +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,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
|