rspec-xml 0.0.3 → 0.0.4

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.
data/Gemfile CHANGED
@@ -2,6 +2,5 @@ source "http://rubygems.org"
2
2
 
3
3
  # bundler doesn't require this from the .gemspec
4
4
  # https://github.com/carlhuda/bundler/issues/1041
5
- gem 'pry'
6
5
 
7
6
  gemspec
@@ -1,3 +1,3 @@
1
1
  module RSpecXML
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -0,0 +1,27 @@
1
+ module RSpecXML
2
+ module XMLMatchers
3
+ class HaveXPath
4
+ private
5
+
6
+ class Matcher
7
+ def initialize(options={})
8
+ self.xpath = options[:xpath]
9
+ end
10
+
11
+ def matches?(xml)
12
+ ::Nokogiri::XML(xml).xpath(@xpath).count > 0
13
+ end
14
+
15
+ def failure_message_for_should
16
+ "expected #{xpath} to exist"
17
+ end
18
+
19
+ def failure_message_for_should_not
20
+ "expected #{xpath} to not exist"
21
+ end
22
+
23
+ attr_accessor :xpath
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,32 @@
1
+ module RSpecXML
2
+ module XMLMatchers
3
+ class HaveXPath
4
+
5
+ private
6
+
7
+ class TextMatcher
8
+
9
+ def initialize(options={})
10
+ self.xpath = options[:xpath]
11
+ self.text = options[:text]
12
+ end
13
+
14
+ def matches?(xml)
15
+ ::Nokogiri::XML(xml).xpath(xpath).text == text
16
+ end
17
+
18
+ def failure_message_for_should
19
+ "expected #{xpath} to contain #{text}"
20
+ end
21
+
22
+ def failure_message_for_should_not
23
+ "expected #{xpath} to not exist with text: #{text}"
24
+ end
25
+
26
+ private
27
+
28
+ attr_accessor :text, :xpath
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ module RSpecXML
2
+ module XMLMatchers
3
+ class HaveXPath
4
+
5
+ def initialize(xpath)
6
+ self.matcher = Matcher.new(:xpath => xpath)
7
+ end
8
+
9
+ def with_text(text)
10
+ self.matcher = TextMatcher.new(
11
+ :xpath => matcher.xpath,
12
+ :text => text.to_s )
13
+ self
14
+ end
15
+
16
+ def matches?(xml)
17
+ matcher.matches?(xml)
18
+ end
19
+
20
+ def failure_message_for_should
21
+ matcher.failure_message_for_should
22
+ end
23
+
24
+ def failure_message_for_should_not
25
+ matcher.failure_message_for_should_not
26
+ end
27
+
28
+ private
29
+
30
+ attr_accessor :matcher
31
+ end
32
+ end
33
+ end
@@ -1,84 +1,14 @@
1
- module RSpecXML
2
- module XMLMatchers
3
- class HaveXPath
4
-
5
- def initialize(xpath)
6
- self.xpath = xpath
7
- @matcher = Matcher.new(:xpath => xpath)
8
- end
9
-
10
- def with_text(text)
11
- @matcher = TextMatcher.new(:xpath => xpath, :text => text)
12
- self
13
- end
14
-
15
- def matches?(xml)
16
- @matcher.matches?(xml)
17
- end
18
-
19
- def failure_message_for_should
20
- @matcher.failure_message_for_should
21
- end
22
-
23
- def failure_message_for_should_not
24
- @matcher.failure_message_for_should_not
25
- end
26
-
27
- private
28
-
29
- attr_accessor :xpath
30
-
31
- class Matcher
32
-
33
- def initialize(options={})
34
- self.xpath = options[:xpath]
35
- end
36
-
37
- def matches?(xml)
38
- ::Nokogiri::XML(xml).xpath(@xpath).count > 0
39
- end
40
-
41
- def failure_message_for_should
42
- "expected #{xpath} to exist"
43
- end
1
+ root = File.dirname(__FILE__)
2
+ require "#{root}/xml_matchers/have_xpath/matcher"
3
+ require "#{root}/xml_matchers/have_xpath/text_matcher"
4
+ require "#{root}/xml_matchers/have_xpath"
44
5
 
45
- def failure_message_for_should_not
46
- "expected #{xpath} to not exist"
47
- end
48
-
49
- private
50
-
51
- attr_accessor :xpath
52
-
53
- end
54
-
55
- class TextMatcher
56
-
57
- def initialize(options)
58
- self.xpath = options[:xpath]
59
- self.text = options[:text]
60
- end
61
-
62
- def matches?(xml)
63
- ::Nokogiri::XML(xml).xpath(xpath).text == text
64
- end
65
-
66
- def failure_message_for_should
67
- "expected #{xpath} to contain #{text}"
68
- end
69
-
70
- def failure_message_for_should_not
71
- "expected #{xpath} to contain #{text}"
72
- end
73
-
74
- private
6
+ module RSpecXML
7
+ module XMLMatchers
75
8
 
76
- attr_accessor :text, :xpath
77
- end
78
- end
9
+ def have_xpath(xpath)
10
+ HaveXPath.new(xpath)
11
+ end
79
12
 
80
- def have_xpath(xpath)
81
- HaveXPath.new(xpath)
82
- end
83
- end
13
+ end
84
14
  end
data/license.txt ADDED
@@ -0,0 +1,22 @@
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2005-2010 The RSpec Development Team
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 NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/readme.md CHANGED
@@ -2,11 +2,32 @@
2
2
  *spec your xml*
3
3
 
4
4
  ## installation
5
- ```ruby
5
+ ```
6
+ # Gemfile
6
7
  gem 'rspec-xml'
7
8
  ```
8
9
 
9
10
  ## Usage
11
+
10
12
  ```ruby
13
+ # some_spec.rb
14
+ "<something>else</something>".should have_xpath('/something')
11
15
  "<something>else</something>".should have_xpath('/something').with_text('else')
16
+
17
+ "<something>else</something>".should_not have_xpath('/what')
18
+ "<something>else</something>".should_not have_xpath('/something').with_text('what')
12
19
  ```
20
+
21
+ ### Builder
22
+
23
+ ```ruby
24
+ xml = ''
25
+ builder = Builder::XmlMarkup.new(:target => xml)
26
+ builder.instruct!
27
+
28
+ builder.some_xml do |xml|
29
+ xml.inner 'stuff'
30
+ end
31
+
32
+ xml.should have_xpath('//some_xml/inner').with_text('stuff')
33
+ ```
data/rspec-xml.gemspec CHANGED
@@ -17,7 +17,8 @@ Gem::Specification.new do |s|
17
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
18
  s.require_paths = ["lib"]
19
19
 
20
- s.add_development_dependency 'turnip'
20
+ s.add_development_dependency 'turnip'
21
+ s.add_development_dependency 'mocha'
21
22
 
22
23
  s.add_runtime_dependency 'rspec'
23
24
  s.add_runtime_dependency 'nokogiri'
@@ -1,15 +1,14 @@
1
1
  Feature: "some xml".should have_xpath('//something').with_text('Budweiser') ---
2
2
 
3
- Background:
4
- Given there is a string of XML
3
+ Background:
4
+ Given there is a string of XML
5
5
 
6
- @wip
7
- Scenario: the matcher should pass when the node contains the text
8
- Given the best node contains the text: Budweiser
9
- When I test for the text: Budweiser within the best node
10
- Then the test should pass
11
- @wop
12
- Scenario: the matcher should fail when the node doesn't contain the text
13
- Given the best node contains the text: Budweiser
14
- When I test for the text: Miller within the best node
15
- Then the test should fail
6
+ Scenario: the matcher should pass when the node contains the text
7
+ Given the best node contains the text: Budweiser
8
+ When I test for the text: Budweiser within the best node
9
+ Then the test should pass
10
+
11
+ Scenario: the matcher should fail when the node doesn't contain the text
12
+ Given the best node contains the text: Budweiser
13
+ When I test for the text: Miller within the best node
14
+ Then the test should fail
@@ -1,22 +1,22 @@
1
1
  steps_for :have_path do
2
- step 'there is a string of XML' do
3
- @xml = lambda { |insides| "<xml>#{insides}</xml>" }
4
- end
2
+ step 'there is a string of XML' do
3
+ @xml = lambda { |insides| "<xml>#{insides}</xml>" }
4
+ end
5
5
 
6
- step 'the :node_name node contains the text: :text' do |node_name, text|
7
- @xml = @xml.call "<#{node_name}>#{text}</#{node_name}>"
8
- end
6
+ step 'the :node_name node contains the text: :text' do |node_name, text|
7
+ @xml = @xml.call "<#{node_name}>#{text}</#{node_name}>"
8
+ end
9
9
 
10
- step 'I test for the text: :text within the :node_name node' do |text, node_name|
11
- @test = lambda { @xml.should have_xpath("//#{node_name}").with_text(text) }
12
- end
10
+ step 'I test for the text: :text within the :node_name node' do |text, node_name|
11
+ @test = lambda { @xml.should have_xpath("//#{node_name}").with_text(text) }
12
+ end
13
13
 
14
- step 'the test should pass' do
15
- @test.should_not raise_error(RSpec::Expectations::ExpectationNotMetError)
16
- end
14
+ step 'the test should pass' do
15
+ @test.should_not raise_error(RSpec::Expectations::ExpectationNotMetError)
16
+ end
17
17
 
18
- step 'the test should fail' do
19
- @test.should raise_error(RSpec::Expectations::ExpectationNotMetError)
20
- end
18
+ step 'the test should fail' do
19
+ @test.should raise_error(RSpec::Expectations::ExpectationNotMetError)
20
+ end
21
21
 
22
22
  end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ describe RSpecXML::XMLMatchers::HaveXPath::Matcher do
4
+ describe '#initialize' do
5
+ it 'should accept an xpath' do
6
+ matcher = subject.class.new(:xpath => 'not a real xpath')
7
+ matcher.xpath.should == 'not a real xpath'
8
+ end
9
+ end
10
+
11
+ describe '#matches?' do
12
+ # TODO mock out Nokogiri
13
+
14
+ it 'should return true if the supplied xml contains the xpath' do
15
+ matcher = subject.class.new(:xpath => '//hi')
16
+ matcher.matches?('<hi></hi>').should be_true
17
+ end
18
+
19
+ it 'should return false if the supplied xml contains the xpath' do
20
+ matcher = subject.class.new(:xpath => '//hi')
21
+ matcher.matches?('<no></no>').should be_false
22
+ end
23
+ end
24
+
25
+ describe '#failure_message_for_should' do
26
+ it 'should turn a message about the xpath not existing when it should' do
27
+ subject.stubs(:xpath).returns('xpath')
28
+ subject.failure_message_for_should.should == "expected xpath to exist"
29
+ end
30
+ end
31
+
32
+ describe '#failure_message_for_should_not' do
33
+ it 'should turn a message about the xpath existing when it should not' do
34
+ subject.stubs(:xpath).returns('xpath')
35
+ subject.failure_message_for_should_not.should == "expected xpath to not exist"
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe RSpecXML::XMLMatchers::HaveXPath::TextMatcher do
4
+ describe '#initialize' do
5
+ it 'should accept an xpath' do
6
+ matcher = subject.class.new(:xpath => 'not a real xpath')
7
+ matcher.send(:xpath).should == 'not a real xpath'
8
+ end
9
+
10
+ it 'should accept text' do
11
+ matcher = subject.class.new(:text => 'text')
12
+ matcher.send(:text).should == 'text'
13
+ end
14
+
15
+ end
16
+
17
+ describe '#matches?' do
18
+ # TODO mock out Nokogiri
19
+
20
+ it 'should return true if the supplied xml contains the xpath with supplied text' do
21
+ matcher = subject.class.new(:xpath => '//hi', :text => 'hi')
22
+ matcher.matches?('<hi>hi</hi>').should be_true
23
+ end
24
+
25
+ it 'should return false if the supplied xml contains the xpath but not the text' do
26
+ matcher = subject.class.new(:xpath => '//hi', :text => 'what')
27
+ matcher.matches?('<hi></hi>').should be_false
28
+ end
29
+
30
+ it 'should return false if the supplied xml does not contain the xpath' do
31
+ matcher = subject.class.new(:xpath => '//hi', :text => 'what')
32
+ matcher.matches?('<no></no>').should be_false
33
+ end
34
+
35
+ end
36
+
37
+ describe '#failure_message_for_should' do
38
+ it 'should turn a message about the xpath not existing when the supplied text' do
39
+ subject.stubs(:xpath).returns('xpath')
40
+ subject.stubs(:text).returns('text')
41
+ subject.failure_message_for_should.should == "expected xpath to contain text"
42
+ end
43
+ end
44
+
45
+ describe '#failure_message_for_should_not' do
46
+ it 'should turn a message about the xpath existing when it should not' do
47
+ subject.stubs(:xpath).returns('xpath')
48
+ subject.stubs(:text).returns('text')
49
+ subject.failure_message_for_should_not.should == "expected xpath to not exist with text: text"
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ module Factory
4
+ def self.xpath_matcher(xpath)
5
+ RSpecXML::XMLMatchers::HaveXPath.new(xpath)
6
+ end
7
+ end
8
+
9
+ describe RSpecXML::XMLMatchers::HaveXPath do
10
+ describe '#intialize' do
11
+ it 'should build and save a matcher containing the supplied xpath' do
12
+
13
+ RSpecXML::XMLMatchers::HaveXPath::Matcher.
14
+ expects(:new).
15
+ with(:xpath => 'fake xpath').
16
+ returns(:flag)
17
+
18
+ xpath_matcher = Factory.xpath_matcher('fake xpath')
19
+ xpath_matcher.send(:matcher).should == :flag
20
+
21
+ end
22
+ end
23
+
24
+ describe '#with_text' do
25
+ it 'should build a new text matcher containing supplied xpath and text' do
26
+
27
+ RSpecXML::XMLMatchers::HaveXPath::TextMatcher.
28
+ expects(:new).
29
+ with(:xpath => 'fake xpath', :text => 'blah').
30
+ returns(:flag)
31
+
32
+ xpath_matcher = Factory.xpath_matcher('fake xpath').with_text('blah')
33
+ xpath_matcher.send(:matcher).should == :flag
34
+
35
+ end
36
+ end
37
+
38
+ describe '#failure_message_for_should' do
39
+ it 'should delegate to the matcher' do
40
+ xpath_matcher = Factory.xpath_matcher('whatever')
41
+ xpath_matcher.stubs(:matcher).
42
+ returns(stub( :failure_message_for_should => 'woo!' ))
43
+
44
+ xpath_matcher.failure_message_for_should.should == 'woo!'
45
+ end
46
+ end
47
+
48
+ describe '#failure_message_for_should' do
49
+ it 'should delegate to the matcher' do
50
+ xpath_matcher = Factory.xpath_matcher('whatever')
51
+ xpath_matcher.stubs(:matcher).
52
+ returns(stub( :failure_message_for_should_not => 'woo!' ))
53
+
54
+ xpath_matcher.failure_message_for_should_not.should == 'woo!'
55
+ end
56
+ end
57
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,2 +1,5 @@
1
1
  require File.expand_path('../../lib/rspec-xml', __FILE__)
2
- require 'pry'
2
+
3
+ RSpec.configure do |config|
4
+ config.mock_with :mocha
5
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-xml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-07 00:00:00.000000000 Z
12
+ date: 2012-08-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: turnip
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: mocha
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
30
46
  - !ruby/object:Gem::Dependency
31
47
  name: rspec
32
48
  requirement: !ruby/object:Gem::Requirement
@@ -72,12 +88,18 @@ files:
72
88
  - lib/rspec-xml.rb
73
89
  - lib/rspec-xml/version.rb
74
90
  - lib/rspec-xml/xml_matchers.rb
91
+ - lib/rspec-xml/xml_matchers/have_xpath.rb
92
+ - lib/rspec-xml/xml_matchers/have_xpath/matcher.rb
93
+ - lib/rspec-xml/xml_matchers/have_xpath/text_matcher.rb
94
+ - license.txt
75
95
  - readme.md
76
96
  - rspec-xml.gemspec
77
97
  - spec/features/have_path.feature
78
98
  - spec/features/steps/have_path_steps.rb
99
+ - spec/rspec-xml/xml_matchers/have_xpath/matcher_spec.rb
100
+ - spec/rspec-xml/xml_matchers/have_xpath/text_matcher_spec.rb
101
+ - spec/rspec-xml/xml_matchers/have_xpath_matcher_spec.rb
79
102
  - spec/spec_helper.rb
80
- - spec/xml_matchers_spec.rb
81
103
  homepage: ''
82
104
  licenses: []
83
105
  post_install_message:
@@ -105,5 +127,7 @@ summary: Spec your XML
105
127
  test_files:
106
128
  - spec/features/have_path.feature
107
129
  - spec/features/steps/have_path_steps.rb
130
+ - spec/rspec-xml/xml_matchers/have_xpath/matcher_spec.rb
131
+ - spec/rspec-xml/xml_matchers/have_xpath/text_matcher_spec.rb
132
+ - spec/rspec-xml/xml_matchers/have_xpath_matcher_spec.rb
108
133
  - spec/spec_helper.rb
109
- - spec/xml_matchers_spec.rb
@@ -1,32 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe RSpecXML::XMLMatchers do
4
- describe '#have_xpath' do
5
- context '#with_text' do
6
- it 'should pass if the xpath exists containing the supplied text' do
7
- "<node>HAI</node>".should have_xpath('/node').with_text('HAI')
8
- end
9
-
10
- it "should fail if the xpath does not exist" do
11
- lambda { "<node>HAI</node>".should have_xpath('/ne').with_text('HAI')}.
12
- should raise_error(RSpec::Expectations::ExpectationNotMetError)
13
- end
14
-
15
- it 'should fail if the xpath does not contain the supplied text' do
16
- lambda { "<node>HAI</node>".should have_xpath('/ne').with_text('HI')}.
17
- should raise_error(RSpec::Expectations::ExpectationNotMetError)
18
- end
19
- end
20
-
21
- context 'without specifying text' do
22
- it 'should pass if the node exists' do
23
- '<node>something</node>'.should have_xpath('/node')
24
- end
25
-
26
- it 'should fail if the node does not exist' do
27
- lambda { "<node>HAI</node>".should have_xpath('/ne')}.
28
- should raise_error(RSpec::Expectations::ExpectationNotMetError)
29
- end
30
- end
31
- end
32
- end