rspec-html-matchers 0.2.2

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/mikhalok.jpg ADDED
Binary file
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "rspec-html-matchers"
6
+ s.version = '0.2.2'
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["kucaahbe"]
9
+ s.email = ["kucaahbe@ukr.net"]
10
+ s.homepage = "http://github.com/kucaahbe/rspec-html-matchers"
11
+ s.summary = %q{Nokogiri based 'have_tag' and 'with_tag' matchers for rspec 2.x.x}
12
+ s.description = <<DESC
13
+ #{s.summary}. Does not depend on assert_select matcher, provides useful error messages.
14
+ DESC
15
+
16
+ s.rubyforge_project = "rspec-html-matchers"
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ s.require_paths = ["lib"]
22
+
23
+ s.add_dependency 'rspec', '>= 2.0.0'
24
+ s.add_dependency 'nokogiri', '>= 1.4.4'
25
+
26
+ s.add_development_dependency 'simplecov'
27
+ s.add_development_dependency 'rake'
28
+ end
data/script/assets.rb ADDED
@@ -0,0 +1,38 @@
1
+ class Asset
2
+ @@assets = {}
3
+
4
+ PATH = File.expand_path(File.join(File.dirname(__FILE__),'..','assets','*.html'))
5
+
6
+ def self.[] name
7
+ @@assets[name.to_s]
8
+ end
9
+
10
+ def self.<< asset
11
+ @@assets.merge! asset.name => asset
12
+ end
13
+
14
+ def self.list
15
+ @@assets.keys
16
+ end
17
+
18
+ attr_reader :name
19
+
20
+ def initialize name, path
21
+ @name = name
22
+ @path = path
23
+ end
24
+
25
+ def content
26
+ @content ||= IO.read(@path)
27
+ puts @content
28
+ return @content
29
+ end
30
+ alias_method :c, :content
31
+ end
32
+
33
+ puts 'assets list:'
34
+ Dir[Asset::PATH].each do |asset_path|
35
+ asset_name = File.basename(asset_path,'.html')
36
+ puts asset_name
37
+ Asset << Asset.new(asset_name,asset_path)
38
+ end
data/script/console ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+ require 'nokogiri'
6
+ require File.join(File.dirname(__FILE__),'assets.rb')
7
+ require 'irb'
8
+
9
+ IRB.start
@@ -0,0 +1,310 @@
1
+ require 'spec_helper'
2
+
3
+ describe "have_form" do
4
+ let(:rendered) { IO.read(File.dirname(__FILE__)+"/../../assets/form.html") }
5
+
6
+ context "without &block" do
7
+ it "should find form" do
8
+ rendered.should have_form("/books", :post)
9
+ self.should_receive(:have_tag).with("form#new_book", :with => { :method => "post", :action => "/books", :class => %w(book formtastic) })
10
+ rendered.should have_form("/books", "post", :with => { :id => "new_book", :class => %w(book formtastic) })
11
+ end
12
+
13
+ it "should not find form" do
14
+ rendered.should_not have_form("/some_url", :post)
15
+ rendered.should_not have_form("/books", :get)
16
+ end
17
+ end
18
+
19
+ context "with &block" do
20
+ context "with_select" do
21
+ it "should find select" do
22
+ rendered.should have_form("/books", :post) do
23
+ with_select("book[publisher_id]", :with => { :id => "book_publisher_id" })
24
+ self.should_receive(:have_tag).with("select#book_publisher_id", :with => { :name => "book[publisher_id]" })
25
+ with_select("book[publisher_id]", :with => { :id => "book_publisher_id" })
26
+ end
27
+ end
28
+
29
+ it "should not find select" do
30
+ rendered.should have_form("/books", :post) do
31
+ without_select("book[publisher_id]", :with => { :id => "other_id" })
32
+ self.should_receive(:have_tag).with("select#book_publisher_id", :with => { :name => "koob[publisher_id]" })
33
+ without_select("koob[publisher_id]", :with => { :id => "book_publisher_id" })
34
+ end
35
+ end
36
+
37
+ context "with_option" do
38
+ it "should find options" do
39
+ rendered.should have_form("/books", :post) do
40
+ with_select("book[publisher_id]") do
41
+ with_option(nil)
42
+ with_option("The Pragmatic Bookshelf", :selected => true)
43
+ with_option(/sitepoint/,2)
44
+ self.should_receive(:have_tag).with('option', :with => { :value => '3' }, :text => "O'Reilly")
45
+ with_option("O'Reilly", 3, :selected => false)
46
+ end
47
+ end
48
+ end
49
+
50
+ it "should not find options" do
51
+ rendered.should have_form("/books", :post) do
52
+ with_select("book[publisher_id]") do
53
+ without_option("blah blah")
54
+ without_option("O'Reilly", 3, :selected => true)
55
+ without_option("O'Reilly", 100500)
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ context "with_button" do
62
+ it "should find button" do
63
+ rendered.should have_form("/books", :post) do
64
+ self.should_receive(:have_tag).with('button', :with => {}, :text => "Cancel Book")
65
+ with_button("Cancel Book")
66
+ end
67
+ end
68
+
69
+ it "should not find button" do
70
+ rendered.should have_form("/books", :post) do
71
+ without_button("Cancel Book")
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ context "with_hidden_field" do
78
+ it "should find hidden field" do
79
+ rendered.should have_form("/books", :post) do
80
+ with_hidden_field("authenticity_token")
81
+ self.should_receive(:have_tag).with('input', :with => {
82
+ :name => 'authenticity_token',
83
+ :type => 'hidden',
84
+ :value => '718WaH76RAbIVhDlnOidgew62ikn8IUCOyWLEqjw1GE='
85
+ })
86
+ with_hidden_field("authenticity_token", '718WaH76RAbIVhDlnOidgew62ikn8IUCOyWLEqjw1GE=')
87
+ end
88
+ end
89
+
90
+ it "should not find hidden field" do
91
+ rendered.should have_form("/books", :post) do
92
+ without_hidden_field('user_id')
93
+ without_hidden_field('authenticity_token', 'blabla')
94
+ end
95
+ end
96
+ end
97
+
98
+ context "with_text_field" do
99
+ it "should find text field" do
100
+ rendered.should have_form("/books", :post) do
101
+ with_text_field('book[title]')
102
+ with_text_field('book[title]',nil)
103
+ with_text_field('book[author]','Authorname')
104
+ end
105
+ end
106
+
107
+ it "should not find text field" do
108
+ rendered.should have_form("/books", :post) do
109
+ without_text_field('book[title]','title does not exist')
110
+ without_text_field('book[authoRR]')
111
+ without_text_field('book[blabla]')
112
+ end
113
+ end
114
+ end
115
+
116
+ context "with_email_field" do
117
+ it "should find email field" do
118
+ rendered.should have_form("/books", :post) do
119
+ with_email_field('user[email]')
120
+ with_email_field('user[email]', 'email@example.com')
121
+ with_email_field('user[email_confirmation]', nil)
122
+ end
123
+ end
124
+
125
+ it "should not find email field" do
126
+ rendered.should have_form("/books", :post) do
127
+ without_email_field('book[author]','Authorname')
128
+ without_email_field('user[emaiL]')
129
+ without_email_field('user[apocalyptiq]')
130
+ end
131
+ end
132
+ end
133
+
134
+ context "with_url_field" do
135
+ it "should find url field" do
136
+ rendered.should have_form("/books", :post) do
137
+ with_url_field('user[url]')
138
+ with_url_field('user[url]', 'http://user.com')
139
+ end
140
+ end
141
+
142
+ it "should not find url field" do
143
+ rendered.should have_form("/books", :post) do
144
+ without_url_field('user[url]','Authorname')
145
+ without_url_field('user[emaiL]')
146
+ without_url_field('user[apocalyptiq]')
147
+ end
148
+ end
149
+ end
150
+
151
+ context "with_number_field" do
152
+ it "should find number field" do
153
+ rendered.should have_form("/books", :post) do
154
+ with_number_field('number')
155
+ with_number_field('number_defined', 3)
156
+ with_number_field('number_defined', '3')
157
+ end
158
+ end
159
+
160
+ it "should not find number field" do
161
+ rendered.should have_form("/books", :post) do
162
+ without_number_field('number',400)
163
+ without_number_field('number','400')
164
+ without_number_field('user[emaiL]')
165
+ without_number_field('user[apocalyptiq]')
166
+ end
167
+ end
168
+ end
169
+
170
+ context "with_range_field" do
171
+ it "should find range field" do
172
+ rendered.should have_form("/books", :post) do
173
+ with_range_field('range1', 1, 3)
174
+ with_range_field('range1','1','3')
175
+ with_range_field('range2', 1, 3, :with => { :value => 2 } )
176
+ with_range_field('range2', 1, 3, :with => { :value => '2' } )
177
+ end
178
+ end
179
+
180
+ it "should not find range field" do
181
+ rendered.should have_form("/books", :post) do
182
+ without_range_field('number')
183
+ without_range_field('range1', 1, 5)
184
+ without_range_field('range2', 1, 3, :with => { :value => 5 } )
185
+ end
186
+ end
187
+ end
188
+
189
+ context "with_date_field" do
190
+ it "should find date field" do
191
+ rendered.should have_form("/books", :post) do
192
+ with_date_field(:date)
193
+ with_date_field(:date, 'book_date')
194
+ with_date_field(:month, 'book_month', :with => { :value => 5 })
195
+ with_date_field(:week,'book_week')
196
+ with_date_field(:time, 'book_time')
197
+ with_date_field(:datetime, 'book_datetime')
198
+ with_date_field('datetime-local', 'book_datetime_local')
199
+ end
200
+ end
201
+
202
+ it "should not find date field" do
203
+ rendered.should have_form("/books", :post) do
204
+ without_date_field(:date, 'book_something')
205
+ without_date_field(:month, 'book_month', :with => { :value => 100500 })
206
+ end
207
+ end
208
+
209
+ it "should raise exception if wrong date field type specified" do
210
+ expect do
211
+ rendered.should have_form("/books", :post) do
212
+ without_date_field(:unknown, 'book_something')
213
+ end
214
+ end.to raise_error('unknown type `unknown` for date picker')
215
+ expect do
216
+ rendered.should have_form("/books", :post) do
217
+ with_date_field(:unknown, 'book_something')
218
+ end
219
+ end.to raise_error('unknown type `unknown` for date picker')
220
+ end
221
+ end
222
+
223
+ context "with_password_field" do
224
+ it "should find password field" do
225
+ rendered.should have_form("/books", :post) do
226
+ with_password_field('user[password]')
227
+ end
228
+ end
229
+
230
+ it "should not find password field" do
231
+ rendered.should have_form("/books", :post) do
232
+ without_password_field('account[password]')
233
+ end
234
+ end
235
+ end
236
+
237
+ context "with_file_field" do
238
+ it "should find file field" do
239
+ rendered.should have_form("/books", :post) do
240
+ with_file_field('form[file]')
241
+ end
242
+ end
243
+
244
+ it "should not find file field" do
245
+ rendered.should have_form("/books", :post) do
246
+ without_file_field('user[file]')
247
+ end
248
+ end
249
+ end
250
+
251
+ context "with_text_area" do
252
+ it "should find text area" do
253
+ rendered.should have_form("/books", :post) do
254
+ with_text_area('book[description]')
255
+ end
256
+ end
257
+
258
+ it "should not find text area" do
259
+ rendered.should have_form("/books", :post) do
260
+ without_text_area('user[bio]')
261
+ end
262
+ end
263
+ end
264
+
265
+ context "with_check_box" do
266
+ it "should find check box" do
267
+ rendered.should have_form("/books", :post) do
268
+ with_checkbox("book[still_in_print]")
269
+ with_checkbox("book[still_in_print]","1")
270
+ end
271
+ end
272
+
273
+ it "should not find check box" do
274
+ rendered.should have_form("/books", :post) do
275
+ without_checkbox("book[book]")
276
+ without_checkbox("book[still_in_print]","500")
277
+ end
278
+ end
279
+ end
280
+
281
+ context "with_radio_button" do
282
+ it "should find radio button" do
283
+ rendered.should have_form("/books", :post) do
284
+ with_radio_button("form[name]","true")
285
+ end
286
+ end
287
+
288
+ it "should not find radio button" do
289
+ rendered.should have_form("/books", :post) do
290
+ without_radio_button("form[name]","100500")
291
+ without_radio_button("form[item]","false")
292
+ end
293
+ end
294
+ end
295
+
296
+ context "with_submit" do
297
+ it "should find submit" do
298
+ rendered.should have_form("/books", :post) do
299
+ with_submit("Create Book")
300
+ end
301
+ end
302
+
303
+ it "should not find submit" do
304
+ rendered.should have_form("/books", :post) do
305
+ without_submit("Destroy Book")
306
+ end
307
+ end
308
+ end
309
+ end
310
+ end
@@ -0,0 +1,346 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'have_tag' do
4
+ context "through css selector" do
5
+ let(:rendered) { asset('search_and_submit') }
6
+
7
+ it "should find tags" do
8
+ rendered.should have_tag('div')
9
+ rendered.should have_tag(:div)
10
+ rendered.should have_tag('div#div')
11
+ rendered.should have_tag('p.paragraph')
12
+ rendered.should have_tag('div p strong')
13
+ end
14
+
15
+ it "should not find tags" do
16
+ rendered.should_not have_tag('span')
17
+ rendered.should_not have_tag(:span)
18
+ rendered.should_not have_tag('span#id')
19
+ rendered.should_not have_tag('span#class')
20
+ rendered.should_not have_tag('div div span')
21
+ end
22
+
23
+ it "should not find tags and display appropriate message" do
24
+ expect { rendered.should have_tag('span') }.should raise_spec_error(
25
+ %Q{expected following:\n#{rendered}\nto have at least 1 element matching "span", found 0.}
26
+ )
27
+ expect { rendered.should have_tag('span#some_id') }.should raise_spec_error(
28
+ %Q{expected following:\n#{rendered}\nto have at least 1 element matching "span#some_id", found 0.}
29
+ )
30
+ expect { rendered.should have_tag('span.some_class') }.should raise_spec_error(
31
+ %Q{expected following:\n#{rendered}\nto have at least 1 element matching "span.some_class", found 0.}
32
+ )
33
+ end
34
+
35
+ it "should find unexpected tags and display appropriate message" do
36
+ expect { rendered.should_not have_tag('div') }.should raise_spec_error(
37
+ %Q{expected following:\n#{rendered}\nto NOT have element matching "div", found 2.}
38
+ )
39
+ expect { rendered.should_not have_tag('div#div') }.should raise_spec_error(
40
+ %Q{expected following:\n#{rendered}\nto NOT have element matching "div#div", found 1.}
41
+ )
42
+ expect { rendered.should_not have_tag('p.paragraph') }.should raise_spec_error(
43
+ %Q{expected following:\n#{rendered}\nto NOT have element matching "p.paragraph", found 1.}
44
+ )
45
+ end
46
+
47
+ context "with additional HTML attributes(:with option)" do
48
+ it "should find tags" do
49
+ rendered.should have_tag('input#search',:with => {:type => "text"})
50
+ rendered.should have_tag(:input ,:with => {:type => "submit", :value => "Save"})
51
+ end
52
+
53
+ it "should find tags that have classes specified via array(or string)" do
54
+ rendered.should have_tag('div',:with => {:class => %w(class-one class-two)})
55
+ rendered.should have_tag('div',:with => {:class => 'class-two class-one'})
56
+ end
57
+
58
+ it "should not find tags that have classes specified via array" do
59
+ rendered.should_not have_tag('div',:with => {:class => %w(class-other class-two)})
60
+ end
61
+
62
+ it "should not find tags that have classes specified via array and display appropriate message" do
63
+ expect do
64
+ rendered.should have_tag('div',:with => {:class => %w(class-other class-two)})
65
+ end.should raise_spec_error(
66
+ %Q{expected following:\n#{rendered}\nto have at least 1 element matching "div.class-other.class-two", found 0.}
67
+ )
68
+ expect do
69
+ rendered.should have_tag('div',:with => {:class => 'class-other class-two'})
70
+ end.should raise_spec_error(
71
+ %Q{expected following:\n#{rendered}\nto have at least 1 element matching "div.class-other.class-two", found 0.}
72
+ )
73
+ end
74
+
75
+ it "should not find tags" do
76
+ rendered.should_not have_tag('input#search',:with => {:type => "some_other_type"})
77
+ rendered.should_not have_tag(:input, :with => {:type => "some_other_type"})
78
+ end
79
+
80
+ it "should not find tags and display appropriate message" do
81
+ expect { rendered.should have_tag('input#search',:with => {:type => "some_other_type"}) }.should raise_spec_error(
82
+ %Q{expected following:\n#{rendered}\nto have at least 1 element matching "input#search[type='some_other_type']", found 0.}
83
+ )
84
+ end
85
+
86
+ it "should find unexpected tags and display appropriate message" do
87
+ expect { rendered.should_not have_tag('input#search',:with => {:type => "text"}) }.should raise_spec_error(
88
+ %Q{expected following:\n#{rendered}\nto NOT have element matching "input#search[type='text']", found 1.}
89
+ )
90
+ end
91
+
92
+ end
93
+
94
+ end
95
+
96
+ context "by count" do
97
+ let(:rendered) { asset('paragraphs') }
98
+
99
+ it "should find tags" do
100
+ rendered.should have_tag('p', :count => 3)
101
+ rendered.should have_tag('p', :count => 2..3)
102
+ end
103
+
104
+ it "should find tags when :minimum specified" do
105
+ rendered.should have_tag('p', :min => 3)
106
+ rendered.should have_tag('p', :minimum => 2)
107
+ end
108
+
109
+ it "should find tags when :maximum specified" do
110
+ rendered.should have_tag('p', :max => 4)
111
+ rendered.should have_tag('p', :maximum => 3)
112
+ end
113
+
114
+ it "should not find tags(with :count, :minimum or :maximum specified)" do
115
+ rendered.should_not have_tag('p', :count => 10)
116
+ rendered.should_not have_tag('p', :count => 4..8)
117
+ rendered.should_not have_tag('p', :min => 11)
118
+ rendered.should_not have_tag('p', :minimum => 10)
119
+ rendered.should_not have_tag('p', :max => 2)
120
+ rendered.should_not have_tag('p', :maximum => 2)
121
+ end
122
+
123
+ it "should not find tags and display appropriate message(with :count)" do
124
+ expect { rendered.should have_tag('p', :count => 10) }.should raise_spec_error(
125
+ %Q{expected following:\n#{rendered}\nto have 10 element(s) matching "p", found 3.}
126
+ )
127
+
128
+ expect { rendered.should have_tag('p', :count => 4..8) }.should raise_spec_error(
129
+ %Q{expected following:\n#{rendered}\nto have at least 4 and at most 8 element(s) matching "p", found 3.}
130
+ )
131
+ end
132
+
133
+ it "should find unexpected tags and display appropriate message(with :count)" do
134
+ expect { rendered.should_not have_tag('p', :count => 3) }.should raise_spec_error(
135
+ %Q{expected following:\n#{rendered}\nto NOT have 3 element(s) matching "p", but found.}
136
+ )
137
+
138
+ expect { rendered.should_not have_tag('p', :count => 1..3) }.should raise_spec_error(
139
+ %Q{expected following:\n#{rendered}\nto NOT have at least 1 and at most 3 element(s) matching "p", but found 3.}
140
+ )
141
+ end
142
+
143
+ it "should not find tags and display appropriate message(with :minimum)" do
144
+ expect { rendered.should have_tag('p', :min => 100) }.should raise_spec_error(
145
+ %Q{expected following:\n#{rendered}\nto have at least 100 element(s) matching "p", found 3.}
146
+ )
147
+ expect { rendered.should have_tag('p', :minimum => 100) }.should raise_spec_error(
148
+ %Q{expected following:\n#{rendered}\nto have at least 100 element(s) matching "p", found 3.}
149
+ )
150
+ end
151
+
152
+ it "should find unexpected tags and display appropriate message(with :minimum)" do
153
+ expect { rendered.should_not have_tag('p', :min => 2) }.should raise_spec_error(
154
+ %Q{expected following:\n#{rendered}\nto NOT have at least 2 element(s) matching "p", but found 3.}
155
+ )
156
+ expect { rendered.should_not have_tag('p', :minimum => 2) }.should raise_spec_error(
157
+ %Q{expected following:\n#{rendered}\nto NOT have at least 2 element(s) matching "p", but found 3.}
158
+ )
159
+ end
160
+
161
+ it "should not find tags and display appropriate message(with :maximum)" do
162
+ expect { rendered.should have_tag('p', :max => 2) }.should raise_spec_error(
163
+ %Q{expected following:\n#{rendered}\nto have at most 2 element(s) matching "p", found 3.}
164
+ )
165
+ expect { rendered.should have_tag('p', :maximum => 2) }.should raise_spec_error(
166
+ %Q{expected following:\n#{rendered}\nto have at most 2 element(s) matching "p", found 3.}
167
+ )
168
+ end
169
+
170
+ it "should find unexpected tags and display appropriate message(with :maximum)" do
171
+ expect { rendered.should_not have_tag('p', :max => 5) }.should raise_spec_error(
172
+ %Q{expected following:\n#{rendered}\nto NOT have at most 5 element(s) matching "p", but found 3.}
173
+ )
174
+ expect { rendered.should_not have_tag('p', :maximum => 5) }.should raise_spec_error(
175
+ %Q{expected following:\n#{rendered}\nto NOT have at most 5 element(s) matching "p", but found 3.}
176
+ )
177
+ end
178
+
179
+ it "should raise error when wrong params specified" do
180
+ expect { rendered.should have_tag('div', :count => 'string') }.should raise_error(/wrong :count/)
181
+ wrong_params_error_msg_1 = ':count with :minimum or :maximum has no sence!'
182
+ expect { rendered.should have_tag('div', :count => 2, :minimum => 1) }.should raise_error(wrong_params_error_msg_1)
183
+ expect { rendered.should have_tag('div', :count => 2, :min => 1) }.should raise_error(wrong_params_error_msg_1)
184
+ expect { rendered.should have_tag('div', :count => 2, :maximum => 1) }.should raise_error(wrong_params_error_msg_1)
185
+ expect { rendered.should have_tag('div', :count => 2, :max => 1) }.should raise_error(wrong_params_error_msg_1)
186
+ wrong_params_error_msg_2 = ':minimum shold be less than :maximum!'
187
+ expect { rendered.should have_tag('div', :minimum => 2, :maximum => 1) }.should raise_error(wrong_params_error_msg_2)
188
+ [ 4..1, -2..6, 'a'..'z', 3..-9 ].each do |range|
189
+ expect { rendered.should have_tag('div', :count => range ) }.should raise_error("Your :count range(#{range.to_s}) has no sence!")
190
+ end
191
+ end
192
+ end
193
+
194
+ context "with content specified" do
195
+ let(:rendered) { asset('quotes') }
196
+
197
+ it "should find tags" do
198
+ rendered.should have_tag('div', :text => 'sample text')
199
+ rendered.should have_tag('p', :text => 'one')
200
+ rendered.should have_tag('div', :text => /SAMPLE/i)
201
+ rendered.should have_tag('span', :text => "sample with 'single' quotes")
202
+ rendered.should have_tag('span', :text => %Q{sample with 'single' and "double" quotes})
203
+
204
+ rendered.should have_tag('p', :text => 'content with ignored spaces around')
205
+ rendered.should have_tag('p', :text => 'content with ignored spaces in')
206
+ rendered.should have_tag('p', :text => 'content with nbsp')
207
+ rendered.should have_tag('p', :text => 'content with nbsp and spaces around')
208
+ rendered.should have_tag('pre', :text => " 1. bla \n 2. bla ")
209
+ end
210
+
211
+ it "should map a string argument to :text => string" do
212
+ rendered.should have_tag('div', 'sample text')
213
+ end
214
+
215
+ it "should not find tags" do
216
+ rendered.should_not have_tag('p', :text => 'text does not present')
217
+ rendered.should_not have_tag('strong', :text => 'text does not present')
218
+ rendered.should_not have_tag('p', :text => /text does not present/)
219
+ rendered.should_not have_tag('strong', :text => /text does not present/)
220
+
221
+ rendered.should_not have_tag('p', :text => 'content with ignoredspaces around')
222
+ rendered.should_not have_tag('p', :text => 'content with ignored spaces around')
223
+ rendered.should_not have_tag('p', :text => 'content withignored spaces in')
224
+ rendered.should_not have_tag('p', :text => 'contentwith nbsp')
225
+ rendered.should_not have_tag('p', :text => 'content with nbsp and spaces around')
226
+ rendered.should_not have_tag('pre', :text => "1. bla\n2. bla")
227
+ end
228
+
229
+ it "should invoke #to_s method for :text" do
230
+ expect {
231
+ rendered.should_not have_tag('p', :text => 100500 )
232
+ rendered.should have_tag('p', :text => 315 )
233
+ }.to_not raise_exception
234
+ end
235
+
236
+ it "should not find tags and display appropriate message" do
237
+ # TODO make diffable,maybe...
238
+ expect { rendered.should have_tag('div', :text => 'SAMPLE text') }.should raise_spec_error(
239
+ %Q{"SAMPLE text" expected within "div" in following template:\n#{rendered}}
240
+ )
241
+ expect { rendered.should have_tag('div', :text => /SAMPLE tekzt/i) }.should raise_spec_error(
242
+ %Q{/SAMPLE tekzt/i regexp expected within "div" in following template:\n#{rendered}}
243
+ )
244
+ end
245
+
246
+ it "should find unexpected tags and display appropriate message" do
247
+ expect { rendered.should_not have_tag('div', :text => 'sample text') }.should raise_spec_error(
248
+ %Q{"sample text" unexpected within "div" in following template:\n#{rendered}\nbut was found.}
249
+ )
250
+ expect { rendered.should_not have_tag('div', :text => /SAMPLE text/i) }.should raise_spec_error(
251
+ %Q{/SAMPLE text/i regexp unexpected within "div" in following template:\n#{rendered}\nbut was found.}
252
+ )
253
+ end
254
+
255
+ end
256
+
257
+ context "mixed matching" do
258
+ let(:rendered) { asset('special') }
259
+
260
+ it "should find tags by count and exact content" do
261
+ rendered.should have_tag("td", :text => 'a', :count => 3)
262
+ end
263
+
264
+ it "should find tags by count and rough content(regexp)" do
265
+ rendered.should have_tag("td", :text => /user/, :count => 3)
266
+ end
267
+
268
+ it "should find tags with exact content and additional attributes" do
269
+ rendered.should have_tag("td", :text => 'a', :with => { :id => "special" })
270
+ rendered.should_not have_tag("td", :text => 'a', :with => { :id => "other-special" })
271
+ end
272
+
273
+ it "should find tags with rough content and additional attributes" do
274
+ rendered.should have_tag("td", :text => /user/, :with => { :id => "other-special" })
275
+ rendered.should_not have_tag("td", :text => /user/, :with => { :id => "special" })
276
+ end
277
+
278
+ it "should find tags with count and additional attributes" do
279
+ rendered.should have_tag("div", :with => { :class => "one" }, :count => 6)
280
+ rendered.should have_tag("div", :with => { :class => "two" }, :count => 3)
281
+ end
282
+
283
+ it "should find tags with count, exact text and additional attributes" do
284
+ rendered.should have_tag("div", :with => { :class => "one" }, :count => 3, :text => 'text')
285
+ rendered.should_not have_tag("div", :with => { :class => "one" }, :count => 5, :text => 'text')
286
+ rendered.should_not have_tag("div", :with => { :class => "one" }, :count => 3, :text => 'other text')
287
+ rendered.should_not have_tag("div", :with => { :class => "two" }, :count => 3, :text => 'text')
288
+ end
289
+
290
+ it "should find tags with count, regexp text and additional attributes" do
291
+ rendered.should have_tag("div", :with => { :class => "one" }, :count => 2, :text => /bla/)
292
+ rendered.should have_tag("div", :with => { :class => "two" }, :count => 1, :text => /bla/)
293
+ rendered.should_not have_tag("div", :with => { :class => "one" }, :count => 5, :text => /bla/)
294
+ rendered.should_not have_tag("div", :with => { :class => "one" }, :count => 6, :text => /other bla/)
295
+ end
296
+ end
297
+
298
+ context "nested matching:" do
299
+ let(:rendered) { asset('ordered_list') }
300
+
301
+ it "should find tags" do
302
+ rendered.should have_tag('ol') {
303
+ with_tag('li', :text => 'list item 1')
304
+ with_tag('li', :text => 'list item 2')
305
+ with_tag('li', :text => 'list item 3')
306
+ with_tag('li', :count => 3)
307
+ with_tag('li', :count => 2..3)
308
+ with_tag('li', :min => 2)
309
+ with_tag('li', :max => 6)
310
+ }
311
+ end
312
+
313
+ it "should not find tags" do
314
+ rendered.should have_tag('ol') {
315
+ without_tag('div')
316
+ without_tag('li', :count => 2)
317
+ without_tag('li', :count => 4..8)
318
+ without_tag('li', :min => 100)
319
+ without_tag('li', :max => 2)
320
+ without_tag('li', :text => 'blabla')
321
+ without_tag('li', :text => /list item (?!\d)/)
322
+ }
323
+ end
324
+
325
+ it "should handle do; end" do
326
+ expect do
327
+ rendered.should have_tag('ol') do
328
+ with_tag('div')
329
+ end
330
+ end.should raise_spec_error(/have at least 1 element matching "div", found 0/)
331
+ end
332
+
333
+ it "should not find tags and display appropriate message" do
334
+ ordered_list_regexp = rendered[/<ol.*<\/ol>/m].gsub(/(\n?\s{2,}|\n\s?)/,'\n*\s*')
335
+ expect {
336
+ rendered.should have_tag('ol') { with_tag('li'); with_tag('div') }
337
+ }.should raise_spec_error(/expected following:\n#{ordered_list_regexp}\n\s*to have at least 1 element matching "div", found 0/)
338
+ expect {
339
+ rendered.should have_tag('ol') { with_tag('li'); with_tag('li', :count => 10) }
340
+ }.should raise_spec_error(/expected following:\n#{ordered_list_regexp}\n\s*to have 10 element\(s\) matching "li", found 3/)
341
+ expect {
342
+ rendered.should have_tag('ol') { with_tag('li'); with_tag('li', :text => /SAMPLE text/i) }
343
+ }.should raise_spec_error(/\/SAMPLE text\/i regexp expected within "li" in following template:\n#{ordered_list_regexp}/)
344
+ end
345
+ end
346
+ end