mcmire-rspec-rails 1.1.99.9

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 (164) hide show
  1. data/History.txt +174 -0
  2. data/License.txt +33 -0
  3. data/Manifest.txt +164 -0
  4. data/README.txt +45 -0
  5. data/Rakefile +63 -0
  6. data/TODO.txt +1 -0
  7. data/Upgrade.markdown +52 -0
  8. data/features/step_definitions/people.rb +6 -0
  9. data/features/support/env.rb +13 -0
  10. data/features/transactions/transactions_should_rollback.feature +16 -0
  11. data/generators/rspec/CHANGES +1 -0
  12. data/generators/rspec/rspec_generator.rb +37 -0
  13. data/generators/rspec/templates/previous_failures.txt +0 -0
  14. data/generators/rspec/templates/rcov.opts +2 -0
  15. data/generators/rspec/templates/rspec.rake +177 -0
  16. data/generators/rspec/templates/script/autospec +5 -0
  17. data/generators/rspec/templates/script/spec +4 -0
  18. data/generators/rspec/templates/script/spec_server +37 -0
  19. data/generators/rspec/templates/spec.opts +4 -0
  20. data/generators/rspec/templates/spec_helper.rb +47 -0
  21. data/generators/rspec_controller/USAGE +33 -0
  22. data/generators/rspec_controller/rspec_controller_generator.rb +45 -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 +19 -0
  27. data/generators/rspec_model/USAGE +18 -0
  28. data/generators/rspec_model/rspec_model_generator.rb +35 -0
  29. data/generators/rspec_model/templates/model_spec.rb +15 -0
  30. data/generators/rspec_scaffold/rspec_scaffold_generator.rb +150 -0
  31. data/generators/rspec_scaffold/templates/controller_spec.rb +171 -0
  32. data/generators/rspec_scaffold/templates/edit_erb_spec.rb +27 -0
  33. data/generators/rspec_scaffold/templates/helper_spec.rb +11 -0
  34. data/generators/rspec_scaffold/templates/index_erb_spec.rb +28 -0
  35. data/generators/rspec_scaffold/templates/new_erb_spec.rb +27 -0
  36. data/generators/rspec_scaffold/templates/routing_spec.rb +63 -0
  37. data/generators/rspec_scaffold/templates/show_erb_spec.rb +23 -0
  38. data/init.rb +9 -0
  39. data/lib/autotest/discover.rb +1 -0
  40. data/lib/autotest/rails_rspec.rb +76 -0
  41. data/lib/spec/rails.rb +37 -0
  42. data/lib/spec/rails/example.rb +53 -0
  43. data/lib/spec/rails/example/assigns_hash_proxy.rb +39 -0
  44. data/lib/spec/rails/example/controller_example_group.rb +242 -0
  45. data/lib/spec/rails/example/cookies_proxy.rb +29 -0
  46. data/lib/spec/rails/example/functional_example_group.rb +84 -0
  47. data/lib/spec/rails/example/helper_example_group.rb +167 -0
  48. data/lib/spec/rails/example/model_example_group.rb +14 -0
  49. data/lib/spec/rails/example/render_observer.rb +67 -0
  50. data/lib/spec/rails/example/routing_helpers.rb +68 -0
  51. data/lib/spec/rails/example/view_example_group.rb +186 -0
  52. data/lib/spec/rails/extensions.rb +15 -0
  53. data/lib/spec/rails/extensions/action_controller/rescue.rb +42 -0
  54. data/lib/spec/rails/extensions/action_controller/test_case.rb +16 -0
  55. data/lib/spec/rails/extensions/action_controller/test_response.rb +21 -0
  56. data/lib/spec/rails/extensions/action_view/base.rb +33 -0
  57. data/lib/spec/rails/extensions/active_record/base.rb +43 -0
  58. data/lib/spec/rails/extensions/active_support/test_case.rb +7 -0
  59. data/lib/spec/rails/extensions/spec/matchers/have.rb +23 -0
  60. data/lib/spec/rails/extensions/spec/runner/configuration.rb +48 -0
  61. data/lib/spec/rails/interop/testcase.rb +14 -0
  62. data/lib/spec/rails/matchers.rb +40 -0
  63. data/lib/spec/rails/matchers/ar_be_valid.rb +44 -0
  64. data/lib/spec/rails/matchers/assert_select.rb +131 -0
  65. data/lib/spec/rails/matchers/change.rb +11 -0
  66. data/lib/spec/rails/matchers/have_text.rb +57 -0
  67. data/lib/spec/rails/matchers/include_text.rb +54 -0
  68. data/lib/spec/rails/matchers/redirect_to.rb +126 -0
  69. data/lib/spec/rails/matchers/render_template.rb +114 -0
  70. data/lib/spec/rails/mocks.rb +135 -0
  71. data/lib/spec/rails/spec_server.rb +97 -0
  72. data/lib/spec/rails/story_adapter.rb +79 -0
  73. data/lib/spec/rails/version.rb +16 -0
  74. data/rspec-rails.gemspec +39 -0
  75. data/spec/autotest/mappings_spec.rb +36 -0
  76. data/spec/rails_suite.rb +7 -0
  77. data/spec/resources/controllers/action_view_base_spec_controller.rb +2 -0
  78. data/spec/resources/controllers/application.rb +9 -0
  79. data/spec/resources/controllers/controller_spec_controller.rb +116 -0
  80. data/spec/resources/controllers/redirect_spec_controller.rb +70 -0
  81. data/spec/resources/controllers/render_spec_controller.rb +30 -0
  82. data/spec/resources/controllers/rjs_spec_controller.rb +58 -0
  83. data/spec/resources/helpers/addition_helper.rb +5 -0
  84. data/spec/resources/helpers/explicit_helper.rb +46 -0
  85. data/spec/resources/helpers/more_explicit_helper.rb +5 -0
  86. data/spec/resources/helpers/plugin_application_helper.rb +6 -0
  87. data/spec/resources/helpers/view_spec_helper.rb +13 -0
  88. data/spec/resources/models/animal.rb +4 -0
  89. data/spec/resources/models/person.rb +18 -0
  90. data/spec/resources/models/thing.rb +3 -0
  91. data/spec/resources/views/controller_spec/_partial.rhtml +0 -0
  92. data/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.rhtml +1 -0
  93. data/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.rhtml +1 -0
  94. data/spec/resources/views/controller_spec/action_setting_the_assigns_hash.rhtml +0 -0
  95. data/spec/resources/views/controller_spec/action_with_errors_in_template.rhtml +1 -0
  96. data/spec/resources/views/controller_spec/action_with_template.rhtml +1 -0
  97. data/spec/resources/views/layouts/application.rhtml +0 -0
  98. data/spec/resources/views/layouts/simple.rhtml +0 -0
  99. data/spec/resources/views/objects/_object.html.erb +1 -0
  100. data/spec/resources/views/render_spec/_a_partial.rhtml +0 -0
  101. data/spec/resources/views/render_spec/action_with_alternate_layout.rhtml +0 -0
  102. data/spec/resources/views/render_spec/some_action.html.erb +0 -0
  103. data/spec/resources/views/render_spec/some_action.js.rjs +1 -0
  104. data/spec/resources/views/render_spec/some_action.rjs +1 -0
  105. data/spec/resources/views/rjs_spec/_replacement_partial.rhtml +1 -0
  106. data/spec/resources/views/rjs_spec/hide_div.rjs +1 -0
  107. data/spec/resources/views/rjs_spec/hide_page_element.rjs +1 -0
  108. data/spec/resources/views/rjs_spec/insert_html.rjs +1 -0
  109. data/spec/resources/views/rjs_spec/replace.rjs +1 -0
  110. data/spec/resources/views/rjs_spec/replace_html.rjs +1 -0
  111. data/spec/resources/views/rjs_spec/replace_html_with_partial.rjs +1 -0
  112. data/spec/resources/views/rjs_spec/visual_effect.rjs +1 -0
  113. data/spec/resources/views/rjs_spec/visual_toggle_effect.rjs +1 -0
  114. data/spec/resources/views/tag_spec/no_tags.rhtml +1 -0
  115. data/spec/resources/views/tag_spec/single_div_with_no_attributes.rhtml +1 -0
  116. data/spec/resources/views/tag_spec/single_div_with_one_attribute.rhtml +1 -0
  117. data/spec/resources/views/view_spec/_partial.rhtml +2 -0
  118. data/spec/resources/views/view_spec/_partial_used_twice.rhtml +0 -0
  119. data/spec/resources/views/view_spec/_partial_with_local_variable.rhtml +1 -0
  120. data/spec/resources/views/view_spec/_partial_with_sub_partial.rhtml +1 -0
  121. data/spec/resources/views/view_spec/_spacer.rhtml +1 -0
  122. data/spec/resources/views/view_spec/accessor.rhtml +5 -0
  123. data/spec/resources/views/view_spec/block_helper.rhtml +3 -0
  124. data/spec/resources/views/view_spec/entry_form.rhtml +2 -0
  125. data/spec/resources/views/view_spec/explicit_helper.rhtml +2 -0
  126. data/spec/resources/views/view_spec/foo/show.rhtml +1 -0
  127. data/spec/resources/views/view_spec/implicit_helper.rhtml +2 -0
  128. data/spec/resources/views/view_spec/multiple_helpers.rhtml +3 -0
  129. data/spec/resources/views/view_spec/path_params.html.erb +1 -0
  130. data/spec/resources/views/view_spec/should_not_receive.rhtml +3 -0
  131. data/spec/resources/views/view_spec/template_with_partial.rhtml +5 -0
  132. data/spec/resources/views/view_spec/template_with_partial_using_collection.rhtml +3 -0
  133. data/spec/resources/views/view_spec/template_with_partial_with_array.rhtml +1 -0
  134. data/spec/spec/rails/example/assigns_hash_proxy_spec.rb +109 -0
  135. data/spec/spec/rails/example/configuration_spec.rb +65 -0
  136. data/spec/spec/rails/example/controller_example_group_spec.rb +275 -0
  137. data/spec/spec/rails/example/controller_isolation_spec.rb +56 -0
  138. data/spec/spec/rails/example/cookies_proxy_spec.rb +87 -0
  139. data/spec/spec/rails/example/error_handling_spec.rb +90 -0
  140. data/spec/spec/rails/example/example_group_factory_spec.rb +112 -0
  141. data/spec/spec/rails/example/helper_example_group_spec.rb +206 -0
  142. data/spec/spec/rails/example/model_example_group_spec.rb +20 -0
  143. data/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb +33 -0
  144. data/spec/spec/rails/example/view_example_group_spec.rb +335 -0
  145. data/spec/spec/rails/extensions/action_view_base_spec.rb +48 -0
  146. data/spec/spec/rails/extensions/active_record_spec.rb +14 -0
  147. data/spec/spec/rails/interop/testcase_spec.rb +70 -0
  148. data/spec/spec/rails/matchers/ar_be_valid_spec.rb +45 -0
  149. data/spec/spec/rails/matchers/assert_select_spec.rb +811 -0
  150. data/spec/spec/rails/matchers/errors_on_spec.rb +25 -0
  151. data/spec/spec/rails/matchers/have_text_spec.rb +70 -0
  152. data/spec/spec/rails/matchers/include_text_spec.rb +62 -0
  153. data/spec/spec/rails/matchers/redirect_to_spec.rb +253 -0
  154. data/spec/spec/rails/matchers/render_template_spec.rb +183 -0
  155. data/spec/spec/rails/matchers/should_change_spec.rb +15 -0
  156. data/spec/spec/rails/mocks/ar_classes.rb +10 -0
  157. data/spec/spec/rails/mocks/mock_model_spec.rb +106 -0
  158. data/spec/spec/rails/mocks/stub_model_spec.rb +80 -0
  159. data/spec/spec/rails/sample_modified_fixture.rb +8 -0
  160. data/spec/spec/rails/sample_spec.rb +8 -0
  161. data/spec/spec/rails/spec_server_spec.rb +107 -0
  162. data/spec/spec/rails/spec_spec.rb +11 -0
  163. data/spec/spec_helper.rb +78 -0
  164. metadata +262 -0
@@ -0,0 +1,45 @@
1
+ require File.dirname(__FILE__) + '/../../../spec_helper'
2
+
3
+ describe "be_valid" do
4
+ class CanBeValid
5
+ def initialize(valid)
6
+ @valid = valid
7
+ end
8
+ def valid?; @valid end
9
+ end
10
+
11
+ it "should behave like normal be_valid matcher" do
12
+ CanBeValid.new(true).should be_valid
13
+ CanBeValid.new(false).should_not be_valid
14
+ end
15
+
16
+ describe CanBeValid do
17
+ subject { CanBeValid.new(true) }
18
+ it { subject.should be_valid }
19
+ end
20
+
21
+ describe CanBeValid do
22
+ subject { CanBeValid.new(false) }
23
+ it { subject.should_not be_valid }
24
+ end
25
+
26
+ class CanHaveErrors
27
+ def initialize(errors)
28
+ @valid = !errors
29
+ @errors = ActiveRecord::Errors.new self
30
+ @errors.add :name, "is too short"
31
+ end
32
+ attr_reader :errors
33
+ def valid?; @valid end
34
+
35
+ def self.human_attribute_name(ignore)
36
+ "Name"
37
+ end
38
+ end
39
+
40
+ it "should show errors in the output if they're available" do
41
+ lambda {
42
+ CanHaveErrors.new(true).should be_valid
43
+ }.should fail_with(/Name is too short/)
44
+ end
45
+ end
@@ -0,0 +1,811 @@
1
+ require File.dirname(__FILE__) + '/../../../spec_helper'
2
+
3
+ # assert_select plugins for Rails
4
+ #
5
+ # Copyright (c) 2006 Assaf Arkin, under Creative Commons Attribution and/or MIT License
6
+ # Developed for http://co.mments.com
7
+ # Code and documention: http://labnotes.org
8
+
9
+ class AssertSelectController < ActionController::Base
10
+
11
+ def response=(content)
12
+ @content = content
13
+ end
14
+
15
+ #NOTE - this is commented because response is implemented in lib/spec/rails/context/controller
16
+ # def response(&block)
17
+ # @update = block
18
+ # end
19
+ #
20
+ def html()
21
+ render :text=>@content, :layout=>false, :content_type=>Mime::HTML
22
+ @content = nil
23
+ end
24
+
25
+ def rjs()
26
+ update = @update
27
+ render :update do |page|
28
+ update.call page
29
+ end
30
+ @update = nil
31
+ end
32
+
33
+ def xml()
34
+ render :text=>@content, :layout=>false, :content_type=>Mime::XML
35
+ @content = nil
36
+ end
37
+
38
+ end
39
+
40
+ class AssertSelectMailer < ActionMailer::Base
41
+
42
+ def test(html)
43
+ recipients "test <test@test.host>"
44
+ from "test@test.host"
45
+ subject "Test e-mail"
46
+ part :content_type=>"text/html", :body=>html
47
+ end
48
+
49
+ end
50
+
51
+ module AssertSelectSpecHelpers
52
+ def render_html(html)
53
+ @controller.response = html
54
+ get :html
55
+ end
56
+
57
+ def render_rjs(&block)
58
+ clear_response
59
+ @controller.response &block
60
+ get :rjs
61
+ end
62
+
63
+ def render_xml(xml)
64
+ @controller.response = xml
65
+ get :xml
66
+ end
67
+
68
+ def first_non_rspec_line_in_backtrace_of(error)
69
+ rspec_path = File.join('rspec', 'lib', 'spec')
70
+ error.backtrace.reject { |line|
71
+ line =~ /#{rspec_path}/
72
+ }.first
73
+ end
74
+
75
+ private
76
+ # necessary for 1.2.1
77
+ def clear_response
78
+ render_html("")
79
+ end
80
+ end
81
+
82
+ unless defined?(SpecFailed)
83
+ SpecFailed = Spec::Expectations::ExpectationNotMetError
84
+ end
85
+
86
+ describe "should have_tag", :type => :controller do
87
+ include AssertSelectSpecHelpers
88
+ controller_name :assert_select
89
+ integrate_views
90
+
91
+ it "should find specific numbers of elements" do
92
+ render_html %Q{<div id="1"></div><div id="2"></div>}
93
+ response.should have_tag( "div" )
94
+ response.should have_tag("div", 2)
95
+ lambda { response.should_not have_tag("div") }.should raise_error(SpecFailed, "should not have tag(\"div\"), but did")
96
+
97
+ lambda { response.should have_tag("div", 3) }.should raise_error(SpecFailed)
98
+ lambda { response.should have_tag("p") }.should raise_error(SpecFailed)
99
+ end
100
+
101
+ it "should expect to find elements when using true" do
102
+ render_html %Q{<div id="1"></div><div id="2"></div>}
103
+ response.should have_tag( "div", true )
104
+ lambda { response.should have_tag( "p", true )}.should raise_error(SpecFailed)
105
+ end
106
+
107
+ it "should expect to not find elements when using false" do
108
+ render_html %Q{<div id="1"></div><div id="2"></div>}
109
+ response.should have_tag( "p", false )
110
+ lambda { response.should have_tag( "div", false )}.should raise_error(SpecFailed)
111
+ end
112
+
113
+
114
+ it "should match submitted text using text or regexp" do
115
+ render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
116
+ response.should have_tag("div", "foo")
117
+ response.should have_tag("div", /(foo|bar)/)
118
+ response.should have_tag("div", :text=>"foo")
119
+ response.should have_tag("div", :text=>/(foo|bar)/)
120
+
121
+ lambda { response.should have_tag("div", "bar") }.should raise_error(SpecFailed)
122
+ lambda { response.should have_tag("div", :text=>"bar") }.should raise_error(SpecFailed)
123
+ lambda { response.should have_tag("p", :text=>"foo") }.should raise_error(SpecFailed)
124
+
125
+ lambda { response.should have_tag("div", /foobar/) }.should raise_error(SpecFailed)
126
+ lambda { response.should have_tag("div", :text=>/foobar/) }.should raise_error(SpecFailed)
127
+ lambda { response.should have_tag("p", :text=>/foo/) }.should raise_error(SpecFailed)
128
+ end
129
+
130
+ it "should use submitted message" do
131
+ render_html %Q{nothing here}
132
+ lambda {
133
+ response.should have_tag("div", {}, "custom message")
134
+ }.should raise_error(SpecFailed, /custom message/)
135
+ end
136
+
137
+ it "should match submitted html" do
138
+ render_html %Q{<p>\n<em>"This is <strong>not</strong> a big problem,"</em> he said.\n</p>}
139
+ text = "\"This is not a big problem,\" he said."
140
+ html = "<em>\"This is <strong>not</strong> a big problem,\"</em> he said."
141
+ response.should have_tag("p", text)
142
+ lambda { response.should have_tag("p", html) }.should raise_error(SpecFailed)
143
+ response.should have_tag("p", :html=>html)
144
+ lambda { response.should have_tag("p", :html=>text) }.should raise_error(SpecFailed)
145
+
146
+ # # No stripping for pre.
147
+ render_html %Q{<pre>\n<em>"This is <strong>not</strong> a big problem,"</em> he said.\n</pre>}
148
+ text = "\n\"This is not a big problem,\" he said.\n"
149
+ html = "\n<em>\"This is <strong>not</strong> a big problem,\"</em> he said.\n"
150
+ response.should have_tag("pre", text)
151
+ lambda { response.should have_tag("pre", html) }.should raise_error(SpecFailed)
152
+ response.should have_tag("pre", :html=>html)
153
+ lambda { response.should have_tag("pre", :html=>text) }.should raise_error(SpecFailed)
154
+ end
155
+
156
+ it "should match number of instances" do
157
+ render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
158
+ response.should have_tag("div", 2)
159
+ lambda { response.should have_tag("div", 3) }.should raise_error(SpecFailed)
160
+ response.should have_tag("div", 1..2)
161
+ lambda { response.should have_tag("div", 3..4) }.should raise_error(SpecFailed)
162
+ response.should have_tag("div", :count=>2)
163
+ lambda { response.should have_tag("div", :count=>3) }.should raise_error(SpecFailed)
164
+ response.should have_tag("div", :minimum=>1)
165
+ response.should have_tag("div", :minimum=>2)
166
+ lambda { response.should have_tag("div", :minimum=>3) }.should raise_error(SpecFailed)
167
+ response.should have_tag("div", :maximum=>2)
168
+ response.should have_tag("div", :maximum=>3)
169
+ lambda { response.should have_tag("div", :maximum=>1) }.should raise_error(SpecFailed)
170
+ response.should have_tag("div", :minimum=>1, :maximum=>2)
171
+ lambda { response.should have_tag("div", :minimum=>3, :maximum=>4) }.should raise_error(SpecFailed)
172
+ end
173
+
174
+ it "substitution values" do
175
+ render_html %Q{<div id="1">foo</div><div id="2">foo</div><span id="3"></span>}
176
+ response.should have_tag("div#?", /\d+/) do |elements| #using do/end
177
+ elements.size.should == 2
178
+ end
179
+ response.should have_tag("div#?", /\d+/) { |elements| #using {}
180
+ elements.size.should == 2
181
+ }
182
+ lambda {
183
+ response.should have_tag("div#?", /\d+/) do |elements|
184
+ elements.size.should == 3
185
+ end
186
+ }.should raise_error(SpecFailed, "expected: 3,\n got: 2 (using ==)")
187
+
188
+ lambda {
189
+ response.should have_tag("div#?", /\d+/) { |elements|
190
+ elements.size.should == 3
191
+ }
192
+ }.should raise_error(SpecFailed, "expected: 3,\n got: 2 (using ==)")
193
+
194
+ response.should have_tag("div#?", /\d+/) do |elements|
195
+ elements.size.should == 2
196
+ with_tag("#1")
197
+ with_tag("#2")
198
+ without_tag("#3")
199
+ end
200
+ end
201
+
202
+ #added for RSpec
203
+ it "nested tags in form" do
204
+ render_html %Q{
205
+ <form action="test">
206
+ <input type="text" name="email">
207
+ </form>
208
+ <form action="other">
209
+ <input type="text" name="other_input">
210
+ </form>
211
+ }
212
+ response.should have_tag("form[action=test]") { |form|
213
+ with_tag("input[type=text][name=email]")
214
+ }
215
+ response.should have_tag("form[action=other]") { |form|
216
+ with_tag("input[type=text][name=other_input]")
217
+ }
218
+
219
+ lambda {
220
+ response.should have_tag("form[action=test]") { |form|
221
+ with_tag("input[type=text][name=other_input]")
222
+ }
223
+ }.should raise_error(SpecFailed)
224
+
225
+ lambda {
226
+ response.should have_tag("form[action=test]") {
227
+ with_tag("input[type=text][name=other_input]")
228
+ }
229
+ }.should raise_error(SpecFailed)
230
+ end
231
+
232
+ it "should report the correct line number for a nested failed expectation" do
233
+ render_html %Q{
234
+ <form action="test">
235
+ <input type="text" name="email">
236
+ </form>
237
+ }
238
+ begin
239
+ response.should have_tag("form[action=test]") {
240
+ @expected_error_line = __LINE__; should have_tag("input[type=text][name=other_input]")
241
+ }
242
+ rescue => e
243
+ first_non_rspec_line_in_backtrace_of(e).should =~
244
+ /#{File.basename(__FILE__)}:#{@expected_error_line}/
245
+ else
246
+ fail
247
+ end
248
+ end
249
+
250
+ it "should report the correct line number for a nested raised exception" do
251
+ render_html %Q{
252
+ <form action="test">
253
+ <input type="text" name="email">
254
+ </form>
255
+ }
256
+ begin
257
+ response.should have_tag("form[action=test]") {
258
+ @expected_error_line = __LINE__; raise "Failed!"
259
+ }
260
+ rescue => e
261
+ first_non_rspec_line_in_backtrace_of(e).should =~
262
+ /#{File.basename(__FILE__)}:#{@expected_error_line}/
263
+ else
264
+ fail
265
+ end
266
+ end
267
+
268
+ it "should report the correct line number for a nested failed test/unit assertion" do
269
+ pending "Doesn't work at the moment. Do we want to support this?" do
270
+ render_html %Q{
271
+ <form action="test">
272
+ <input type="text" name="email">
273
+ </form>
274
+ }
275
+ begin
276
+ response.should have_tag("form[action=test]") {
277
+ @expected_error_line = __LINE__; assert false
278
+ }
279
+ rescue => e
280
+ first_non_rspec_line_in_backtrace_of(e).should =~
281
+ /#{File.basename(__FILE__)}:#{@expected_error_line}/
282
+ else
283
+ fail
284
+ end
285
+ end
286
+ end
287
+
288
+
289
+ it "beatles" do
290
+ unless defined?(BEATLES)
291
+ BEATLES = [
292
+ ["John", "Guitar"],
293
+ ["George", "Guitar"],
294
+ ["Paul", "Bass"],
295
+ ["Ringo", "Drums"]
296
+ ]
297
+ end
298
+
299
+ render_html %Q{
300
+ <div id="beatles">
301
+ <div class="beatle">
302
+ <h2>John</h2><p>Guitar</p>
303
+ </div>
304
+ <div class="beatle">
305
+ <h2>George</h2><p>Guitar</p>
306
+ </div>
307
+ <div class="beatle">
308
+ <h2>Paul</h2><p>Bass</p>
309
+ </div>
310
+ <div class="beatle">
311
+ <h2>Ringo</h2><p>Drums</p>
312
+ </div>
313
+ </div>
314
+ }
315
+ response.should have_tag("div#beatles>div[class=\"beatle\"]", 4)
316
+
317
+ response.should have_tag("div#beatles>div.beatle") {
318
+ BEATLES.each { |name, instrument|
319
+ with_tag("div.beatle>h2", name)
320
+ with_tag("div.beatle>p", instrument)
321
+ without_tag("div.beatle>span")
322
+ }
323
+ }
324
+ end
325
+
326
+ it "assert_select_text_match" do
327
+ render_html %Q{<div id="1"><span>foo</span></div><div id="2"><span>bar</span></div>}
328
+ response.should have_tag("div") do |divs|
329
+ with_tag("div", "foo")
330
+ with_tag("div", "bar")
331
+ with_tag("div", /\w*/)
332
+ with_tag("div", /\w*/, :count=>2)
333
+ without_tag("div", :text=>"foo", :count=>2)
334
+ with_tag("div", :html=>"<span>bar</span>")
335
+ with_tag("div", :html=>"<span>bar</span>")
336
+ with_tag("div", :html=>/\w*/)
337
+ with_tag("div", :html=>/\w*/, :count=>2)
338
+ without_tag("div", :html=>"<span>foo</span>", :count=>2)
339
+ end
340
+ end
341
+
342
+
343
+ it "assert_select_from_rjs with one item" do
344
+ render_rjs do |page|
345
+ page.replace_html "test", "<div id=\"1\">foo</div>\n<div id=\"2\">foo</div>"
346
+ end
347
+ response.should have_tag("div") { |elements|
348
+ elements.size.should == 2
349
+ with_tag("#1")
350
+ with_tag("#2")
351
+ }
352
+
353
+ lambda {
354
+ response.should have_tag("div") { |elements|
355
+ elements.size.should == 2
356
+ with_tag("#1")
357
+ with_tag("#3")
358
+ }
359
+ }.should raise_error(SpecFailed)
360
+
361
+ lambda {
362
+ response.should have_tag("div") { |elements|
363
+ elements.size.should == 2
364
+ with_tag("#1")
365
+ without_tag("#2")
366
+ }
367
+ }.should raise_error(SpecFailed, "should not have tag(\"#2\"), but did")
368
+
369
+ lambda {
370
+ response.should have_tag("div") { |elements|
371
+ elements.size.should == 3
372
+ with_tag("#1")
373
+ with_tag("#2")
374
+ }
375
+ }.should raise_error(SpecFailed)
376
+
377
+
378
+ response.should have_tag("div#?", /\d+/) { |elements|
379
+ with_tag("#1")
380
+ with_tag("#2")
381
+ }
382
+ end
383
+
384
+ it "assert_select_from_rjs with multiple items" do
385
+ render_rjs do |page|
386
+ page.replace_html "test", "<div id=\"1\">foo</div>"
387
+ page.replace_html "test2", "<div id=\"2\">foo</div>"
388
+ end
389
+ response.should have_tag("div")
390
+ response.should have_tag("div") { |elements|
391
+ elements.size.should == 2
392
+ with_tag("#1")
393
+ with_tag("#2")
394
+ }
395
+
396
+ lambda {
397
+ response.should have_tag("div") { |elements|
398
+ with_tag("#3")
399
+ }
400
+ }.should raise_error(SpecFailed)
401
+ end
402
+ end
403
+
404
+ describe "css_select", :type => :controller do
405
+ include AssertSelectSpecHelpers
406
+ controller_name :assert_select
407
+ integrate_views
408
+
409
+ it "can select tags from html" do
410
+ render_html %Q{<div id="1"></div><div id="2"></div>}
411
+ css_select("div").size.should == 2
412
+ css_select("p").size.should == 0
413
+ end
414
+
415
+
416
+ it "can select nested tags from html" do
417
+ render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
418
+ response.should have_tag("div#?", /\d+/) { |elements|
419
+ css_select(elements[0], "div").should have(1).element
420
+ css_select(elements[1], "div").should have(1).element
421
+ }
422
+ response.should have_tag("div") {
423
+ css_select("div").should have(2).elements
424
+ css_select("div").each { |element|
425
+ # Testing as a group is one thing
426
+ css_select("#1,#2").should have(2).elements
427
+ # Testing individually is another
428
+ css_select("#1").should have(1).element
429
+ css_select("#2").should have(1).element
430
+ }
431
+ }
432
+ end
433
+
434
+ it "can select nested tags from rjs (one result)" do
435
+ render_rjs do |page|
436
+ page.replace_html "test", "<div id=\"1\">foo</div>\n<div id=\"2\">foo</div>"
437
+ end
438
+ css_select("div").should have(2).elements
439
+ css_select("#1").should have(1).element
440
+ css_select("#2").should have(1).element
441
+ end
442
+
443
+ it "can select nested tags from rjs (two results)" do
444
+ render_rjs do |page|
445
+ page.replace_html "test", "<div id=\"1\">foo</div>"
446
+ page.replace_html "test2", "<div id=\"2\">foo</div>"
447
+ end
448
+ css_select("div").should have(2).elements
449
+ css_select("#1").should have(1).element
450
+ css_select("#2").should have(1).element
451
+ end
452
+
453
+ end
454
+
455
+ describe "have_rjs behaviour_type", :type => :controller do
456
+ include AssertSelectSpecHelpers
457
+ controller_name :assert_select
458
+ integrate_views
459
+
460
+ before(:each) do
461
+ render_rjs do |page|
462
+ page.replace "test1", "<div id=\"1\">foo</div>"
463
+ page.replace_html "test2", "<div id=\"2\">bar</div><div id=\"3\">none</div>"
464
+ page.insert_html :top, "test3", "<div id=\"4\">loopy</div>"
465
+ page.hide "test4"
466
+ page["test5"].hide
467
+ end
468
+ end
469
+
470
+ it "should pass if any rjs exists" do
471
+ response.should have_rjs
472
+ end
473
+
474
+ it "should fail if no rjs exists" do
475
+ render_rjs do |page|
476
+ end
477
+ lambda do
478
+ response.should have_rjs
479
+ end.should raise_error(SpecFailed)
480
+ end
481
+
482
+ it "should find all rjs from multiple statements" do
483
+ response.should have_rjs do
484
+ with_tag("#1")
485
+ with_tag("#2")
486
+ with_tag("#3")
487
+ # with_tag("#4")
488
+ # with_tag("#5")
489
+ end
490
+ end
491
+
492
+ it "should find by id" do
493
+ response.should have_rjs("test1") { |rjs|
494
+ rjs.size.should == 1
495
+ with_tag("div", 1)
496
+ with_tag("div#1", "foo")
497
+ }
498
+
499
+ lambda do
500
+ response.should have_rjs("test1") { |rjs|
501
+ rjs.size.should == 1
502
+ without_tag("div#1", "foo")
503
+ }
504
+ end.should raise_error(SpecFailed, "should not have tag(\"div#1\", \"foo\"), but did")
505
+
506
+ response.should have_rjs("test2") { |rjs|
507
+ rjs.size.should == 2
508
+ with_tag("div", 2)
509
+ with_tag("div#2", "bar")
510
+ with_tag("div#3", "none")
511
+ }
512
+ # response.should have_rjs("test4")
513
+ # response.should have_rjs("test5")
514
+ end
515
+
516
+ # specify "should find rjs using :hide" do
517
+ # response.should have_rjs(:hide)
518
+ # response.should have_rjs(:hide, "test4")
519
+ # response.should have_rjs(:hide, "test5")
520
+ # lambda do
521
+ # response.should have_rjs(:hide, "test3")
522
+ # end.should raise_error(SpecFailed)
523
+ # end
524
+
525
+ it "should find rjs using :replace" do
526
+ response.should have_rjs(:replace) { |rjs|
527
+ with_tag("div", 1)
528
+ with_tag("div#1", "foo")
529
+ }
530
+ response.should have_rjs(:replace, "test1") { |rjs|
531
+ with_tag("div", 1)
532
+ with_tag("div#1", "foo")
533
+ }
534
+ lambda {
535
+ response.should have_rjs(:replace, "test2")
536
+ }.should raise_error(SpecFailed)
537
+
538
+ lambda {
539
+ response.should have_rjs(:replace, "test3")
540
+ }.should raise_error(SpecFailed)
541
+ end
542
+
543
+ it "should find rjs using :replace_html" do
544
+ response.should have_rjs(:replace_html) { |rjs|
545
+ with_tag("div", 2)
546
+ with_tag("div#2", "bar")
547
+ with_tag("div#3", "none")
548
+ }
549
+
550
+ response.should have_rjs(:replace_html, "test2") { |rjs|
551
+ with_tag("div", 2)
552
+ with_tag("div#2", "bar")
553
+ with_tag("div#3", "none")
554
+ }
555
+
556
+ lambda {
557
+ response.should have_rjs(:replace_html, "test1")
558
+ }.should raise_error(SpecFailed)
559
+
560
+ lambda {
561
+ response.should have_rjs(:replace_html, "test3")
562
+ }.should raise_error(SpecFailed)
563
+ end
564
+
565
+ it "should find rjs using :insert_html (non-positioned)" do
566
+ response.should have_rjs(:insert_html) { |rjs|
567
+ with_tag("div", 1)
568
+ with_tag("div#4", "loopy")
569
+ }
570
+
571
+ response.should have_rjs(:insert_html, "test3") { |rjs|
572
+ with_tag("div", 1)
573
+ with_tag("div#4", "loopy")
574
+ }
575
+
576
+ lambda {
577
+ response.should have_rjs(:insert_html, "test1")
578
+ }.should raise_error(SpecFailed)
579
+
580
+ lambda {
581
+ response.should have_rjs(:insert_html, "test2")
582
+ }.should raise_error(SpecFailed)
583
+ end
584
+
585
+ it "should find rjs using :insert (positioned)" do
586
+ render_rjs do |page|
587
+ page.insert_html :top, "test1", "<div id=\"1\">foo</div>"
588
+ page.insert_html :bottom, "test2", "<div id=\"2\">bar</div>"
589
+ page.insert_html :before, "test3", "<div id=\"3\">none</div>"
590
+ page.insert_html :after, "test4", "<div id=\"4\">loopy</div>"
591
+ end
592
+ response.should have_rjs(:insert, :top) do
593
+ with_tag("div", 1)
594
+ with_tag("#1")
595
+ end
596
+ response.should have_rjs(:insert, :top, "test1") do
597
+ with_tag("div", 1)
598
+ with_tag("#1")
599
+ end
600
+ response.should have_rjs(:insert, :bottom) {|rjs|
601
+ with_tag("div", 1)
602
+ with_tag("#2")
603
+ }
604
+ response.should have_rjs(:insert, :bottom, "test2") {|rjs|
605
+ with_tag("div", 1)
606
+ with_tag("#2")
607
+ }
608
+ response.should have_rjs(:insert, :before) {|rjs|
609
+ with_tag("div", 1)
610
+ with_tag("#3")
611
+ }
612
+ response.should have_rjs(:insert, :before, "test3") {|rjs|
613
+ with_tag("div", 1)
614
+ with_tag("#3")
615
+ }
616
+ response.should have_rjs(:insert, :after) {|rjs|
617
+ with_tag("div", 1)
618
+ with_tag("#4")
619
+ }
620
+ response.should have_rjs(:insert, :after, "test4") {|rjs|
621
+ with_tag("div", 1)
622
+ with_tag("#4")
623
+ }
624
+ end
625
+
626
+ it "should find rjs using :insert (positioned)" do
627
+ pending("await fix for http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/982")
628
+ render_rjs do |page|
629
+ page.insert_html :top, "test1", "<div id=\"1\">foo</div>"
630
+ page.insert_html :bottom, "test2", "<div id=\"2\">bar</div>"
631
+ end
632
+ lambda {
633
+ response.should have_rjs(:insert, :top, "test2")
634
+ }.should raise_error(SpecFailed)
635
+ end
636
+ end
637
+
638
+ describe "send_email behaviour_type", :type => :controller do
639
+ include AssertSelectSpecHelpers
640
+ controller_name :assert_select
641
+ integrate_views
642
+
643
+ before(:each) do
644
+ ActionMailer::Base.delivery_method = :test
645
+ ActionMailer::Base.perform_deliveries = true
646
+ ActionMailer::Base.deliveries = []
647
+ end
648
+
649
+ after(:each) do
650
+ ActionMailer::Base.deliveries.clear
651
+ end
652
+
653
+ it "should fail with nothing sent" do
654
+ response.should_not send_email
655
+ lambda {
656
+ response.should send_email{}
657
+ }.should raise_error(SpecFailed, /No e-mail in delivery list./)
658
+ end
659
+
660
+ it "should pass otherwise" do
661
+ AssertSelectMailer.deliver_test "<div><p>foo</p><p>bar</p></div>"
662
+ response.should send_email
663
+ lambda {
664
+ response.should_not send_email
665
+ }.should raise_error(SpecFailed)
666
+ response.should send_email{}
667
+ response.should send_email {
668
+ with_tag("div:root") {
669
+ with_tag("p:first-child", "foo")
670
+ with_tag("p:last-child", "bar")
671
+ }
672
+ }
673
+
674
+ lambda {
675
+ response.should_not send_email
676
+ }.should raise_error(SpecFailed, "should not send email, but did")
677
+ end
678
+
679
+ end
680
+
681
+ # describe "An rjs call to :visual_effect, a 'should have_rjs' spec with",
682
+ # :type => :view do
683
+ #
684
+ # before do
685
+ # render 'rjs_spec/visual_effect'
686
+ # end
687
+ #
688
+ # it "should pass with the correct element name" do
689
+ # response.should have_rjs(:effect, :fade, 'mydiv')
690
+ # end
691
+ #
692
+ # it "should fail the wrong element name" do
693
+ # lambda {
694
+ # response.should have_rjs(:effect, :fade, 'wrongname')
695
+ # }.should raise_error(SpecFailed)
696
+ # end
697
+ #
698
+ # it "should fail with the correct element but the wrong command" do
699
+ # lambda {
700
+ # response.should have_rjs(:effect, :puff, 'mydiv')
701
+ # }.should raise_error(SpecFailed)
702
+ # end
703
+ #
704
+ # end
705
+ #
706
+ # describe "An rjs call to :visual_effect for a toggle, a 'should have_rjs' spec with",
707
+ # :type => :view do
708
+ #
709
+ # before do
710
+ # render 'rjs_spec/visual_toggle_effect'
711
+ # end
712
+ #
713
+ # it "should pass with the correct element name" do
714
+ # response.should have_rjs(:effect, :toggle_blind, 'mydiv')
715
+ # end
716
+ #
717
+ # it "should fail with the wrong element name" do
718
+ # lambda {
719
+ # response.should have_rjs(:effect, :toggle_blind, 'wrongname')
720
+ # }.should raise_error(SpecFailed)
721
+ # end
722
+ #
723
+ # it "should fail the correct element but the wrong command" do
724
+ # lambda {
725
+ # response.should have_rjs(:effect, :puff, 'mydiv')
726
+ # }.should raise_error(SpecFailed)
727
+ # end
728
+ #
729
+ # end
730
+
731
+ describe "string.should have_tag", :type => :helper do
732
+ include AssertSelectSpecHelpers
733
+
734
+ it "should find root element" do
735
+ "<p>a paragraph</p>".should have_tag("p", "a paragraph")
736
+ end
737
+
738
+ it "should not find non-existent element" do
739
+ lambda do
740
+ "<p>a paragraph</p>".should have_tag("p", "wrong text")
741
+ end.should raise_error(SpecFailed)
742
+ end
743
+
744
+ it "should find child element" do
745
+ "<div><p>a paragraph</p></div>".should have_tag("p", "a paragraph")
746
+ end
747
+
748
+ it "should find nested element" do
749
+ "<div><p>a paragraph</p></div>".should have_tag("div") do
750
+ with_tag("p", "a paragraph")
751
+ end
752
+ end
753
+
754
+ it "should not find wrong nested element" do
755
+ lambda do
756
+ "<div><p>a paragraph</p></div>".should have_tag("div") do
757
+ with_tag("p", "wrong text")
758
+ end
759
+ end.should raise_error(SpecFailed)
760
+ end
761
+ end
762
+
763
+ describe "have_tag", :type => :controller do
764
+ include AssertSelectSpecHelpers
765
+ controller_name :assert_select
766
+ integrate_views
767
+
768
+ it "should work exactly the same as assert_select" do
769
+ render_html %Q{
770
+ <div id="wrapper">foo
771
+ <div class="piece">
772
+ <h3>Text</h3>
773
+ </div>
774
+ <div class="piece">
775
+ <h3>Another</h3>
776
+ </div>
777
+ </div>
778
+ }
779
+
780
+ assert_select "#wrapper .piece h3", :text => "Text"
781
+ assert_select "#wrapper .piece h3", :text => "Another"
782
+
783
+ response.should have_tag("#wrapper .piece h3", :text => "Text")
784
+ response.should have_tag("#wrapper .piece h3", :text => "Another")
785
+ end
786
+ end
787
+
788
+ describe 'selecting in HTML that contains a mock with null_object' do
789
+ include ActionController::Assertions::SelectorAssertions
790
+ module HTML
791
+ class Document
792
+ def initialize_with_strict_error_checking(text, strict=false, xml=false)
793
+ initialize_without_strict_error_checking(text, true, xml)
794
+ end
795
+ alias_method :initialize_without_strict_error_checking, :initialize
796
+ alias_method :initialize, :initialize_with_strict_error_checking
797
+ end
798
+ end
799
+
800
+ describe 'modified HTML::Document' do
801
+ it 'should raise error on valid HTML even though false is specified' do
802
+ lambda {HTML::Document.new("<b>#<Spec::Mocks::Mock:0x267b4f0></b>", false, false)}.should raise_error
803
+ end
804
+ end
805
+
806
+ it 'should not print errors from assert_select' do
807
+ mock = mock("Dog", :null_object => true)
808
+ html = "<b>#{mock.colour}</b>"
809
+ lambda {html.should have_tag('b')}.should_not raise_error
810
+ end
811
+ end