test_xml 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'spec/rake/spectask'
5
+
6
+ task :default => ['test:units', :spec]
7
+
8
+ namespace :test do
9
+ Rake::TestTask.new(:units) do |t|
10
+ t.test_files = FileList['test/**/test_*.rb']
11
+ t.libs << "test"
12
+ t.verbose = true
13
+ end
14
+ end
15
+
16
+
17
+ Spec::Rake::SpecTask.new do |t|
18
+ t.libs << "spec"
19
+ t.verbose = true
20
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'nokogiri'
3
+
4
+ module TestXml
5
+ VERSION = '0.0.1'
6
+ end
7
+
8
+ require File.dirname(__FILE__) + '/../lib/test_xml/matchers'
9
+ require File.dirname(__FILE__) + '/../lib/test_xml/nokogiri/node'
10
+ require File.dirname(__FILE__) + '/../lib/test_xml/nokogiri'
@@ -0,0 +1,21 @@
1
+ module TestXml
2
+ module Matchers
3
+ class XmlMatcher
4
+ attr_reader :subject, :pattern, :compare_value
5
+ def initialize(subject, pattern, compare_value)
6
+ @subject = Nokogiri::XML::Document.parse(subject)
7
+ @pattern = Nokogiri::XML::Document.parse(pattern)
8
+ @compare_value = compare_value
9
+ end
10
+
11
+ def match?
12
+ subject.match?(pattern, compare_value)
13
+ end
14
+ end
15
+
16
+ def match_xml?(subject, pattern, compare_value = false)
17
+ matcher = XmlMatcher.new(subject, pattern, compare_value)
18
+ matcher.match?
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ class Nokogiri::XML::Node
2
+ include TestXml::NokogiriExt::Node
3
+ end
@@ -0,0 +1,35 @@
1
+ module TestXml
2
+ module NokogiriExt
3
+ module Node
4
+ def match?(element, compare_value = false)
5
+ if compare_value && element.text_element?
6
+ equal_text?(element)
7
+ else
8
+ contains_elements_of?(element) &&
9
+ !element.elements.find {|el| not at(el.name).match?(el, compare_value) }
10
+ end
11
+ end
12
+
13
+ def elements
14
+ children.collect {|node| node if node.element? }.delete_if {|node| node.nil?}
15
+ end
16
+
17
+ def text_element?
18
+ children.size == 1 && children.first.text?
19
+ end
20
+
21
+ private
22
+ def equal_text?(element)
23
+ content == element.content
24
+ end
25
+
26
+ def contains_elements_of?(element)
27
+ element.elements.find {|el| not contains?(el)}.nil?
28
+ end
29
+
30
+ def contains?(element)
31
+ children.find {|node| node.element? && node.name == element.name }
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,42 @@
1
+ module TestXml
2
+ module Spec
3
+ class MatchXml
4
+ include TestXml::Matchers
5
+
6
+ def initialize(expected, compare_values = false)
7
+ @expected = expected
8
+ @compare_values = compare_values
9
+ end
10
+
11
+ def matches?(actual)
12
+ @actual = actual
13
+ match_xml?(@actual, @expected, @compare_values)
14
+ end
15
+
16
+ def failure_message_for_should
17
+ "expected\n#{@actual} to match#{structure_message}\n#{@expected}"
18
+ end
19
+
20
+ def failure_message_for_should_not
21
+ "expected\n#{@actual} not to match#{structure_message}\n#{@expected}"
22
+ end
23
+
24
+ private
25
+ def structure_message
26
+ " structure" unless @compare_values
27
+ end
28
+ end
29
+
30
+ def match_xml(expected)
31
+ MatchXml.new(expected, true)
32
+ end
33
+
34
+ def match_xml_structure(expected)
35
+ MatchXml.new(expected, false)
36
+ end
37
+ end
38
+ end
39
+
40
+ class Spec::Example::ExampleGroup
41
+ include TestXml::Spec
42
+ end
@@ -0,0 +1,48 @@
1
+ module TestXml
2
+ module TestUnit
3
+ include TestXml::Matchers
4
+
5
+ def assert_match_xml(xml, message = "")
6
+ pattern = yield
7
+ full_message = build_message(message, <<-EOT, xml, pattern)
8
+ The following xml:
9
+ ?
10
+ does not match with:
11
+ ?
12
+ EOT
13
+ assert_block(full_message) do
14
+ match_xml?(xml, yield, true)
15
+ end
16
+ end
17
+
18
+ def assert_match_xml_structure(xml, message = "")
19
+ pattern = yield
20
+ full_message = build_message(message, <<-EOT, xml, pattern)
21
+ The following xml:
22
+ ?
23
+ does not match with structure of:
24
+ ?
25
+ EOT
26
+ assert_block(full_message) do
27
+ match_xml?(xml, yield)
28
+ end
29
+ end
30
+
31
+ def assert_not_match_xml(xml, message = "")
32
+ pattern = yield
33
+ full_message = build_message(message, <<-EOT, xml, pattern)
34
+ The following xml:
35
+ ?
36
+ matches with:
37
+ ?
38
+ EOT
39
+ assert_block(full_message) do
40
+ !match_xml?(xml, yield, true)
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ class Test::Unit::TestCase
47
+ include TestXml::TestUnit
48
+ end
@@ -0,0 +1,4 @@
1
+ require 'spec'
2
+
3
+ require File.dirname(__FILE__) + '/../lib/test_xml'
4
+ require File.dirname(__FILE__) + '/../lib/test_xml/spec'
@@ -0,0 +1,47 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe "xml" do
4
+ before(:each) do
5
+ @xml = <<-XML
6
+ <root>
7
+ <one>1</one>
8
+ <two>2</two>
9
+ </root>
10
+ XML
11
+ end
12
+
13
+ it "should match_xml" do
14
+ @xml.should match_xml(<<-XML)
15
+ <root>
16
+ <one>1</one>
17
+ <two>2</two>
18
+ </root>
19
+ XML
20
+ end
21
+
22
+ it "should not match_xml" do
23
+ @xml.should_not match_xml(<<-XML)
24
+ <root>
25
+ <one>2</one>
26
+ </root>
27
+ XML
28
+ end
29
+
30
+ it "should match_xml_structure" do
31
+ @xml.should match_xml_structure(<<-XML)
32
+ <root>
33
+ <one>2</one>
34
+ <two>1</two>
35
+ </root>
36
+ XML
37
+ end
38
+
39
+ it "should not match_xml_structure" do
40
+ @xml.should_not match_xml_structure(<<-XML)
41
+ <root>
42
+ <one>2</one>
43
+ <three>1</three>
44
+ </root>
45
+ XML
46
+ end
47
+ end
@@ -0,0 +1,4 @@
1
+ require 'test/unit'
2
+
3
+ require File.dirname(__FILE__) + '/../lib/test_xml'
4
+ require File.dirname(__FILE__) + '/../lib/test_xml/test_unit'
@@ -0,0 +1,116 @@
1
+ require 'test_helper'
2
+
3
+ class TestNode < Test::Unit::TestCase
4
+ def test_elements
5
+ assert doc.elements.size == 1
6
+ assert doc.at('root').elements.size == 2
7
+ end
8
+
9
+ def test_text_element
10
+ assert doc(<<-XML).at('root').text_element?
11
+ <root>
12
+ hello
13
+ </root>
14
+ XML
15
+ end
16
+
17
+ def test_match_of_elements_without_comparing_values
18
+ subject = doc(<<-XML)
19
+ <root>
20
+ <one>1</one>
21
+ <two>
22
+ <three>3</three>
23
+ </two>
24
+ </root>
25
+ XML
26
+
27
+ pattern = doc(<<-XML)
28
+ <root>
29
+ <two><three/></two>
30
+ <one>2</one>
31
+ </root>
32
+ XML
33
+
34
+ assert subject.match?(pattern)
35
+ end
36
+
37
+ def test_no_match_of_elements_without_comparing_values
38
+ subject = doc(<<-XML)
39
+ <root>
40
+ <one>1</one>
41
+ <two/>
42
+ </root>
43
+ XML
44
+
45
+ pattern = doc(<<-XML)
46
+ <root>
47
+ <four/>
48
+ <five>5</five>
49
+ </root>
50
+ XML
51
+
52
+ assert !subject.match?(pattern)
53
+ end
54
+
55
+ def test_match_with_values
56
+ subject = doc(<<-XML)
57
+ <root>
58
+ <one>1</one>
59
+ <two><three>3</three></two>
60
+ </root>
61
+ XML
62
+
63
+ pattern = doc(<<-XML)
64
+ <root>
65
+ <two><three>3</three></two>
66
+ <one>1</one>
67
+ </root>
68
+ XML
69
+
70
+ assert subject.match?(pattern, true)
71
+ end
72
+
73
+ def test_no_match_with_values
74
+ subject = doc(<<-XML)
75
+ <root>
76
+ <one>1</one>
77
+ </root>
78
+ XML
79
+
80
+ not_matched_pattern = doc(<<-XML)
81
+ <root>
82
+ <one>2</one>
83
+ </root>
84
+ XML
85
+
86
+ assert !subject.match?(not_matched_pattern, true)
87
+ end
88
+
89
+ def test_element_contains_another_element
90
+ element = create_element('<one/>')
91
+
92
+ assert !doc.send(:contains?,element)
93
+ assert doc.at('root').send(:contains?,element)
94
+ end
95
+
96
+ def test_element_contains_elements
97
+ assert doc.root.send(:contains_elements_of?, doc.root)
98
+ assert !doc.root.send(:contains_elements_of?, doc('<root><test_element/></root>'))
99
+ end
100
+
101
+ private
102
+
103
+ def create_element(xml)
104
+ Nokogiri::XML::Document.parse(xml).root
105
+ end
106
+
107
+ def doc(xml = nil)
108
+ xml ||= <<-XML
109
+ <root>
110
+ <one>1</one>
111
+ <two>2</two>
112
+ </root>
113
+ XML
114
+ Nokogiri::XML::Document.parse(xml)
115
+ end
116
+ end
@@ -0,0 +1,30 @@
1
+ require 'test_helper'
2
+
3
+ class TestMatchers < Test::Unit::TestCase
4
+ include TestXml::Matchers
5
+
6
+ def test_match
7
+ actual = <<-XML
8
+ <root>
9
+ <one>
10
+ <two>2</two>
11
+ </one>
12
+ </root>
13
+ XML
14
+
15
+ assert match_xml?(actual, '<root><one><two/></one></root>')
16
+ assert !match_xml?(actual, '<root><two/></root>')
17
+ end
18
+
19
+ def test_match_with_values
20
+ actual = <<-XML
21
+ <root>
22
+ <one>1</one>
23
+ <two>2</two>
24
+ </root>
25
+ XML
26
+
27
+ assert match_xml?(actual, '<root><one>1</one></root>', true)
28
+ assert !match_xml?(actual, '<root><one>2</one></root>', true)
29
+ end
30
+ end
@@ -0,0 +1,55 @@
1
+ require 'test_helper'
2
+
3
+ class TestTestUnit < Test::Unit::TestCase
4
+ def test_assert_match_xml
5
+ xml = <<-XML
6
+ <root>
7
+ <one>1</one>
8
+ </root>
9
+ XML
10
+
11
+ assert_match_xml(xml) do
12
+ <<-XML
13
+ <root>
14
+ <one>1</one>
15
+ </root>
16
+ XML
17
+ end
18
+ end
19
+
20
+ def test_assert_match_xml_structure
21
+ xml = <<-XML
22
+ <root>
23
+ <one>1</one>
24
+ <two>
25
+ <three>3</three>
26
+ </two>
27
+ </root>
28
+ XML
29
+
30
+ assert_match_xml_structure(xml) do
31
+ <<-XML
32
+ <root>
33
+ <one>2</one>
34
+ <two><three/></two>
35
+ </root>
36
+ XML
37
+ end
38
+ end
39
+
40
+ def test_assert_not_match_xml
41
+ xml = <<-XML
42
+ <root>
43
+ <one>1</one>
44
+ </root>
45
+ XML
46
+
47
+ assert_not_match_xml(xml) do
48
+ <<-XML
49
+ <root>
50
+ <one>2</one>
51
+ </root>
52
+ XML
53
+ end
54
+ end
55
+ end
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: test_xml
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Pavel Gabriel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-01-04 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: nokogiri
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.3.2
24
+ version:
25
+ description: test_xml allows you to test xml (match stucture and values) with Test::Unit or RSpec
26
+ email: alovak@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files: []
32
+
33
+ files:
34
+ - lib/test_xml/matchers.rb
35
+ - lib/test_xml/nokogiri/node.rb
36
+ - lib/test_xml/nokogiri.rb
37
+ - lib/test_xml/spec.rb
38
+ - lib/test_xml/test_unit.rb
39
+ - lib/test_xml.rb
40
+ - test/test_helper.rb
41
+ - test/test_xml/nokogiri/test_node.rb
42
+ - test/test_xml/test_matchers.rb
43
+ - test/test_xml/test_test_unit.rb
44
+ - spec/spec_helper.rb
45
+ - spec/test_xml/spec_spec.rb
46
+ - Rakefile
47
+ has_rdoc: true
48
+ homepage: http://github.com/alovak/
49
+ licenses: []
50
+
51
+ post_install_message:
52
+ rdoc_options: []
53
+
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ version:
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ version:
68
+ requirements: []
69
+
70
+ rubyforge_project:
71
+ rubygems_version: 1.3.5
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: test_xml allows you to test xml with Test::Unit or RSpec
75
+ test_files: []
76
+