Use wrap to fix names of decorated test methods

Decorators not using wrap() prevent running the test from command line, e.g.
with:

    python tests/__init__.py test_module.TestSuite.test_method
This commit is contained in:
Daniele Varrazzo 2013-03-20 17:17:10 +00:00
parent 31265e3439
commit 546927d44a
4 changed files with 42 additions and 24 deletions

View File

@ -25,14 +25,17 @@
import os import os
import shutil import shutil
import tempfile import tempfile
from functools import wraps
import psycopg2 import psycopg2
import psycopg2.extensions import psycopg2.extensions
from psycopg2.extensions import b from psycopg2.extensions import b
from testconfig import dsn, green from testconfig import dsn
from testutils import unittest, decorate_all_tests, skip_if_tpc_disabled from testutils import unittest, decorate_all_tests, skip_if_tpc_disabled
from testutils import skip_if_green
def skip_if_no_lo(f): def skip_if_no_lo(f):
@wraps(f)
def skip_if_no_lo_(self): def skip_if_no_lo_(self):
if self.conn.server_version < 80100: if self.conn.server_version < 80100:
return self.skipTest("large objects only supported from PG 8.1") return self.skipTest("large objects only supported from PG 8.1")
@ -41,14 +44,7 @@ def skip_if_no_lo(f):
return skip_if_no_lo_ return skip_if_no_lo_
def skip_if_green(f): skip_lo_if_green = skip_if_green("libpq doesn't support LO in async mode")
def skip_if_green_(self):
if green:
return self.skipTest("libpq doesn't support LO in async mode")
else:
return f(self)
return skip_if_green_
class LargeObjectMixin(object): class LargeObjectMixin(object):
@ -379,10 +375,11 @@ class LargeObjectTests(LargeObjectMixin, unittest.TestCase):
decorate_all_tests(LargeObjectTests, skip_if_no_lo) decorate_all_tests(LargeObjectTests, skip_if_no_lo)
decorate_all_tests(LargeObjectTests, skip_if_green) decorate_all_tests(LargeObjectTests, skip_lo_if_green)
def skip_if_no_truncate(f): def skip_if_no_truncate(f):
@wraps(f)
def skip_if_no_truncate_(self): def skip_if_no_truncate_(self):
if self.conn.server_version < 80300: if self.conn.server_version < 80300:
return self.skipTest( return self.skipTest(
@ -434,7 +431,7 @@ class LargeObjectTruncateTests(LargeObjectMixin, unittest.TestCase):
self.assertRaises(psycopg2.ProgrammingError, lo.truncate) self.assertRaises(psycopg2.ProgrammingError, lo.truncate)
decorate_all_tests(LargeObjectTruncateTests, skip_if_no_lo) decorate_all_tests(LargeObjectTruncateTests, skip_if_no_lo)
decorate_all_tests(LargeObjectTruncateTests, skip_if_green) decorate_all_tests(LargeObjectTruncateTests, skip_lo_if_green)
decorate_all_tests(LargeObjectTruncateTests, skip_if_no_truncate) decorate_all_tests(LargeObjectTruncateTests, skip_if_no_truncate)

View File

@ -26,7 +26,9 @@ try:
import decimal import decimal
except: except:
pass pass
import sys import sys
from functools import wraps
import testutils import testutils
from testutils import unittest, decorate_all_tests from testutils import unittest, decorate_all_tests
from testconfig import dsn from testconfig import dsn
@ -461,6 +463,7 @@ class ByteaParserTest(unittest.TestCase):
self.assertEqual(rv, tgt) self.assertEqual(rv, tgt)
def skip_if_cant_cast(f): def skip_if_cant_cast(f):
@wraps(f)
def skip_if_cant_cast_(self, *args, **kwargs): def skip_if_cant_cast_(self, *args, **kwargs):
if self._cast is None: if self._cast is None:
return self.skipTest("can't test bytea parser: %s - %s" return self.skipTest("can't test bytea parser: %s - %s"

View File

@ -18,6 +18,7 @@ import re
import sys import sys
from decimal import Decimal from decimal import Decimal
from datetime import date, datetime from datetime import date, datetime
from functools import wraps
from testutils import unittest, skip_if_no_uuid, skip_before_postgres from testutils import unittest, skip_if_no_uuid, skip_before_postgres
from testutils import decorate_all_tests from testutils import decorate_all_tests
@ -124,6 +125,7 @@ class TypesExtrasTests(unittest.TestCase):
def skip_if_no_hstore(f): def skip_if_no_hstore(f):
@wraps(f)
def skip_if_no_hstore_(self): def skip_if_no_hstore_(self):
from psycopg2.extras import HstoreAdapter from psycopg2.extras import HstoreAdapter
oids = HstoreAdapter.get_oids(self.conn) oids = HstoreAdapter.get_oids(self.conn)
@ -447,6 +449,7 @@ class HstoreTestCase(unittest.TestCase):
def skip_if_no_composite(f): def skip_if_no_composite(f):
@wraps(f)
def skip_if_no_composite_(self): def skip_if_no_composite_(self):
if self.conn.server_version < 80000: if self.conn.server_version < 80000:
return self.skipTest( return self.skipTest(
@ -455,7 +458,6 @@ def skip_if_no_composite(f):
return f(self) return f(self)
skip_if_no_composite_.__name__ = f.__name__
return skip_if_no_composite_ return skip_if_no_composite_
class AdaptTypeTestCase(unittest.TestCase): class AdaptTypeTestCase(unittest.TestCase):
@ -831,7 +833,8 @@ class AdaptTypeTestCase(unittest.TestCase):
def skip_if_json_module(f): def skip_if_json_module(f):
"""Skip a test if no Python json module is available""" """Skip a test if a Python json module *is* available"""
@wraps(f)
def skip_if_json_module_(self): def skip_if_json_module_(self):
if psycopg2.extras.json is not None: if psycopg2.extras.json is not None:
return self.skipTest("json module is available") return self.skipTest("json module is available")
@ -842,6 +845,7 @@ def skip_if_json_module(f):
def skip_if_no_json_module(f): def skip_if_no_json_module(f):
"""Skip a test if no Python json module is available""" """Skip a test if no Python json module is available"""
@wraps(f)
def skip_if_no_json_module_(self): def skip_if_no_json_module_(self):
if psycopg2.extras.json is None: if psycopg2.extras.json is None:
return self.skipTest("json module not available") return self.skipTest("json module not available")
@ -852,6 +856,7 @@ def skip_if_no_json_module(f):
def skip_if_no_json_type(f): def skip_if_no_json_type(f):
"""Skip a test if PostgreSQL json type is not available""" """Skip a test if PostgreSQL json type is not available"""
@wraps(f)
def skip_if_no_json_type_(self): def skip_if_no_json_type_(self):
curs = self.conn.cursor() curs = self.conn.cursor()
curs.execute("select oid from pg_type where typname = 'json'") curs.execute("select oid from pg_type where typname = 'json'")
@ -1242,6 +1247,7 @@ class RangeTestCase(unittest.TestCase):
def skip_if_no_range(f): def skip_if_no_range(f):
@wraps(f)
def skip_if_no_range_(self): def skip_if_no_range_(self):
if self.conn.server_version < 90200: if self.conn.server_version < 90200:
return self.skipTest( return self.skipTest(
@ -1250,7 +1256,6 @@ def skip_if_no_range(f):
return f(self) return f(self)
skip_if_no_range_.__name__ = f.__name__
return skip_if_no_range_ return skip_if_no_range_

View File

@ -26,6 +26,7 @@
import os import os
import sys import sys
from functools import wraps
try: try:
import unittest2 import unittest2
@ -43,6 +44,7 @@ else:
def skipIf(cond, msg): def skipIf(cond, msg):
def skipIf_(f): def skipIf_(f):
@wraps(f)
def skipIf__(self): def skipIf__(self):
if cond: if cond:
warnings.warn(msg) warnings.warn(msg)
@ -81,6 +83,7 @@ def decorate_all_tests(cls, decorator):
def skip_if_no_uuid(f): def skip_if_no_uuid(f):
"""Decorator to skip a test if uuid is not supported by Py/PG.""" """Decorator to skip a test if uuid is not supported by Py/PG."""
@wraps(f)
def skip_if_no_uuid_(self): def skip_if_no_uuid_(self):
try: try:
import uuid import uuid
@ -104,6 +107,7 @@ def skip_if_no_uuid(f):
def skip_if_tpc_disabled(f): def skip_if_tpc_disabled(f):
"""Skip a test if the server has tpc support disabled.""" """Skip a test if the server has tpc support disabled."""
@wraps(f)
def skip_if_tpc_disabled_(self): def skip_if_tpc_disabled_(self):
from psycopg2 import ProgrammingError from psycopg2 import ProgrammingError
cnn = self.connect() cnn = self.connect()
@ -123,11 +127,11 @@ def skip_if_tpc_disabled(f):
"set max_prepared_transactions to > 0 to run the test") "set max_prepared_transactions to > 0 to run the test")
return f(self) return f(self)
skip_if_tpc_disabled_.__name__ = f.__name__
return skip_if_tpc_disabled_ return skip_if_tpc_disabled_
def skip_if_no_namedtuple(f): def skip_if_no_namedtuple(f):
@wraps(f)
def skip_if_no_namedtuple_(self): def skip_if_no_namedtuple_(self):
try: try:
from collections import namedtuple from collections import namedtuple
@ -136,12 +140,12 @@ def skip_if_no_namedtuple(f):
else: else:
return f(self) return f(self)
skip_if_no_namedtuple_.__name__ = f.__name__
return skip_if_no_namedtuple_ return skip_if_no_namedtuple_
def skip_if_no_iobase(f): def skip_if_no_iobase(f):
"""Skip a test if io.TextIOBase is not available.""" """Skip a test if io.TextIOBase is not available."""
@wraps(f)
def skip_if_no_iobase_(self): def skip_if_no_iobase_(self):
try: try:
from io import TextIOBase from io import TextIOBase
@ -157,6 +161,7 @@ def skip_before_postgres(*ver):
"""Skip a test on PostgreSQL before a certain version.""" """Skip a test on PostgreSQL before a certain version."""
ver = ver + (0,) * (3 - len(ver)) ver = ver + (0,) * (3 - len(ver))
def skip_before_postgres_(f): def skip_before_postgres_(f):
@wraps(f)
def skip_before_postgres__(self): def skip_before_postgres__(self):
if self.conn.server_version < int("%d%02d%02d" % ver): if self.conn.server_version < int("%d%02d%02d" % ver):
return self.skipTest("skipped because PostgreSQL %s" return self.skipTest("skipped because PostgreSQL %s"
@ -171,6 +176,7 @@ def skip_after_postgres(*ver):
"""Skip a test on PostgreSQL after (including) a certain version.""" """Skip a test on PostgreSQL after (including) a certain version."""
ver = ver + (0,) * (3 - len(ver)) ver = ver + (0,) * (3 - len(ver))
def skip_after_postgres_(f): def skip_after_postgres_(f):
@wraps(f)
def skip_after_postgres__(self): def skip_after_postgres__(self):
if self.conn.server_version >= int("%d%02d%02d" % ver): if self.conn.server_version >= int("%d%02d%02d" % ver):
return self.skipTest("skipped because PostgreSQL %s" return self.skipTest("skipped because PostgreSQL %s"
@ -184,6 +190,7 @@ def skip_after_postgres(*ver):
def skip_before_python(*ver): def skip_before_python(*ver):
"""Skip a test on Python before a certain version.""" """Skip a test on Python before a certain version."""
def skip_before_python_(f): def skip_before_python_(f):
@wraps(f)
def skip_before_python__(self): def skip_before_python__(self):
if sys.version_info[:len(ver)] < ver: if sys.version_info[:len(ver)] < ver:
return self.skipTest("skipped because Python %s" return self.skipTest("skipped because Python %s"
@ -197,6 +204,7 @@ def skip_before_python(*ver):
def skip_from_python(*ver): def skip_from_python(*ver):
"""Skip a test on Python after (including) a certain version.""" """Skip a test on Python after (including) a certain version."""
def skip_from_python_(f): def skip_from_python_(f):
@wraps(f)
def skip_from_python__(self): def skip_from_python__(self):
if sys.version_info[:len(ver)] >= ver: if sys.version_info[:len(ver)] >= ver:
return self.skipTest("skipped because Python %s" return self.skipTest("skipped because Python %s"
@ -209,6 +217,7 @@ def skip_from_python(*ver):
def skip_if_no_superuser(f): def skip_if_no_superuser(f):
"""Skip a test if the database user running the test is not a superuser""" """Skip a test if the database user running the test is not a superuser"""
@wraps(f)
def skip_if_no_superuser_(self): def skip_if_no_superuser_(self):
from psycopg2 import ProgrammingError from psycopg2 import ProgrammingError
try: try:
@ -222,16 +231,20 @@ def skip_if_no_superuser(f):
return skip_if_no_superuser_ return skip_if_no_superuser_
def skip_copy_if_green(f): def skip_if_green(reason):
def skip_copy_if_green_(self): def skip_if_green_(f):
from testconfig import green @wraps(f)
if green: def skip_if_green__(self):
return self.skipTest("copy in async mode currently not supported") from testconfig import green
else: if green:
return f(self) return self.skipTest(reason)
else:
return f(self)
return skip_copy_if_green_ return skip_if_green__
return skip_if_green_
skip_copy_if_green = skip_if_green("copy in async mode currently not supported")
def script_to_py3(script): def script_to_py3(script):
"""Convert a script to Python3 syntax if required.""" """Convert a script to Python3 syntax if required."""