xpath-specs 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NDRlMGQ4MGQxZjA4Yzk0ODE3MDBiMGFiMWQ2YmNiMzZhYjEzMmEwOQ==
4
+ ZWNkNzJkN2RlODc2OTYyMDc2NmJkN2ZlMDg2MTU1NjdkYzNjOTljNw==
5
5
  data.tar.gz: !binary |-
6
- MTVmMmViNDliNDhkZDYwYjNlNDczN2NiZmMxZjkxZDJhNTU5NWI1Yw==
6
+ NzhkZTliYWUxNDBiOWZjYjQ3NTEwNjZkZDBkN2M2NGUxNDQyMWU0Yg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- M2IzY2I1MjM2ZWRmZTQ1M2JhNmJmNjBhNTUxMTEyZGI2NzA4MDhjOWM3OTg2
10
- NWJlN2UxYjIzZTYxNDczYjM3MjVmM2E3MmM3ZTA2ZDhkNGUyZTYzMjk3ZDA3
11
- MjZjZGJkMDc0YzFmYmNlOGYyZGMxZmYwYjU1MGNlYzRhNTJlM2Y=
9
+ NWUwMTIxNTVlY2U1OWMyODI0MjI4YzExYTYxNzIwZTk1NmM5MDhmOGYxNDk3
10
+ NWYxNjQwZjRmNjBiNGQ0YzI4MjMwNjQ2MjhiMzg2MjE3MDI3ZDFlZWI4MmMx
11
+ YzZmYzQ3ZGY4MmE3ZjliZmYxYTkwYTExN2EyM2RhNDJmNzNjYjQ=
12
12
  data.tar.gz: !binary |-
13
- YTU3ODFjNTdhYjM0YzQ4ZjMzYTMzMmEzMWJhMGFmMDA1NzIyN2M2YWVhMTFh
14
- YmJlYWUxZjEwNjg1NjQwYzViZmY1OWY3YTNiMDg4NGNkMGY0ZDBkNWFjYTQ0
15
- NGVjNDQ5MzJmYjJiMzNhNDFhMzEzZDliNGEwMWE1MjA0MDkwNTg=
13
+ NGFiN2RmNmJlNGY0MmQxY2M0N2MwNTVhNTg3NTRkNzQ5NmQ0N2EwN2M4YzMx
14
+ MmZkNTVhOWQxOGFjOThjNDRlNmQyZjBmNjk1OTYyNTM1N2M2MjIwZGViMjE0
15
+ MzIyNDQxYjAzMmIyOGMwNzJjZDMyYzY5MzExMDk3MGY3NjQ4MzY=
@@ -1,2 +1,2 @@
1
- ��c � a�;mM�\��ց��ho��(�_�I��w�d'~QH�i=&,A���9��<'��Қ�Mݧ^G���H�X��(-������y��w_{l'>�ڀ�
2
- O��bI ��쒦q�=�'ꨭ�D��ȗZJ�V����7��p8�3���Q㓨Z����|��b}�pB;��2U̟T�aF=�kx�8� Y`�r��I��$��Q��0��ᷠuYhI�SO|�q������_���E�#Xz1�w[
1
+ -���
2
+ ���9H��^�\�&x]s���po����S����
data.tar.gz.sig CHANGED
Binary file
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.1
4
+ - 2.0.0
5
+ script: bundle exec rake
6
+
@@ -0,0 +1,9 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard :rspec do
5
+ watch(%r{^spec/.+_spec\.rb$})
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
9
+
data/README.md CHANGED
@@ -18,7 +18,84 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- TODO: Write usage instructions here
21
+ As an example, suppose you have website with dishes and receipes. You want to test your views (either in RSpec or Cucumber) to make sure that they contain parts you want them to.
22
+
23
+ ### Declare your page parts
24
+
25
+ In order to encourage reuse, create one or many custom page part definition files
26
+
27
+ ```ruby
28
+ # spec/support/knows_page_parts.rb
29
+
30
+ module KnowsPageParts
31
+ def dish_panel
32
+ Xpath::Specs::PagePart.new("the dish panel", "//table[@id='dish-panel']")
33
+ end
34
+
35
+ def dish
36
+ # match a sub element of dish_panel
37
+ dish_panel.with("a dish", "//tr")
38
+ end
39
+
40
+ def dish_with_name(name)
41
+ # match a special dish
42
+ dish.that("is named #{name}", "[td[contains(.,'#{name}')]]")
43
+ end
44
+ end
45
+
46
+ ```
47
+
48
+ ### Use them in your specs
49
+
50
+ With these page parts definitions in place, you can now use them to test your views. Suppose this is the html for your view :
51
+
52
+ ```html
53
+ <html>
54
+ <head></head>
55
+ <body>
56
+ <div>
57
+ <table id="dish-panel">
58
+ <tr><td>Pizza</td>...</tr>
59
+ <tr><td>Cheese Burger</td>...</tr>
60
+ ...
61
+ </table>
62
+ </div>
63
+ </body>
64
+ </html>
65
+ ```
66
+
67
+ * You can test that your view contains the dish panel :
68
+
69
+ ```ruby
70
+ expect(html).to contain_a(dish_panel)
71
+ ```
72
+
73
+ * You can test that it contains at least one dish
74
+
75
+ ```ruby
76
+ expect(html).to contain_a(dish)
77
+ ```
78
+
79
+ * You can also test that it contains a pizza
80
+
81
+ ```ruby
82
+ expect(html).to contain_a(dish_with_name("Pizza")
83
+ ```
84
+
85
+ * Eventually, if you try to search for a dish that is not there :
86
+
87
+ ```ruby
88
+ expect(html).to contain_a(dish_with_name("Grilled Lobster")
89
+ ```
90
+
91
+ You'll get a nice error message :
92
+
93
+ ```
94
+ expected the page to contain a dish that is named Grilled Lobster (//table[@id='dish-panel']//tr[td[contains(.,'#{name}')]])
95
+ it found a dish (//table[@id='dish-panel']//tr) :
96
+ <tr><td>Pizza</td>...</tr>
97
+ but not a dish that is named Grilled Lobster (//table[@id='dish-panel']//tr[td[contains(.,'#{name}')]])
98
+ ```
22
99
 
23
100
  ## Contributing
24
101
 
data/Rakefile CHANGED
@@ -1 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ desc 'Run specs'
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
@@ -1,8 +1,11 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
+ require 'nokogiri'
4
+
3
5
  module Xpath
4
6
  module Specs
5
7
 
8
+ # A custom rspec matcher to verify some html against a PagePart instance
6
9
  class ContainA
7
10
  def initialize(page_part)
8
11
  @page_part = page_part
@@ -3,7 +3,14 @@
3
3
  module Xpath
4
4
  module Specs
5
5
 
6
+ # XPath wrapper providing a user friendly description.
7
+ # Should be used with the contain_a rspec matcher.
6
8
  class PagePart
9
+
10
+ # description: user friendly text used in assertions error messages
11
+ # xpath: the actual xpath to search for
12
+ # parent: an optional parent page part, used to provide better assertion
13
+ # failure diagnostic
7
14
  def initialize(description, xpath, parent = nil)
8
15
  @xpath = xpath
9
16
  @description = description
@@ -16,20 +23,32 @@ module Xpath
16
23
  !parent.nil?
17
24
  end
18
25
 
26
+ # A full description containing the xpath
19
27
  def long_description
20
28
  "#{description} (#{xpath})"
21
29
  end
22
30
 
31
+ # Creates another PagePart instance to match elements relatively to self
32
+ # Uses a completely new description. It's the prefered way to mach sub
33
+ # elements, xpath should usually start with '/'
23
34
  def with(description, xpath)
24
35
  PagePart.new(description, self.xpath+xpath, self)
25
36
  end
26
- def within_a(outer_page_part)
27
- outer_page_part.with(self.description, self.xpath)
28
- end
37
+
38
+ # Creates another PagePart instance to match elements relatively to self
39
+ # Concatenates the descriptions. It's the prefered way to add constraints
40
+ # to the currently matched elements, xpath should usually start with '['
29
41
  def that(description, xpath)
30
- PagePart.new("#{self.description} that #{description}", self.xpath+xpath, self)
42
+ PagePart.new("#{self.description} that #{description}",
43
+ self.xpath+xpath,
44
+ self)
31
45
  end
32
46
 
47
+ # Creates another PagePart instance like self, but relatively to another
48
+ # existing page part.
49
+ def within_a(outer_page_part)
50
+ outer_page_part.with(self.description, self.xpath)
51
+ end
33
52
  end
34
53
 
35
54
  end
@@ -1,5 +1,5 @@
1
1
  module Xpath
2
2
  module Specs
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -0,0 +1,102 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ module Xpath
6
+ module Specs
7
+
8
+ describe ContainA do
9
+
10
+ context 'direct matching' do
11
+
12
+ before :each do
13
+ @html_with_link = '<html>
14
+ <head></head>
15
+ <body>
16
+ <a href="#">Click Me !</a>
17
+ </body>
18
+ </html>'
19
+
20
+ @blank_html = '<html>
21
+ <head></head>
22
+ <body>
23
+ </body>
24
+ </html>'
25
+
26
+ @link = PagePart.new("<my link>", '//a')
27
+ end
28
+
29
+ it 'matches an existing xpath' do
30
+ expect(@html_with_link).to contain_a(@link)
31
+ end
32
+
33
+ it 'has better error messages for missing xpath' do
34
+ expect do
35
+ expect(@blank_html).to contain_a(@link)
36
+ end.to raise_error(Regexp.new("expected the page to contain <my link> \\(\\/\\/a\\)"+
37
+ "\\s+but could not find <my link> \\(\\/\\/a\\)"))
38
+ end
39
+
40
+ it 'has clear error messages for unexpected xpath' do
41
+ expect do
42
+ expect(@html_with_link).not_to contain_a(@link)
43
+ end.to raise_error(/expected the page not to contain <my link> \(\/\/a\)/)
44
+ end
45
+
46
+ it 'automaticaly works on body attributes' do
47
+ expect(double(:body => @html_with_link)).to contain_a(@link)
48
+ end
49
+
50
+ end
51
+
52
+ context 'nesting xpath' do
53
+
54
+ before :each do
55
+ @html_with_link = '<html>
56
+ <head></head>
57
+ <body>
58
+ <div>
59
+ <a href="#">Click Me !</a>
60
+ </div>
61
+ </body>
62
+ </html>'
63
+
64
+ @html_without_link = '<html>
65
+ <head></head>
66
+ <body>
67
+ <div></div>
68
+ </body>
69
+ </html>'
70
+
71
+ @nested_link = PagePart.new("<my div>", '//div').with('<my nested link>', '/a')
72
+ end
73
+
74
+ it 'matches a nested xpath' do
75
+ expect(@html_with_link).to contain_a(@nested_link)
76
+ end
77
+ it 'has even better error messages for missing nested xpath' do
78
+ expect do
79
+ expect(@html_without_link).to contain_a(@nested_link)
80
+ end.to raise_error(Regexp.new("expected the page to contain <my nested link> \\(\\/\\/div\\/a\\)"+
81
+ "\\s+it found <my div> \\(\\/\\/div\\) :"+
82
+ "\\s+<div><\\/div>"+
83
+ "\\s+but not <my nested link> \\(\\/\\/div\\/a\\)"))
84
+ end
85
+
86
+ it 'supports nesting xpath the other way round' do
87
+ link_within = PagePart.new('link', '//a').within_a(PagePart.new('div', '//div'))
88
+
89
+ expect(link_within.xpath).to eq('//div//a')
90
+ end
91
+ it 'supports specializing xpath' do
92
+ red_link = PagePart.new('link', '//a').that('is red', "[@class='red']")
93
+
94
+ expect(red_link.xpath).to eq("//a[@class='red']")
95
+ expect(red_link.description).to eq('link that is red')
96
+ end
97
+
98
+ end
99
+
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,3 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'xpath/specs'
@@ -20,6 +20,8 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "nokogiri"
22
22
 
23
- spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "bundler"
24
24
  spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "guard-rspec"
26
+
25
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xpath-specs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Philou
@@ -38,7 +38,7 @@ cert_chain:
38
38
  NU5zd3dIY0llUVpCL05JRDdiZXJJZjlhd3gzCnlMY2wxY21tNUFMdEovK0Jr
39
39
  a21wMGk0YW1YZVRETXZxOXI4UEJzVnNRd3hZT1lKQlArVW14ejNQWDZIakZI
40
40
  clEKWGRrWHgzb1oKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
41
- date: 2014-05-13 00:00:00.000000000 Z
41
+ date: 2014-05-18 00:00:00.000000000 Z
42
42
  dependencies:
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: nokogiri
@@ -58,16 +58,16 @@ dependencies:
58
58
  name: bundler
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - ~>
61
+ - - ! '>='
62
62
  - !ruby/object:Gem::Version
63
- version: '1.3'
63
+ version: '0'
64
64
  type: :development
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
- - - ~>
68
+ - - ! '>='
69
69
  - !ruby/object:Gem::Version
70
- version: '1.3'
70
+ version: '0'
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: rake
73
73
  requirement: !ruby/object:Gem::Requirement
@@ -82,6 +82,20 @@ dependencies:
82
82
  - - ! '>='
83
83
  - !ruby/object:Gem::Version
84
84
  version: '0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: guard-rspec
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
85
99
  description: A gem providing recursive and named wrappers around xpaths, in order
86
100
  to improve error messages when testing xpath presence in html files
87
101
  email:
@@ -91,7 +105,10 @@ extensions: []
91
105
  extra_rdoc_files: []
92
106
  files:
93
107
  - .gitignore
108
+ - .rspec
109
+ - .travis.yml
94
110
  - Gemfile
111
+ - Guardfile
95
112
  - LICENSE.txt
96
113
  - README.md
97
114
  - Rakefile
@@ -99,6 +116,8 @@ files:
99
116
  - lib/xpath/specs/contain_a_matcher.rb
100
117
  - lib/xpath/specs/page_part.rb
101
118
  - lib/xpath/specs/version.rb
119
+ - spec/lib/xpath/specs/contain_a_matcher_spec.rb
120
+ - spec/spec_helper.rb
102
121
  - xpath-specs.gemspec
103
122
  homepage: https://github.com/philou/xpath-specs
104
123
  licenses:
@@ -124,4 +143,6 @@ rubygems_version: 2.0.3
124
143
  signing_key:
125
144
  specification_version: 4
126
145
  summary: An RSpec library to get better messages when matching XPaths
127
- test_files: []
146
+ test_files:
147
+ - spec/lib/xpath/specs/contain_a_matcher_spec.rb
148
+ - spec/spec_helper.rb
metadata.gz.sig CHANGED
Binary file