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.
- data/History.txt +174 -0
- data/License.txt +33 -0
- data/Manifest.txt +164 -0
- data/README.txt +45 -0
- data/Rakefile +63 -0
- data/TODO.txt +1 -0
- data/Upgrade.markdown +52 -0
- data/features/step_definitions/people.rb +6 -0
- data/features/support/env.rb +13 -0
- data/features/transactions/transactions_should_rollback.feature +16 -0
- data/generators/rspec/CHANGES +1 -0
- data/generators/rspec/rspec_generator.rb +37 -0
- data/generators/rspec/templates/previous_failures.txt +0 -0
- data/generators/rspec/templates/rcov.opts +2 -0
- data/generators/rspec/templates/rspec.rake +177 -0
- data/generators/rspec/templates/script/autospec +5 -0
- data/generators/rspec/templates/script/spec +4 -0
- data/generators/rspec/templates/script/spec_server +37 -0
- data/generators/rspec/templates/spec.opts +4 -0
- data/generators/rspec/templates/spec_helper.rb +47 -0
- data/generators/rspec_controller/USAGE +33 -0
- data/generators/rspec_controller/rspec_controller_generator.rb +45 -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 +19 -0
- data/generators/rspec_model/USAGE +18 -0
- data/generators/rspec_model/rspec_model_generator.rb +35 -0
- data/generators/rspec_model/templates/model_spec.rb +15 -0
- data/generators/rspec_scaffold/rspec_scaffold_generator.rb +150 -0
- data/generators/rspec_scaffold/templates/controller_spec.rb +171 -0
- data/generators/rspec_scaffold/templates/edit_erb_spec.rb +27 -0
- data/generators/rspec_scaffold/templates/helper_spec.rb +11 -0
- data/generators/rspec_scaffold/templates/index_erb_spec.rb +28 -0
- data/generators/rspec_scaffold/templates/new_erb_spec.rb +27 -0
- data/generators/rspec_scaffold/templates/routing_spec.rb +63 -0
- data/generators/rspec_scaffold/templates/show_erb_spec.rb +23 -0
- data/init.rb +9 -0
- data/lib/autotest/discover.rb +1 -0
- data/lib/autotest/rails_rspec.rb +76 -0
- data/lib/spec/rails.rb +37 -0
- data/lib/spec/rails/example.rb +53 -0
- data/lib/spec/rails/example/assigns_hash_proxy.rb +39 -0
- data/lib/spec/rails/example/controller_example_group.rb +242 -0
- data/lib/spec/rails/example/cookies_proxy.rb +29 -0
- data/lib/spec/rails/example/functional_example_group.rb +84 -0
- data/lib/spec/rails/example/helper_example_group.rb +167 -0
- data/lib/spec/rails/example/model_example_group.rb +14 -0
- data/lib/spec/rails/example/render_observer.rb +67 -0
- data/lib/spec/rails/example/routing_helpers.rb +68 -0
- data/lib/spec/rails/example/view_example_group.rb +186 -0
- data/lib/spec/rails/extensions.rb +15 -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 +33 -0
- data/lib/spec/rails/extensions/active_record/base.rb +43 -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 +48 -0
- data/lib/spec/rails/interop/testcase.rb +14 -0
- data/lib/spec/rails/matchers.rb +40 -0
- data/lib/spec/rails/matchers/ar_be_valid.rb +44 -0
- data/lib/spec/rails/matchers/assert_select.rb +131 -0
- data/lib/spec/rails/matchers/change.rb +11 -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 +114 -0
- data/lib/spec/rails/mocks.rb +135 -0
- data/lib/spec/rails/spec_server.rb +97 -0
- data/lib/spec/rails/story_adapter.rb +79 -0
- data/lib/spec/rails/version.rb +16 -0
- data/rspec-rails.gemspec +39 -0
- data/spec/autotest/mappings_spec.rb +36 -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 +116 -0
- data/spec/resources/controllers/redirect_spec_controller.rb +70 -0
- data/spec/resources/controllers/render_spec_controller.rb +30 -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.rhtml +0 -0
- data/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.rhtml +1 -0
- data/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.rhtml +1 -0
- data/spec/resources/views/controller_spec/action_setting_the_assigns_hash.rhtml +0 -0
- data/spec/resources/views/controller_spec/action_with_errors_in_template.rhtml +1 -0
- data/spec/resources/views/controller_spec/action_with_template.rhtml +1 -0
- data/spec/resources/views/layouts/application.rhtml +0 -0
- data/spec/resources/views/layouts/simple.rhtml +0 -0
- data/spec/resources/views/objects/_object.html.erb +1 -0
- data/spec/resources/views/render_spec/_a_partial.rhtml +0 -0
- data/spec/resources/views/render_spec/action_with_alternate_layout.rhtml +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/render_spec/some_action.rjs +1 -0
- data/spec/resources/views/rjs_spec/_replacement_partial.rhtml +1 -0
- data/spec/resources/views/rjs_spec/hide_div.rjs +1 -0
- data/spec/resources/views/rjs_spec/hide_page_element.rjs +1 -0
- data/spec/resources/views/rjs_spec/insert_html.rjs +1 -0
- data/spec/resources/views/rjs_spec/replace.rjs +1 -0
- data/spec/resources/views/rjs_spec/replace_html.rjs +1 -0
- data/spec/resources/views/rjs_spec/replace_html_with_partial.rjs +1 -0
- data/spec/resources/views/rjs_spec/visual_effect.rjs +1 -0
- data/spec/resources/views/rjs_spec/visual_toggle_effect.rjs +1 -0
- data/spec/resources/views/tag_spec/no_tags.rhtml +1 -0
- data/spec/resources/views/tag_spec/single_div_with_no_attributes.rhtml +1 -0
- data/spec/resources/views/tag_spec/single_div_with_one_attribute.rhtml +1 -0
- data/spec/resources/views/view_spec/_partial.rhtml +2 -0
- data/spec/resources/views/view_spec/_partial_used_twice.rhtml +0 -0
- data/spec/resources/views/view_spec/_partial_with_local_variable.rhtml +1 -0
- data/spec/resources/views/view_spec/_partial_with_sub_partial.rhtml +1 -0
- data/spec/resources/views/view_spec/_spacer.rhtml +1 -0
- data/spec/resources/views/view_spec/accessor.rhtml +5 -0
- data/spec/resources/views/view_spec/block_helper.rhtml +3 -0
- data/spec/resources/views/view_spec/entry_form.rhtml +2 -0
- data/spec/resources/views/view_spec/explicit_helper.rhtml +2 -0
- data/spec/resources/views/view_spec/foo/show.rhtml +1 -0
- data/spec/resources/views/view_spec/implicit_helper.rhtml +2 -0
- data/spec/resources/views/view_spec/multiple_helpers.rhtml +3 -0
- data/spec/resources/views/view_spec/path_params.html.erb +1 -0
- data/spec/resources/views/view_spec/should_not_receive.rhtml +3 -0
- data/spec/resources/views/view_spec/template_with_partial.rhtml +5 -0
- data/spec/resources/views/view_spec/template_with_partial_using_collection.rhtml +3 -0
- data/spec/resources/views/view_spec/template_with_partial_with_array.rhtml +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 +275 -0
- data/spec/spec/rails/example/controller_isolation_spec.rb +56 -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 +206 -0
- data/spec/spec/rails/example/model_example_group_spec.rb +20 -0
- data/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb +33 -0
- data/spec/spec/rails/example/view_example_group_spec.rb +335 -0
- data/spec/spec/rails/extensions/action_view_base_spec.rb +48 -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 +45 -0
- data/spec/spec/rails/matchers/assert_select_spec.rb +811 -0
- data/spec/spec/rails/matchers/errors_on_spec.rb +25 -0
- data/spec/spec/rails/matchers/have_text_spec.rb +70 -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 +183 -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 +106 -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_server_spec.rb +107 -0
- data/spec/spec/rails/spec_spec.rb +11 -0
- data/spec/spec_helper.rb +78 -0
- 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
|