OLD | NEW |
| (Empty) |
1 # Copyright (c) 2001-2007 Twisted Matrix Laboratories. | |
2 # See LICENSE for details. | |
3 | |
4 """ | |
5 Tests for L{twisted.words.xish.domish}. | |
6 """ | |
7 | |
8 from twisted.trial import unittest | |
9 from twisted.words.xish import domish | |
10 | |
11 class DomishTestCase(unittest.TestCase): | |
12 def testEscaping(self): | |
13 s = "&<>'\"" | |
14 self.assertEquals(domish.escapeToXml(s), "&<>'\"") | |
15 self.assertEquals(domish.escapeToXml(s, 1), "&<>'"") | |
16 | |
17 def testNamespaceObject(self): | |
18 ns = domish.Namespace("testns") | |
19 self.assertEquals(ns.foo, ("testns", "foo")) | |
20 | |
21 def testElementInit(self): | |
22 e = domish.Element((None, "foo")) | |
23 self.assertEquals(e.name, "foo") | |
24 self.assertEquals(e.uri, None) | |
25 self.assertEquals(e.defaultUri, None) | |
26 self.assertEquals(e.parent, None) | |
27 | |
28 e = domish.Element(("", "foo")) | |
29 self.assertEquals(e.name, "foo") | |
30 self.assertEquals(e.uri, "") | |
31 self.assertEquals(e.defaultUri, "") | |
32 self.assertEquals(e.parent, None) | |
33 | |
34 e = domish.Element(("testns", "foo")) | |
35 self.assertEquals(e.name, "foo") | |
36 self.assertEquals(e.uri, "testns") | |
37 self.assertEquals(e.defaultUri, "testns") | |
38 self.assertEquals(e.parent, None) | |
39 | |
40 e = domish.Element(("testns", "foo"), "test2ns") | |
41 self.assertEquals(e.name, "foo") | |
42 self.assertEquals(e.uri, "testns") | |
43 self.assertEquals(e.defaultUri, "test2ns") | |
44 | |
45 def testChildOps(self): | |
46 e = domish.Element(("testns", "foo")) | |
47 e.addContent("somecontent") | |
48 b2 = e.addElement(("testns2", "bar2")) | |
49 e["attrib1"] = "value1" | |
50 e[("testns2", "attrib2")] = "value2" | |
51 e.addElement("bar") | |
52 e.addElement("bar") | |
53 e.addContent("abc") | |
54 e.addContent("123") | |
55 | |
56 # Check content merging | |
57 self.assertEquals(e.children[-1], "abc123") | |
58 | |
59 # Check str()/content extraction | |
60 self.assertEquals(str(e), "somecontent") | |
61 | |
62 # Check direct child accessor | |
63 self.assertEquals(e.bar2, b2) | |
64 e.bar2.addContent("subcontent") | |
65 e.bar2["bar2value"] = "somevalue" | |
66 | |
67 # Check child ops | |
68 self.assertEquals(e.children[1], e.bar2) | |
69 self.assertEquals(e.children[2], e.bar) | |
70 | |
71 # Check attribute ops | |
72 self.assertEquals(e["attrib1"], "value1") | |
73 del e["attrib1"] | |
74 self.assertEquals(e.hasAttribute("attrib1"), 0) | |
75 self.assertEquals(e.hasAttribute("attrib2"), 0) | |
76 self.assertEquals(e[("testns2", "attrib2")], "value2") | |
77 | |
78 class DomishStreamTests: | |
79 def setUp(self): | |
80 self.doc_started = False | |
81 self.doc_ended = False | |
82 self.root = None | |
83 self.elements = [] | |
84 self.stream = self.streamClass() | |
85 self.stream.DocumentStartEvent = self._docStarted | |
86 self.stream.ElementEvent = self.elements.append | |
87 self.stream.DocumentEndEvent = self._docEnded | |
88 | |
89 def _docStarted(self, root): | |
90 self.root = root | |
91 self.doc_started = True | |
92 | |
93 def _docEnded(self): | |
94 self.doc_ended = True | |
95 | |
96 def doTest(self, xml): | |
97 self.stream.parse(xml) | |
98 | |
99 def testHarness(self): | |
100 xml = "<root><child/><child2/></root>" | |
101 self.stream.parse(xml) | |
102 self.assertEquals(self.doc_started, True) | |
103 self.assertEquals(self.root.name, 'root') | |
104 self.assertEquals(self.elements[0].name, 'child') | |
105 self.assertEquals(self.elements[1].name, 'child2') | |
106 self.assertEquals(self.doc_ended, True) | |
107 | |
108 def testBasic(self): | |
109 xml = "<stream:stream xmlns:stream='etherx' xmlns='jabber'>\n" + \ | |
110 " <message to='bar'>" + \ | |
111 " <x xmlns='xdelay'>some&data></x>" + \ | |
112 " </message>" + \ | |
113 "</stream:stream>" | |
114 | |
115 self.stream.parse(xml) | |
116 self.assertEquals(self.root.name, 'stream') | |
117 self.assertEquals(self.root.uri, 'etherx') | |
118 self.assertEquals(self.elements[0].name, 'message') | |
119 self.assertEquals(self.elements[0].uri, 'jabber') | |
120 self.assertEquals(self.elements[0]['to'], 'bar') | |
121 self.assertEquals(self.elements[0].x.uri, 'xdelay') | |
122 self.assertEquals(unicode(self.elements[0].x), 'some&data>') | |
123 | |
124 def testNoRootNS(self): | |
125 xml = "<stream><error xmlns='etherx'/></stream>" | |
126 | |
127 self.stream.parse(xml) | |
128 self.assertEquals(self.root.uri, '') | |
129 self.assertEquals(self.elements[0].uri, 'etherx') | |
130 | |
131 def testNoDefaultNS(self): | |
132 xml = "<stream:stream xmlns:stream='etherx'><error/></stream:stream>""" | |
133 | |
134 self.stream.parse(xml) | |
135 self.assertEquals(self.root.uri, 'etherx') | |
136 self.assertEquals(self.root.defaultUri, '') | |
137 self.assertEquals(self.elements[0].uri, '') | |
138 self.assertEquals(self.elements[0].defaultUri, '') | |
139 | |
140 def testChildDefaultNS(self): | |
141 xml = "<root xmlns='testns'><child/></root>" | |
142 | |
143 self.stream.parse(xml) | |
144 self.assertEquals(self.root.uri, 'testns') | |
145 self.assertEquals(self.elements[0].uri, 'testns') | |
146 | |
147 def testEmptyChildNS(self): | |
148 xml = "<root xmlns='testns'><child1><child2 xmlns=''/></child1></root>" | |
149 | |
150 self.stream.parse(xml) | |
151 self.assertEquals(self.elements[0].child2.uri, '') | |
152 | |
153 def testChildPrefix(self): | |
154 xml = "<root xmlns='testns' xmlns:foo='testns2'><foo:child/></root>" | |
155 | |
156 self.stream.parse(xml) | |
157 self.assertEquals(self.root.localPrefixes['foo'], 'testns2') | |
158 self.assertEquals(self.elements[0].uri, 'testns2') | |
159 | |
160 def testUnclosedElement(self): | |
161 self.assertRaises(domish.ParserError, self.stream.parse, | |
162 "<root><error></root>") | |
163 | |
164 def test_namespaceReuse(self): | |
165 """ | |
166 Test that reuse of namespaces does affect an element's serialization. | |
167 | |
168 When one element uses a prefix for a certain namespace, this is | |
169 stored in the C{localPrefixes} attribute of the element. We want | |
170 to make sure that elements created after such use, won't have this | |
171 prefix end up in their C{localPrefixes} attribute, too. | |
172 """ | |
173 | |
174 xml = """<root> | |
175 <foo:child1 xmlns:foo='testns'/> | |
176 <child2 xmlns='testns'/> | |
177 </root>""" | |
178 | |
179 self.stream.parse(xml) | |
180 self.assertEquals('child1', self.elements[0].name) | |
181 self.assertEquals('testns', self.elements[0].uri) | |
182 self.assertEquals('', self.elements[0].defaultUri) | |
183 self.assertEquals({'foo': 'testns'}, self.elements[0].localPrefixes) | |
184 self.assertEquals('child2', self.elements[1].name) | |
185 self.assertEquals('testns', self.elements[1].uri) | |
186 self.assertEquals('testns', self.elements[1].defaultUri) | |
187 self.assertEquals({}, self.elements[1].localPrefixes) | |
188 | |
189 class DomishExpatStreamTestCase(unittest.TestCase, DomishStreamTests): | |
190 def setUp(self): | |
191 DomishStreamTests.setUp(self) | |
192 | |
193 def setUpClass(self): | |
194 try: | |
195 import pyexpat | |
196 except ImportError: | |
197 raise unittest.SkipTest, "Skipping ExpatElementStream test, since no
expat wrapper is available." | |
198 | |
199 self.streamClass = domish.ExpatElementStream | |
200 | |
201 class DomishSuxStreamTestCase(unittest.TestCase, DomishStreamTests): | |
202 def setUp(self): | |
203 DomishStreamTests.setUp(self) | |
204 | |
205 def setUpClass(self): | |
206 if domish.SuxElementStream is None: | |
207 raise unittest.SkipTest, "Skipping SuxElementStream test, since twis
ted.web is not available." | |
208 | |
209 self.streamClass = domish.SuxElementStream | |
210 | |
211 | |
212 | |
213 class SerializerTests(unittest.TestCase): | |
214 def testNoNamespace(self): | |
215 e = domish.Element((None, "foo")) | |
216 self.assertEquals(e.toXml(), "<foo/>") | |
217 self.assertEquals(e.toXml(closeElement = 0), "<foo>") | |
218 | |
219 def testDefaultNamespace(self): | |
220 e = domish.Element(("testns", "foo")) | |
221 self.assertEquals(e.toXml(), "<foo xmlns='testns'/>") | |
222 | |
223 def testOtherNamespace(self): | |
224 e = domish.Element(("testns", "foo"), "testns2") | |
225 self.assertEquals(e.toXml({'testns': 'bar'}), | |
226 "<bar:foo xmlns:bar='testns' xmlns='testns2'/>") | |
227 | |
228 def testChildDefaultNamespace(self): | |
229 e = domish.Element(("testns", "foo")) | |
230 e.addElement("bar") | |
231 self.assertEquals(e.toXml(), "<foo xmlns='testns'><bar/></foo>") | |
232 | |
233 def testChildSameNamespace(self): | |
234 e = domish.Element(("testns", "foo")) | |
235 e.addElement(("testns", "bar")) | |
236 self.assertEquals(e.toXml(), "<foo xmlns='testns'><bar/></foo>") | |
237 | |
238 def testChildSameDefaultNamespace(self): | |
239 e = domish.Element(("testns", "foo")) | |
240 e.addElement("bar", "testns") | |
241 self.assertEquals(e.toXml(), "<foo xmlns='testns'><bar/></foo>") | |
242 | |
243 def testChildOtherDefaultNamespace(self): | |
244 e = domish.Element(("testns", "foo")) | |
245 e.addElement(("testns2", "bar"), 'testns2') | |
246 self.assertEquals(e.toXml(), "<foo xmlns='testns'><bar xmlns='testns2'/>
</foo>") | |
247 | |
248 def testOnlyChildDefaultNamespace(self): | |
249 e = domish.Element((None, "foo")) | |
250 e.addElement(("ns2", "bar"), 'ns2') | |
251 self.assertEquals(e.toXml(), "<foo><bar xmlns='ns2'/></foo>") | |
252 | |
253 def testOnlyChildDefaultNamespace2(self): | |
254 e = domish.Element((None, "foo")) | |
255 e.addElement("bar") | |
256 self.assertEquals(e.toXml(), "<foo><bar/></foo>") | |
257 | |
258 def testChildInDefaultNamespace(self): | |
259 e = domish.Element(("testns", "foo"), "testns2") | |
260 e.addElement(("testns2", "bar")) | |
261 self.assertEquals(e.toXml(), "<xn0:foo xmlns:xn0='testns' xmlns='testns2
'><bar/></xn0:foo>") | |
262 | |
263 def testQualifiedAttribute(self): | |
264 e = domish.Element((None, "foo"), | |
265 attribs = {("testns2", "bar"): "baz"}) | |
266 self.assertEquals(e.toXml(), "<foo xmlns:xn0='testns2' xn0:bar='baz'/>") | |
267 | |
268 def testQualifiedAttributeDefaultNS(self): | |
269 e = domish.Element(("testns", "foo"), | |
270 attribs = {("testns", "bar"): "baz"}) | |
271 self.assertEquals(e.toXml(), "<foo xmlns='testns' xmlns:xn0='testns' xn0
:bar='baz'/>") | |
272 | |
273 def testTwoChilds(self): | |
274 e = domish.Element(('', "foo")) | |
275 child1 = e.addElement(("testns", "bar"), "testns2") | |
276 child1.addElement(('testns2', 'quux')) | |
277 child2 = e.addElement(("testns3", "baz"), "testns4") | |
278 child2.addElement(('testns', 'quux')) | |
279 self.assertEquals(e.toXml(), "<foo><xn0:bar xmlns:xn0='testns' xmlns='te
stns2'><quux/></xn0:bar><xn1:baz xmlns:xn1='testns3' xmlns='testns4'><xn0:quux x
mlns:xn0='testns'/></xn1:baz></foo>") | |
280 | |
281 def testXMLNamespace(self): | |
282 e = domish.Element((None, "foo"), | |
283 attribs = {("http://www.w3.org/XML/1998/namespace", | |
284 "lang"): "en_US"}) | |
285 self.assertEquals(e.toXml(), "<foo xml:lang='en_US'/>") | |
286 | |
287 def testQualifiedAttributeGivenListOfPrefixes(self): | |
288 e = domish.Element((None, "foo"), | |
289 attribs = {("testns2", "bar"): "baz"}) | |
290 self.assertEquals(e.toXml({"testns2": "qux"}), | |
291 "<foo xmlns:qux='testns2' qux:bar='baz'/>") | |
292 | |
293 def testNSPrefix(self): | |
294 e = domish.Element((None, "foo"), | |
295 attribs = {("testns2", "bar"): "baz"}) | |
296 c = e.addElement(("testns2", "qux")) | |
297 c[("testns2", "bar")] = "quux" | |
298 | |
299 self.assertEquals(e.toXml(), "<foo xmlns:xn0='testns2' xn0:bar='baz'><xn
0:qux xn0:bar='quux'/></foo>") | |
300 | |
301 def testDefaultNSPrefix(self): | |
302 e = domish.Element((None, "foo"), | |
303 attribs = {("testns2", "bar"): "baz"}) | |
304 c = e.addElement(("testns2", "qux")) | |
305 c[("testns2", "bar")] = "quux" | |
306 c.addElement('foo') | |
307 | |
308 self.assertEquals(e.toXml(), "<foo xmlns:xn0='testns2' xn0:bar='baz'><xn
0:qux xn0:bar='quux'><xn0:foo/></xn0:qux></foo>") | |
309 | |
310 def testPrefixScope(self): | |
311 e = domish.Element(('testns', 'foo')) | |
312 | |
313 self.assertEquals(e.toXml(prefixes={'testns': 'bar'}, | |
314 prefixesInScope=['bar']), | |
315 "<bar:foo/>") | |
316 | |
317 def testLocalPrefixes(self): | |
318 e = domish.Element(('testns', 'foo'), localPrefixes={'bar': 'testns'}) | |
319 self.assertEquals(e.toXml(), "<bar:foo xmlns:bar='testns'/>") | |
320 | |
321 def testLocalPrefixesWithChild(self): | |
322 e = domish.Element(('testns', 'foo'), localPrefixes={'bar': 'testns'}) | |
323 e.addElement('baz') | |
324 self.assertIdentical(e.baz.defaultUri, None) | |
325 self.assertEquals(e.toXml(), "<bar:foo xmlns:bar='testns'><baz/></bar:fo
o>") | |
326 | |
327 def test_prefixesReuse(self): | |
328 """ | |
329 Test that prefixes passed to serialization are not modified. | |
330 | |
331 This test makes sure that passing a dictionary of prefixes repeatedly | |
332 to C{toXml} of elements does not cause serialization errors. A | |
333 previous implementation changed the passed in dictionary internally, | |
334 causing havoc later on. | |
335 """ | |
336 prefixes = {'testns': 'foo'} | |
337 | |
338 # test passing of dictionary | |
339 s = domish.SerializerClass(prefixes=prefixes) | |
340 self.assertNotIdentical(prefixes, s.prefixes) | |
341 | |
342 # test proper serialization on prefixes reuse | |
343 e = domish.Element(('testns2', 'foo'), | |
344 localPrefixes={'quux': 'testns2'}) | |
345 self.assertEquals("<quux:foo xmlns:quux='testns2'/>", | |
346 e.toXml(prefixes=prefixes)) | |
347 e = domish.Element(('testns2', 'foo')) | |
348 self.assertEquals("<foo xmlns='testns2'/>", | |
349 e.toXml(prefixes=prefixes)) | |
350 | |
351 def testRawXMLSerialization(self): | |
352 e = domish.Element((None, "foo")) | |
353 e.addRawXml("<abc123>") | |
354 # The testcase below should NOT generate valid XML -- that's | |
355 # the whole point of using the raw XML call -- it's the callers | |
356 # responsiblity to ensure that the data inserted is valid | |
357 self.assertEquals(e.toXml(), "<foo><abc123></foo>") | |
358 | |
359 def testRawXMLWithUnicodeSerialization(self): | |
360 e = domish.Element((None, "foo")) | |
361 e.addRawXml(u"<degree>\u00B0</degree>") | |
362 self.assertEquals(e.toXml(), u"<foo><degree>\u00B0</degree></foo>") | |
363 | |
364 def testUnicodeSerialization(self): | |
365 e = domish.Element((None, "foo")) | |
366 e["test"] = u"my value\u0221e" | |
367 e.addContent(u"A degree symbol...\u00B0") | |
368 self.assertEquals(e.toXml(), | |
369 u"<foo test='my value\u0221e'>A degree symbol...\u00B0
</foo>") | |
OLD | NEW |