rspec-html 0.2.8 → 0.2.11
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/Gemfile.lock +2 -2
- data/README.md +17 -1
- data/lib/rspec/html/version.rb +1 -1
- data/lib/rspec_html/element.rb +4 -1
- data/lib/rspec_html/matchers/match_text.rb +19 -1
- data/lib/rspec_html/reconstituted_element.rb +1 -0
- data/lib/rspec_html/search.rb +16 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8052637b48c07f5312c3c0f6c4f3c42b790691758ab66b92240509bc19512b78
|
4
|
+
data.tar.gz: 28332c0112b53c97613bb24f387d6b9cef099527d363416856a44eab9e9f7260
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa6583f785fd6e9da9e0a6c6d2a06e4f262e749e75d99e7a808fb937c3d08c882366424ffffcaf70e7d19de44027064435148ac9a8c9b3d4607ca67f218e5377
|
7
|
+
data.tar.gz: 419571c56771c6c5b46a7197ce3f8f3cb866c00e0db54201c1106e9f2105099c78461feb719b81ddf5d924b6098859f57e5c4107140583805ba84b3c6555a2d5
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rspec-html (0.2.
|
4
|
+
rspec-html (0.2.11)
|
5
5
|
nokogiri (~> 1.10)
|
6
6
|
rspec (~> 3.0)
|
7
7
|
|
@@ -14,7 +14,7 @@ GEM
|
|
14
14
|
diff-lcs (1.5.0)
|
15
15
|
i18n (1.10.0)
|
16
16
|
concurrent-ruby (~> 1.0)
|
17
|
-
nokogiri (1.13.
|
17
|
+
nokogiri (1.13.6-x86_64-linux)
|
18
18
|
racc (~> 1.4)
|
19
19
|
paint (2.2.1)
|
20
20
|
parallel (1.22.1)
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@ _RSpec::HTML_ provides a simple object interface to HTML responses from [_RSpec
|
|
7
7
|
Add the gem to your `Gemfile`:
|
8
8
|
|
9
9
|
```ruby
|
10
|
-
gem 'rspec-html', '~> 0.2.
|
10
|
+
gem 'rspec-html', '~> 0.2.11'
|
11
11
|
```
|
12
12
|
|
13
13
|
And rebuild your bundle:
|
@@ -41,6 +41,11 @@ it 'says hello' do
|
|
41
41
|
end
|
42
42
|
```
|
43
43
|
|
44
|
+
This method can also be used for _ActionMailer_ emails:
|
45
|
+
```ruby
|
46
|
+
before { parse_html(ActionMailer::Base.deliveries.last.body.decoded) }
|
47
|
+
```
|
48
|
+
|
44
49
|
To navigate the _DOM_ by a sequence of tag names use chained method calls on the `document` object:
|
45
50
|
|
46
51
|
#### Tag Traversal
|
@@ -63,6 +68,17 @@ expect(document.body.div(id: 'my-div').span(class: 'my-class my-other-class')).t
|
|
63
68
|
|
64
69
|
Classes can be provided in any order, i.e. `'my-class my-other-class'` is equivalent to `'my-other-class my-class'`.
|
65
70
|
|
71
|
+
#### Simple CSS Matching
|
72
|
+
To use a simple CSS selector when no other attributes are needed, pass a string to the tag method:
|
73
|
+
```ruby
|
74
|
+
expect(document.body.div('#my-id.my-class1.my-class2')).to contain_text 'some text'
|
75
|
+
```
|
76
|
+
|
77
|
+
This is effectively shorthand for:
|
78
|
+
```ruby
|
79
|
+
expect(document.body.div(id: 'my-id', class: 'my-class1 my-class2')).to contain_text 'some text'
|
80
|
+
```
|
81
|
+
|
66
82
|
#### Text Matching
|
67
83
|
To select an element that includes a given text string (i.e. excluding mark-up) use the `text` option:
|
68
84
|
```ruby
|
data/lib/rspec/html/version.rb
CHANGED
data/lib/rspec_html/element.rb
CHANGED
@@ -8,7 +8,10 @@ module RSpecHTML
|
|
8
8
|
extend Forwardable
|
9
9
|
|
10
10
|
def_delegators :@search,
|
11
|
-
:has_css?, :has_xpath?, :include?,
|
11
|
+
:has_css?, :has_xpath?, :include?,
|
12
|
+
:siblings, :text, :truncated_text,
|
13
|
+
:size, :length, :[],
|
14
|
+
:css, :xpath
|
12
15
|
|
13
16
|
def initialize(element, name, options: {}, siblings: [])
|
14
17
|
@name = name
|
@@ -10,10 +10,28 @@ module RSpecHTML
|
|
10
10
|
|
11
11
|
def match(actual)
|
12
12
|
@rspec_actual = actual&.text
|
13
|
-
return (actual
|
13
|
+
return regexp_match?(actual) || regexp_siblings_match?(actual) if @expected.is_a?(Regexp)
|
14
14
|
|
15
|
+
string_match?(actual) || string_siblings_match?(actual)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def regexp_match?(actual)
|
15
21
|
@expected.match(actual&.text || '')
|
16
22
|
end
|
23
|
+
|
24
|
+
def regexp_siblings_match?(actual)
|
25
|
+
actual.siblings.any? { |sibling| @expected.match(sibling&.text || '') }
|
26
|
+
end
|
27
|
+
|
28
|
+
def string_match?(actual)
|
29
|
+
(actual&.text || '').include?(@expected.to_s)
|
30
|
+
end
|
31
|
+
|
32
|
+
def string_siblings_match?(actual)
|
33
|
+
actual.siblings.any? { |sibling| (sibling&.text || '').include?(@expected.to_s) }
|
34
|
+
end
|
17
35
|
end
|
18
36
|
end
|
19
37
|
end
|
@@ -12,6 +12,7 @@ module RSpecHTML
|
|
12
12
|
name = @tag.to_s.downcase
|
13
13
|
return '#document' if name == 'document'
|
14
14
|
return name if name == 'document'
|
15
|
+
return "<#{name}#{@options} />" if @options.is_a?(String)
|
15
16
|
return "<#{name}#{formatted_attributes} />" unless @options&.key?(:text)
|
16
17
|
|
17
18
|
"<#{name}#{formatted_attributes}>#{@options[:text]}</#{name}>"
|
data/lib/rspec_html/search.rb
CHANGED
@@ -2,7 +2,10 @@
|
|
2
2
|
|
3
3
|
module RSpecHTML
|
4
4
|
# Provides element/attribute/text searching for HTML entities
|
5
|
+
# rubocop:disable Metrics/ClassLength
|
5
6
|
class Search
|
7
|
+
attr_reader :siblings
|
8
|
+
|
6
9
|
def initialize(element, siblings)
|
7
10
|
@element = element
|
8
11
|
@siblings = siblings
|
@@ -56,7 +59,7 @@ module RSpecHTML
|
|
56
59
|
def size
|
57
60
|
return @element.size if @element.respond_to?(:size)
|
58
61
|
|
59
|
-
@siblings
|
62
|
+
@siblings&.size || 0
|
60
63
|
end
|
61
64
|
alias length size
|
62
65
|
|
@@ -95,17 +98,23 @@ module RSpecHTML
|
|
95
98
|
end
|
96
99
|
|
97
100
|
def where(tag, query, all: false)
|
98
|
-
matched =
|
99
|
-
where_class(tag, query[:class]) & where_xpath(tag, query.merge(class: nil))
|
100
|
-
else
|
101
|
-
where_xpath(tag, query)
|
102
|
-
end
|
101
|
+
matched = matched_from_query(tag, query)
|
103
102
|
return nil unless matched || all
|
104
103
|
return matched&.first unless all
|
105
104
|
|
106
105
|
matched
|
107
106
|
end
|
108
107
|
|
108
|
+
def matched_from_query(tag, query)
|
109
|
+
if query.is_a?(String)
|
110
|
+
@element&.css("#{tag}#{query}")
|
111
|
+
elsif query[:class]
|
112
|
+
where_class(tag, query[:class]) & where_xpath(tag, query.merge(class: nil))
|
113
|
+
else
|
114
|
+
where_xpath(tag, query)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
109
118
|
def where_xpath(tag, query)
|
110
119
|
conditions = "[#{where_conditions(query)}]" unless query.compact.empty?
|
111
120
|
@element&.xpath("//#{tag}#{conditions}")
|
@@ -132,4 +141,5 @@ module RSpecHTML
|
|
132
141
|
@element&.css(tag.to_s)
|
133
142
|
end
|
134
143
|
end
|
144
|
+
# rubocop:enable Metrics/ClassLength
|
135
145
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-html
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bob Farrell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05
|
11
|
+
date: 2022-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|