/[thuban]/branches/WIP-pyshapelib-bramz/test/test_load.py
ViewVC logotype

Annotation of /branches/WIP-pyshapelib-bramz/test/test_load.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1687 - (hide annotations)
Fri Aug 29 10:02:16 2003 UTC (21 years, 6 months ago) by bh
Original Path: trunk/thuban/test/test_load.py
File MIME type: text/x-python
File size: 27647 byte(s)
Add some missing parameters to projections. Proj complains about
them on windows but for some reason not on Linux.

* test/test_save.py (SaveSessionTest.testLayerProjection): Add
missing required projection parameters

* test/test_proj.py (TestProjFile.test): Add missing required
projection parameters

* test/test_load_0_8.py (TestLayerProjection.file_contents)
(TestLayerProjection.test): Add missing required projection
parameters and tests for them

* test/test_load.py (TestLayerProjection.file_contents)
(TestLayerProjection.test): Add missing required projection
parameters and tests for them

* test/test_layer.py (TestLayer.test_base_layer): Add missing
required projection parameters

1 bh 765 # Copyright (c) 2002, 2003 by Intevation GmbH
2 bh 292 # Authors:
3     # Bernhard Herzog <[email protected]>
4     #
5     # This program is free software under the GPL (>=v2)
6     # Read the file COPYING coming with Thuban for details.
7    
8     """
9     Test loading a thuban session from a file
10 bh 1247
11     The tests in this file (test_load.py) are always be the tests for the
12     current version of the thuban file format. Tests for older versions can
13     be found in the version specific test modules, e.g. test_load_0_2 for
14     files created by Thuban 0.2.
15    
16     Maintenance of the test cases:
17    
18     When during a development period the file format is changed with respect
19     to the last released version for the first, the tests here should be
20 bh 1257 copied to the version specific test file. The round-trip tests which
21     save the session again and compare the XML files should not be copied
22     over as they only make sense here to make sure th that the files checked
23     here are actually ones that may have been written by the current thuban
24     version.
25 bh 292 """
26    
27     __version__ = "$Revision$"
28     # $Source$
29     # $Id$
30    
31     import os
32     import unittest
33    
34     import support
35     support.initthuban()
36    
37 bh 1646 import postgissupport
38 bh 1257 from xmlsupport import sax_eventlist
39 bh 1268
40     import dbflib
41    
42 bh 1257 from Thuban.Model.save import save_session
43 bh 1646 from Thuban.Model.load import load_session, parse_color, LoadError, \
44     LoadCancelled
45 jonathan 1350 from Thuban.Model.color import Transparent
46 jonathan 684 from Thuban.Model.classification import ClassGroupProperties, ClassGroupRange,\
47     ClassGroupSingleton, ClassGroupDefault
48 bh 1646 from Thuban.Model.postgisdb import ConnectionError
49 jonathan 684
50 bh 292 def filenames_equal(name1, name2):
51     """Return true if the filenames name1 and name2 are equal.
52    
53     On systems where it is available, simply use os.path.samefile,
54     otherwise return whether the normalized versions of the filenames
55     according to os.path.normpath are equal.
56     """
57     if hasattr(os.path, "samefile"):
58     return os.path.samefile(name1, name2)
59     return os.path.normpath(name1) == os.path.normpath(name2)
60    
61    
62 bh 957
63     class LoadSessionTest(support.FileLoadTestCase):
64    
65     """Base class for .thuban file loading tests
66    
67     Basically the same as the FileLoadTestCase, except that all tests
68     use the '.thuban' extension by default and that setUp and tearDown
69     handle sessions.
70     """
71    
72     file_extension = ".thuban"
73    
74     def setUp(self):
75     """Create the test files"""
76     support.FileLoadTestCase.setUp(self)
77     self.session = None
78    
79     def tearDown(self):
80     if self.session is not None:
81     self.session.Destroy()
82     self.session = None
83    
84 bh 1268
85 bh 1664 dtd = "http://thuban.intevation.org/dtds/thuban-0.9.dtd"
86 bh 1268 thubanids = [((dtd, n), (None, "id")) for n in
87     ["fileshapesource", "filetable", "jointable",
88     "derivedshapesource"]]
89     thubanidrefs = [((dtd, n), (None, m)) for n, m in
90     [("layer", "shapestore"),
91     ("jointable", "left"),
92     ("jointable", "right"),
93     ("derivedshapesource", "table"),
94     ("derivedshapesource", "shapesource")]]
95 bh 1683 filenames = [((dtd, n), (None, m)) for n, m in
96     [("fileshapesource", "filename"),
97     ("rasterlayer", "filename"),
98     ("filetable", "filename")]]
99 bh 1268 del n, m, dtd
100    
101 bh 1257 def check_format(self):
102     """Check whether the file we loaded from matches the one that
103     would be written. Call this from each test case after loading
104     the session
105     """
106     filename = self.temp_file_name(self.id() + ".roundtrip.thuban")
107     save_session(self.session, filename)
108 bh 1268 el1 = sax_eventlist(filename = filename, ids = self.thubanids,
109 bh 1683 idrefs = self.thubanidrefs,
110     filenames = self.filenames)
111 bh 1268 el2 = sax_eventlist(filename = self.filename(), ids = self.thubanids,
112 bh 1683 idrefs = self.thubanidrefs,
113     filenames = self.filenames)
114 bh 1268 if 0:
115     for a, b in zip(el1, el2):
116     print a != b and "***************" or ""
117     print a
118     print b
119     self.assertEquals(el1, el2,
120     "loaded file not equivalent to the saved file")
121 bh 957
122 bh 1257
123 bh 957 class ClassificationTest(LoadSessionTest):
124    
125     """
126     Base class for tests that do some detailed checking of classifications
127     """
128    
129     def TestLayers(self, layers, expected):
130     TITLE = 0
131     NUM_GROUPS = 1
132     CLASSES = 2
133     GROUP_TYPE = 0
134     GROUP_DATA = 1
135     GROUP_LABEL = 2
136     GROUP_PROPS = 3
137    
138     eq = self.assertEquals
139    
140     eq(len(layers), len(expected))
141    
142     for layer, data in zip(layers, expected):
143     eq(layer.Title(), data[TITLE])
144    
145     clazz = layer.GetClassification()
146     eq(clazz.GetNumGroups(), data[NUM_GROUPS])
147     eq(clazz.GetNumGroups() + 1, len(data[CLASSES]))
148    
149     i = 0
150     for group in clazz:
151     props = ClassGroupProperties()
152     props.SetLineColor(
153     parse_color(data[CLASSES][i][GROUP_PROPS][0]))
154     props.SetLineWidth(data[CLASSES][i][GROUP_PROPS][1])
155     props.SetFill(
156     parse_color(data[CLASSES][i][GROUP_PROPS][2]))
157    
158     if data[CLASSES][i][GROUP_TYPE] == "default":
159     g = ClassGroupDefault(props, data[CLASSES][i][GROUP_LABEL])
160     elif data[CLASSES][i][GROUP_TYPE] == "range":
161 jonathan 1357 g = ClassGroupRange((data[CLASSES][i][GROUP_DATA][0],
162     data[CLASSES][i][GROUP_DATA][1]),
163 bh 957 props, data[CLASSES][i][GROUP_LABEL])
164     elif data[CLASSES][i][GROUP_TYPE] == "single":
165     g = ClassGroupSingleton(data[CLASSES][i][GROUP_DATA],
166     props, data[CLASSES][i][GROUP_LABEL])
167    
168     eq(group, g)
169    
170     i += 1
171    
172    
173    
174     class TestSingleLayer(LoadSessionTest):
175    
176     file_contents = '''\
177 bh 292 <?xml version="1.0" encoding="UTF-8"?>
178 bh 1375 <!DOCTYPE session SYSTEM "thuban-0.9.dtd">
179 bh 1664 <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"
180 bh 1268 title="single map&amp;layer">
181     <fileshapesource filetype="shapefile" id="D1"
182     filename="../../Data/iceland/political.shp"/>
183     <map title="Test Map">
184     <projection name="Unknown">
185     <parameter value="zone=26"/>
186     <parameter value="proj=utm"/>
187     <parameter value="ellps=clrk66"/>
188     </projection>
189     <layer shapestore="D1" visible="true"
190     stroke="#000000" title="My Layer" stroke_width="1"
191     fill="None"/>
192     </map>
193 bh 292 </session>
194     '''
195    
196 bh 957 def test(self):
197     """Load a session with a single map with a single layer"""
198     eq = self.assertEquals
199     session = load_session(self.filename())
200     self.session = session
201    
202     # Check the title
203     eq(session.Title(), "single map&layer")
204    
205     # the session has one map.
206     maps = session.Maps()
207     eq(len(maps), 1)
208    
209     # Check the map's attributes
210     map = maps[0]
211     eq(map.Title(), "Test Map")
212    
213     # the map has a single layer
214     layers = map.Layers()
215     eq(len(layers), 1)
216    
217     # Check the layer attributes
218     layer = layers[0]
219     eq(layer.Title(), "My Layer")
220 bh 1219 self.failUnless(filenames_equal(layer.ShapeStore().FileName(),
221 bh 957 os.path.join(self.temp_dir(),
222     os.pardir, os.pardir,
223     "Data", "iceland",
224     "political.shp")))
225 jonathan 1347 eq(layer.GetClassification().GetDefaultFill(), Transparent)
226 bh 957 eq(layer.GetClassification().GetDefaultLineColor().hex(), "#000000")
227     eq(layer.Visible(), True)
228    
229 bh 1257 self.check_format()
230    
231 bh 957 self.session.Destroy()
232     self.session = None
233    
234    
235     class TestLayerVisibility(LoadSessionTest):
236    
237     file_contents = '''\
238 jonathan 690 <?xml version="1.0" encoding="UTF-8"?>
239 bh 1375 <!DOCTYPE session SYSTEM "thuban-0.9.dtd">
240 bh 1664 <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"
241 bh 1268 title="single map&amp;layer">
242     <fileshapesource filetype="shapefile" id="D1"
243     filename="../../Data/iceland/political.shp"/>
244     <map title="Test Map">
245     <projection name="Unknown">
246     <parameter value="zone=26"/>
247     <parameter value="proj=utm"/>
248     <parameter value="ellps=clrk66"/>
249     </projection>
250     <layer shapestore="D1" visible="false" stroke="#000000"
251     title="My Layer" stroke_width="1" fill="None"/>
252 bh 957 </map>
253     </session>
254     '''
255    
256     def test(self):
257     """Test that the visible flag is correctly loaded for a layer."""
258     eq = self.assertEquals
259     session = load_session(self.filename())
260     self.session = session
261     maps = session.Maps()
262     eq(len(maps), 1)
263     map = maps[0]
264     layers = map.Layers()
265     eq(len(layers), 1)
266     layer = layers[0]
267    
268     eq(layer.Visible(), False)
269    
270 bh 1257 self.check_format()
271 bh 957
272    
273     class TestClassification(ClassificationTest):
274    
275     file_contents = '''\
276     <?xml version="1.0" encoding="UTF-8"?>
277     <!DOCTYPE session SYSTEM "thuban.dtd">
278     <session title="single map&amp;layer">
279     <map title="Test Map">
280     <projection>
281     <parameter value="zone=26"/>
282     <parameter value="proj=utm"/>
283     <parameter value="ellps=clrk66"/>
284     </projection>
285     <layer title="My Layer" stroke_width="1" fill="None"
286     filename="../../Data/iceland/political.shp"
287 jonathan 690 stroke="#000000">
288     <classification field="POPYREG" field_type="string">
289     <clnull>
290     <cldata stroke="#000000" stroke_width="1" fill="None"/>
291     </clnull>
292     <clpoint value="1">
293     <cldata stroke="#000000" stroke_width="2" fill="None"/>
294     </clpoint>
295     <clpoint value="1">
296     <cldata stroke="#000000" stroke_width="10" fill="None"/>
297     </clpoint>
298 bh 1417 <clpoint value="\xc3\xa4\xc3\xb6\xc3\xbc"
299     label="\xc3\x9cml\xc3\xa4uts">
300     <cldata fill="None" stroke="#000000" stroke_width="1"/>
301     </clpoint>
302 jonathan 690 </classification>
303     </layer>
304     <layer title="My Layer 2" stroke_width="1" fill="None"
305     filename="../../Data/iceland/political.shp"
306     stroke="#000000">
307     <classification field="AREA" field_type="double">
308     <clnull>
309     <cldata stroke="#000000" stroke_width="2" fill="None"/>
310     </clnull>
311     <clrange min="0" max="1">
312 jonathan 692 <cldata stroke="#111111" stroke_width="1" fill="None"/>
313 jonathan 690 </clrange>
314     <clpoint value=".5">
315 jonathan 692 <cldata stroke="#000000" stroke_width="1" fill="#111111"/>
316 jonathan 690 </clpoint>
317     <clrange min="-1" max="0">
318     <cldata stroke="#000000" stroke_width="1" fill="None"/>
319     </clrange>
320     <clpoint value="-.5">
321     <cldata stroke="#000000" stroke_width="1" fill="None"/>
322     </clpoint>
323     </classification>
324     </layer>
325     </map>
326     </session>
327     '''
328 bh 292
329 bh 957 def test(self):
330 bh 1247 """Load a Thuban session with a map and classified layers."""
331 bh 957 session = load_session(self.filename())
332     self.session = session
333    
334     map = self.session.Maps()[0] # only one map in the sample
335    
336 bh 1417 expected = [("My Layer", 3,
337 bh 957 [("default", (), "",
338     ("#000000", 1, "None")),
339     ("single", "1", "",
340     ("#000000", 2, "None")),
341     ("single", "1", "",
342 bh 1417 ("#000000", 10, "None")),
343     ("single", "\xe4\xf6\xfc", "\xdcml\xe4uts",
344     ("#000000", 1, "None"))]),
345 bh 957 ("My Layer 2", 4,
346     [("default", (), "",
347     ("#000000", 2, "None")),
348     ("range", (0, 1), "",
349     ("#111111", 1, "None")),
350     ("single", .5, "",
351     ("#000000", 1, "#111111")),
352     ("range", (-1, 0), "",
353     ("#000000", 1, "None")),
354     ("single", -.5, "",
355     ("#000000", 1, "None"))])]
356    
357     self.TestLayers(map.Layers(), expected)
358    
359    
360     class TestLabels(ClassificationTest):
361    
362     file_contents = '''\
363 jonathan 690 <?xml version="1.0" encoding="UTF-8"?>
364 bh 1375 <!DOCTYPE session SYSTEM "thuban-0.9.dtd">
365 bh 1664 <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"
366 bh 1268 title="single map&amp;layer">
367     <fileshapesource filetype="shapefile" id="D1"
368     filename="../../Data/iceland/political.shp"/>
369     <map title="Test Map">
370     <projection name="Unknown">
371     <parameter value="zone=26"/>
372     <parameter value="proj=utm"/>
373     <parameter value="ellps=clrk66"/>
374     </projection>
375     <layer shapestore="D1" visible="true" stroke="#000000"
376     title="My Layer" stroke_width="1" fill="None">
377 jonathan 690 <classification field="POPYREG" field_type="string">
378     <clnull label="hallo">
379     <cldata stroke="#000000" stroke_width="1" fill="None"/>
380     </clnull>
381     <clpoint label="welt" value="1">
382     <cldata stroke="#000000" stroke_width="2" fill="None"/>
383     </clpoint>
384     </classification>
385     </layer>
386     </map>
387     </session>
388     '''
389    
390 bh 957 def test(self):
391     """Load a session and test for reading the group labels."""
392     eq = self.assertEquals
393     session = load_session(self.filename())
394     self.session = session
395    
396     map = self.session.Maps()[0] # only one map in the sample
397    
398     expected = [("My Layer", 1,
399     [("default", (), "hallo",
400     ("#000000", 1, "None")),
401     ("single", "1", "welt",
402     ("#000000", 2, "None"))])]
403    
404     self.TestLayers(map.Layers(), expected)
405 bh 1257 self.check_format()
406 bh 957
407    
408     class TestLayerProjection(LoadSessionTest):
409    
410     file_contents = '''\
411 jonathan 746 <?xml version="1.0" encoding="UTF-8"?>
412 bh 1375 <!DOCTYPE session SYSTEM "thuban-0.9.dtd">
413 bh 1664 <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"
414 bh 1268 title="single map&amp;layer">
415     <fileshapesource filetype="shapefile" id="D2"
416     filename="../../Data/iceland/roads-line.shp"/>
417     <fileshapesource filetype="shapefile" id="D4"
418     filename="../../Data/iceland/political.shp"/>
419     <map title="Test Map">
420     <projection name="Unknown">
421     <parameter value="zone=26"/>
422     <parameter value="proj=utm"/>
423     <parameter value="ellps=clrk66"/>
424     </projection>
425     <layer shapestore="D4" visible="true" stroke="#000000"
426     title="My Layer" stroke_width="1" fill="None">
427     <projection name="hello">
428     <parameter value="zone=13"/>
429     <parameter value="proj=tmerc"/>
430     <parameter value="ellps=clrk66"/>
431     </projection>
432 jonathan 746 <classification field="POPYREG" field_type="string">
433     <clnull label="hallo">
434     <cldata stroke="#000000" stroke_width="1" fill="None"/>
435     </clnull>
436     <clpoint label="welt" value="1">
437     <cldata stroke="#000000" stroke_width="2" fill="None"/>
438     </clpoint>
439     </classification>
440     </layer>
441 bh 1268 <layer shapestore="D2" visible="true" stroke="#000000"
442     title="My Layer" stroke_width="1" fill="None">
443     <projection name="Unknown">
444     <parameter value="proj=lcc"/>
445 bh 1687 <parameter value="lat_1=10"/>
446     <parameter value="lat_2=20"/>
447 bh 1268 <parameter value="ellps=clrk66"/>
448     </projection>
449 jonathan 746 </layer>
450     </map>
451     </session>
452     '''
453    
454 bh 957 def test(self):
455     """Test loading layers with projections"""
456 bh 292 eq = self.assertEquals
457 jonathan 746 neq = self.assertNotEqual
458    
459 bh 957 session = load_session(self.filename())
460 jonathan 746 self.session = session
461    
462     map = self.session.Maps()[0] # only one map in the sample
463    
464     layers = map.Layers() # two layers in the sample
465    
466     # test layer with a named projection
467     proj = layers[0].GetProjection()
468     neq(proj, None)
469     eq(proj.GetName(), "hello")
470     eq(proj.GetParameter("proj"), "tmerc")
471     eq(proj.GetParameter("zone"), "13")
472     eq(proj.GetParameter("ellps"), "clrk66")
473    
474     # test layer with an unnamed projection
475     proj = layers[1].GetProjection()
476     neq(proj, None)
477     eq(proj.GetName(), "Unknown")
478     eq(proj.GetParameter("proj"), "lcc")
479 bh 1687 eq(proj.GetParameter("lat_1"), "10")
480     eq(proj.GetParameter("lat_2"), "20")
481 jonathan 746 eq(proj.GetParameter("ellps"), "clrk66")
482    
483 bh 1257 self.check_format()
484 bh 957
485 bh 1257
486 bh 957 class TestRasterLayer(LoadSessionTest):
487    
488     file_contents = '''\
489     <?xml version="1.0" encoding="UTF-8"?>
490 bh 1375 <!DOCTYPE session SYSTEM "thuban-0.9.dtd">
491 bh 1664 <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"
492 bh 1268 title="single map&amp;layer">
493     <map title="Test Map">
494     <rasterlayer visible="false" filename="../../Data/iceland/island.tif"
495     title="My RasterLayer"/>
496 bh 957 </map>
497     </session>
498     '''
499    
500     def test(self):
501 jonathan 947 eq = self.assertEquals
502     neq = self.assertNotEqual
503    
504 bh 957 session = load_session(self.filename())
505 jonathan 947 self.session = session
506    
507     map = self.session.Maps()[0] # only one map in the sample
508    
509     layer = map.Layers()[0] # one layer in the sample
510    
511     eq(layer.Title(), "My RasterLayer")
512     self.failIf(layer.Visible())
513     self.failUnless(filenames_equal(layer.GetImageFilename(),
514     os.path.join(self.temp_dir(),
515     os.pardir, os.pardir,
516     "Data", "iceland",
517     "island.tif")))
518 bh 1257 self.check_format()
519 jonathan 947
520 bh 1268
521     class TestJoinedTable(LoadSessionTest):
522    
523     file_contents = '''<?xml version="1.0" encoding="UTF-8"?>
524 bh 1375 <!DOCTYPE session SYSTEM "thuban-0.9.dtd">
525 bh 1664 <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd" title="A Joined Table session">
526 bh 1282 <fileshapesource filetype="shapefile" id="D137227612"
527     filename="../../Data/iceland/roads-line.shp"/>
528     <filetable filetype="DBF" filename="load_joinedtable.dbf" id="D136171140"
529     title="Some Title"/>
530 bh 1375 <jointable id="D136169900" title="Joined"
531     right="D136171140" left="D137227612"
532     leftcolumn="RDLNTYPE" rightcolumn="RDTYPE"
533     jointype="LEFT OUTER"/>
534 bh 1282 <derivedshapesource table="D136169900" shapesource="D137227612"
535     id="D136170932"/>
536 bh 1268 <map title="Test Map">
537 bh 1282 <layer shapestore="D136170932" visible="true" stroke="#000000"
538     title="My Layer" stroke_width="1" fill="None"/>
539 bh 1268 </map>
540 bh 1282 </session>
541     '''
542 bh 1268
543     def setUp(self):
544     """Extend inherited method to create the dbffile for the join"""
545     LoadSessionTest.setUp(self)
546     dbffile = self.temp_file_name("load_joinedtable.dbf")
547     dbf = dbflib.create(dbffile)
548     dbf.add_field("RDTYPE", dbflib.FTInteger, 10, 0)
549     dbf.add_field("TEXT", dbflib.FTString, 10, 0)
550     dbf.write_record(0, {'RDTYPE': 8, "TEXT": "foo"})
551     dbf.write_record(1, {'RDTYPE': 2, "TEXT": "bar"})
552     dbf.write_record(2, {'RDTYPE': 3, "TEXT": "baz"})
553     dbf.close()
554    
555     def test(self):
556     """Test loading a session containing a joined table"""
557     session = load_session(self.filename())
558     self.session = session
559    
560     tables = session.Tables()
561     self.assertEquals(len(tables), 3)
562     # FIXME: The tests shouldn't assume a certain order of the tables
563     self.assertEquals(tables[0].Title(), "Some Title")
564     self.assertEquals(tables[1].Title(), "Joined")
565 bh 1375 self.assertEquals(tables[1].JoinType(), "LEFT OUTER")
566 bh 1282 self.check_format()
567 bh 1268
568    
569 bh 1646
570     class TestPostGISLayer(LoadSessionTest):
571    
572     file_contents = '''<?xml version="1.0" encoding="UTF-8"?>
573     <!DOCTYPE session SYSTEM "thuban-0.9.dtd">
574 bh 1664 <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"
575 bh 1646 title="unnamed session">
576     <dbconnection port="%(port)s" host="%(host)s" user="%(user)s"
577     dbtype="postgis" id="D142684948" dbname="%(dbname)s"/>
578     <dbshapesource tablename="landmarks" id="D143149420" dbconn="D142684948"/>
579     <map title="unnamed map">
580     <layer shapestore="D143149420" visible="true" stroke="#000000"
581     title="landmarks" stroke_width="1" fill="None"/>
582     </map>
583     </session>
584     '''
585    
586     def setUp(self):
587     """Extend the inherited method to start the postgis server
588    
589     Furthermore, patch the file contents with the real postgis db
590     information
591     """
592     postgissupport.skip_if_no_postgis()
593     self.server = postgissupport.get_test_server()
594     self.postgisdb = self.server.get_default_static_data_db()
595    
596     self.file_contents = self.__class__.file_contents % {
597     "dbname": self.postgisdb.dbname,
598     "user": self.server.user_name,
599     "port": self.server.port,
600     "host": self.server.host}
601     LoadSessionTest.setUp(self)
602    
603     def test(self):
604     """Test loading a session containing a postgis shapestore"""
605     session = load_session(self.filename())
606     self.session = session
607     connections = session.DBConnections()
608     self.assertEquals(len(connections), 1)
609     conn = connections[0]
610     for attr, value in [("host", self.server.host),
611     ("port", str(self.server.port)),
612     ("user", self.server.user_name),
613     ("dbname", self.postgisdb.dbname)]:
614     self.assertEquals(getattr(conn, attr), value)
615     layer = session.Maps()[0].Layers()[0]
616     self.failUnless(layer.ShapeStore().DBConnection() is conn)
617    
618    
619     class TestPostGISLayerPassword(LoadSessionTest):
620    
621     file_contents = '''<?xml version="1.0" encoding="UTF-8"?>
622     <!DOCTYPE session SYSTEM "thuban-0.9.dtd">
623 bh 1664 <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"
624 bh 1646 title="unnamed session">
625     <dbconnection port="%(port)s" host="%(host)s" user="%(user)s"
626     dbtype="postgis" id="D142684948" dbname="%(dbname)s"/>
627     <dbshapesource tablename="landmarks" id="D143149420" dbconn="D142684948"/>
628     <map title="unnamed map">
629     <layer shapestore="D143149420" visible="true" stroke="#000000"
630     title="landmarks" stroke_width="1" fill="None"/>
631     </map>
632     </session>
633     '''
634    
635     def setUp(self):
636     """Extend the inherited method to start the postgis server
637    
638     Furthermore, patch the file contents with the real postgis db
639     information
640     """
641     postgissupport.skip_if_no_postgis()
642     self.server = postgissupport.get_test_server()
643     self.postgisdb = self.server.get_default_static_data_db()
644    
645     self.file_contents = self.__class__.file_contents % {
646     "dbname": self.postgisdb.dbname,
647     "user": self.server.user_name,
648     "port": self.server.port,
649     "host": self.server.host}
650     LoadSessionTest.setUp(self)
651    
652     self.db_connection_callback_called = False
653     self.server.require_authentication(True)
654    
655     def tearDown(self):
656     """Extend the inherited method to switch off postgresql authentication
657     """
658     self.server.require_authentication(False)
659     LoadSessionTest.tearDown(self)
660    
661     def db_connection_callback(self, params, message):
662     """Implementation of Thuban.Model.hooks.query_db_connection_parameters
663     """
664     self.assertEquals(params,
665     {"dbname": self.postgisdb.dbname,
666     "user": self.server.user_name,
667     "port": str(self.server.port),
668     "host": self.server.host})
669     self.db_connection_callback_called = True
670     params = params.copy()
671     params["password"] = self.server.user_password
672     return params
673    
674     def test_with_callback(self):
675     """Test loading a session with postgis, authentication and a callback
676     """
677     session = load_session(self.filename(),
678     db_connection_callback = self.db_connection_callback)
679     self.session = session
680     connections = session.DBConnections()
681     self.assertEquals(len(connections), 1)
682     conn = connections[0]
683     for attr, value in [("host", self.server.host),
684     ("port", str(self.server.port)),
685     ("user", self.server.user_name),
686     ("dbname", self.postgisdb.dbname)]:
687     self.assertEquals(getattr(conn, attr), value)
688     layer = session.Maps()[0].Layers()[0]
689     self.failUnless(layer.ShapeStore().DBConnection() is conn)
690     self.failUnless(self.db_connection_callback_called)
691    
692     def test_without_callback(self):
693     """Test loading a session with postgis, authentication and no callback
694     """
695     # A password is required and there's no callback, so we should
696     # get a ConnectionError
697     self.assertRaises(ConnectionError, load_session, self.filename())
698    
699     def test_cancel(self):
700     """Test loading a session with postgis and cancelling authentication
701     """
702     def cancel(*args):
703     self.db_connection_callback_called = True
704     return None
705    
706     # If the user cancels, i.e. if the callbakc returns None, a
707     # LoadCancelled exception is raised.
708     self.assertRaises(LoadCancelled,
709     load_session, self.filename(), cancel)
710     self.failUnless(self.db_connection_callback_called)
711    
712    
713 bh 1268 class TestLoadError(LoadSessionTest):
714    
715     file_contents = '''\
716     <?xml version="1.0" encoding="UTF-8"?>
717 bh 1375 <!DOCTYPE session SYSTEM "thuban-0.9.dtd">
718 bh 1664 <session xmlns="http://thuban.intevation.org/dtds/thuban-0.9.dtd"
719 bh 1268 title="single map&amp;layer">
720     <fileshapesource id="D1" filename="../../Data/iceland/political.shp"/>
721     <map title="Test Map">
722     <projection name="Unknown">
723     <parameter value="zone=26"/>
724     <parameter value="proj=utm"/>
725     <parameter value="ellps=clrk66"/>
726     </projection>
727     <layer shapestore="D1" visible="true"
728     stroke="#000000" title="My Layer" stroke_width="1"
729     fill="None"/>
730     </map>
731     </session>
732     '''
733    
734     def test(self):
735     """Test loading a session missing a required attribute"""
736     # Don't use assertRaises to make sure that if a session is
737     # actually returned it gets destroyed properly.
738     try:
739     self.session = load_session(self.filename())
740     except LoadError, value:
741 bh 1642 # Check the actual messge in value to make sure the
742     # LoadError really was about the missing attribute
743     self.assertEquals(str(value),
744     "Element "
745 bh 1664 "(u'http://thuban.intevation.org/dtds/thuban-0.9.dtd',"
746 bh 1642 " u'fileshapesource') requires an attribute 'filetype'")
747 bh 1268 else:
748     self.fail("Missing filetype attribute doesn't raise LoadError")
749    
750 bh 292 if __name__ == "__main__":
751 bh 1683 support.run_tests()

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26