xml_spec 0.0.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.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in xml_spec.gemspec
4
+ gemspec
data/README ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,7 @@
1
+ require File.expand_path("../../xml_spec", __FILE__)
2
+
3
+ World(XmlSpec::Helpers, XmlSpec::Matchers)
4
+
5
+ Then /^the response should include the following XML$/ do |xml|
6
+ last_xml.should include_xml(xml)
7
+ end
@@ -0,0 +1,14 @@
1
+ require 'nokogiri'
2
+
3
+ module XmlSpec
4
+ module Helpers
5
+ extend self
6
+
7
+ def parse_xml(subject, pattern)
8
+ [Nokogiri::XML.parse(subject).root, Nokogiri::XML.parse(pattern).root]
9
+ end
10
+
11
+ end
12
+ end
13
+
14
+
@@ -0,0 +1,68 @@
1
+ require "nokogiri"
2
+ require "rspec"
3
+
4
+ module XmlSpec
5
+ module Matchers
6
+ class BeXmlEql
7
+ include XmlSpec::Helpers
8
+
9
+ attr_reader :expected, :actual
10
+
11
+ def diffable?
12
+ true
13
+ end
14
+
15
+ def initialize(expected_xml)
16
+ @expected_xml = expected_xml
17
+ end
18
+
19
+ def matches?(actual_xml)
20
+ @actual, @expected = parse_xml(actual_xml, @expected_xml)
21
+ @actual.match?(@expected, true) && @expected.match?(@actual, true)
22
+ end
23
+
24
+ def failure_message_for_should
25
+ "the xml:\n#{@actual}\nshould exactly match xml:\n#{@expected}"
26
+ end
27
+
28
+ def failure_message_for_should_not
29
+ "the xml:\n#{@actual}\nshould not exactly match xml:\n#{@expected}\nbut it does"
30
+ end
31
+ end
32
+
33
+ class IncludeXml
34
+ include XmlSpec::Helpers
35
+
36
+ attr_reader :expected, :actual
37
+
38
+ def initialize(expected_xml)
39
+ @expected_xml = expected_xml
40
+ end
41
+
42
+ def matches?(actual_xml)
43
+ @actual, @expected = parse_xml(actual_xml, @expected_xml)
44
+ @actual.match?(expected, true)
45
+ end
46
+
47
+ def failure_message_for_should
48
+ "the xml:\n#{@actual}\nshould match xml structure:\n#{@expected}"
49
+ end
50
+
51
+ def failure_message_for_should_not
52
+ "the xml:\n#{@actual}\nshould not match xml structure:\n#{@expected}\nbut it does"
53
+ end
54
+ end
55
+
56
+ def be_xml_eql(xml)
57
+ XmlSpec::Matchers::BeXmlEql.new(xml)
58
+ end
59
+
60
+ def include_xml(xml)
61
+ XmlSpec::Matchers::IncludeXml.new(xml)
62
+ end
63
+ end
64
+ end
65
+
66
+ RSpec.configure do |config|
67
+ config.include XmlSpec::Matchers
68
+ end
@@ -0,0 +1,60 @@
1
+ module XmlSpec
2
+ module NokogiriExt
3
+ module Node
4
+ def match?(element, compare_value = false)
5
+ if compare_value && element.leaf?
6
+ comparable_attributes == element.comparable_attributes and equal_text?(element)
7
+ else
8
+
9
+ #TODO clean this part of the code
10
+ if compare_value
11
+ (comparable_attributes == element.comparable_attributes) &&
12
+ contains_elements_of?(element) &&
13
+ element.elements.all? {|el| matches_at_least_one?(el, compare_value) }
14
+ else
15
+ contains_elements_of?(element) &&
16
+ element.elements.all? {|el| matches_at_least_one?(el, compare_value) }
17
+ end
18
+ end
19
+ end
20
+
21
+ def elements
22
+ children.collect {|node| node if node.element? }.delete_if {|node| node.nil?}
23
+ end
24
+
25
+ # Attributes of the current node.
26
+ def comparable_attributes
27
+ attributes.collect {|k,a| [k.downcase, a.value]}.sort
28
+ end
29
+
30
+ # Check if node is either childless, self-closing, or has content text.
31
+ def leaf?
32
+ children.size == 0 or (children.size == 1 && children.first.text?)
33
+ end
34
+
35
+ # def placeholder?
36
+ # TestXml.placeholders_enabled? and (content =~ /^`.*`$/)
37
+ # end
38
+
39
+ private
40
+ def equal_text?(element)
41
+ #element.content = content if element.placeholder?
42
+
43
+ content == element.content
44
+ end
45
+
46
+
47
+ def contains_elements_of?(element)
48
+ element.elements.find {|el| not contains?(el)}.nil?
49
+ end
50
+
51
+ def contains?(element)
52
+ children.find {|node| node.element? && node.name == element.name }
53
+ end
54
+
55
+ def matches_at_least_one?(element, compare_value)
56
+ search(element.name).find { |el| el.match?(element, compare_value) }
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,5 @@
1
+ require "xml_spec/nokogiri/node"
2
+
3
+ class Nokogiri::XML::Node
4
+ include XmlSpec::NokogiriExt::Node
5
+ end
@@ -0,0 +1,3 @@
1
+ module XmlSpec
2
+ VERSION = "0.0.1"
3
+ end
data/lib/xml_spec.rb ADDED
@@ -0,0 +1,7 @@
1
+ require "xml_spec/version"
2
+ require "xml_spec/helpers"
3
+ require "xml_spec/matchers"
4
+ require "xml_spec/nokogiri"
5
+
6
+ module XmlSpec
7
+ end
@@ -0,0 +1,4 @@
1
+ require "xml_spec"
2
+
3
+ RSpec.configure do |config|
4
+ end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ describe "Matchers:" do
4
+ context "be_xml_eql" do
5
+ it "matches the exact same XML" do
6
+ xml = %(<name complete="true">TAPUHI</name><count type="integer">1</count>)
7
+ xml.should be_xml_eql(%(<name complete="true">TAPUHI</name><count type="integer">1</count>))
8
+ end
9
+
10
+ it "doesn't match XML with different attributes" do
11
+ xml = %(<name complete="true">TAPUHI</name><count type="integer">1</count>)
12
+ xml.should_not be_xml_eql(%(<name complete="false">TAPUHI</name><count type="integer">1</count>))
13
+ end
14
+ end
15
+
16
+ context "include_xml" do
17
+ it "matches a basic xml structure" do
18
+ xml = %(<values type="array">
19
+ <value>
20
+ <name>TAPUHI</name>
21
+ <count type="integer">1</count>
22
+ </value>
23
+ </values>)
24
+
25
+ xml.should include_xml(%(<values type="array"><value><name>TAPUHI</name></value></values>))
26
+ end
27
+
28
+ it "ignores other nodes" do
29
+ xml = %(<value><name>TAPUHI</name><count type="integer">1</count></value>)
30
+ xml.should include_xml(%(<value><name>TAPUHI</name></value>))
31
+ end
32
+ end
33
+ end
data/xml_spec.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/xml_spec/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Federico Gonzalez"]
6
+ gem.email = ["fedegl@gmail.com"]
7
+ gem.description = %q{Test XML with RSpec and Cucumber}
8
+ gem.summary = %q{Test XML with RSpec and Cucumber}
9
+ gem.homepage = ""
10
+
11
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
+ gem.files = `git ls-files`.split("\n")
13
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ gem.name = "xml_spec"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = XmlSpec::VERSION
17
+
18
+ gem.add_dependency "nokogiri", ">= 1.3.2"
19
+ gem.add_dependency "rspec", "~> 2.0"
20
+
21
+ gem.add_development_dependency "rake", "~> 0.9"
22
+ gem.add_development_dependency "cucumber", "~> 1.1", ">= 1.1.1"
23
+ end
metadata ADDED
@@ -0,0 +1,148 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xml_spec
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Federico Gonzalez
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-02-20 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: nokogiri
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 31
29
+ segments:
30
+ - 1
31
+ - 3
32
+ - 2
33
+ version: 1.3.2
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 2
47
+ - 0
48
+ version: "2.0"
49
+ type: :runtime
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: rake
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ~>
58
+ - !ruby/object:Gem::Version
59
+ hash: 25
60
+ segments:
61
+ - 0
62
+ - 9
63
+ version: "0.9"
64
+ type: :development
65
+ version_requirements: *id003
66
+ - !ruby/object:Gem::Dependency
67
+ name: cucumber
68
+ prerelease: false
69
+ requirement: &id004 !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ~>
73
+ - !ruby/object:Gem::Version
74
+ hash: 13
75
+ segments:
76
+ - 1
77
+ - 1
78
+ version: "1.1"
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ hash: 17
82
+ segments:
83
+ - 1
84
+ - 1
85
+ - 1
86
+ version: 1.1.1
87
+ type: :development
88
+ version_requirements: *id004
89
+ description: Test XML with RSpec and Cucumber
90
+ email:
91
+ - fedegl@gmail.com
92
+ executables: []
93
+
94
+ extensions: []
95
+
96
+ extra_rdoc_files: []
97
+
98
+ files:
99
+ - .gitignore
100
+ - Gemfile
101
+ - README
102
+ - Rakefile
103
+ - lib/xml_spec.rb
104
+ - lib/xml_spec/cucumber.rb
105
+ - lib/xml_spec/helpers.rb
106
+ - lib/xml_spec/matchers.rb
107
+ - lib/xml_spec/nokogiri.rb
108
+ - lib/xml_spec/nokogiri/node.rb
109
+ - lib/xml_spec/version.rb
110
+ - spec/spec_helper.rb
111
+ - spec/xml_spec/matchers_spec.rb
112
+ - xml_spec.gemspec
113
+ homepage: ""
114
+ licenses: []
115
+
116
+ post_install_message:
117
+ rdoc_options: []
118
+
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ hash: 3
127
+ segments:
128
+ - 0
129
+ version: "0"
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ none: false
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ hash: 3
136
+ segments:
137
+ - 0
138
+ version: "0"
139
+ requirements: []
140
+
141
+ rubyforge_project:
142
+ rubygems_version: 1.8.10
143
+ signing_key:
144
+ specification_version: 3
145
+ summary: Test XML with RSpec and Cucumber
146
+ test_files:
147
+ - spec/spec_helper.rb
148
+ - spec/xml_spec/matchers_spec.rb