rails-dom-testing 1.0.9 → 2.0.0
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.
- checksums.yaml +4 -4
- data/README.md +9 -8
- data/lib/rails/dom/testing/assertions.rb +0 -2
- data/lib/rails/dom/testing/assertions/selector_assertions.rb +6 -9
- data/lib/rails/dom/testing/assertions/selector_assertions/html_selector.rb +12 -7
- data/lib/rails/dom/testing/assertions/selector_assertions/substitution_context.rb +13 -4
- data/lib/rails/dom/testing/version.rb +1 -1
- data/test/selector_assertions_test.rb +11 -8
- metadata +7 -25
- data/LICENSE.txt +0 -22
- data/lib/rails/dom/testing/assertions/tag_assertions.rb +0 -155
- data/test/tag_assertions_test.rb +0 -218
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61edc9fa5e40088f189be03e372c57a555e4794f
|
4
|
+
data.tar.gz: 6c0cde2f592e0fb52435d686c814907ef203ed97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 529f62430db89db452a82c13ee2aa575c8e288a50923c6e954941805589431d4bb03a228eb6b9828afbe0ffb26f796d3007a948abaa08fc2b07b1364b5953526
|
7
|
+
data.tar.gz: 574f7c7d88a42632d46efa89ac038d0f154584aef74dc314075f09e9327d33e8d7fa42304864b74fa466bc01aa8eb3fe80112d3f094d02344d79b618d376117a
|
data/README.md
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
# Rails::Dom::Testing
|
2
|
-
[](https://travis-ci.org/rails/rails-dom-testing)
|
3
2
|
|
4
3
|
This gem is responsible for comparing HTML doms and asserting that DOM elements are present in Rails applications.
|
5
4
|
Doms are compared via `assert_dom_equal` and `assert_dom_not_equal`.
|
@@ -56,7 +55,7 @@ assert_select_encoded '#out-of-your-element'
|
|
56
55
|
assert_select_email '#you-got-mail'
|
57
56
|
```
|
58
57
|
|
59
|
-
The documentation in [selector_assertions.rb](https://github.com/
|
58
|
+
The documentation in [selector_assertions.rb](https://github.com/rails/rails-dom-testing/blob/master/lib/rails/dom/testing/assertions/selector_assertions.rb) goes into a lot more detail of how selector assertions can be used.
|
60
59
|
|
61
60
|
## Read more
|
62
61
|
|
@@ -67,10 +66,12 @@ Under the hood the doms are parsed with Nokogiri and you'll generally be working
|
|
67
66
|
Read more about Nokogiri:
|
68
67
|
- [Nokogiri](http://nokogiri.org)
|
69
68
|
|
70
|
-
## Contributing
|
69
|
+
## Contributing to Rails::Dom::Testing
|
71
70
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
71
|
+
Rails::Dom::Testing is work of many contributors. You're encouraged to submit pull requests, propose
|
72
|
+
features and discuss issues.
|
73
|
+
|
74
|
+
See [CONTRIBUTING](CONTRIBUTING.md).
|
75
|
+
|
76
|
+
## License
|
77
|
+
Rails::Dom::Testing is released under the [MIT License](MIT-LICENSE).
|
@@ -7,13 +7,11 @@ module Rails
|
|
7
7
|
module Assertions
|
8
8
|
autoload :DomAssertions, 'rails/dom/testing/assertions/dom_assertions'
|
9
9
|
autoload :SelectorAssertions, 'rails/dom/testing/assertions/selector_assertions'
|
10
|
-
autoload :TagAssertions, 'rails/dom/testing/assertions/tag_assertions'
|
11
10
|
|
12
11
|
extend ActiveSupport::Concern
|
13
12
|
|
14
13
|
include DomAssertions
|
15
14
|
include SelectorAssertions
|
16
|
-
include TagAssertions
|
17
15
|
end
|
18
16
|
end
|
19
17
|
end
|
@@ -166,13 +166,14 @@ module Rails
|
|
166
166
|
|
167
167
|
selector = HTMLSelector.new(args, @selected) { nodeset document_root_element }
|
168
168
|
|
169
|
-
if selecting_no_body?
|
169
|
+
if selector.selecting_no_body?
|
170
170
|
assert true
|
171
171
|
return
|
172
172
|
end
|
173
173
|
|
174
174
|
selector.select.tap do |matches|
|
175
|
-
assert_size_match!(matches.size, selector.tests,
|
175
|
+
assert_size_match!(matches.size, selector.tests,
|
176
|
+
selector.css_selector, selector.message)
|
176
177
|
|
177
178
|
nest_selection(matches, &block) if block_given? && !matches.empty?
|
178
179
|
end
|
@@ -219,7 +220,9 @@ module Rails
|
|
219
220
|
end
|
220
221
|
|
221
222
|
content = nodeset(element || @selected).map do |elem|
|
222
|
-
elem.children.select
|
223
|
+
elem.children.select do |child|
|
224
|
+
child.cdata? || (child.text? && !child.blank?)
|
225
|
+
end.map(&:content)
|
223
226
|
end.join
|
224
227
|
|
225
228
|
selected = Nokogiri::HTML::DocumentFragment.parse(content)
|
@@ -282,12 +285,6 @@ module Rails
|
|
282
285
|
end
|
283
286
|
end
|
284
287
|
|
285
|
-
def selecting_no_body?(html_selector)
|
286
|
-
# Nokogiri gives the document a body element. Which means we can't
|
287
|
-
# run an assertion expecting there to not be a body.
|
288
|
-
html_selector.selector == 'body' && html_selector.tests[:count] == 0
|
289
|
-
end
|
290
|
-
|
291
288
|
def nest_selection(selection)
|
292
289
|
# Set @selected to allow nested assert_select.
|
293
290
|
# Can be nested several levels deep.
|
@@ -2,12 +2,12 @@ require 'active_support/core_ext/module/attribute_accessors'
|
|
2
2
|
require_relative 'substitution_context'
|
3
3
|
|
4
4
|
class HTMLSelector #:nodoc:
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :css_selector, :tests, :message
|
6
6
|
|
7
7
|
def initialize(values, previous_selection = nil, &root_fallback)
|
8
8
|
@values = values
|
9
9
|
@root = extract_root(previous_selection, root_fallback)
|
10
|
-
|
10
|
+
extract_selectors
|
11
11
|
@tests = extract_equality_tests
|
12
12
|
@message = @values.shift
|
13
13
|
|
@@ -16,8 +16,14 @@ class HTMLSelector #:nodoc:
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
def selecting_no_body? #:nodoc:
|
20
|
+
# Nokogiri gives the document a body element. Which means we can't
|
21
|
+
# run an assertion expecting there to not be a body.
|
22
|
+
@selector == 'body' && @tests[:count] == 0
|
23
|
+
end
|
24
|
+
|
19
25
|
def select
|
20
|
-
filter @root.css(selector, context)
|
26
|
+
filter @root.css(@selector, context)
|
21
27
|
end
|
22
28
|
|
23
29
|
private
|
@@ -67,16 +73,15 @@ class HTMLSelector #:nodoc:
|
|
67
73
|
end
|
68
74
|
end
|
69
75
|
|
70
|
-
def
|
76
|
+
def extract_selectors
|
71
77
|
selector = @values.shift
|
72
78
|
|
73
79
|
unless selector.is_a? String
|
74
80
|
raise ArgumentError, "Expecting a selector as the first argument"
|
75
81
|
end
|
76
82
|
|
77
|
-
|
78
|
-
context.substitute!(selector, @values)
|
79
|
-
selector
|
83
|
+
@css_selector = context.substitute!(selector, @values.dup, true)
|
84
|
+
@selector = context.substitute!(selector, @values)
|
80
85
|
end
|
81
86
|
|
82
87
|
def extract_equality_tests
|
@@ -3,10 +3,14 @@ class SubstitutionContext
|
|
3
3
|
@substitute = '?'
|
4
4
|
end
|
5
5
|
|
6
|
-
def substitute!(selector, values)
|
6
|
+
def substitute!(selector, values, format_for_presentation = false)
|
7
|
+
selector = selector.dup
|
8
|
+
|
7
9
|
while !values.empty? && substitutable?(values.first) && selector.index(@substitute)
|
8
|
-
selector.sub! @substitute, matcher_for(values.shift)
|
10
|
+
selector.sub! @substitute, matcher_for(values.shift, format_for_presentation)
|
9
11
|
end
|
12
|
+
|
13
|
+
selector
|
10
14
|
end
|
11
15
|
|
12
16
|
def match(matches, attribute, matcher)
|
@@ -14,8 +18,13 @@ class SubstitutionContext
|
|
14
18
|
end
|
15
19
|
|
16
20
|
private
|
17
|
-
def matcher_for(value)
|
18
|
-
|
21
|
+
def matcher_for(value, format_for_presentation)
|
22
|
+
# Nokogiri doesn't like arbitrary values without quotes, hence inspect.
|
23
|
+
if format_for_presentation
|
24
|
+
value.inspect # Avoid to_s so Regexps aren't put in quotes.
|
25
|
+
else
|
26
|
+
value.to_s.inspect
|
27
|
+
end
|
19
28
|
end
|
20
29
|
|
21
30
|
def substitutable?(value)
|
@@ -18,11 +18,6 @@ class AssertSelectTest < ActiveSupport::TestCase
|
|
18
18
|
# Test assert select.
|
19
19
|
#
|
20
20
|
|
21
|
-
def test_frozen_selector_substitution
|
22
|
-
render_html %Q{<div id="1">foo</div><div id="2">foo</div>}
|
23
|
-
assert_select "div:match('id', ?)".freeze, /\d+/
|
24
|
-
end
|
25
|
-
|
26
21
|
def test_assert_select
|
27
22
|
render_html %Q{<div id="1"></div><div id="2"></div>}
|
28
23
|
assert_select "div", 2
|
@@ -237,6 +232,16 @@ class AssertSelectTest < ActiveSupport::TestCase
|
|
237
232
|
end
|
238
233
|
end
|
239
234
|
|
235
|
+
def test_nested_assert_select_with_match_failure_shows_nice_regex
|
236
|
+
render_html %Q{<div id="1">foo</div>}
|
237
|
+
|
238
|
+
error = assert_raises Minitest::Assertion do
|
239
|
+
assert_select "div:match('id', ?)", /wups/
|
240
|
+
end
|
241
|
+
|
242
|
+
assert_match %Q{div:match('id', /wups/)}, error.message
|
243
|
+
end
|
244
|
+
|
240
245
|
def test_feed_item_encoded
|
241
246
|
render_xml <<-EOF
|
242
247
|
<rss version="2.0">
|
@@ -250,9 +255,7 @@ class AssertSelectTest < ActiveSupport::TestCase
|
|
250
255
|
</item>
|
251
256
|
<item>
|
252
257
|
<description>
|
253
|
-
|
254
|
-
<p>Test 2</p>
|
255
|
-
]]>
|
258
|
+
<p>Test 2</p>
|
256
259
|
</description>
|
257
260
|
</item>
|
258
261
|
</channel>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-dom-testing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rafael Mendonça França
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-05-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -17,14 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
20
|
+
version: 1.6.0
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
27
|
+
version: 1.6.0
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: activesupport
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
version: 4.2.0
|
35
35
|
- - "<"
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: '
|
37
|
+
version: '6.0'
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -44,21 +44,7 @@ dependencies:
|
|
44
44
|
version: 4.2.0
|
45
45
|
- - "<"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
48
|
-
- !ruby/object:Gem::Dependency
|
49
|
-
name: rails-deprecated_sanitizer
|
50
|
-
requirement: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 1.0.1
|
55
|
-
type: :runtime
|
56
|
-
prerelease: false
|
57
|
-
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 1.0.1
|
47
|
+
version: '6.0'
|
62
48
|
- !ruby/object:Gem::Dependency
|
63
49
|
name: bundler
|
64
50
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,7 +96,6 @@ executables: []
|
|
110
96
|
extensions: []
|
111
97
|
extra_rdoc_files: []
|
112
98
|
files:
|
113
|
-
- LICENSE.txt
|
114
99
|
- README.md
|
115
100
|
- lib/rails-dom-testing.rb
|
116
101
|
- lib/rails/dom/testing/assertions.rb
|
@@ -119,11 +104,9 @@ files:
|
|
119
104
|
- lib/rails/dom/testing/assertions/selector_assertions/count_describable.rb
|
120
105
|
- lib/rails/dom/testing/assertions/selector_assertions/html_selector.rb
|
121
106
|
- lib/rails/dom/testing/assertions/selector_assertions/substitution_context.rb
|
122
|
-
- lib/rails/dom/testing/assertions/tag_assertions.rb
|
123
107
|
- lib/rails/dom/testing/version.rb
|
124
108
|
- test/dom_assertions_test.rb
|
125
109
|
- test/selector_assertions_test.rb
|
126
|
-
- test/tag_assertions_test.rb
|
127
110
|
- test/test_helper.rb
|
128
111
|
homepage: https://github.com/rails/rails-dom-testing
|
129
112
|
licenses:
|
@@ -145,12 +128,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
128
|
version: '0'
|
146
129
|
requirements: []
|
147
130
|
rubyforge_project:
|
148
|
-
rubygems_version: 2.
|
131
|
+
rubygems_version: 2.5.1
|
149
132
|
signing_key:
|
150
133
|
specification_version: 4
|
151
134
|
summary: Dom and Selector assertions for Rails applications
|
152
135
|
test_files:
|
153
136
|
- test/dom_assertions_test.rb
|
154
137
|
- test/selector_assertions_test.rb
|
155
|
-
- test/tag_assertions_test.rb
|
156
138
|
- test/test_helper.rb
|
data/LICENSE.txt
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
Copyright (c) 2013 Kasper Timm Hansen
|
2
|
-
|
3
|
-
MIT License
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
-
a copy of this software and associated documentation files (the
|
7
|
-
"Software"), to deal in the Software without restriction, including
|
8
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
-
permit persons to whom the Software is furnished to do so, subject to
|
11
|
-
the following conditions:
|
12
|
-
|
13
|
-
The above copyright notice and this permission notice shall be
|
14
|
-
included in all copies or substantial portions of the Software.
|
15
|
-
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -1,155 +0,0 @@
|
|
1
|
-
require 'active_support/deprecation'
|
2
|
-
require 'rails/deprecated_sanitizer/html-scanner'
|
3
|
-
|
4
|
-
module Rails
|
5
|
-
module Dom
|
6
|
-
module Testing
|
7
|
-
module Assertions
|
8
|
-
# Pair of assertions to testing elements in the HTML output of the response.
|
9
|
-
module TagAssertions
|
10
|
-
# Asserts that there is a tag/node/element in the body of the response
|
11
|
-
# that meets all of the given conditions. The +conditions+ parameter must
|
12
|
-
# be a hash of any of the following keys (all are optional):
|
13
|
-
#
|
14
|
-
# * <tt>:tag</tt>: the node type must match the corresponding value
|
15
|
-
# * <tt>:attributes</tt>: a hash. The node's attributes must match the
|
16
|
-
# corresponding values in the hash.
|
17
|
-
# * <tt>:parent</tt>: a hash. The node's parent must match the
|
18
|
-
# corresponding hash.
|
19
|
-
# * <tt>:child</tt>: a hash. At least one of the node's immediate children
|
20
|
-
# must meet the criteria described by the hash.
|
21
|
-
# * <tt>:ancestor</tt>: a hash. At least one of the node's ancestors must
|
22
|
-
# meet the criteria described by the hash.
|
23
|
-
# * <tt>:descendant</tt>: a hash. At least one of the node's descendants
|
24
|
-
# must meet the criteria described by the hash.
|
25
|
-
# * <tt>:sibling</tt>: a hash. At least one of the node's siblings must
|
26
|
-
# meet the criteria described by the hash.
|
27
|
-
# * <tt>:after</tt>: a hash. The node must be after any sibling meeting
|
28
|
-
# the criteria described by the hash, and at least one sibling must match.
|
29
|
-
# * <tt>:before</tt>: a hash. The node must be before any sibling meeting
|
30
|
-
# the criteria described by the hash, and at least one sibling must match.
|
31
|
-
# * <tt>:children</tt>: a hash, for counting children of a node. Accepts
|
32
|
-
# the keys:
|
33
|
-
# * <tt>:count</tt>: either a number or a range which must equal (or
|
34
|
-
# include) the number of children that match.
|
35
|
-
# * <tt>:less_than</tt>: the number of matching children must be less
|
36
|
-
# than this number.
|
37
|
-
# * <tt>:greater_than</tt>: the number of matching children must be
|
38
|
-
# greater than this number.
|
39
|
-
# * <tt>:only</tt>: another hash consisting of the keys to use
|
40
|
-
# to match on the children, and only matching children will be
|
41
|
-
# counted.
|
42
|
-
# * <tt>:content</tt>: the textual content of the node must match the
|
43
|
-
# given value. This will not match HTML tags in the body of a
|
44
|
-
# tag--only text.
|
45
|
-
#
|
46
|
-
# Conditions are matched using the following algorithm:
|
47
|
-
#
|
48
|
-
# * if the condition is a string, it must be a substring of the value.
|
49
|
-
# * if the condition is a regexp, it must match the value.
|
50
|
-
# * if the condition is a number, the value must match number.to_s.
|
51
|
-
# * if the condition is +true+, the value must not be +nil+.
|
52
|
-
# * if the condition is +false+ or +nil+, the value must be +nil+.
|
53
|
-
#
|
54
|
-
# # Assert that there is a "span" tag
|
55
|
-
# assert_tag tag: "span"
|
56
|
-
#
|
57
|
-
# # Assert that there is a "span" tag with id="x"
|
58
|
-
# assert_tag tag: "span", attributes: { id: "x" }
|
59
|
-
#
|
60
|
-
# # Assert that there is a "span" tag using the short-hand
|
61
|
-
# assert_tag :span
|
62
|
-
#
|
63
|
-
# # Assert that there is a "span" tag with id="x" using the short-hand
|
64
|
-
# assert_tag :span, attributes: { id: "x" }
|
65
|
-
#
|
66
|
-
# # Assert that there is a "span" inside of a "div"
|
67
|
-
# assert_tag tag: "span", parent: { tag: "div" }
|
68
|
-
#
|
69
|
-
# # Assert that there is a "span" somewhere inside a table
|
70
|
-
# assert_tag tag: "span", ancestor: { tag: "table" }
|
71
|
-
#
|
72
|
-
# # Assert that there is a "span" with at least one "em" child
|
73
|
-
# assert_tag tag: "span", child: { tag: "em" }
|
74
|
-
#
|
75
|
-
# # Assert that there is a "span" containing a (possibly nested)
|
76
|
-
# # "strong" tag.
|
77
|
-
# assert_tag tag: "span", descendant: { tag: "strong" }
|
78
|
-
#
|
79
|
-
# # Assert that there is a "span" containing between 2 and 4 "em" tags
|
80
|
-
# # as immediate children
|
81
|
-
# assert_tag tag: "span",
|
82
|
-
# children: { count: 2..4, only: { tag: "em" } }
|
83
|
-
#
|
84
|
-
# # Get funky: assert that there is a "div", with an "ul" ancestor
|
85
|
-
# # and an "li" parent (with "class" = "enum"), and containing a
|
86
|
-
# # "span" descendant that contains text matching /hello world/
|
87
|
-
# assert_tag tag: "div",
|
88
|
-
# ancestor: { tag: "ul" },
|
89
|
-
# parent: { tag: "li",
|
90
|
-
# attributes: { class: "enum" } },
|
91
|
-
# descendant: { tag: "span",
|
92
|
-
# child: /hello world/ }
|
93
|
-
#
|
94
|
-
# <b>Please note</b>: +assert_tag+ and +assert_no_tag+ only work
|
95
|
-
# with well-formed XHTML. They recognize a few tags as implicitly self-closing
|
96
|
-
# (like br and hr and such) but will not work correctly with tags
|
97
|
-
# that allow optional closing tags (p, li, td). <em>You must explicitly
|
98
|
-
# close all of your tags to use these assertions.</em>
|
99
|
-
def assert_tag(*opts)
|
100
|
-
ActiveSupport::Deprecation.warn("assert_tag is deprecated and will be removed at Rails 5. Use assert_select to get the same feature.")
|
101
|
-
|
102
|
-
opts = opts.size > 1 ? opts.last.merge({ tag: opts.first.to_s }) : opts.first
|
103
|
-
tag = _find_tag(opts)
|
104
|
-
|
105
|
-
assert tag, "expected tag, but no tag found matching #{opts.inspect} in:\n#{@response.body.inspect}"
|
106
|
-
end
|
107
|
-
|
108
|
-
# Identical to +assert_tag+, but asserts that a matching tag does _not_
|
109
|
-
# exist. (See +assert_tag+ for a full discussion of the syntax.)
|
110
|
-
#
|
111
|
-
# # Assert that there is not a "div" containing a "p"
|
112
|
-
# assert_no_tag tag: "div", descendant: { tag: "p" }
|
113
|
-
#
|
114
|
-
# # Assert that an unordered list is empty
|
115
|
-
# assert_no_tag tag: "ul", descendant: { tag: "li" }
|
116
|
-
#
|
117
|
-
# # Assert that there is not a "p" tag with between 1 to 3 "img" tags
|
118
|
-
# # as immediate children
|
119
|
-
# assert_no_tag tag: "p",
|
120
|
-
# children: { count: 1..3, only: { tag: "img" } }
|
121
|
-
def assert_no_tag(*opts)
|
122
|
-
ActiveSupport::Deprecation.warn("assert_no_tag is deprecated and will be removed at Rails 5. Use assert_select to get the same feature.")
|
123
|
-
|
124
|
-
opts = opts.size > 1 ? opts.last.merge({ tag: opts.first.to_s }) : opts.first
|
125
|
-
tag = _find_tag(opts)
|
126
|
-
|
127
|
-
assert !tag, "expected no tag, but found tag matching #{opts.inspect} in:\n#{@response.body.inspect}"
|
128
|
-
end
|
129
|
-
|
130
|
-
def find_tag(conditions)
|
131
|
-
ActiveSupport::Deprecation.warn("find_tag is deprecated and will be removed at Rails 5 without replacement.")
|
132
|
-
|
133
|
-
_find_tag(conditions)
|
134
|
-
end
|
135
|
-
|
136
|
-
def find_all_tag(conditions)
|
137
|
-
ActiveSupport::Deprecation.warn("find_all_tag is deprecated and will be removed at Rails 5 without replacement. Use assert_select to get the same feature.")
|
138
|
-
|
139
|
-
html_scanner_document.find_all(conditions)
|
140
|
-
end
|
141
|
-
|
142
|
-
private
|
143
|
-
def _find_tag(conditions)
|
144
|
-
html_scanner_document.find(conditions)
|
145
|
-
end
|
146
|
-
|
147
|
-
def html_scanner_document
|
148
|
-
xml = @response.content_type =~ /xml$/
|
149
|
-
@html_scanner_document ||= HTML::Document.new(@response.body, false, xml)
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
data/test/tag_assertions_test.rb
DELETED
@@ -1,218 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'rails/dom/testing/assertions/tag_assertions'
|
3
|
-
|
4
|
-
HTML_TEST_OUTPUT = <<HTML
|
5
|
-
<html>
|
6
|
-
<body>
|
7
|
-
<a href="/"><img src="/images/button.png" /></a>
|
8
|
-
<div id="foo">
|
9
|
-
<ul>
|
10
|
-
<li class="item">hello</li>
|
11
|
-
<li class="item">goodbye</li>
|
12
|
-
</ul>
|
13
|
-
</div>
|
14
|
-
<div id="bar">
|
15
|
-
<form action="/somewhere">
|
16
|
-
Name: <input type="text" name="person[name]" id="person_name" />
|
17
|
-
</form>
|
18
|
-
</div>
|
19
|
-
</body>
|
20
|
-
</html>
|
21
|
-
HTML
|
22
|
-
|
23
|
-
class AssertTagTest < ActiveSupport::TestCase
|
24
|
-
include Rails::Dom::Testing::Assertions::TagAssertions
|
25
|
-
|
26
|
-
class FakeResponse
|
27
|
-
attr_accessor :content_type, :body
|
28
|
-
|
29
|
-
def initialize(content_type, body)
|
30
|
-
@content_type, @body = content_type, body
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
setup do
|
35
|
-
@response = FakeResponse.new 'html', HTML_TEST_OUTPUT
|
36
|
-
end
|
37
|
-
|
38
|
-
def test_assert_tag_tag
|
39
|
-
assert_deprecated do
|
40
|
-
# there is a 'form' tag
|
41
|
-
assert_tag tag: 'form'
|
42
|
-
# there is not an 'hr' tag
|
43
|
-
assert_no_tag tag: 'hr'
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def test_assert_tag_attributes
|
48
|
-
assert_deprecated do
|
49
|
-
# there is a tag with an 'id' of 'bar'
|
50
|
-
assert_tag attributes: { id: "bar" }
|
51
|
-
# there is no tag with a 'name' of 'baz'
|
52
|
-
assert_no_tag attributes: { name: "baz" }
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_assert_tag_parent
|
57
|
-
assert_deprecated do
|
58
|
-
# there is a tag with a parent 'form' tag
|
59
|
-
assert_tag parent: { tag: "form" }
|
60
|
-
# there is no tag with a parent of 'input'
|
61
|
-
assert_no_tag parent: { tag: "input" }
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_assert_tag_child
|
66
|
-
assert_deprecated do
|
67
|
-
# there is a tag with a child 'input' tag
|
68
|
-
assert_tag child: { tag: "input" }
|
69
|
-
# there is no tag with a child 'strong' tag
|
70
|
-
assert_no_tag child: { tag: "strong" }
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_assert_tag_ancestor
|
75
|
-
assert_deprecated do
|
76
|
-
# there is a 'li' tag with an ancestor having an id of 'foo'
|
77
|
-
assert_tag ancestor: { attributes: { id: "foo" } }, tag: "li"
|
78
|
-
# there is no tag of any kind with an ancestor having an href matching 'foo'
|
79
|
-
assert_no_tag ancestor: { attributes: { href: /foo/ } }
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_assert_tag_descendant
|
84
|
-
assert_deprecated do
|
85
|
-
# there is a tag with a descendant 'li' tag
|
86
|
-
assert_tag descendant: { tag: "li" }
|
87
|
-
# there is no tag with a descendant 'html' tag
|
88
|
-
assert_no_tag descendant: { tag: "html" }
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def test_assert_tag_sibling
|
93
|
-
assert_deprecated do
|
94
|
-
# there is a tag with a sibling of class 'item'
|
95
|
-
assert_tag sibling: { attributes: { class: "item" } }
|
96
|
-
# there is no tag with a sibling 'ul' tag
|
97
|
-
assert_no_tag sibling: { tag: "ul" }
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def test_assert_tag_after
|
102
|
-
assert_deprecated do
|
103
|
-
# there is a tag following a sibling 'div' tag
|
104
|
-
assert_tag after: { tag: "div" }
|
105
|
-
# there is no tag following a sibling tag with id 'bar'
|
106
|
-
assert_no_tag after: { attributes: { id: "bar" } }
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def test_assert_tag_before
|
111
|
-
assert_deprecated do
|
112
|
-
# there is a tag preceding a tag with id 'bar'
|
113
|
-
assert_tag before: { attributes: { id: "bar" } }
|
114
|
-
# there is no tag preceding a 'form' tag
|
115
|
-
assert_no_tag before: { tag: "form" }
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_assert_tag_children_count
|
120
|
-
assert_deprecated do
|
121
|
-
# there is a tag with 2 children
|
122
|
-
assert_tag children: { count: 2 }
|
123
|
-
# in particular, there is a <ul> tag with two children (a nameless pair of <li>s)
|
124
|
-
assert_tag tag: 'ul', children: { count: 2 }
|
125
|
-
# there is no tag with 4 children
|
126
|
-
assert_no_tag children: { count: 4 }
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
def test_assert_tag_children_less_than
|
131
|
-
assert_deprecated do
|
132
|
-
# there is a tag with less than 5 children
|
133
|
-
assert_tag children: { less_than: 5 }
|
134
|
-
# there is no 'ul' tag with less than 2 children
|
135
|
-
assert_no_tag children: { less_than: 2 }, tag: "ul"
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
def test_assert_tag_children_greater_than
|
140
|
-
assert_deprecated do
|
141
|
-
# there is a 'body' tag with more than 1 children
|
142
|
-
assert_tag children: { greater_than: 1 }, tag: "body"
|
143
|
-
# there is no tag with more than 10 children
|
144
|
-
assert_no_tag children: { greater_than: 10 }
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
def test_assert_tag_children_only
|
149
|
-
assert_deprecated do
|
150
|
-
# there is a tag containing only one child with an id of 'foo'
|
151
|
-
assert_tag children: { count: 1,
|
152
|
-
only: { attributes: { id: "foo" } } }
|
153
|
-
# there is no tag containing only one 'li' child
|
154
|
-
assert_no_tag children: { count: 1, only: { tag: "li" } }
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def test_assert_tag_content
|
159
|
-
assert_deprecated do
|
160
|
-
# the output contains the string "Name"
|
161
|
-
assert_tag content: /Name/
|
162
|
-
# the output does not contain the string "test"
|
163
|
-
assert_no_tag content: /test/
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
def test_assert_tag_multiple
|
168
|
-
assert_deprecated do
|
169
|
-
# there is a 'div', id='bar', with an immediate child whose 'action'
|
170
|
-
# attribute matches the regexp /somewhere/.
|
171
|
-
assert_tag tag: "div", attributes: { id: "bar" },
|
172
|
-
child: { attributes: { action: /somewhere/ } }
|
173
|
-
|
174
|
-
# there is no 'div', id='foo', with a 'ul' child with more than
|
175
|
-
# 2 "li" children.
|
176
|
-
assert_no_tag tag: "div", attributes: { id: "foo" },
|
177
|
-
child: { tag: "ul",
|
178
|
-
children: { greater_than: 2, only: { tag: "li" } } }
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
def test_assert_tag_children_without_content
|
183
|
-
assert_deprecated do
|
184
|
-
# there is a form tag with an 'input' child which is a self closing tag
|
185
|
-
assert_tag tag: "form",
|
186
|
-
children: { count: 1,
|
187
|
-
only: { tag: "input" } }
|
188
|
-
|
189
|
-
# the body tag has an 'a' child which in turn has an 'img' child
|
190
|
-
assert_tag tag: "body",
|
191
|
-
children: { count: 1,
|
192
|
-
only: { tag: "a",
|
193
|
-
children: { count: 1,
|
194
|
-
only: { tag: "img" } } } }
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
def test_assert_tag_attribute_matching
|
199
|
-
assert_deprecated do
|
200
|
-
@response.body = '<input type="text" name="my_name">'
|
201
|
-
assert_tag tag: 'input',
|
202
|
-
attributes: { name: /my/, type: 'text' }
|
203
|
-
assert_no_tag tag: 'input',
|
204
|
-
attributes: { name: 'my', type: 'text' }
|
205
|
-
assert_no_tag tag: 'input',
|
206
|
-
attributes: { name: /^my$/, type: 'text' }
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
def test_assert_tag_content_matching
|
211
|
-
assert_deprecated do
|
212
|
-
@response.body = "<p>hello world</p>"
|
213
|
-
assert_tag tag: "p", content: "hello world"
|
214
|
-
assert_tag tag: "p", content: /hello/
|
215
|
-
assert_no_tag tag: "p", content: "hello"
|
216
|
-
end
|
217
|
-
end
|
218
|
-
end
|