rspec-rails 1.1.5

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.
Files changed (159) hide show
  1. data/History.txt +57 -0
  2. data/Manifest.txt +158 -0
  3. data/README.txt +81 -0
  4. data/Rakefile +39 -0
  5. data/UPGRADE +7 -0
  6. data/generators/rspec/CHANGES +1 -0
  7. data/generators/rspec/rspec_generator.rb +40 -0
  8. data/generators/rspec/templates/all_stories.rb +4 -0
  9. data/generators/rspec/templates/previous_failures.txt +0 -0
  10. data/generators/rspec/templates/rcov.opts +2 -0
  11. data/generators/rspec/templates/rspec.rake +132 -0
  12. data/generators/rspec/templates/script/autospec +3 -0
  13. data/generators/rspec/templates/script/spec +4 -0
  14. data/generators/rspec/templates/script/spec_server +116 -0
  15. data/generators/rspec/templates/spec.opts +4 -0
  16. data/generators/rspec/templates/spec_helper.rb +47 -0
  17. data/generators/rspec/templates/stories_helper.rb +3 -0
  18. data/generators/rspec_controller/USAGE +33 -0
  19. data/generators/rspec_controller/rspec_controller_generator.rb +49 -0
  20. data/generators/rspec_controller/templates/controller_spec.rb +25 -0
  21. data/generators/rspec_controller/templates/helper_spec.rb +11 -0
  22. data/generators/rspec_controller/templates/view_spec.rb +12 -0
  23. data/generators/rspec_default_values.rb +19 -0
  24. data/generators/rspec_model/USAGE +18 -0
  25. data/generators/rspec_model/rspec_model_generator.rb +35 -0
  26. data/generators/rspec_model/templates/model_spec.rb +15 -0
  27. data/generators/rspec_scaffold/rspec_scaffold_generator.rb +154 -0
  28. data/generators/rspec_scaffold/templates/controller_spec.rb +173 -0
  29. data/generators/rspec_scaffold/templates/edit_erb_spec.rb +26 -0
  30. data/generators/rspec_scaffold/templates/helper_spec.rb +11 -0
  31. data/generators/rspec_scaffold/templates/index_erb_spec.rb +27 -0
  32. data/generators/rspec_scaffold/templates/new_erb_spec.rb +26 -0
  33. data/generators/rspec_scaffold/templates/routing_spec.rb +59 -0
  34. data/generators/rspec_scaffold/templates/show_erb_spec.rb +23 -0
  35. data/init.rb +9 -0
  36. data/lib/autotest/discover.rb +1 -0
  37. data/lib/autotest/rails_rspec.rb +76 -0
  38. data/lib/spec/rails.rb +15 -0
  39. data/lib/spec/rails/example.rb +47 -0
  40. data/lib/spec/rails/example/assigns_hash_proxy.rb +43 -0
  41. data/lib/spec/rails/example/controller_example_group.rb +256 -0
  42. data/lib/spec/rails/example/cookies_proxy.rb +25 -0
  43. data/lib/spec/rails/example/functional_example_group.rb +87 -0
  44. data/lib/spec/rails/example/helper_example_group.rb +166 -0
  45. data/lib/spec/rails/example/model_example_group.rb +14 -0
  46. data/lib/spec/rails/example/rails_example_group.rb +33 -0
  47. data/lib/spec/rails/example/render_observer.rb +93 -0
  48. data/lib/spec/rails/example/view_example_group.rb +183 -0
  49. data/lib/spec/rails/extensions.rb +12 -0
  50. data/lib/spec/rails/extensions/action_controller/base.rb +14 -0
  51. data/lib/spec/rails/extensions/action_controller/rescue.rb +21 -0
  52. data/lib/spec/rails/extensions/action_controller/test_response.rb +11 -0
  53. data/lib/spec/rails/extensions/action_view/base.rb +31 -0
  54. data/lib/spec/rails/extensions/active_record/base.rb +30 -0
  55. data/lib/spec/rails/extensions/object.rb +5 -0
  56. data/lib/spec/rails/extensions/spec/example/configuration.rb +71 -0
  57. data/lib/spec/rails/extensions/spec/matchers/have.rb +21 -0
  58. data/lib/spec/rails/interop/testcase.rb +14 -0
  59. data/lib/spec/rails/matchers.rb +31 -0
  60. data/lib/spec/rails/matchers/assert_select.rb +131 -0
  61. data/lib/spec/rails/matchers/change.rb +11 -0
  62. data/lib/spec/rails/matchers/have_text.rb +57 -0
  63. data/lib/spec/rails/matchers/include_text.rb +54 -0
  64. data/lib/spec/rails/matchers/redirect_to.rb +113 -0
  65. data/lib/spec/rails/matchers/render_template.rb +90 -0
  66. data/lib/spec/rails/mocks.rb +132 -0
  67. data/lib/spec/rails/story_adapter.rb +79 -0
  68. data/lib/spec/rails/version.rb +15 -0
  69. data/spec/rails/autotest/mappings_spec.rb +36 -0
  70. data/spec/rails/example/assigns_hash_proxy_spec.rb +65 -0
  71. data/spec/rails/example/configuration_spec.rb +83 -0
  72. data/spec/rails/example/controller_isolation_spec.rb +62 -0
  73. data/spec/rails/example/controller_spec_spec.rb +272 -0
  74. data/spec/rails/example/cookies_proxy_spec.rb +74 -0
  75. data/spec/rails/example/example_group_factory_spec.rb +112 -0
  76. data/spec/rails/example/helper_spec_spec.rb +161 -0
  77. data/spec/rails/example/model_spec_spec.rb +18 -0
  78. data/spec/rails/example/shared_behaviour_spec.rb +16 -0
  79. data/spec/rails/example/test_unit_assertion_accessibility_spec.rb +33 -0
  80. data/spec/rails/example/view_spec_spec.rb +280 -0
  81. data/spec/rails/extensions/action_controller_rescue_action_spec.rb +54 -0
  82. data/spec/rails/extensions/action_view_base_spec.rb +48 -0
  83. data/spec/rails/extensions/active_record_spec.rb +14 -0
  84. data/spec/rails/interop/testcase_spec.rb +66 -0
  85. data/spec/rails/matchers/assert_select_spec.rb +814 -0
  86. data/spec/rails/matchers/description_generation_spec.rb +37 -0
  87. data/spec/rails/matchers/errors_on_spec.rb +13 -0
  88. data/spec/rails/matchers/have_text_spec.rb +62 -0
  89. data/spec/rails/matchers/include_text_spec.rb +64 -0
  90. data/spec/rails/matchers/redirect_to_spec.rb +209 -0
  91. data/spec/rails/matchers/render_template_spec.rb +176 -0
  92. data/spec/rails/matchers/should_change_spec.rb +15 -0
  93. data/spec/rails/mocks/ar_classes.rb +10 -0
  94. data/spec/rails/mocks/mock_model_spec.rb +106 -0
  95. data/spec/rails/mocks/stub_model_spec.rb +80 -0
  96. data/spec/rails/sample_modified_fixture.rb +8 -0
  97. data/spec/rails/sample_spec.rb +8 -0
  98. data/spec/rails/spec_server_spec.rb +96 -0
  99. data/spec/rails/spec_spec.rb +11 -0
  100. data/spec/rails_suite.rb +7 -0
  101. data/spec/spec_helper.rb +57 -0
  102. data/spec_resources/controllers/action_view_base_spec_controller.rb +2 -0
  103. data/spec_resources/controllers/controller_spec_controller.rb +94 -0
  104. data/spec_resources/controllers/redirect_spec_controller.rb +59 -0
  105. data/spec_resources/controllers/render_spec_controller.rb +30 -0
  106. data/spec_resources/controllers/rjs_spec_controller.rb +58 -0
  107. data/spec_resources/helpers/explicit_helper.rb +38 -0
  108. data/spec_resources/helpers/more_explicit_helper.rb +5 -0
  109. data/spec_resources/helpers/plugin_application_helper.rb +6 -0
  110. data/spec_resources/helpers/view_spec_helper.rb +13 -0
  111. data/spec_resources/views/controller_spec/_partial.rhtml +0 -0
  112. data/spec_resources/views/controller_spec/action_setting_flash_after_session_reset.rhtml +1 -0
  113. data/spec_resources/views/controller_spec/action_setting_flash_before_session_reset.rhtml +1 -0
  114. data/spec_resources/views/controller_spec/action_setting_the_assigns_hash.rhtml +0 -0
  115. data/spec_resources/views/controller_spec/action_with_errors_in_template.rhtml +1 -0
  116. data/spec_resources/views/controller_spec/action_with_template.rhtml +1 -0
  117. data/spec_resources/views/layouts/application.rhtml +0 -0
  118. data/spec_resources/views/layouts/simple.rhtml +0 -0
  119. data/spec_resources/views/objects/_object.html.erb +1 -0
  120. data/spec_resources/views/render_spec/_a_partial.rhtml +0 -0
  121. data/spec_resources/views/render_spec/action_with_alternate_layout.rhtml +0 -0
  122. data/spec_resources/views/render_spec/some_action.js.rjs +1 -0
  123. data/spec_resources/views/render_spec/some_action.rhtml +0 -0
  124. data/spec_resources/views/render_spec/some_action.rjs +1 -0
  125. data/spec_resources/views/rjs_spec/_replacement_partial.rhtml +1 -0
  126. data/spec_resources/views/rjs_spec/hide_div.rjs +1 -0
  127. data/spec_resources/views/rjs_spec/hide_page_element.rjs +1 -0
  128. data/spec_resources/views/rjs_spec/insert_html.rjs +1 -0
  129. data/spec_resources/views/rjs_spec/replace.rjs +1 -0
  130. data/spec_resources/views/rjs_spec/replace_html.rjs +1 -0
  131. data/spec_resources/views/rjs_spec/replace_html_with_partial.rjs +1 -0
  132. data/spec_resources/views/rjs_spec/visual_effect.rjs +1 -0
  133. data/spec_resources/views/rjs_spec/visual_toggle_effect.rjs +1 -0
  134. data/spec_resources/views/tag_spec/no_tags.rhtml +1 -0
  135. data/spec_resources/views/tag_spec/single_div_with_no_attributes.rhtml +1 -0
  136. data/spec_resources/views/tag_spec/single_div_with_one_attribute.rhtml +1 -0
  137. data/spec_resources/views/view_spec/_partial.rhtml +2 -0
  138. data/spec_resources/views/view_spec/_partial_used_twice.rhtml +0 -0
  139. data/spec_resources/views/view_spec/_partial_with_local_variable.rhtml +1 -0
  140. data/spec_resources/views/view_spec/_partial_with_sub_partial.rhtml +1 -0
  141. data/spec_resources/views/view_spec/_spacer.rhtml +1 -0
  142. data/spec_resources/views/view_spec/accessor.rhtml +5 -0
  143. data/spec_resources/views/view_spec/block_helper.rhtml +3 -0
  144. data/spec_resources/views/view_spec/entry_form.rhtml +2 -0
  145. data/spec_resources/views/view_spec/explicit_helper.rhtml +2 -0
  146. data/spec_resources/views/view_spec/foo/show.rhtml +1 -0
  147. data/spec_resources/views/view_spec/implicit_helper.rhtml +2 -0
  148. data/spec_resources/views/view_spec/multiple_helpers.rhtml +3 -0
  149. data/spec_resources/views/view_spec/should_not_receive.rhtml +3 -0
  150. data/spec_resources/views/view_spec/template_with_partial.rhtml +5 -0
  151. data/spec_resources/views/view_spec/template_with_partial_using_collection.rhtml +3 -0
  152. data/spec_resources/views/view_spec/template_with_partial_with_array.rhtml +1 -0
  153. data/stories/all.rb +10 -0
  154. data/stories/configuration/stories.rb +5 -0
  155. data/stories/helper.rb +6 -0
  156. data/stories/steps/people.rb +8 -0
  157. data/stories/transactions_should_rollback +15 -0
  158. data/stories/transactions_should_rollback.rb +25 -0
  159. metadata +234 -0
@@ -0,0 +1,12 @@
1
+ require 'spec'
2
+
3
+ require 'spec/rails/extensions/object'
4
+
5
+ require 'spec/rails/extensions/spec/example/configuration'
6
+ require 'spec/rails/extensions/spec/matchers/have'
7
+
8
+ require 'spec/rails/extensions/active_record/base'
9
+ require 'spec/rails/extensions/action_controller/base'
10
+ require 'spec/rails/extensions/action_controller/rescue'
11
+ require 'spec/rails/extensions/action_controller/test_response'
12
+ require 'spec/rails/extensions/action_view/base'
@@ -0,0 +1,14 @@
1
+ module ActionController
2
+ class Base
3
+ class << self
4
+ def set_view_path(path)
5
+ [:append_view_path, :view_paths=, :template_root=].each do |method|
6
+ if respond_to?(method)
7
+ return send(method, path)
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,21 @@
1
+ module ActionController
2
+ module Rescue
3
+ def use_rails_error_handling!
4
+ @use_rails_error_handling = true
5
+ end
6
+
7
+ def use_rails_error_handling?
8
+ @use_rails_error_handling ||= false
9
+ end
10
+
11
+ protected
12
+ def rescue_action_with_fast_errors(exception)
13
+ if use_rails_error_handling?
14
+ rescue_action_without_fast_errors exception
15
+ else
16
+ raise exception
17
+ end
18
+ end
19
+ alias_method_chain :rescue_action, :fast_errors
20
+ end
21
+ end
@@ -0,0 +1,11 @@
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
+ alias [] capture
9
+
10
+ end
11
+ end
@@ -0,0 +1,31 @@
1
+ module ActionView #:nodoc:
2
+ class Base #:nodoc:
3
+ include Spec::Rails::Example::RenderObserver
4
+ cattr_accessor :base_view_path
5
+ def render_partial(partial_path, local_assigns = nil, deprecated_local_assigns = nil) #:nodoc:
6
+ if partial_path.is_a?(String)
7
+ unless partial_path.include?("/")
8
+ unless self.class.base_view_path.nil?
9
+ partial_path = "#{self.class.base_view_path}/#{partial_path}"
10
+ end
11
+ end
12
+ end
13
+ begin
14
+ super(partial_path, local_assigns, deprecated_local_assigns)
15
+ rescue ArgumentError # edge rails > 2.1 changed render_partial to accept only one arg
16
+ super(partial_path)
17
+ end
18
+ end
19
+
20
+ alias_method :orig_render, :render
21
+ def render(options = {}, old_local_assigns = {}, &block)
22
+ if render_proxy.send(:__mock_proxy).send(:find_matching_expectation, :render, options)
23
+ render_proxy.render(options)
24
+ else
25
+ unless render_proxy.send(:__mock_proxy).send(:find_matching_method_stub, :render, options)
26
+ orig_render(options, old_local_assigns, &block)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ if defined?(ActiveRecord::Base)
2
+ module ActiveRecord #:nodoc:
3
+ class Base
4
+
5
+ (class << self; self; end).class_eval do
6
+ # Extension for <tt>should have</tt> on AR Model classes
7
+ #
8
+ # ModelClass.should have(:no).records
9
+ # ModelClass.should have(1).record
10
+ # ModelClass.should have(n).records
11
+ def records
12
+ find(:all)
13
+ end
14
+ alias :record :records
15
+ end
16
+
17
+ # Extension for <tt>should have</tt> on AR Model instances
18
+ #
19
+ # model.should have(:no).errors_on(:attribute)
20
+ # model.should have(1).error_on(:attribute)
21
+ # model.should have(n).errors_on(:attribute)
22
+ def errors_on(attribute)
23
+ self.valid?
24
+ [self.errors.on(attribute)].flatten.compact
25
+ end
26
+ alias :error_on :errors_on
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,5 @@
1
+ class Object # :nodoc:
2
+ def self.path2class(klassname)
3
+ klassname.split('::').inject(Object) { |k,n| k.const_get n }
4
+ end
5
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec/example/configuration'
2
+ begin
3
+ module Spec
4
+ module Example
5
+ class Configuration
6
+ # Rails 1.2.3 does a copy of the @inheritable_attributes to the subclass when the subclass is
7
+ # created. This causes an ordering issue when setting state on Configuration because the data is
8
+ # already copied.
9
+ # Iterating over EXAMPLE_GROUP_CLASSES causes the base ExampleGroup classes to have their
10
+ # @inheritable_attributes updated.
11
+ # TODO: BT - When we no longer support Rails 1.2.3, we can remove this functionality
12
+ EXAMPLE_GROUP_CLASSES = [
13
+ ::Test::Unit::TestCase,
14
+ ::Spec::Rails::Example::RailsExampleGroup,
15
+ ::Spec::Rails::Example::FunctionalExampleGroup,
16
+ ::Spec::Rails::Example::ControllerExampleGroup,
17
+ ::Spec::Rails::Example::ViewExampleGroup,
18
+ ::Spec::Rails::Example::HelperExampleGroup,
19
+ ::Spec::Rails::Example::ModelExampleGroup
20
+ ]
21
+ # All of this is ActiveRecord related and makes no sense if it's not used by the app
22
+ if defined?(ActiveRecord::Base)
23
+ def initialize
24
+ super
25
+ self.fixture_path = RAILS_ROOT + '/spec/fixtures'
26
+ end
27
+
28
+ def use_transactional_fixtures
29
+ Test::Unit::TestCase.use_transactional_fixtures
30
+ end
31
+ def use_transactional_fixtures=(value)
32
+ EXAMPLE_GROUP_CLASSES.each do |example_group|
33
+ example_group.use_transactional_fixtures = value
34
+ end
35
+ end
36
+
37
+ def use_instantiated_fixtures
38
+ Test::Unit::TestCase.use_instantiated_fixtures
39
+ end
40
+ def use_instantiated_fixtures=(value)
41
+ EXAMPLE_GROUP_CLASSES.each do |example_group|
42
+ example_group.use_instantiated_fixtures = value
43
+ end
44
+ end
45
+
46
+ def fixture_path
47
+ Test::Unit::TestCase.fixture_path
48
+ end
49
+ def fixture_path=(path)
50
+ EXAMPLE_GROUP_CLASSES.each do |example_group|
51
+ example_group.fixture_path = path
52
+ end
53
+ end
54
+
55
+ def global_fixtures
56
+ ::Test::Unit::TestCase.fixture_table_names
57
+ end
58
+ def global_fixtures=(fixtures)
59
+ EXAMPLE_GROUP_CLASSES.each do |example_group|
60
+ example_group.fixtures(*fixtures)
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ rescue Exception => e
68
+ puts e.message
69
+ puts e.backtrace
70
+ raise e
71
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec/matchers/have'
2
+
3
+ module Spec #:nodoc:
4
+ module Matchers #:nodoc:
5
+ class Have #:nodoc:
6
+ alias_method :__original_failure_message, :failure_message
7
+ def failure_message
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 __original_failure_message
11
+ end
12
+
13
+ alias_method :__original_description, :description
14
+ def description
15
+ return "should have #{relativities[@relativity]}#{@expected} errors on :#{@args[0]}" if @collection_name == :errors_on
16
+ return "should have #{relativities[@relativity]}#{@expected} error on :#{@args[0]}" if @collection_name == :error_on
17
+ return __original_description
18
+ end
19
+ end
20
+ end
21
+ end
@@ -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,31 @@
1
+ dir = File.dirname(__FILE__)
2
+ require 'spec/rails/matchers/assert_select'
3
+ require 'spec/rails/matchers/change'
4
+ require 'spec/rails/matchers/have_text'
5
+ require 'spec/rails/matchers/include_text'
6
+ require 'spec/rails/matchers/redirect_to'
7
+ require 'spec/rails/matchers/render_template'
8
+
9
+ module Spec
10
+ module Rails
11
+ # Spec::Rails::Expectations::Matchers provides several expectation matchers
12
+ # intended to work with Rails components like models and responses. For example:
13
+ #
14
+ # response.should redirect_to("some/url") #redirect_to(url) is the matcher.
15
+ #
16
+ # In addition to those you see below, the arbitrary predicate feature of RSpec
17
+ # makes the following available as well:
18
+ #
19
+ # response.should be_success #passes if response.success?
20
+ # response.should be_redirect #passes if response.redirect?
21
+ #
22
+ # Note that many of these matchers are part of a wrapper of <tt>assert_select</tt>, so
23
+ # the documentation comes straight from that with some slight modifications.
24
+ # <tt>assert_select</tt> is a Test::Unit extension originally contributed to the
25
+ # Rails community as a plugin by Assaf Arkin and eventually shipped as part of Rails.
26
+ #
27
+ # For more info on <tt>assert_select</tt>, see the relevant Rails documentation.
28
+ module Matchers
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,131 @@
1
+ # This is a wrapper of assert_select for rspec.
2
+
3
+ module Spec # :nodoc:
4
+ module Rails
5
+ module Matchers
6
+
7
+ class AssertSelect #:nodoc:
8
+
9
+ def initialize(assertion, spec_scope, *args, &block)
10
+ @assertion = assertion
11
+ @spec_scope = spec_scope
12
+ @args = args
13
+ @block = block
14
+ end
15
+
16
+ def matches?(response_or_text, &block)
17
+ if ActionController::TestResponse === response_or_text and
18
+ response_or_text.headers.key?('Content-Type') and
19
+ !response_or_text.headers['Content-Type'].blank? and
20
+ response_or_text.headers['Content-Type'].to_sym == :xml
21
+ @args.unshift(HTML::Document.new(response_or_text.body, false, true).root)
22
+ elsif String === response_or_text
23
+ @args.unshift(HTML::Document.new(response_or_text).root)
24
+ end
25
+ @block = block if block
26
+ begin
27
+ @spec_scope.send(@assertion, *@args, &@block)
28
+ rescue ::Test::Unit::AssertionFailedError => @error
29
+ end
30
+
31
+ @error.nil?
32
+ end
33
+
34
+ def failure_message; @error.message; end
35
+ def negative_failure_message; "should not #{description}, but did"; end
36
+
37
+ def description
38
+ {
39
+ :assert_select => "have tag#{format_args(*@args)}",
40
+ :assert_select_email => "send email#{format_args(*@args)}",
41
+ }[@assertion]
42
+ end
43
+
44
+ private
45
+
46
+ def format_args(*args)
47
+ return "" if args.empty?
48
+ return "(#{arg_list(*args)})"
49
+ end
50
+
51
+ def arg_list(*args)
52
+ args.collect do |arg|
53
+ arg.respond_to?(:description) ? arg.description : arg.inspect
54
+ end.join(", ")
55
+ end
56
+
57
+ end
58
+
59
+ # :call-seq:
60
+ # response.should have_tag(*args, &block)
61
+ # string.should have_tag(*args, &block)
62
+ #
63
+ # wrapper for assert_select with additional support for using
64
+ # css selectors to set expectation on Strings. Use this in
65
+ # helper specs, for example, to set expectations on the results
66
+ # of helper methods.
67
+ #
68
+ # == Examples
69
+ #
70
+ # # in a controller spec
71
+ # response.should have_tag("div", "some text")
72
+ #
73
+ # # in a helper spec (person_address_tag is a method in the helper)
74
+ # person_address_tag.should have_tag("input#person_address")
75
+ #
76
+ # see documentation for assert_select at http://api.rubyonrails.org/
77
+ def have_tag(*args, &block)
78
+ AssertSelect.new(:assert_select, self, *args, &block)
79
+ end
80
+
81
+ # wrapper for a nested assert_select
82
+ #
83
+ # response.should have_tag("div#form") do
84
+ # with_tag("input#person_name[name=?]", "person[name]")
85
+ # end
86
+ #
87
+ # see documentation for assert_select at http://api.rubyonrails.org/
88
+ def with_tag(*args, &block)
89
+ should have_tag(*args, &block)
90
+ end
91
+
92
+ # wrapper for a nested assert_select with false
93
+ #
94
+ # response.should have_tag("div#1") do
95
+ # without_tag("span", "some text that shouldn't be there")
96
+ # end
97
+ #
98
+ # see documentation for assert_select at http://api.rubyonrails.org/
99
+ def without_tag(*args, &block)
100
+ should_not have_tag(*args, &block)
101
+ end
102
+
103
+ # :call-seq:
104
+ # response.should have_rjs(*args, &block)
105
+ #
106
+ # wrapper for assert_select_rjs
107
+ #
108
+ # see documentation for assert_select_rjs at http://api.rubyonrails.org/
109
+ def have_rjs(*args, &block)
110
+ AssertSelect.new(:assert_select_rjs, self, *args, &block)
111
+ end
112
+
113
+ # :call-seq:
114
+ # response.should send_email(*args, &block)
115
+ #
116
+ # wrapper for assert_select_email
117
+ #
118
+ # see documentation for assert_select_email at http://api.rubyonrails.org/
119
+ def send_email(*args, &block)
120
+ AssertSelect.new(:assert_select_email, self, *args, &block)
121
+ end
122
+
123
+ # wrapper for assert_select_encoded
124
+ #
125
+ # see documentation for assert_select_encoded at http://api.rubyonrails.org/
126
+ def with_encoded(*args, &block)
127
+ should AssertSelect.new(:assert_select_encoded, self, *args, &block)
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,11 @@
1
+ module Spec
2
+ module Matchers
3
+ class Change
4
+ def evaluate_value_proc_with_ensured_evaluation_of_proxy
5
+ value = evaluate_value_proc_without_ensured_evaluation_of_proxy
6
+ ActiveRecord::Associations::AssociationProxy === value ? value.dup : value
7
+ end
8
+ alias_method_chain :evaluate_value_proc, :ensured_evaluation_of_proxy
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,57 @@
1
+ module Spec
2
+ module Rails
3
+ module Matchers
4
+
5
+ class HaveText #:nodoc:
6
+
7
+ def initialize(expected)
8
+ @expected = expected
9
+ end
10
+
11
+ def matches?(response_or_text)
12
+ @actual = response_or_text.respond_to?(:body) ? response_or_text.body : response_or_text
13
+ return actual =~ expected if Regexp === expected
14
+ return actual == expected unless Regexp === expected
15
+ end
16
+
17
+ def failure_message
18
+ "expected #{expected.inspect}, got #{actual.inspect}"
19
+ end
20
+
21
+ def negative_failure_message
22
+ "expected not to have text #{expected.inspect}"
23
+ end
24
+
25
+ def to_s
26
+ "have text #{expected.inspect}"
27
+ end
28
+
29
+ private
30
+ attr_reader :expected
31
+ attr_reader :actual
32
+
33
+ end
34
+
35
+ # :call-seq:
36
+ # response.should have_text(expected)
37
+ # response.should_not have_text(expected)
38
+ #
39
+ # Accepts a String or a Regexp, matching a String using ==
40
+ # and a Regexp using =~.
41
+ #
42
+ # If response_or_text has a #body, then that is used as to match against
43
+ # else it uses response_or_text
44
+ #
45
+ # Use this instead of <tt>response.should have_tag()</tt>
46
+ # when you want to match the whole string or whole body
47
+ #
48
+ # == Examples
49
+ #
50
+ # response.should have_text("This is the expected text")
51
+ def have_text(text)
52
+ HaveText.new(text)
53
+ end
54
+
55
+ end
56
+ end
57
+ end