Coverage for gws-app/gws/lib/xmlx/_test/parser_test.py: 100%

0 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-17 01:37 +0200

1# @TODO fix me 

2# """Tests for the parser module""" 

3 

4# import gws 

5# import gws.test.util as u 

6 

7# import gws.lib.xmlx as xmlx 

8 

9# xmlstr = ''' 

10# <Root 

11# xmlns:gml="http://www.opengis.net/gml/3.0" 

12# > 

13# <a xmlns:foo="http://www.opengis.net/cat/csw"> 

14# <gml:a test="gml1"/> 

15# <a Test="just"/> 

16# <A TEST="CASESENSITIVE"/> 

17# <foo:A TEST="gml2"/> 

18# </a> 

19# </Root> 

20 

21# ''' 

22 

23 

24# def test_from_path(): 

25# with open('/tmp/myfile.xml', 'w') as f: 

26# f.write(xmlstr) 

27# f.close() 

28# test = xmlx.parser.from_path('/tmp/myfile.xml') 

29# assert test.to_string(with_namespace_declarations=True) == '''<Root xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:gml="http://www.opengis.net/gml/3.2"> 

30# <a> 

31# <gml:a test="gml1"/> 

32# <a Test="just"/> 

33# <A TEST="CASESENSITIVE"/> 

34# <csw:A TEST="gml2"/> 

35# </a> 

36# </Root>''' 

37 

38 

39# def test_from_path_case(): 

40# with open('/tmp/myfile.xml', 'w') as f: 

41# f.write(xmlstr) 

42# f.close() 

43# test = xmlx.parser.from_path('/tmp/myfile.xml', case_insensitive=True) 

44# assert test.to_string() == '''<root> 

45# <a> 

46# <gml:a test="gml1"/> 

47# <a test="just"/> 

48# <a test="CASESENSITIVE"/> 

49# <csw:a test="gml2"/> 

50# </a> 

51# </root>''' 

52 

53 

54# def test_from_path_compact(): 

55# with open('/tmp/myfile.xml', 'w') as f: 

56# f.write(xmlstr) 

57# f.close() 

58# test = xmlx.parser.from_path('/tmp/myfile.xml', compact_whitespace=True) 

59# assert test.to_string() == '<Root><a><gml:a test="gml1"/><a Test="just"/><A TEST="CASESENSITIVE"/><csw:A TEST="gml2"/></a></Root>' 

60 

61 

62# # no clue what it does 

63# def test_from_path_normalize(): 

64# with open('/tmp/myfile.xml', 'w') as f: 

65# f.write(xmlstr) 

66# f.close() 

67# test = xmlx.parser.from_path('/tmp/myfile.xml', normalize_namespaces=True) 

68# assert test.to_string(with_namespace_declarations=True) == '''<Root xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:gml="http://www.opengis.net/gml/3.2"> 

69# <a> 

70# <gml:a test="gml1"/> 

71# <a Test="just"/> 

72# <A TEST="CASESENSITIVE"/> 

73# <csw:A TEST="gml2"/> 

74# </a> 

75# </Root>''' 

76 

77 

78# def test_from_path_remove(): 

79# with open('/tmp/myfile.xml', 'w') as f: 

80# f.write(xmlstr) 

81# f.close() 

82# test = xmlx.parser.from_path('/tmp/myfile.xml', remove_namespaces=True) 

83# assert test.to_string(with_namespace_declarations=True) == '''<Root> 

84# <a> 

85# <a test="gml1"/> 

86# <a Test="just"/> 

87# <A TEST="CASESENSITIVE"/> 

88# <A TEST="gml2"/> 

89# </a> 

90# </Root>''' 

91 

92 

93# def test_from_string(): 

94# test = xmlx.parser.from_string(xmlstr) 

95# assert test.to_string(with_namespace_declarations=True) == '''<Root xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:gml="http://www.opengis.net/gml/3.2"> 

96# <a> 

97# <gml:a test="gml1"/> 

98# <a Test="just"/> 

99# <A TEST="CASESENSITIVE"/> 

100# <csw:A TEST="gml2"/> 

101# </a> 

102# </Root>''' 

103 

104 

105# def test_from_string_case(): 

106# test = xmlx.parser.from_string(xmlstr, case_insensitive=True) 

107# assert test.to_string() == '''<root> 

108# <a> 

109# <gml:a test="gml1"/> 

110# <a test="just"/> 

111# <a test="CASESENSITIVE"/> 

112# <csw:a test="gml2"/> 

113# </a> 

114# </root>''' 

115 

116 

117# def test_from_string_compact(): 

118# test = xmlx.parser.from_string(xmlstr, compact_whitespace=True) 

119# assert test.to_string() == '<Root><a><gml:a test="gml1"/><a Test="just"/><A TEST="CASESENSITIVE"/><csw:A TEST="gml2"/></a></Root>' 

120 

121 

122# def test_from_string_remove(): 

123# test = xmlx.parser.from_string(xmlstr, remove_namespaces=True) 

124# assert test.to_string() == '''<Root> 

125# <a> 

126# <a test="gml1"/> 

127# <a Test="just"/> 

128# <A TEST="CASESENSITIVE"/> 

129# <A TEST="gml2"/> 

130# </a> 

131# </Root>''' 

132 

133 

134 

135# def test_from_string_normalize(): 

136# test = xmlx.parser.from_string(xmlstr, normalize_namespaces=True) 

137# assert test.to_string(with_namespace_declarations=True) == '''<Root xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:gml="http://www.opengis.net/gml/3.2"> 

138# <a> 

139# <gml:a test="gml1"/> 

140# <a Test="just"/> 

141# <A TEST="CASESENSITIVE"/> 

142# <csw:A TEST="gml2"/> 

143# </a> 

144# </Root>''' 

145 

146 

147# # encoded in iso-8859-1 and declared utf-8 but declaration still shows utf-8 

148# def test_from_string_decode_1(): 

149# xml_decode = '<?xml version="1.0" encoding="UTF-8"?>\n' + xmlstr 

150# test = xmlx.parser.from_string(xml_decode) 

151# assert test.to_string(with_xml_declaration=True, with_namespace_declarations=True) == ('''<?xml version="1.0" encoding="UTF-8"?><Root xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:gml="http://www.opengis.net/gml/3.2"> 

152# <a> 

153# <gml:a test="gml1"/> 

154# <a Test="just"/> 

155# <A TEST="CASESENSITIVE"/> 

156# <csw:A TEST="gml2"/> 

157# </a> 

158# </Root>''') 

159 

160 

161# # encoded in utf-8 and declared as iso-8859-1 encoding but shows utf-8 encoding 

162# def test_from_string_decode_2(): 

163# xml_decode = '<?xml version="1.0" encoding="iso-8859-1"?>\n' + xmlstr 

164# test = xmlx.parser.from_string(xml_decode) 

165# assert test.to_string(with_xml_declaration=True, with_namespace_declarations=True) == ('''<?xml version="1.0" encoding="UTF-8"?><Root xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:gml="http://www.opengis.net/gml/3.2"> 

166# <a> 

167# <gml:a test="gml1"/> 

168# <a Test="just"/> 

169# <A TEST="CASESENSITIVE"/> 

170# <csw:A TEST="gml2"/> 

171# </a> 

172# </Root>''') 

173 

174 

175# def test_from_bytes(): 

176# test = xmlx.parser.from_string(xmlstr.encode('utf-8')) 

177# assert test.to_string(with_namespace_declarations=True) == '''<Root xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:gml="http://www.opengis.net/gml/3.2"> 

178# <a> 

179# <gml:a test="gml1"/> 

180# <a Test="just"/> 

181# <A TEST="CASESENSITIVE"/> 

182# <csw:A TEST="gml2"/> 

183# </a> 

184# </Root>''' 

185 

186 

187# def test_from_bytes_case(): 

188# test = xmlx.parser.from_string(xmlstr.encode('utf-8'), case_insensitive=True) 

189# assert test.to_string() == '''<root> 

190# <a> 

191# <gml:a test="gml1"/> 

192# <a test="just"/> 

193# <a test="CASESENSITIVE"/> 

194# <csw:a test="gml2"/> 

195# </a> 

196# </root>''' 

197 

198 

199# def test_from_bytes_compact(): 

200# test = xmlx.parser.from_string(xmlstr.encode('utf-8'), compact_whitespace=True) 

201# assert test.to_string() == '<Root><a><gml:a test="gml1"/><a Test="just"/><A TEST="CASESENSITIVE"/><csw:A TEST="gml2"/></a></Root>' 

202 

203 

204# def test_from_bytes_remove(): 

205# test = xmlx.parser.from_string(xmlstr.encode('utf-8'), remove_namespaces=True) 

206# assert test.to_string() == '''<Root> 

207# <a> 

208# <a test="gml1"/> 

209# <a Test="just"/> 

210# <A TEST="CASESENSITIVE"/> 

211# <A TEST="gml2"/> 

212# </a> 

213# </Root>''' 

214 

215 

216 

217# def test_from_bytes_normalize(): 

218# test = xmlx.parser.from_string(xmlstr.encode('utf-8'), normalize_namespaces=True) 

219# assert test.to_string(with_namespace_declarations=True) == '''<Root xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:gml="http://www.opengis.net/gml/3.2"> 

220# <a> 

221# <gml:a test="gml1"/> 

222# <a Test="just"/> 

223# <A TEST="CASESENSITIVE"/> 

224# <csw:A TEST="gml2"/> 

225# </a> 

226# </Root>''' 

227 

228 

229# # encoded in iso-8859-1 and declared utf-8 but declaration still shows utf-8 

230# def test_from_bytes_decode_1(): 

231# xml_decode = '<?xml version="1.0" encoding="UTF-8"?>\n' + xmlstr 

232# test = xmlx.parser.from_string(xml_decode.encode('iso-8859-1')) 

233# assert test.to_string(with_xml_declaration=True, with_namespace_declarations=True) == ('''<?xml version="1.0" encoding="UTF-8"?><Root xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:gml="http://www.opengis.net/gml/3.2"> 

234# <a> 

235# <gml:a test="gml1"/> 

236# <a Test="just"/> 

237# <A TEST="CASESENSITIVE"/> 

238# <csw:A TEST="gml2"/> 

239# </a> 

240# </Root>''') 

241 

242 

243# # encoded in utf-8 and declared as iso-8859-1 encoding but shows utf-8 encoding 

244# def test_from_bytes_decode_2(): 

245# xml_decode = '<?xml version="1.0" encoding="iso-8859-1"?>\n' + xmlstr 

246# test = xmlx.parser.from_string(xml_decode.encode('UTF-8')) 

247# assert test.to_string(with_xml_declaration=True, with_namespace_declarations=True) == ('''<?xml version="1.0" encoding="UTF-8"?><Root xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" xmlns:gml="http://www.opengis.net/gml/3.2"> 

248# <a> 

249# <gml:a test="gml1"/> 

250# <a Test="just"/> 

251# <A TEST="CASESENSITIVE"/> 

252# <csw:A TEST="gml2"/> 

253# </a> 

254# </Root>''') 

255 

256 

257# def test_parser_convert_name(): 

258# p = xmlx.parser._ParserTarget(case_insensitive=False, 

259# compact_whitespace=False, 

260# normalize_namespaces=False, 

261# remove_namespaces=False) 

262# assert p.convert_name('foo') == 'foo' 

263# p.remove_namespaces = True 

264# assert p.convert_name('{http://www.opengis.net/cat/csw}foo') == 'foo' 

265# assert p.convert_name('gml:foo') == 'foo' 

266# p.remove_namespaces = False 

267# p.normalize_namespaces = True 

268# assert p.convert_name('{http://www.opengis.net/gml/999}foo') == '{http://www.opengis.net/gml}foo' 

269# assert p.convert_name('gml:foo') == '{}foo' 

270# p.normalize_namespaces = False 

271# assert p.convert_name('{http://www.opengis.net/cat/csw}foo') == '{http://www.opengis.net/cat/csw}foo' 

272# assert p.convert_name('gml:foo') == '{}foo' 

273 

274 

275# def test_parser_make(): 

276# p = xmlx.parser._ParserTarget(case_insensitive=False, 

277# compact_whitespace=False, 

278# normalize_namespaces=False, 

279# remove_namespaces=False) 

280# t = 'tag' 

281# a = {'attribute': 'foo'} 

282# assert p.make(t, a).to_string() == '<tag attribute="foo"/>' 

283 

284 

285# def test_parser_make_noattr(): 

286# p = xmlx.parser._ParserTarget(case_insensitive=False, 

287# compact_whitespace=False, 

288# normalize_namespaces=False, 

289# remove_namespaces=False) 

290# t = 'tag' 

291# a = {} 

292# assert p.make(t, a).to_string() == '<tag/>' 

293 

294 

295# def test_parser_flush(): 

296# p = xmlx.parser._ParserTarget(case_insensitive=False, 

297# compact_whitespace=False, 

298# normalize_namespaces=False, 

299# remove_namespaces=False) 

300# p.buf = ['a'] 

301# p.stack = [xmlx.parser.from_string('<Root><a test="attr"/></Root>')] 

302# p.flush() 

303# assert p.buf == [] 

304# assert p.stack[-1].text == '' 

305 

306 

307# def test_parser_start(): 

308# p = xmlx.parser._ParserTarget(case_insensitive=False, 

309# compact_whitespace=False, 

310# normalize_namespaces=False, 

311# remove_namespaces=False) 

312# p.start('root', {}) 

313# p.start('child', {'test': 'a'}) 

314# assert p.stack[0].to_string() == '<root><child test="a"/></root>' 

315# assert p.stack[1].to_string() == '<child test="a"/>' 

316 

317 

318# def test_parser_end(): 

319# p = xmlx.parser._ParserTarget(case_insensitive=False, 

320# compact_whitespace=False, 

321# normalize_namespaces=False, 

322# remove_namespaces=False) 

323# p.start('root', {}) 

324# p.start('child', {'test':'a'}) 

325# p.data('foo') 

326# p.data(' bar') 

327# p.end('child') 

328# assert p.buf == [] 

329# assert len(p.stack) == 1 

330# assert p.stack[0].to_string() == '<root><child test="a">foo bar</child></root>' 

331 

332 

333# def test_parser_data(): 

334# p = xmlx.parser._ParserTarget(case_insensitive=False, 

335# compact_whitespace=False, 

336# normalize_namespaces=False, 

337# remove_namespaces=False) 

338# p.data('d1') 

339# p.data('d2') 

340# p.data('d3') 

341# assert p.buf == ['d1', 'd2', 'd3'] 

342 

343 

344# def test_parser_close(): 

345# p = xmlx.parser._ParserTarget(case_insensitive=False, 

346# compact_whitespace=False, 

347# normalize_namespaces=False, 

348# remove_namespaces=False) 

349# p.root = 'test' 

350# assert p.close() == 'test'