Author: cito
Date: Thu Feb 4 07:37:31 2016
New Revision: 816
Log:
Test adaptation of dates, times and intervals
The tests so far checked only the typecasting, not the adaption.
They now make sure that adaptation works as well, independent of
the setting of datestyle and intervalstyle.
Modified:
trunk/tests/test_classic_dbwrapper.py
trunk/tests/test_dbapi20.py
Modified: trunk/tests/test_classic_dbwrapper.py
==============================================================================
--- trunk/tests/test_classic_dbwrapper.py Wed Feb 3 16:11:13 2016
(r815)
+++ trunk/tests/test_classic_dbwrapper.py Thu Feb 4 07:37:31 2016
(r816)
@@ -3527,8 +3527,8 @@
'SQL, MDY', 'SQL, DMY', 'German'):
self.db.set_parameter('datestyle', datestyle)
d = date(2016, 3, 14)
- q = "select '2016-03-14'::date"
- r = query(q).getresult()[0][0]
+ q = "select $1::date"
+ r = query(q, (d,)).getresult()[0][0]
self.assertIsInstance(r, date)
self.assertEqual(r, d)
q = "select '10000-08-01'::date, '0099-01-08 BC'::date"
@@ -3547,13 +3547,13 @@
def testTime(self):
query = self.db.query
d = time(15, 9, 26)
- q = "select '15:09:26'::time"
- r = query(q).getresult()[0][0]
+ q = "select $1::time"
+ r = query(q, (d,)).getresult()[0][0]
self.assertIsInstance(r, time)
self.assertEqual(r, d)
d = time(15, 9, 26, 535897)
- q = "select '15:09:26.535897'::time"
- r = query(q).getresult()[0][0]
+ q = "select $1::time"
+ r = query(q, (d,)).getresult()[0][0]
self.assertIsInstance(r, time)
self.assertEqual(r, d)
@@ -3568,13 +3568,13 @@
tzinfo = None
self.db.set_parameter('timezone', timezone)
d = time(15, 9, 26, tzinfo=tzinfo)
- q = "select '15:09:26'::timetz"
- r = query(q).getresult()[0][0]
+ q = "select $1::timetz"
+ r = query(q, (d,)).getresult()[0][0]
self.assertIsInstance(r, time)
self.assertEqual(r, d)
d = time(15, 9, 26, 535897, tzinfo)
- q = "select '15:09:26.535897'::timetz"
- r = query(q).getresult()[0][0]
+ q = "select $1::timetz"
+ r = query(q, (d,)).getresult()[0][0]
self.assertIsInstance(r, time)
self.assertEqual(r, d)
@@ -3584,18 +3584,18 @@
'SQL, MDY', 'SQL, DMY', 'German'):
self.db.set_parameter('datestyle', datestyle)
d = datetime(2016, 3, 14)
- q = "select '2016-03-14'::timestamp"
- r = query(q).getresult()[0][0]
+ q = "select $1::timestamp"
+ r = query(q, (d,)).getresult()[0][0]
self.assertIsInstance(r, datetime)
self.assertEqual(r, d)
d = datetime(2016, 3, 14, 15, 9, 26)
- q = "select '2016-03-14 15:09:26'::timestamp"
- r = query(q).getresult()[0][0]
+ q = "select $1::timestamp"
+ r = query(q, (d,)).getresult()[0][0]
self.assertIsInstance(r, datetime)
self.assertEqual(r, d)
d = datetime(2016, 3, 14, 15, 9, 26, 535897)
- q = "select '2016-03-14 15:09:26.535897'::timestamp"
- r = query(q).getresult()[0][0]
+ q = "select $1::timestamp"
+ r = query(q, (d,)).getresult()[0][0]
self.assertIsInstance(r, datetime)
self.assertEqual(r, d)
q = ("select '10000-08-01 AD'::timestamp,"
@@ -3626,18 +3626,18 @@
'SQL, MDY', 'SQL, DMY', 'German'):
self.db.set_parameter('datestyle', datestyle)
d = datetime(2016, 3, 14, tzinfo=tzinfo)
- q = "select '2016-03-14'::timestamptz"
- r = query(q).getresult()[0][0]
+ q = "select $1::timestamptz"
+ r = query(q, (d,)).getresult()[0][0]
self.assertIsInstance(r, datetime)
self.assertEqual(r, d)
d = datetime(2016, 3, 14, 15, 9, 26, tzinfo=tzinfo)
- q = "select '2016-03-14 15:09:26'::timestamptz"
- r = query(q).getresult()[0][0]
+ q = "select $1::timestamptz"
+ r = query(q, (d,)).getresult()[0][0]
self.assertIsInstance(r, datetime)
self.assertEqual(r, d)
d = datetime(2016, 3, 14, 15, 9, 26, 535897, tzinfo)
- q = "select '2016-03-14 15:09:26.535897'::timestamptz"
- r = query(q).getresult()[0][0]
+ q = "select $1::timestamptz"
+ r = query(q, (d,)).getresult()[0][0]
self.assertIsInstance(r, datetime)
self.assertEqual(r, d)
q = ("select '10000-08-01 AD'::timestamptz,"
@@ -3659,36 +3659,29 @@
for intervalstyle in (
'sql_standard', 'postgres', 'postgres_verbose', 'iso_8601'):
self.db.set_parameter('intervalstyle', intervalstyle)
- q = "select '2016-03-14'::timestamp - '2016-03-11'::timestamp"
- r = query(q).getresult()[0][0]
- self.assertIsInstance(r, timedelta)
d = timedelta(3)
- self.assertEqual(r, d)
- q = "select '2016-03-14'::timestamp - '2016-04-13'::timestamp"
- r = query(q).getresult()[0][0]
+ q = "select $1::interval"
+ r = query(q, (d,)).getresult()[0][0]
self.assertIsInstance(r, timedelta)
- d = timedelta(-30)
self.assertEqual(r, d)
- q = ("select '2016-03-14 15:31:42.5678'::timestamp"
- " - '2016-03-14 12:00:00'::timestamp")
- r = query(q).getresult()[0][0]
+ d = timedelta(-30)
+ r = query(q, (d,)).getresult()[0][0]
self.assertIsInstance(r, timedelta)
+ self.assertEqual(r, d)
d = timedelta(hours=3, minutes=31, seconds=42, microseconds=5678)
+ q = "select $1::interval"
+ r = query(q, (d,)).getresult()[0][0]
+ self.assertIsInstance(r, timedelta)
self.assertEqual(r, d)
def testDateAndTimeArrays(self):
- q = "select ARRAY['2016-03-14'::date], ARRAY['15:09:26'::time]"
- r = self.db.query(q).getresult()[0]
- d = r[0]
- self.assertIsInstance(d, list)
- d = d[0]
- self.assertIsInstance(d, date)
- self.assertEqual(d, date(2016, 3, 14))
- d = r[1]
- self.assertIsInstance(d, list)
- d = d[0]
- self.assertIsInstance(d, time)
- self.assertEqual(d, time(15, 9, 26))
+ dt = (date(2016, 3, 14), time(15, 9, 26))
+ q = "select ARRAY[$1::date], ARRAY[$2::time]"
+ r = self.db.query(q, dt).getresult()[0]
+ self.assertIsInstance(r[0], list)
+ self.assertEqual(r[0][0], dt[0])
+ self.assertIsInstance(r[1], list)
+ self.assertEqual(r[1][0], dt[1])
def testDbTypesInfo(self):
dbtypes = self.db.dbtypes
Modified: trunk/tests/test_dbapi20.py
==============================================================================
--- trunk/tests/test_dbapi20.py Wed Feb 3 16:11:13 2016 (r815)
+++ trunk/tests/test_dbapi20.py Thu Feb 4 07:37:31 2016 (r816)
@@ -510,43 +510,37 @@
def test_datetime(self):
dt = datetime(2011, 7, 17, 15, 47, 42, 317509)
- td = dt - datetime(1970, 1, 1)
table = self.table_prefix + 'booze'
con = self._connect()
try:
cur = con.cursor()
- cur.execute("set datestyle to iso")
- cur.execute("set datestyle to iso")
cur.execute("create table %s ("
"d date, t time, ts timestamp,"
- "tz timetz, tsz timestamptz, i interval)" % table)
+ "tz timetz, tsz timestamptz)" % table)
for n in range(3):
values = [dt.date(), dt.time(), dt,
- dt.time(), dt, td]
+ dt.time(), dt]
if timezone:
values[3] = values[3].replace(tzinfo=timezone.utc)
values[4] = values[4].replace(tzinfo=timezone.utc)
if n == 0: # input as objects
params = values
if n == 1: # input as text
- params = [v.isoformat() for v in values[:5]] # as text
- params.append('%d days %d seconds %d microseconds '
- % (td.days, td.seconds, td.microseconds))
+ params = [v.isoformat() for v in values] # as text
elif n == 2: # input using type helpers
d = (dt.year, dt.month, dt.day)
t = (dt.hour, dt.minute, dt.second, dt.microsecond)
- i = (td.days, 0, 0, td.seconds, td.microseconds)
params = [pgdb.Date(*d), pgdb.Time(*t),
pgdb.Timestamp(*(d + t)), pgdb.Time(*t),
- pgdb.Timestamp(*(d + t)), pgdb.Interval(*i)]
- cur.execute("insert into %s"
- " values (%%s,%%s,%%s,%%s,%%s,%%s)" % table, params)
+ pgdb.Timestamp(*(d + t))]
for datestyle in ('iso', 'postgres, mdy', 'postgres, dmy',
'sql, mdy', 'sql, dmy', 'german'):
cur.execute("set datestyle to %s" % datestyle)
+ cur.execute("insert into %s"
+ " values (%%s,%%s,%%s,%%s,%%s)" % table, params)
cur.execute("select * from %s" % table)
d = cur.description
- for i in range(6):
+ for i in range(5):
self.assertEqual(d[i].type_code, pgdb.DATETIME)
self.assertNotEqual(d[i].type_code, pgdb.STRING)
self.assertNotEqual(d[i].type_code, pgdb.ARRAY)
@@ -556,10 +550,43 @@
self.assertEqual(d[2].type_code, pgdb.TIMESTAMP)
self.assertEqual(d[3].type_code, pgdb.TIME)
self.assertEqual(d[4].type_code, pgdb.TIMESTAMP)
- self.assertEqual(d[5].type_code, pgdb.INTERVAL)
row = cur.fetchone()
self.assertEqual(row, tuple(values))
- cur.execute("delete from %s" % table)
+ cur.execute("delete from %s" % table)
+ finally:
+ con.close()
+
+ def test_interval(self):
+ td = datetime(2011, 7, 17, 15, 47, 42, 317509) - datetime(1970, 1, 1)
+ table = self.table_prefix + 'booze'
+ con = self._connect()
+ try:
+ cur = con.cursor()
+ cur.execute("create table %s (i interval)" % table)
+ for n in range(3):
+ if n == 0: # input as objects
+ param = td
+ if n == 1: # input as text
+ param = '%d days %d seconds %d microseconds ' % (
+ td.days, td.seconds, td.microseconds)
+ elif n == 2: # input using type helpers
+ param = pgdb.Interval(
+ td.days, 0, 0, td.seconds, td.microseconds)
+ for intervalstyle in ('sql_standard ', 'postgres',
+ 'postgres_verbose', 'iso_8601'):
+ cur.execute("set intervalstyle to %s" % intervalstyle)
+ cur.execute("insert into %s"
+ " values (%%s)" % table, [param])
+ cur.execute("select * from %s" % table)
+ tc = cur.description[0].type_code
+ self.assertEqual(tc, pgdb.DATETIME)
+ self.assertNotEqual(tc, pgdb.STRING)
+ self.assertNotEqual(tc, pgdb.ARRAY)
+ self.assertNotEqual(tc, pgdb.RECORD)
+ self.assertEqual(tc, pgdb.INTERVAL)
+ row = cur.fetchone()
+ self.assertEqual(row, (td,))
+ cur.execute("delete from %s" % table)
finally:
con.close()
_______________________________________________
PyGreSQL mailing list
[email protected]
https://mail.vex.net/mailman/listinfo.cgi/pygresql