Author: cito
Date: Fri Nov 27 07:56:09 2015
New Revision: 643
Log:
Fix and backport some issues in the config tests
Modified:
branches/4.x/module/tests/test_classic_connection.py
trunk/module/tests/test_classic_connection.py
Modified: branches/4.x/module/tests/test_classic_connection.py
==============================================================================
--- branches/4.x/module/tests/test_classic_connection.py Fri Nov 27
07:39:21 2015 (r642)
+++ branches/4.x/module/tests/test_classic_connection.py Fri Nov 27
07:56:09 2015 (r643)
@@ -931,97 +931,280 @@
def testGetDecimalPoint(self):
point = pg.get_decimal_point()
+ # error if a parameter is passed
+ self.assertRaises(TypeError, pg.get_decimal_point, point)
self.assertIsInstance(point, str)
- self.assertEqual(point, '.')
+ self.assertEqual(point, '.') # the default setting
+ pg.set_decimal_point(',')
+ try:
+ r = pg.get_decimal_point()
+ finally:
+ pg.set_decimal_point(point)
+ self.assertIsInstance(r, str)
+ self.assertEqual(r, ',')
+ pg.set_decimal_point("'")
+ try:
+ r = pg.get_decimal_point()
+ finally:
+ pg.set_decimal_point(point)
+ self.assertIsInstance(r, str)
+ self.assertEqual(r, "'")
+ pg.set_decimal_point('')
+ try:
+ r = pg.get_decimal_point()
+ finally:
+ pg.set_decimal_point(point)
+ self.assertIsNone(r)
+ pg.set_decimal_point(None)
+ try:
+ r = pg.get_decimal_point()
+ finally:
+ pg.set_decimal_point(point)
+ self.assertIsNone(r)
def testSetDecimalPoint(self):
d = pg.Decimal
point = pg.get_decimal_point()
+ self.assertRaises(TypeError, pg.set_decimal_point)
+ # error if decimal point is not a string
+ self.assertRaises(TypeError, pg.set_decimal_point, 0)
+ # error if more than one decimal point passed
+ self.assertRaises(TypeError, pg.set_decimal_point, '.', ',')
+ self.assertRaises(TypeError, pg.set_decimal_point, '.,')
+ # error if decimal point is not a punctuation character
+ self.assertRaises(TypeError, pg.set_decimal_point, '0')
query = self.c.query
- # check that money values can be interpreted correctly
- # if and only if the decimal point is set appropriately
- # for the current lc_monetary setting
+ # check that money values are interpreted as decimal values
+ # only if decimal_point is set, and that the result is correct
+ # only if it is set suitable for the current lc_monetary setting
+ select_money = "select '34.25'::money"
+ proper_money = d(34.25)
+ bad_money = d(3425)
+ en_locales = 'en', 'en_US', 'en_US.utf8', 'en_US.UTF-8'
+ en_money = '$34.25', '$ 34.25', '34.25$', '34.25 $', '34.25 Dollar'
+ de_locales = 'de', 'de_DE', 'de_DE.utf8', 'de_DE.UTF-8'
+ de_money = ('34,25€', '34,25 €', '€34,25' '€ 34,25',
+ '34,25 EUR', '34,25 Euro', '34,25 DM')
+ # first try with English localization (using the point)
+ for lc in en_locales:
+ try:
+ query("set lc_monetary='%s'" % lc)
+ except pg.ProgrammingError:
+ pass
+ else:
+ break
+ else:
+ self.skipTest("cannot set English money locale")
try:
- query("set lc_monetary='en_US.UTF-8'")
+ r = query(select_money)
except pg.ProgrammingError:
- self.skipTest("cannot set English money locale")
+ # this can happen if the currency signs cannot be
+ # converted using the encoding of the test database
+ self.skipTest("database does not support English money")
pg.set_decimal_point(None)
try:
- r = query("select '34.25'::money").getresult()[0][0]
+ r = r.getresult()[0][0]
finally:
pg.set_decimal_point(point)
self.assertIsInstance(r, str)
- self.assertIn(r, (
- '$34.25', '$ 34.25', '34.25$', '34.25 $', '34.25 Dollar'))
+ self.assertIn(r, en_money)
+ r = query(select_money)
+ pg.set_decimal_point('')
+ try:
+ r = r.getresult()[0][0]
+ finally:
+ pg.set_decimal_point(point)
+ self.assertIsInstance(r, str)
+ self.assertIn(r, en_money)
+ r = query(select_money)
pg.set_decimal_point('.')
try:
- r = query("select '34.25'::money").getresult()[0][0]
+ r = r.getresult()[0][0]
finally:
pg.set_decimal_point(point)
self.assertIsInstance(r, d)
- self.assertEqual(r, d('34.25'))
+ self.assertEqual(r, proper_money)
+ r = query(select_money)
pg.set_decimal_point(',')
try:
- r = query("select '34.25'::money").getresult()[0][0]
+ r = r.getresult()[0][0]
finally:
pg.set_decimal_point(point)
- self.assertNotEqual(r, d('34.25'))
+ self.assertIsInstance(r, d)
+ self.assertEqual(r, bad_money)
+ r = query(select_money)
+ pg.set_decimal_point("'")
try:
- query("set lc_monetary='de_DE.UTF-8'")
- except pg.ProgrammingError:
+ r = r.getresult()[0][0]
+ finally:
+ pg.set_decimal_point(point)
+ self.assertIsInstance(r, d)
+ self.assertEqual(r, bad_money)
+ # then try with German localization (using the comma)
+ for lc in de_locales:
+ try:
+ query("set lc_monetary='%s'" % lc)
+ except pg.ProgrammingError:
+ pass
+ else:
+ break
+ else:
self.skipTest("cannot set German money locale")
+ select_money = select_money.replace('.', ',')
+ try:
+ r = query(select_money)
+ except pg.ProgrammingError:
+ self.skipTest("database does not support English money")
pg.set_decimal_point(None)
try:
- r = query("select '34,25'::money").getresult()[0][0]
+ r = r.getresult()[0][0]
+ finally:
+ pg.set_decimal_point(point)
+ self.assertIsInstance(r, str)
+ self.assertIn(r, de_money)
+ r = query(select_money)
+ pg.set_decimal_point('')
+ try:
+ r = r.getresult()[0][0]
finally:
pg.set_decimal_point(point)
self.assertIsInstance(r, str)
- self.assertIn(r, ('34,25€', '34,25 €', '€34,25' '€ 34,25',
- '34,25 EUR', '34,25 Euro', '34,25 DM'))
+ self.assertIn(r, de_money)
+ r = query(select_money)
pg.set_decimal_point(',')
try:
- r = query("select '34,25'::money").getresult()[0][0]
+ r = r.getresult()[0][0]
finally:
pg.set_decimal_point(point)
self.assertIsInstance(r, d)
- self.assertEqual(r, d('34.25'))
+ self.assertEqual(r, proper_money)
+ r = query(select_money)
+ pg.set_decimal_point('.')
+ try:
+ r = r.getresult()[0][0]
+ finally:
+ pg.set_decimal_point(point)
+ self.assertEqual(r, bad_money)
+ r = query(select_money)
+ pg.set_decimal_point("'")
try:
- pg.set_decimal_point('.')
+ r = r.getresult()[0][0]
finally:
pg.set_decimal_point(point)
- r = query("select '34,25'::money").getresult()[0][0]
- self.assertNotEqual(r, d('34.25'))
+ self.assertEqual(r, bad_money)
+
+ def testGetDecimal(self):
+ decimal_class = pg.get_decimal()
+ # error if a parameter is passed
+ self.assertRaises(TypeError, pg.get_decimal, decimal_class)
+ self.assertIs(decimal_class, pg.Decimal) # the default setting
+ pg.set_decimal(int)
+ try:
+ r = pg.get_decimal()
+ finally:
+ pg.set_decimal(decimal_class)
+ self.assertIs(r, int)
+ r = pg.get_decimal()
+ self.assertIs(r, decimal_class)
def testSetDecimal(self):
- d = pg.Decimal
+ decimal_class = pg.get_decimal()
+ # error if no parameter is passed
+ self.assertRaises(TypeError, pg.set_decimal)
query = self.c.query
- r = query("select 3425::numeric").getresult()[0][0]
- self.assertIsInstance(r, d)
- self.assertEqual(r, d('3425'))
- pg.set_decimal(long)
try:
- r = query("select 3425::numeric").getresult()[0][0]
+ r = query("select 3425::numeric")
+ except pg.ProgrammingError:
+ self.skipTest('database does not support numeric')
+ r = r.getresult()[0][0]
+ self.assertIsInstance(r, decimal_class)
+ self.assertEqual(r, decimal_class('3425'))
+ r = query("select 3425::numeric")
+ pg.set_decimal(int)
+ try:
+ r = r.getresult()[0][0]
finally:
- pg.set_decimal(d)
- self.assertNotIsInstance(r, d)
- self.assertIsInstance(r, long)
- self.assertEqual(r, 3425L)
+ pg.set_decimal(decimal_class)
+ self.assertNotIsInstance(r, decimal_class)
+ self.assertIsInstance(r, int)
+ self.assertEqual(r, int(3425))
+
+ def testGetBool(self):
+ use_bool = pg.get_bool()
+ # error if a parameter is passed
+ self.assertRaises(TypeError, pg.get_bool, use_bool)
+ self.assertIsInstance(use_bool, bool)
+ self.assertIs(use_bool, False) # the default setting
+ pg.set_bool(True)
+ try:
+ r = pg.get_bool()
+ finally:
+ pg.set_bool(use_bool)
+ self.assertIsInstance(r, bool)
+ self.assertIs(r, True)
+ pg.set_bool(False)
+ try:
+ r = pg.get_bool()
+ finally:
+ pg.set_bool(use_bool)
+ self.assertIsInstance(r, bool)
+ self.assertIs(r, False)
+ pg.set_bool(1)
+ try:
+ r = pg.get_bool()
+ finally:
+ pg.set_bool(use_bool)
+ self.assertIsInstance(r, bool)
+ self.assertIs(r, True)
+ pg.set_bool(0)
+ try:
+ r = pg.get_bool()
+ finally:
+ pg.set_bool(use_bool)
+ self.assertIsInstance(r, bool)
+ self.assertIs(r, False)
+
+ def testSetBool(self):
+ use_bool = pg.get_bool()
+ # error if no parameter is passed
+ self.assertRaises(TypeError, pg.set_bool)
+ query = self.c.query
+ try:
+ r = query("select true::bool")
+ except pg.ProgrammingError:
+ self.skipTest('database does not support bool')
+ r = r.getresult()[0][0]
+ self.assertIsInstance(r, str)
+ self.assertEqual(r, 't')
+ r = query("select true::bool")
+ pg.set_bool(True)
+ try:
+ r = r.getresult()[0][0]
+ finally:
+ pg.set_bool(use_bool)
+ self.assertIsInstance(r, bool)
+ self.assertIs(r, True)
+ r = query("select true::bool")
+ pg.set_bool(False)
+ try:
+ r = r.getresult()[0][0]
+ finally:
+ pg.set_bool(use_bool)
+ self.assertIsInstance(r, str)
+ self.assertIs(r, 't')
+
+ def testGetNamedresult(self):
+ namedresult = pg.get_namedresult()
+ # error if a parameter is passed
+ self.assertRaises(TypeError, pg.get_namedresult, namedresult)
+ self.assertIs(namedresult, pg._namedresult) # the default setting
@unittest.skipUnless(namedtuple, 'Named tuples not available')
def testSetNamedresult(self):
- query = self.c.query
-
- r = query("select 1 as x, 2 as y").namedresult()[0]
- self.assertIsInstance(r, tuple)
- self.assertEqual(r, (1, 2))
- self.assertIsNot(type(r), tuple)
- self.assertEqual(r._fields, ('x', 'y'))
- self.assertEqual(r._asdict(), {'x': 1, 'y': 2})
- self.assertEqual(r.__class__.__name__, 'Row')
+ namedresult = pg.get_namedresult()
+ self.assertTrue(callable(namedresult))
- _namedresult = pg._namedresult
- self.assertTrue(callable(_namedresult))
- pg.set_namedresult(_namedresult)
+ query = self.c.query
r = query("select 1 as x, 2 as y").namedresult()[0]
self.assertIsInstance(r, tuple)
@@ -1031,12 +1214,13 @@
self.assertEqual(r._asdict(), {'x': 1, 'y': 2})
self.assertEqual(r.__class__.__name__, 'Row')
- def _listresult(q):
- return map(list, q.getresult())
-
- pg.set_namedresult(_listresult)
+ def listresult(q):
+ return [list(row) for row in q.getresult()]
+ pg.set_namedresult(listresult)
try:
+ r = pg.get_namedresult()
+ self.assertIs(r, listresult)
r = query("select 1 as x, 2 as y").namedresult()[0]
self.assertIsInstance(r, list)
self.assertEqual(r, [1, 2])
@@ -1044,7 +1228,10 @@
self.assertFalse(hasattr(r, '_fields'))
self.assertNotEqual(r.__class__.__name__, 'Row')
finally:
- pg.set_namedresult(_namedresult)
+ pg.set_namedresult(namedresult)
+
+ r = pg.get_namedresult()
+ self.assertIs(r, namedresult)
if __name__ == '__main__':
Modified: trunk/module/tests/test_classic_connection.py
==============================================================================
--- trunk/module/tests/test_classic_connection.py Fri Nov 27 07:39:21
2015 (r642)
+++ trunk/module/tests/test_classic_connection.py Fri Nov 27 07:56:09
2015 (r643)
@@ -1360,7 +1360,7 @@
else:
break
else:
- self.SkipTest("cannot set English money locale")
+ self.skipTest("cannot set English money locale")
try:
r = query(select_money)
except pg.ProgrammingError:
@@ -1415,7 +1415,7 @@
else:
break
else:
- self.SkipTest("cannot set German money locale")
+ self.skipTest("cannot set German money locale")
select_money = select_money.replace('.', ',')
try:
r = query(select_money)
@@ -1559,7 +1559,7 @@
self.assertIsInstance(r, str)
self.assertIs(r, 't')
- def testGetBool(self):
+ def testGetNamedresult(self):
namedresult = pg.get_namedresult()
# error if a parameter is passed
self.assertRaises(TypeError, pg.get_namedresult, namedresult)
_______________________________________________
PyGreSQL mailing list
[email protected]
https://mail.vex.net/mailman/listinfo.cgi/pygresql