-
-
Notifications
You must be signed in to change notification settings - Fork 897
/
test_schema.rb
142 lines (120 loc) · 3.83 KB
/
test_schema.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
require "helper"
module Nokogiri
module XML
class TestSchema < Nokogiri::TestCase
def setup
assert @xsd = Nokogiri::XML::Schema(File.read(PO_SCHEMA_FILE))
end
def test_schema_from_document
doc = Nokogiri::XML(File.open(PO_SCHEMA_FILE))
assert doc
xsd = Nokogiri::XML::Schema.from_document doc
assert_instance_of Nokogiri::XML::Schema, xsd
end
def test_invalid_schema_do_not_raise_exceptions
xsd = Nokogiri::XML::Schema.new <<EOF
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:group name="foo1">
<xs:sequence>
<xs:element name="bar" type="xs:boolean" />
</xs:sequence>
</xs:group>
<xs:group name="foo2">
<xs:sequence>
<xs:element name="bar" type="xs:string" />
</xs:sequence>
</xs:group>
<xs:element name="foo">
<xs:complexType>
<xs:choice>
<xs:group ref="foo1"/>
<xs:group ref="foo2"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
EOF
assert_instance_of Nokogiri::XML::Schema, xsd
end
def test_schema_from_document_node
doc = Nokogiri::XML(File.open(PO_SCHEMA_FILE))
assert doc
xsd = Nokogiri::XML::Schema.from_document doc.root
assert_instance_of Nokogiri::XML::Schema, xsd
end
def test_schema_validates_with_relative_paths
xsd = File.join(ASSETS_DIR, 'foo', 'foo.xsd')
xml = File.join(ASSETS_DIR, 'valid_bar.xml')
doc = Nokogiri::XML(File.open(xsd))
xsd = Nokogiri::XML::Schema.from_document doc
doc = Nokogiri::XML(File.open(xml))
assert xsd.valid?(doc)
end
def test_parse_with_memory
assert_instance_of Nokogiri::XML::Schema, @xsd
assert_equal 0, @xsd.errors.length
end
def test_new
assert xsd = Nokogiri::XML::Schema.new(File.read(PO_SCHEMA_FILE))
assert_instance_of Nokogiri::XML::Schema, xsd
end
def test_parse_with_io
xsd = nil
File.open(PO_SCHEMA_FILE, 'rb') { |f|
assert xsd = Nokogiri::XML::Schema(f)
}
assert_equal 0, xsd.errors.length
end
def test_parse_with_errors
xml = File.read(PO_SCHEMA_FILE).sub(/name="/, 'name=')
assert_raises(Nokogiri::XML::SyntaxError) {
Nokogiri::XML::Schema(xml)
}
end
def test_validate_document
doc = Nokogiri::XML(File.read(PO_XML_FILE))
assert errors = @xsd.validate(doc)
assert_equal 0, errors.length
end
def test_validate_file
assert errors = @xsd.validate(PO_XML_FILE)
assert_equal 0, errors.length
end
def test_validate_invalid_document
doc = Nokogiri::XML File.read(PO_XML_FILE)
doc.css("city").unlink
assert errors = @xsd.validate(doc)
assert_equal 2, errors.length
end
def test_validate_invalid_file
tempfile = Tempfile.new("xml")
doc = Nokogiri::XML File.read(PO_XML_FILE)
doc.css("city").unlink
tempfile.write doc.to_xml
tempfile.close
assert errors = @xsd.validate(tempfile.path)
assert_equal 2, errors.length
end
def test_validate_non_document
string = File.read(PO_XML_FILE)
assert_raise(ArgumentError) {@xsd.validate(string)}
end
def test_valid?
valid_doc = Nokogiri::XML(File.read(PO_XML_FILE))
invalid_doc = Nokogiri::XML(
File.read(PO_XML_FILE).gsub(/<city>[^<]*<\/city>/, '')
)
assert(@xsd.valid?(valid_doc))
assert(!@xsd.valid?(invalid_doc))
end
def test_xsd_with_dtd
Dir.chdir(File.join(ASSETS_DIR, 'saml')) do
# works
Nokogiri::XML::Schema(IO.read('xmldsig_schema.xsd'))
# was not working
Nokogiri::XML::Schema(IO.read('saml20protocol_schema.xsd'))
end
end
end
end
end