rspec-html 0.2.20 → 0.3.1
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/.rubocop.yml +4 -0
- data/Gemfile.lock +1 -1
- data/README.md +47 -16
- data/lib/rspec/html/version.rb +1 -1
- data/lib/rspec/html.rb +1 -3
- data/lib/rspec_html/browser.rb +36 -0
- data/lib/rspec_html/countable.rb +51 -0
- data/lib/rspec_html/element.rb +10 -0
- data/lib/rspec_html/matchers/base.rb +6 -0
- data/lib/rspec_html/matchers/contain_tag.rb +9 -3
- data/lib/rspec_html/matchers/match_text.rb +22 -5
- data/lib/rspec_html/matchers.rb +4 -3
- data/lib/rspec_html/search.rb +6 -3
- data/lib/rspec_html.rb +3 -0
- data/templates/failure/contain_tag.erb +8 -0
- data/templates/failure/match_text.erb +10 -2
- metadata +4 -5
- data/lib/rspec_html/matchers/contain_text.rb +0 -19
- data/templates/description/contain_text.erb +0 -1
- data/templates/failure/contain_text.erb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4eb7179d1b8e0ae007c863c0ff33ee3b7599e5f9d8d105fc5be06afd273f7a8
|
4
|
+
data.tar.gz: 391b0849d222beac92d0e98975da2f0eaf66d5bc1fce3285ba26d9ad36007250
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 37f3419b01b9d60979a51e7f3866e2a3b42b87b1988141fe5819de6a76f387c844ebd1f79f44aecdf7e675d13c89fb92681fd21fbf63d78e02737e03ae9b2827
|
7
|
+
data.tar.gz: '08ffe7d4519cda519b2dc02bb9fcc3321fdf92ab76480c1a4f0d82b9c9e922aae8103d121b2f3c7649e9926484c9d27030e646d689763db1dc8385ed24abc706'
|
data/.rubocop.yml
CHANGED
data/Gemfile.lock
CHANGED
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.
|
10
|
+
gem 'rspec-html', '~> 0.3.0'
|
11
11
|
```
|
12
12
|
|
13
13
|
And rebuild your bundle:
|
@@ -27,6 +27,19 @@ require 'rspec/html'
|
|
27
27
|
|
28
28
|
Several [matchers](#matchers) are provided to identify text and _HTML_ elements within the _DOM_. These matchers can only be used with the provided [object interface](#object-interface).
|
29
29
|
|
30
|
+
### Browser Inspection
|
31
|
+
|
32
|
+
To open the current document in your operating system's default browser, call `document.open`. Use this to inspect _HTML_ content while debugging.
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
it 'has complex HTML' do
|
36
|
+
get '/my/path'
|
37
|
+
document.open
|
38
|
+
end
|
39
|
+
```
|
40
|
+
|
41
|
+
Alternatively `document.html_path` writes the current document to a temporary file and returns its path.
|
42
|
+
|
30
43
|
### Object Interface
|
31
44
|
<a name="object-interface"></a>
|
32
45
|
|
@@ -35,28 +48,31 @@ The top-level object `document` is available in all tests which reflects the cur
|
|
35
48
|
If you need to parse _HTML_ manually you can use the provided `parse_html` helper and then access `document` as normal:
|
36
49
|
|
37
50
|
```ruby
|
38
|
-
|
51
|
+
let(:document) { parse_html('<html><body>hello</body></html>') }
|
52
|
+
|
39
53
|
it 'says hello' do
|
40
|
-
expect(document.body).to
|
54
|
+
expect(document.body).to match_text 'hello'
|
41
55
|
end
|
42
56
|
```
|
43
57
|
|
44
58
|
This method can also be used for _ActionMailer_ emails:
|
45
59
|
```ruby
|
46
|
-
|
60
|
+
let(:document) { parse_html(ActionMailer::Base.deliveries.last.body.decoded) }
|
47
61
|
```
|
48
62
|
|
63
|
+
**Changed in 0.3.0**: `parse_html` no longer assigns `document` automatically, you must use a `let` block to assign it yourself.
|
64
|
+
|
49
65
|
To navigate the _DOM_ by a sequence of tag names use chained method calls on the `document` object:
|
50
66
|
|
51
67
|
#### Tag Traversal
|
52
68
|
```ruby
|
53
|
-
expect(document.body.div.span).to
|
69
|
+
expect(document.body.div.span).to match_text 'some text'
|
54
70
|
```
|
55
71
|
|
56
72
|
#### Attribute Matching
|
57
73
|
To select an element matching certain attributes pass a hash to any of the chained methods:
|
58
74
|
```ruby
|
59
|
-
expect(document.body.div(id: 'my-div').span(align: 'left')).to
|
75
|
+
expect(document.body.div(id: 'my-div').span(align: 'left')).to match_text 'some text'
|
60
76
|
```
|
61
77
|
|
62
78
|
Special attributes like `checked` can be found using the `#attributes` method:
|
@@ -67,8 +83,8 @@ expect(document.input(type: 'checkbox', name: 'my-name')).attributes).to include
|
|
67
83
|
#### Class Matching
|
68
84
|
_CSS_ classes are treated as a special case: to select an element matching a set of classes pass the `class` parameter:
|
69
85
|
```ruby
|
70
|
-
expect(document.body.div(id: 'my-div').span(class: 'my-class')).to
|
71
|
-
expect(document.body.div(id: 'my-div').span(class: 'my-class my-other-class')).to
|
86
|
+
expect(document.body.div(id: 'my-div').span(class: 'my-class')).to match_text 'some text'
|
87
|
+
expect(document.body.div(id: 'my-div').span(class: 'my-class my-other-class')).to match_text 'some text'
|
72
88
|
```
|
73
89
|
|
74
90
|
Classes can be provided in any order, i.e. `'my-class my-other-class'` is equivalent to `'my-other-class my-class'`.
|
@@ -76,12 +92,25 @@ Classes can be provided in any order, i.e. `'my-class my-other-class'` is equiva
|
|
76
92
|
#### Simple CSS Matching
|
77
93
|
To use a simple CSS selector when no other attributes are needed, pass a string to the tag method:
|
78
94
|
```ruby
|
79
|
-
expect(document.body.div('#my-id.my-class1.my-class2')).to
|
95
|
+
expect(document.body.div('#my-id.my-class1.my-class2')).to match_text 'some text'
|
80
96
|
```
|
81
97
|
|
82
98
|
This is effectively shorthand for:
|
83
99
|
```ruby
|
84
|
-
expect(document.body.div(id: 'my-id', class: 'my-class1 my-class2')).to
|
100
|
+
expect(document.body.div(id: 'my-id', class: 'my-class1 my-class2')).to match_text 'some text'
|
101
|
+
```
|
102
|
+
|
103
|
+
#### Counting Matchers
|
104
|
+
Use `once`, `twice`, `times`, `at_least`, and `at_most` to match element counts:
|
105
|
+
```ruby
|
106
|
+
expect(document.div('.my-class')).to match_text('some text').once
|
107
|
+
expect(document.div('.my-class')).to match_text('some other text').twice
|
108
|
+
expect(document.div('.my-class')).to match_text('some').times(3)
|
109
|
+
expect(document.div('.my-class')).to match_text('some').at_least(:twice)
|
110
|
+
expect(document.div('.my-class')).to match_text('some').at_least.times(3)
|
111
|
+
expect(document.div('.my-class')).to match_text('some text').at_most.once
|
112
|
+
expect(document.div('.my-class')).to match_text('some other text').at_most.twice
|
113
|
+
expect(document.div('.my-class')).to match_text('text').at_most.times(3)
|
85
114
|
```
|
86
115
|
|
87
116
|
#### Text Matching
|
@@ -93,8 +122,8 @@ expect(document.body.div(text: 'some text').input[:value]).to eql 'some-value'
|
|
93
122
|
#### Attribute Retrieval
|
94
123
|
To select an attribute from an element use the hash-style interface:
|
95
124
|
```ruby
|
96
|
-
expect(document.body.div.span[:class]).to
|
97
|
-
expect(document.body.div.span['data-content']).to
|
125
|
+
expect(document.body.div.span[:class]).to match_text 'my-class'
|
126
|
+
expect(document.body.div.span['data-content']).to match_text 'my content'
|
98
127
|
```
|
99
128
|
|
100
129
|
#### Retrieve all matching elements
|
@@ -106,13 +135,13 @@ expect(document.span.all.map(&:text)).to eql ['foo', 'bar', 'baz']
|
|
106
135
|
#### Indexing a Matching Set
|
107
136
|
To select an index from a set of matched elements use the array-style interface (the first matching element is `1`, not `0`):
|
108
137
|
```ruby
|
109
|
-
expect(document.body.div[1].span[1][:class]).to
|
138
|
+
expect(document.body.div[1].span[1][:class]).to match_text 'my-class'
|
110
139
|
```
|
111
140
|
|
112
141
|
Alternatively, use `#first`, `#last` or, when using _ActiveSupport_, `#second`, `#third`, etc. are also available:
|
113
142
|
|
114
143
|
```ruby
|
115
|
-
expect(document.body.div.first.span.last[:class]).to
|
144
|
+
expect(document.body.div.first.span.last[:class]).to match_text 'my-class'
|
116
145
|
```
|
117
146
|
|
118
147
|
|
@@ -133,8 +162,8 @@ expect(document.body.div.length).to eql 3
|
|
133
162
|
#### XPath / CSS Selectors
|
134
163
|
If you need something more specific you can always use the _Nokogiri_ `#xpath` and `#css` methods on any element:
|
135
164
|
```ruby
|
136
|
-
expect(document.body.xpath('//span[@class="my-class"]')).to
|
137
|
-
expect(document.body.css('span.my-class')).to
|
165
|
+
expect(document.body.xpath('//span[@class="my-class"]')).to match_text 'some text'
|
166
|
+
expect(document.body.css('span.my-class')).to match_text 'some text'
|
138
167
|
```
|
139
168
|
|
140
169
|
To simply check that an _XPath_ or _CSS_ selector exists use `have_xpath` and `have_css`:
|
@@ -153,6 +182,8 @@ expect(document.input(type: 'checkbox')).to be_checked
|
|
153
182
|
### Custom Matchers
|
154
183
|
<a name="matchers"></a>
|
155
184
|
|
185
|
+
**Changed in 0.3.0**: The `contain_text` matcher has been removed. Use `match_text` instead.
|
186
|
+
|
156
187
|
#### match_text
|
157
188
|
|
158
189
|
Use the `match_text` matcher to locate text within a _DOM_ element. All mark-up elements are stripped when using this matcher.
|
data/lib/rspec/html/version.rb
CHANGED
data/lib/rspec/html.rb
CHANGED
@@ -9,15 +9,13 @@ module RSpec
|
|
9
9
|
# Module extension for RSpec::SharedContext
|
10
10
|
module HTML
|
11
11
|
def document
|
12
|
-
return @document if @document
|
13
|
-
|
14
12
|
RSpecHTML::Element.new(Nokogiri::HTML.parse(response.body), :document)
|
15
13
|
rescue NameError
|
16
14
|
raise RSpecHTML::NoResponseError, 'No `response` object found. Make a request first.'
|
17
15
|
end
|
18
16
|
|
19
17
|
def parse_html(content)
|
20
|
-
|
18
|
+
RSpecHTML::Element.new(Nokogiri::HTML.parse(content), :document)
|
21
19
|
end
|
22
20
|
end
|
23
21
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RSpecHTML
|
4
|
+
# Convenience utility for loading a provided path in the operating system's default browser.
|
5
|
+
# Used for inspecting documents while debugging tests.
|
6
|
+
class Browser
|
7
|
+
def self.open(path)
|
8
|
+
new(path).open
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(path)
|
12
|
+
@path = path
|
13
|
+
end
|
14
|
+
|
15
|
+
def open
|
16
|
+
log_launch_browser_event
|
17
|
+
system `#{command} '#{path}'`
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_reader :path
|
23
|
+
|
24
|
+
def log_launch_browser_event
|
25
|
+
warn "\e[35m[rspec-html] Opening document in browser from: \e[32m#{caller[3]}\e[0m"
|
26
|
+
end
|
27
|
+
|
28
|
+
def command
|
29
|
+
return 'start' if RUBY_PLATFORM =~ /mswin|mingw|cygwin/
|
30
|
+
return 'open' if RUBY_PLATFORM =~ /darwin/
|
31
|
+
return 'xdg-open' if RUBY_PLATFORM =~ /linux|bsd/
|
32
|
+
|
33
|
+
raise ArgumentError, "Unable to detect operating system from #{RUBY_PLATFORM}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RSpecHTML
|
4
|
+
# DSL module for all matchers, provides element counting utilities.
|
5
|
+
module Countable
|
6
|
+
def once
|
7
|
+
@expected_count = 1
|
8
|
+
@expected_count_type ||= :exact
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
def twice
|
13
|
+
@expected_count = 2
|
14
|
+
@expected_count_type ||= :exact
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def times(count)
|
19
|
+
@expected_count = count
|
20
|
+
@expected_count_type ||= :exact
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def at_least(count = nil)
|
25
|
+
@expected_count = { once: 1, twice: 2 }.fetch(count, nil)
|
26
|
+
@expected_count_type = :at_least
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def at_most(count = nil)
|
31
|
+
@expected_count = { once: 1, twice: 2 }.fetch(count, nil)
|
32
|
+
@expected_count_type = :at_most
|
33
|
+
self
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def count_match?
|
39
|
+
case @expected_count_type
|
40
|
+
when :exact
|
41
|
+
@actual_count == @expected_count
|
42
|
+
when :at_least
|
43
|
+
@actual_count >= @expected_count
|
44
|
+
when :at_most
|
45
|
+
@actual_count <= @expected_count
|
46
|
+
else
|
47
|
+
raise ArgumentError, 'Unknown count comparison type'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/rspec_html/element.rb
CHANGED
@@ -22,6 +22,16 @@ module RSpecHTML
|
|
22
22
|
@search = Search.new(@element, @siblings, self)
|
23
23
|
end
|
24
24
|
|
25
|
+
def open
|
26
|
+
Browser.open(html_path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def html_path
|
30
|
+
@html_path ||= Pathname.new(Dir.mktmpdir('rspec-html')).join('document.html').tap do |path|
|
31
|
+
path.write(@element.inner_html)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
25
35
|
def present?
|
26
36
|
return true if name == :document
|
27
37
|
|
@@ -42,6 +42,12 @@ module RSpecHTML
|
|
42
42
|
RSpecHTML::Element.reconstituted(element, options)
|
43
43
|
end
|
44
44
|
|
45
|
+
def pluralize(number, string)
|
46
|
+
return "#{number} #{string}" if number == 1
|
47
|
+
|
48
|
+
"#{number} #{string}s"
|
49
|
+
end
|
50
|
+
|
45
51
|
private
|
46
52
|
|
47
53
|
def template(type, options, expected, actual = nil)
|
@@ -5,10 +5,16 @@ module RSpecHTML
|
|
5
5
|
# Matches elements within a given DOM element.
|
6
6
|
class ContainTag
|
7
7
|
include Base
|
8
|
+
include Countable
|
8
9
|
|
9
|
-
def match(actual)
|
10
|
-
@actual = actual
|
11
|
-
|
10
|
+
def match(actual, expected_count:, expected_count_type:)
|
11
|
+
@actual = actual
|
12
|
+
@expected_count = expected_count
|
13
|
+
@expected_count_type = expected_count_type
|
14
|
+
return actual.public_send(@expected, @options).present? if @expected_count.nil?
|
15
|
+
|
16
|
+
@actual_count = actual.public_send(@expected, @options).size
|
17
|
+
count_match?
|
12
18
|
end
|
13
19
|
end
|
14
20
|
end
|
@@ -5,11 +5,14 @@ module RSpecHTML
|
|
5
5
|
# Matches text or regex within a given DOM element (strips HTML tags and compares text content only).
|
6
6
|
class MatchText
|
7
7
|
include Base
|
8
|
+
include Countable
|
8
9
|
|
9
10
|
diffable
|
10
11
|
|
11
|
-
def match(actual)
|
12
|
+
def match(actual, expected_count:, expected_count_type:)
|
12
13
|
raise_argument_error unless actual.is_a?(RSpecHTML::Element)
|
14
|
+
@expected_count = expected_count
|
15
|
+
@expected_count_type = expected_count_type
|
13
16
|
@rspec_actual = actual&.text
|
14
17
|
return regexp_match?(actual) || regexp_siblings_match?(actual) if @expected.is_a?(Regexp)
|
15
18
|
|
@@ -19,19 +22,33 @@ module RSpecHTML
|
|
19
22
|
private
|
20
23
|
|
21
24
|
def regexp_match?(actual)
|
22
|
-
@expected.match(actual&.text || '')
|
25
|
+
return @expected.match(actual&.text || '') if @expected_count.nil?
|
26
|
+
|
27
|
+
@actual_count = actual&.text&.scan(@expected)&.size
|
28
|
+
count_match?
|
23
29
|
end
|
24
30
|
|
25
31
|
def regexp_siblings_match?(actual)
|
26
|
-
actual.siblings.
|
32
|
+
matching_siblings = actual.siblings.select { |sibling| @expected.match(sibling&.text || '') }
|
33
|
+
@actual_count = matching_siblings.size
|
34
|
+
return matching_siblings.size.positive? if @expected_count.nil?
|
35
|
+
|
36
|
+
matching_siblings.size.positive? && count_match?
|
27
37
|
end
|
28
38
|
|
29
39
|
def string_match?(actual)
|
30
|
-
(actual&.text || '').include?(@expected.to_s)
|
40
|
+
return (actual&.text || '').include?(@expected.to_s) if @expected_count.nil?
|
41
|
+
|
42
|
+
@actual_count = actual&.text&.scan(@expected)&.size
|
43
|
+
count_match?
|
31
44
|
end
|
32
45
|
|
33
46
|
def string_siblings_match?(actual)
|
34
|
-
actual.siblings.
|
47
|
+
matching_siblings = actual.siblings.select { |sibling| (sibling&.text || '').include?(@expected.to_s) }
|
48
|
+
@actual_count = matching_siblings.size
|
49
|
+
return matching_siblings.size.positive? if @expected_count.nil?
|
50
|
+
|
51
|
+
matching_siblings.size.positive? && count_match?
|
35
52
|
end
|
36
53
|
|
37
54
|
def raise_argument_error
|
data/lib/rspec_html/matchers.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'rspec_html/matchers/base'
|
4
|
-
require 'rspec_html/matchers/contain_text'
|
5
4
|
require 'rspec_html/matchers/contain_tag'
|
6
5
|
require 'rspec_html/matchers/match_text'
|
7
6
|
|
@@ -18,17 +17,19 @@ module RSpecHTML
|
|
18
17
|
match do |actual|
|
19
18
|
rspec_html_matcher
|
20
19
|
.save_actual(actual)
|
21
|
-
.match(actual)
|
20
|
+
.match(actual, expected_count: @expected_count, expected_count_type: @expected_count_type)
|
22
21
|
.tap { @actual = rspec_html_matcher.rspec_actual }
|
23
22
|
end
|
24
23
|
description { rspec_html_matcher.description }
|
24
|
+
|
25
|
+
include Countable
|
26
|
+
|
25
27
|
failure_message { rspec_html_matcher.failure_message }
|
26
28
|
diffable if class_.diffable?
|
27
29
|
end
|
28
30
|
end
|
29
31
|
# rubocop:enable Metrics/MethodLength
|
30
32
|
|
31
|
-
define_matcher(:contain_text, ContainText)
|
32
33
|
define_matcher(:contain_tag, ContainTag)
|
33
34
|
define_matcher(:match_text, MatchText)
|
34
35
|
end
|
data/lib/rspec_html/search.rb
CHANGED
@@ -117,12 +117,12 @@ module RSpecHTML
|
|
117
117
|
|
118
118
|
def index(val)
|
119
119
|
zero_index_error if val.zero?
|
120
|
-
|
120
|
+
Element.new(@siblings[val - 1], @element.name)
|
121
121
|
end
|
122
122
|
|
123
123
|
def range(val)
|
124
124
|
zero_index_error if val.first.zero?
|
125
|
-
|
125
|
+
@siblings[(val.first - 1)..(val.last - 1)].map { |element| Element.new(element, @element.name) }
|
126
126
|
end
|
127
127
|
|
128
128
|
def zero_index_error
|
@@ -149,7 +149,10 @@ module RSpecHTML
|
|
149
149
|
|
150
150
|
def where_xpath(tag, query)
|
151
151
|
conditions = "[#{where_conditions(query)}]" unless query.compact.empty?
|
152
|
-
@element&.xpath(".//#{tag}#{conditions}")
|
152
|
+
result = @element&.xpath(".//#{tag}#{conditions}")
|
153
|
+
return result unless @siblings.is_a?(Nokogiri::XML::NodeSet) && result.empty?
|
154
|
+
|
155
|
+
@siblings.xpath(".//#{tag}#{conditions}")
|
153
156
|
end
|
154
157
|
|
155
158
|
def where_conditions(query)
|
data/lib/rspec_html.rb
CHANGED
@@ -4,12 +4,15 @@ require 'nokogiri'
|
|
4
4
|
|
5
5
|
require 'pathname'
|
6
6
|
require 'forwardable'
|
7
|
+
require 'tempfile'
|
7
8
|
|
8
9
|
require 'rspec_html/tags'
|
9
10
|
require 'rspec_html/element'
|
10
11
|
require 'rspec_html/search'
|
11
12
|
require 'rspec_html/reconstituted_element'
|
13
|
+
require 'rspec_html/countable'
|
12
14
|
require 'rspec_html/matchers'
|
15
|
+
require 'rspec_html/browser'
|
13
16
|
|
14
17
|
# Support module for rspec/html
|
15
18
|
module RSpecHTML
|
@@ -1,5 +1,13 @@
|
|
1
1
|
<% if actual.element.nil? %>
|
2
|
+
<% if @expected_count.nil? %>
|
2
3
|
Expected <%= reconstituted(actual, @options) %> to contain <%= reconstituted(expected, @options) %> but the element did not exist.
|
4
|
+
<% else %>
|
5
|
+
Expected <%= reconstituted(actual, @options) %> to contain <%= reconstituted(expected, @options) %> <%= @expected_count_type.to_s.tr('_', ' ') %> <%= pluralize(@expected_count, 'time') %> but the element did not exist.
|
6
|
+
<% end %>
|
3
7
|
<% else %>
|
8
|
+
<% if @expected_count.nil? %>
|
4
9
|
Expected <%= reconstituted(actual, @options) %> to contain <%= reconstituted(expected, @options) %> but it did not.
|
10
|
+
<% else %>
|
11
|
+
Expected <%= reconstituted(actual, @options) %> to contain <%= reconstituted(expected, @options) %> <%= @expected_count_type.to_s.tr('_', ' ') %> <%= pluralize(@expected_count, 'time') %> but it was found <%= pluralize(@actual_count, 'time') %>.
|
12
|
+
<% end %>
|
5
13
|
<% end %>
|
@@ -1,5 +1,13 @@
|
|
1
1
|
<% unless actual.exist? %>
|
2
|
-
|
2
|
+
<% if @expected_count.nil? %>
|
3
|
+
Expected <%= actual.reconstituted %> to match <%= expected.inspect %> but the element did not exist.
|
4
|
+
<% else %>
|
5
|
+
Expected <%= actual.reconstituted %> to match <%= expected.inspect %> <%= @expected_count_type.to_s.tr('_', ' ') %> <%= pluralize(@expected_count, 'time') %> but the element did not exist.
|
6
|
+
<% end %>
|
3
7
|
<% else %>
|
4
|
-
|
8
|
+
<% if @expected_count.nil? %>
|
9
|
+
Expected text in <%= actual.reconstituted %> <%= (actual.truncated_text).inspect %> to match <%= expected.inspect %> but it did not.
|
10
|
+
<% else %>
|
11
|
+
Expected text in <%= actual.reconstituted %> <%= (actual.truncated_text).inspect %> to match <%= @expected_count_type.to_s.tr('_', ' ') %> <%= expected.inspect %> exactly <%= pluralize(@expected_count, 'time') %> but it was matched <%= pluralize(@actual_count, 'time') %>.
|
12
|
+
<% end %>
|
5
13
|
<% 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.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bob Farrell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -61,21 +61,20 @@ files:
|
|
61
61
|
- lib/rspec/html.rb
|
62
62
|
- lib/rspec/html/version.rb
|
63
63
|
- lib/rspec_html.rb
|
64
|
+
- lib/rspec_html/browser.rb
|
65
|
+
- lib/rspec_html/countable.rb
|
64
66
|
- lib/rspec_html/element.rb
|
65
67
|
- lib/rspec_html/matchers.rb
|
66
68
|
- lib/rspec_html/matchers/base.rb
|
67
69
|
- lib/rspec_html/matchers/contain_tag.rb
|
68
|
-
- lib/rspec_html/matchers/contain_text.rb
|
69
70
|
- lib/rspec_html/matchers/match_text.rb
|
70
71
|
- lib/rspec_html/reconstituted_element.rb
|
71
72
|
- lib/rspec_html/search.rb
|
72
73
|
- lib/rspec_html/tags.rb
|
73
74
|
- rspec-html.gemspec
|
74
75
|
- templates/description/contain_tag.erb
|
75
|
-
- templates/description/contain_text.erb
|
76
76
|
- templates/description/match_text.erb
|
77
77
|
- templates/failure/contain_tag.erb
|
78
|
-
- templates/failure/contain_text.erb
|
79
78
|
- templates/failure/match_text.erb
|
80
79
|
homepage: https://github.com/bobf/rspec-html
|
81
80
|
licenses:
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RSpecHTML
|
4
|
-
module Matchers
|
5
|
-
# Matches text within a given DOM element (strips HTML tags and compares text content only).
|
6
|
-
# (Deprecated in favour of `#match_text`.
|
7
|
-
class ContainText
|
8
|
-
include Base
|
9
|
-
|
10
|
-
diffable
|
11
|
-
|
12
|
-
def match(actual)
|
13
|
-
warn('[rspec-html] The `contain_text` matcher is deprecated. Use `match_text` instead.')
|
14
|
-
@rspec_actual = actual&.text
|
15
|
-
(actual&.text || '').include?(@expected.to_s)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
contain text <%= expected.inspect %>
|
@@ -1,5 +0,0 @@
|
|
1
|
-
<% unless actual.exist? %>
|
2
|
-
Expected <%= actual.reconstituted %> to contain <%= expected.inspect %> but the element did not exist.
|
3
|
-
<% else %>
|
4
|
-
Expected text in <%= actual.reconstituted %> <%= (actual.truncated_text).inspect %> to contain <%= expected.inspect %> but it did not.
|
5
|
-
<% end %>
|