1
2
3 """
4 Tests for the incremental XML serialisation API.
5
6 Tests require Python 2.5 or later.
7 """
8
9 from __future__ import with_statement
10
11 import unittest
12 import tempfile, os, sys
13
14 this_dir = os.path.dirname(__file__)
15 if this_dir not in sys.path:
16 sys.path.insert(0, this_dir)
17
18 from common_imports import etree, BytesIO, HelperTestCase, skipIf
21 _file = None
22
28
30 with etree.xmlfile(self._file) as xf:
31 with xf.element('test'):
32 xf.write('toast')
33 self.assertXml('<test>toast</test>')
34
36 with etree.xmlfile(self._file) as xf:
37 with xf.element('test'):
38 with xf.element('toast'):
39 with xf.element('taste'):
40 xf.write('conTent')
41 self.assertXml('<test><toast><taste>conTent</taste></toast></test>')
42
44 with etree.xmlfile(self._file) as xf:
45 with xf.element('test'):
46 xf.write('con')
47 with xf.element('toast'):
48 xf.write('tent')
49 with xf.element('taste'):
50 xf.write('inside')
51 xf.write('tnet')
52 xf.write('noc')
53 self.assertXml('<test>con<toast>tent<taste>inside</taste>'
54 'tnet</toast>noc</test>')
55
60
72
74 with etree.xmlfile(self._file) as xf:
75 with xf.element('{nsURI}test', nsmap={'x': 'nsURI'}):
76 pass
77 self.assertXml('<x:test xmlns:x="nsURI"></x:test>')
78
80 with etree.xmlfile(self._file) as xf:
81 with xf.element('test', nsmap={'x': 'nsURI'}):
82 with xf.element('{nsURI}toast'):
83 pass
84 self.assertXml('<test xmlns:x="nsURI"><x:toast></x:toast></test>')
85
87 with etree.xmlfile(self._file) as xf:
88 with xf.element('{nsURI}test'):
89 pass
90 self.assertXml('<ns0:test xmlns:ns0="nsURI"></ns0:test>')
91
93 with etree.xmlfile(self._file) as xf:
94 with xf.element('test'):
95 with xf.element('{nsURI}toast'):
96 pass
97 self.assertXml('<test><ns0:toast xmlns:ns0="nsURI"></ns0:toast></test>')
98
100 with etree.xmlfile(self._file) as xf:
101 with xf.element('{nsURI}test', nsmap={None: 'nsURI'}):
102 pass
103 self.assertXml('<test xmlns="nsURI"></test>')
104
106 with etree.xmlfile(self._file) as xf:
107 with xf.element('{nsURI}test', nsmap={None: 'nsURI'}):
108 with xf.element('{nsURI}toast'):
109 pass
110 self.assertXml('<test xmlns="nsURI"><toast></toast></test>')
111
118
125
131
133 with etree.xmlfile(self._file) as xf:
134 with xf.element('test'):
135 xf.write('Comments: <!-- text -->\n')
136 xf.write('Entities: &')
137 self.assertXml(
138 '<test>Comments: <!-- text -->\nEntities: &amp;</test>')
139
145
147 with etree.xmlfile(self._file, buffered=False) as xf:
148 with xf.element('test'):
149 self.assertXml("<test>")
150 xf.write('toast')
151 self.assertXml("<test>toast")
152 with xf.element('taste'):
153 self.assertXml("<test>toast<taste>")
154 xf.write('some', etree.Element("more"), "toast")
155 self.assertXml("<test>toast<taste>some<more/>toast")
156 self.assertXml("<test>toast<taste>some<more/>toast</taste>")
157 xf.write('end')
158 self.assertXml("<test>toast<taste>some<more/>toast</taste>end")
159 self.assertXml("<test>toast<taste>some<more/>toast</taste>end</test>")
160 self.assertXml("<test>toast<taste>some<more/>toast</taste>end</test>")
161
175
177 try:
178 with etree.xmlfile(self._file) as xf:
179 xf.write('toast')
180 except etree.LxmlSyntaxError:
181 self.assertTrue(True)
182 else:
183 self.assertTrue(False)
184
186 with etree.xmlfile(self._file) as xf:
187 with xf.element('test'):
188 pass
189 try:
190 xf.write('toast')
191 except etree.LxmlSyntaxError:
192 self.assertTrue(True)
193 else:
194 self.assertTrue(False)
195
206
208 cm_exit = None
209 try:
210 with etree.xmlfile(self._file) as xf:
211 x = xf.element('test')
212 cm_exit = x.__exit__
213 x.__enter__()
214 raise ValueError('123')
215 except ValueError:
216 self.assertTrue(cm_exit)
217 try:
218 cm_exit(ValueError, ValueError("huhu"), None)
219 except etree.LxmlSyntaxError:
220 self.assertTrue(True)
221 else:
222 self.assertTrue(False)
223 else:
224 self.assertTrue(False)
225
227 pos = self._file.tell()
228 self._file.seek(0)
229 try:
230 return self._file.read()
231 finally:
232 self._file.seek(pos)
233
241
245
246 - def assertXml(self, expected, encoding='utf8'):
248
252 self._file = BytesIO()
253
255 with etree.xmlfile(self._file, close=True) as xf:
256 with xf.element('test'):
257 pass
258 self.assertRaises(ValueError, self._file.getvalue)
259
263 self._file = tempfile.TemporaryFile()
264
268 self._tmpfile = tempfile.NamedTemporaryFile()
269 self._file = self._tmpfile.name
270
272 try:
273 self._tmpfile.close()
274 finally:
275 if os.path.exists(self._tmpfile.name):
276 os.unlink(self._tmpfile.name)
277
279 self._tmpfile.seek(0)
280 return self._tmpfile.read()
281
283 self._tmpfile.seek(0)
284 return etree.parse(self._tmpfile)
285
286 @skipIf(True, "temp file behaviour is too platform specific here")
289
290 @skipIf(True, "temp file behaviour is too platform specific here")
293
303
305 assert not self.closed
306 self.closed = True
307 self._target.close()
308
312
314 return self._target.getvalue()
315
317 pos = self._file.tell()
318 self._target.seek(0)
319 try:
320 return etree.parse(self._target)
321 finally:
322 self._target.seek(pos)
323
329
336
346
347 if __name__ == '__main__':
348 print('to test use test.py %s' % __file__)
349