rspec-html-matchers 0.8.1 → 0.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 22c01ae28fa7cad1439746a9dd405d82c9e1d03b
4
- data.tar.gz: 82a8b327805ab2b26e6bb8a06485d4b65442bda2
3
+ metadata.gz: 17c280c0fd064492e078852526a508bd84e6caca
4
+ data.tar.gz: 83887d4b20b714cfb7456b079960e3df4f3c5d53
5
5
  SHA512:
6
- metadata.gz: 745e59864f28ec8bf28ec3ccef9da23c22d8bc03b3c8e4220412c54ec889b2cac59b32c2229051da5783c8be04f0443196324422f96c476292a6a98c0b2edc97
7
- data.tar.gz: 097dcf96e8f5680a6dc45cd293909ea0e20e83e7b1c96694f71849588bb5b8ab9c7334e782e4f42f938d5753d47d98aafbed6ce84c2e945bcaa51cf4ea9f2e26
6
+ metadata.gz: 8abf7a4a88eb220f105603e528e4b75c7807caa1e3174a20e0c689276b484153c9724d810a5042beb71a9812681e97a04641a457f27d0078c2ac0c9dc309ade6
7
+ data.tar.gz: 784db376e190ad1f85d1bd181e3db36fe9dcdace86d516b906ce79f637abddc6800ab762225b83216506fe69d32f061fe787b70b029f4b50cb4f250054acfb5b
@@ -11,6 +11,19 @@ unreleased(TODO)
11
11
  * order matching
12
12
  * improve documentation, add more usage examples (look at changelog and code!)
13
13
 
14
+ 0.9.0
15
+ -----
16
+
17
+ * fixed `with\_tag` nesting (thanks to [randoum](https://github.com/randoum): [#59](https://github.com/kucaahbe/rspec-html-matchers/pull/59))
18
+ * added ~> 2.4 ruby support
19
+ * removed ~> 2 ruby support
20
+
21
+ 0.8.2
22
+ -----
23
+
24
+ * fixed README (thanks to [Rodrigo Castro](https://github.com/roooodcastro))
25
+ * fixed deep nesting (thanks to [Misha Gorodnitzky](https://github.com/misaka))
26
+
14
27
  0.8.1
15
28
  -----
16
29
 
data/README.md CHANGED
@@ -152,7 +152,7 @@ Input can be any html string. Let's take a look at these examples:
152
152
  expect('<p> Some content&nbsphere</p>').to have_tag('p', :text => mymock.text)
153
153
  # or
154
154
  expect('<p> Some content&nbsphere</p>').to have_tag('p') do
155
- with_content mymock.text
155
+ with_text mymock.text
156
156
  end
157
157
 
158
158
  # matching text content as it's seen by user:
@@ -108,29 +108,31 @@ module RSpecHtmlMatchers
108
108
 
109
109
  case document
110
110
  when String
111
- @parent_scope = @current_scope = Nokogiri::HTML(document).css(@tag)
111
+ @parent_scope = Nokogiri::HTML(document)
112
112
  @document = document
113
113
  else
114
114
  @parent_scope = document.current_scope
115
- @current_scope = begin
116
- document.parent_scope.css(@tag)
117
- # on jruby this produce exception if css was not found:
118
- # undefined method `decorate' for nil:NilClass
119
- rescue NoMethodError
120
- Nokogiri::XML::NodeSet.new(Nokogiri::XML::Document.new)
121
- end
122
115
  @document = @parent_scope.to_html
123
116
  end
124
-
117
+ @current_scope = begin
118
+ @parent_scope.css(@tag)
119
+ # on jruby this produce exception if css was not found:
120
+ # undefined method `decorate' for nil:NilClass
121
+ rescue NoMethodError
122
+ Nokogiri::XML::NodeSet.new(Nokogiri::XML::Document.new)
123
+ end
125
124
  if tag_presents? and text_right? and count_right?
126
- @current_scope = @parent_scope
127
- @block.call if @block
125
+ @block.call(self) if @block
128
126
  true
129
127
  else
130
128
  false
131
129
  end
132
130
  end
133
131
 
132
+ def document
133
+ @document
134
+ end
135
+
134
136
  def description
135
137
  # TODO should it be more complicated?
136
138
  if @options.has_key?(:count)
@@ -309,14 +311,18 @@ module RSpecHtmlMatchers
309
311
  raise StandardError, 'this matcher should be used inside "have_tag" matcher block' unless defined?(@__current_scope_for_nokogiri_matcher)
310
312
  raise ArgumentError, 'this matcher does not accept block' if block_given?
311
313
  tag = @__current_scope_for_nokogiri_matcher.instance_variable_get(:@tag)
312
- expect(@__current_scope_for_nokogiri_matcher).to have_tag(tag, :text => text)
314
+ within_nested_tag do
315
+ expect(@__current_scope_for_nokogiri_matcher).to have_tag(tag, :text => text)
316
+ end
313
317
  end
314
318
 
315
319
  def without_text text
316
320
  raise StandardError, 'this matcher should be used inside "have_tag" matcher block' unless defined?(@__current_scope_for_nokogiri_matcher)
317
321
  raise ArgumentError, 'this matcher does not accept block' if block_given?
318
322
  tag = @__current_scope_for_nokogiri_matcher.instance_variable_get(:@tag)
319
- expect(@__current_scope_for_nokogiri_matcher).to_not have_tag(tag, :text => text)
323
+ within_nested_tag do
324
+ expect(@__current_scope_for_nokogiri_matcher).to_not have_tag(tag, :text => text)
325
+ end
320
326
  end
321
327
  alias :but_without_text :without_text
322
328
 
@@ -325,7 +331,9 @@ module RSpecHtmlMatchers
325
331
  # @see #have_tag
326
332
  # @note this should be used within block of have_tag matcher
327
333
  def with_tag tag, options={}, &block
328
- expect(@__current_scope_for_nokogiri_matcher).to have_tag(tag, options, &block)
334
+ within_nested_tag do
335
+ expect(@__current_scope_for_nokogiri_matcher).to have_tag(tag, options, &block)
336
+ end
329
337
  end
330
338
 
331
339
  # without_tag matcher
@@ -333,7 +341,9 @@ module RSpecHtmlMatchers
333
341
  # @see #have_tag
334
342
  # @note this should be used within block of have_tag matcher
335
343
  def without_tag tag, options={}, &block
336
- expect(@__current_scope_for_nokogiri_matcher).to_not have_tag(tag, options, &block)
344
+ within_nested_tag do
345
+ expect(@__current_scope_for_nokogiri_matcher).to_not have_tag(tag, options, &block)
346
+ end
337
347
  end
338
348
 
339
349
  # form assertion
@@ -458,14 +468,18 @@ module RSpecHtmlMatchers
458
468
  # TODO, should be: with_text_area name, text=nil
459
469
  #options = form_tag_options('text',name,value)
460
470
  options = { :with => { :name => name } }
461
- expect(@__current_scope_for_nokogiri_matcher).to have_tag('textarea', options)
471
+ within_nested_tag do
472
+ expect(@__current_scope_for_nokogiri_matcher).to have_tag('textarea', options)
473
+ end
462
474
  end
463
475
 
464
476
  def without_text_area name
465
477
  # TODO, should be: without_text_area name, text=nil
466
478
  #options = form_tag_options('text',name,value)
467
479
  options = { :with => { :name => name } }
468
- expect(@__current_scope_for_nokogiri_matcher).to_not have_tag('textarea', options)
480
+ within_nested_tag do
481
+ expect(@__current_scope_for_nokogiri_matcher).to_not have_tag('textarea', options)
482
+ end
469
483
  end
470
484
 
471
485
  def with_checkbox name, value=nil
@@ -493,7 +507,9 @@ module RSpecHtmlMatchers
493
507
  id = options[:with].delete(:id)
494
508
  tag='select'; tag += '#'+id if id
495
509
  options[:with].merge!(:name => name)
496
- expect(@__current_scope_for_nokogiri_matcher).to have_tag(tag, options, &block)
510
+ within_nested_tag do
511
+ expect(@__current_scope_for_nokogiri_matcher).to have_tag(tag, options, &block)
512
+ end
497
513
  end
498
514
 
499
515
  def without_select name, options={}, &block
@@ -501,7 +517,9 @@ module RSpecHtmlMatchers
501
517
  id = options[:with].delete(:id)
502
518
  tag='select'; tag += '#'+id if id
503
519
  options[:with].merge!(:name => name)
504
- expect(@__current_scope_for_nokogiri_matcher).to_not have_tag(tag, options, &block)
520
+ within_nested_tag do
521
+ expect(@__current_scope_for_nokogiri_matcher).to_not have_tag(tag, options, &block)
522
+ end
505
523
  end
506
524
 
507
525
  def with_option text, value=nil, options={}
@@ -517,7 +535,9 @@ module RSpecHtmlMatchers
517
535
  end
518
536
  options.delete(:selected)
519
537
  options.merge!(:text => text) if text
520
- expect(@__current_scope_for_nokogiri_matcher).to have_tag(tag, options)
538
+ within_nested_tag do
539
+ expect(@__current_scope_for_nokogiri_matcher).to have_tag(tag, options)
540
+ end
521
541
  end
522
542
 
523
543
  def without_option text, value=nil, options={}
@@ -533,7 +553,9 @@ module RSpecHtmlMatchers
533
553
  end
534
554
  options.delete(:selected)
535
555
  options.merge!(:text => text) if text
536
- expect(@__current_scope_for_nokogiri_matcher).to_not have_tag(tag, options)
556
+ within_nested_tag do
557
+ expect(@__current_scope_for_nokogiri_matcher).to_not have_tag(tag, options)
558
+ end
537
559
  end
538
560
 
539
561
  def with_button text, value=nil, options={}
@@ -544,7 +566,9 @@ module RSpecHtmlMatchers
544
566
  end
545
567
  options[:with].merge!(:value => value.to_s) if value
546
568
  options.merge!(:text => text) if text
547
- expect(@__current_scope_for_nokogiri_matcher).to have_tag('button', options)
569
+ within_nested_tag do
570
+ expect(@__current_scope_for_nokogiri_matcher).to have_tag('button', options)
571
+ end
548
572
  end
549
573
 
550
574
  def without_button text, value=nil, options={}
@@ -555,7 +579,9 @@ module RSpecHtmlMatchers
555
579
  end
556
580
  options[:with].merge!(:value => value.to_s) if value
557
581
  options.merge!(:text => text) if text
558
- expect(@__current_scope_for_nokogiri_matcher).to_not have_tag('button', options)
582
+ within_nested_tag do
583
+ expect(@__current_scope_for_nokogiri_matcher).to_not have_tag('button', options)
584
+ end
559
585
  end
560
586
 
561
587
  def with_submit value
@@ -573,11 +599,15 @@ module RSpecHtmlMatchers
573
599
  private
574
600
 
575
601
  def should_have_input(options)
576
- expect(@__current_scope_for_nokogiri_matcher).to have_tag('input', options)
602
+ within_nested_tag do
603
+ expect(@__current_scope_for_nokogiri_matcher).to have_tag('input', options)
604
+ end
577
605
  end
578
606
 
579
607
  def should_not_have_input(options)
580
- expect(@__current_scope_for_nokogiri_matcher).to_not have_tag('input', options)
608
+ within_nested_tag do
609
+ expect(@__current_scope_for_nokogiri_matcher).to_not have_tag('input', options)
610
+ end
581
611
  end
582
612
 
583
613
  # form_tag in method name name mean smth. like input, submit, tags that should appear in a form
@@ -588,4 +618,11 @@ module RSpecHtmlMatchers
588
618
  return options
589
619
  end
590
620
 
621
+ def within_nested_tag(&block)
622
+ raise 'block needed' unless block_given?
623
+ parent_scope = @__current_scope_for_nokogiri_matcher
624
+ block.call
625
+ @__current_scope_for_nokogiri_matcher = parent_scope
626
+ end
627
+
591
628
  end
@@ -1,4 +1,4 @@
1
- # encoding: UTF-8
1
+ # encoding: utf-8
2
2
  require 'spec_helper'
3
3
 
4
4
  describe 'have_tag' do
@@ -463,7 +463,7 @@ describe 'have_tag' do
463
463
  with_text 'SAMPLE text'
464
464
  end
465
465
  }.to raise_spec_error(
466
- %Q{"SAMPLE text" expected within "div" in following template:\n<div>sample text</div>}
466
+ /"SAMPLE text" expected within "div" in following template:/
467
467
  )
468
468
 
469
469
  expect {
@@ -471,7 +471,7 @@ describe 'have_tag' do
471
471
  with_text /SAMPLE tekzt/i
472
472
  end
473
473
  }.to raise_spec_error(
474
- %Q{/SAMPLE tekzt/i regexp expected within "div" in following template:\n<div>sample text</div>}
474
+ %r{/SAMPLE tekzt/i regexp expected within "div" in following template:}
475
475
  )
476
476
  end
477
477
 
@@ -481,7 +481,7 @@ describe 'have_tag' do
481
481
  without_text 'sample text'
482
482
  end
483
483
  }.to raise_spec_error(
484
- %Q{"sample text" unexpected within "div" in following template:\n<div>sample text</div>\nbut was found.}
484
+ %r{"sample text" unexpected within "div" in following template:}
485
485
  )
486
486
 
487
487
  expect {
@@ -489,7 +489,7 @@ describe 'have_tag' do
489
489
  without_text /SAMPLE text/i
490
490
  end
491
491
  }.to raise_spec_error(
492
- %Q{/SAMPLE text/i regexp unexpected within "div" in following template:\n<div>sample text</div>\nbut was found.}
492
+ %r{/SAMPLE text/i regexp unexpected within "div" in following template:}
493
493
  )
494
494
  end
495
495
 
@@ -578,15 +578,80 @@ describe 'have_tag' do
578
578
 
579
579
  expect {
580
580
  expect(rendered).to have_tag('ol') { with_tag('li'); with_tag('div') }
581
- }.to raise_spec_error(/expected following:\n#{ordered_list_regexp}\n\s*to have at least 1 element matching "div", found 0/)
581
+ }.to raise_spec_error(/to have at least 1 element matching "div", found 0/)
582
582
 
583
583
  expect {
584
584
  expect(rendered).to have_tag('ol') { with_tag('li'); with_tag('li', :count => 10) }
585
- }.to raise_spec_error(/expected following:\n#{ordered_list_regexp}\n\s*to have 10 element\(s\) matching "li", found 3/)
585
+ }.to raise_spec_error(/to have 10 element\(s\) matching "li", found 3/)
586
586
 
587
587
  expect {
588
588
  expect(rendered).to have_tag('ol') { with_tag('li'); with_tag('li', :text => /SAMPLE text/i) }
589
- }.to raise_spec_error(/\/SAMPLE text\/i regexp expected within "li" in following template:\n#{ordered_list_regexp}/)
589
+ }.to raise_spec_error(/\/SAMPLE text\/i regexp expected within "li"/)
590
+ end
591
+ end
592
+
593
+ context "deep nesting" do
594
+ asset 'multiple_lists'
595
+
596
+ it "should allow deep nesting" do
597
+ expect(rendered).to have_tag('div') do
598
+ with_tag 'ul.numeric' do
599
+ with_tag 'li#one'
600
+ end
601
+ end
602
+ end
603
+
604
+ it "should clear context between nested tags" do
605
+ expect(rendered).to have_tag('div') do |div|
606
+ expect(div).to have_tag 'ul.numeric'
607
+ expect(div).to have_tag 'ul.alpha'
608
+ end
609
+ end
610
+
611
+ it "should narrow context when deep nesting" do
612
+ expect do
613
+ expect(rendered).to have_tag('div') do |div|
614
+ expect(div).to have_tag 'ul.numeric' do |ul_numeric|
615
+ expect(ul_numeric).to have_tag 'li#aye'
616
+ end
617
+ end
618
+ end .to raise_spec_error(/at least 1 element matching "li#aye", found 0/)
619
+ end
620
+
621
+ it "should narrow context for with_text" do
622
+ expect do
623
+ expect(rendered).to have_tag('div') do |div|
624
+ expect(div).to have_tag 'ul.numeric' do
625
+ with_text 'A'
626
+ end
627
+ end
628
+ end .to raise_spec_error(/"A" expected within "ul.numeric"/)
629
+ end
630
+ end
631
+
632
+ context 'find nested tags' do
633
+ asset 'nested_matchers'
634
+
635
+ it 'with block parameters' do
636
+ expect(rendered).to have_tag('div#one') do |a|
637
+ expect(a).to have_tag 'p.find_me', count: 2
638
+
639
+ expect(a).to have_tag 'b.nested', count: 3
640
+ expect(a).to have_tag('p.deep-nesting', count: 1) do |b|
641
+ expect(b).to have_tag 'b.nested', count: 2
642
+ end
643
+ end
644
+ end
645
+
646
+ it 'with short_hand methods' do
647
+ expect(rendered).to have_tag('div#one') do
648
+ with_tag 'p.find_me', count: 2
649
+
650
+ with_tag 'b.nested', count: 3
651
+ with_tag('p.deep-nesting', count: 1) do
652
+ with_tag 'b.nested', count: 2
653
+ end
654
+ end
590
655
  end
591
656
  end
592
657
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-html-matchers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kucaahbe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-12 00:00:00.000000000 Z
11
+ date: 2017-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -192,15 +192,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
192
192
  requirements:
193
193
  - - ">="
194
194
  - !ruby/object:Gem::Version
195
- version: '0'
195
+ version: '2.1'
196
196
  required_rubygems_version: !ruby/object:Gem::Requirement
197
197
  requirements:
198
198
  - - ">="
199
199
  - !ruby/object:Gem::Version
200
200
  version: '0'
201
201
  requirements: []
202
- rubyforge_project: rspec-html-matchers
203
- rubygems_version: 2.5.1
202
+ rubyforge_project:
203
+ rubygems_version: 2.6.8
204
204
  signing_key:
205
205
  specification_version: 4
206
206
  summary: Nokogiri based 'have_tag' and 'with_tag' matchers for rspec 3
@@ -214,4 +214,3 @@ test_files:
214
214
  - features/step_definitions/steps.rb
215
215
  - features/support/env.rb
216
216
  - features/js_generated_content.feature
217
- has_rdoc: