From 546927d44ab89de22e851667479e98b3810714dc Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Wed, 20 Mar 2013 17:17:10 +0000 Subject: [PATCH] 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 --- tests/test_lobject.py | 19 ++++++++----------- tests/test_types_basic.py | 3 +++ tests/test_types_extras.py | 11 ++++++++--- tests/testutils.py | 33 +++++++++++++++++++++++---------- 4 files changed, 42 insertions(+), 24 deletions(-) diff --git a/tests/test_lobject.py b/tests/test_lobject.py index fb281639..ed093711 100755 --- a/tests/test_lobject.py +++ b/tests/test_lobject.py @@ -25,14 +25,17 @@ import os import shutil import tempfile +from functools import wraps import psycopg2 import psycopg2.extensions 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 skip_if_green def skip_if_no_lo(f): + @wraps(f) def skip_if_no_lo_(self): if self.conn.server_version < 80100: 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_ -def skip_if_green(f): - 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_ +skip_lo_if_green = skip_if_green("libpq doesn't support LO in async mode") 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_green) +decorate_all_tests(LargeObjectTests, skip_lo_if_green) def skip_if_no_truncate(f): + @wraps(f) def skip_if_no_truncate_(self): if self.conn.server_version < 80300: return self.skipTest( @@ -434,7 +431,7 @@ class LargeObjectTruncateTests(LargeObjectMixin, unittest.TestCase): self.assertRaises(psycopg2.ProgrammingError, lo.truncate) 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) diff --git a/tests/test_types_basic.py b/tests/test_types_basic.py index c2a47e93..4e41d9f4 100755 --- a/tests/test_types_basic.py +++ b/tests/test_types_basic.py @@ -26,7 +26,9 @@ try: import decimal except: pass + import sys +from functools import wraps import testutils from testutils import unittest, decorate_all_tests from testconfig import dsn @@ -461,6 +463,7 @@ class ByteaParserTest(unittest.TestCase): self.assertEqual(rv, tgt) def skip_if_cant_cast(f): + @wraps(f) def skip_if_cant_cast_(self, *args, **kwargs): if self._cast is None: return self.skipTest("can't test bytea parser: %s - %s" diff --git a/tests/test_types_extras.py b/tests/test_types_extras.py index 0dd9aad6..1b26c9e3 100755 --- a/tests/test_types_extras.py +++ b/tests/test_types_extras.py @@ -18,6 +18,7 @@ import re import sys from decimal import Decimal from datetime import date, datetime +from functools import wraps from testutils import unittest, skip_if_no_uuid, skip_before_postgres from testutils import decorate_all_tests @@ -124,6 +125,7 @@ class TypesExtrasTests(unittest.TestCase): def skip_if_no_hstore(f): + @wraps(f) def skip_if_no_hstore_(self): from psycopg2.extras import HstoreAdapter oids = HstoreAdapter.get_oids(self.conn) @@ -447,6 +449,7 @@ class HstoreTestCase(unittest.TestCase): def skip_if_no_composite(f): + @wraps(f) def skip_if_no_composite_(self): if self.conn.server_version < 80000: return self.skipTest( @@ -455,7 +458,6 @@ def skip_if_no_composite(f): return f(self) - skip_if_no_composite_.__name__ = f.__name__ return skip_if_no_composite_ class AdaptTypeTestCase(unittest.TestCase): @@ -831,7 +833,8 @@ class AdaptTypeTestCase(unittest.TestCase): 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): if psycopg2.extras.json is not None: return self.skipTest("json module is available") @@ -842,6 +845,7 @@ def skip_if_json_module(f): def skip_if_no_json_module(f): """Skip a test if no Python json module is available""" + @wraps(f) def skip_if_no_json_module_(self): if psycopg2.extras.json is None: 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): """Skip a test if PostgreSQL json type is not available""" + @wraps(f) def skip_if_no_json_type_(self): curs = self.conn.cursor() curs.execute("select oid from pg_type where typname = 'json'") @@ -1242,6 +1247,7 @@ class RangeTestCase(unittest.TestCase): def skip_if_no_range(f): + @wraps(f) def skip_if_no_range_(self): if self.conn.server_version < 90200: return self.skipTest( @@ -1250,7 +1256,6 @@ def skip_if_no_range(f): return f(self) - skip_if_no_range_.__name__ = f.__name__ return skip_if_no_range_ diff --git a/tests/testutils.py b/tests/testutils.py index 34adb85c..26b8d815 100644 --- a/tests/testutils.py +++ b/tests/testutils.py @@ -26,6 +26,7 @@ import os import sys +from functools import wraps try: import unittest2 @@ -43,6 +44,7 @@ else: def skipIf(cond, msg): def skipIf_(f): + @wraps(f) def skipIf__(self): if cond: warnings.warn(msg) @@ -81,6 +83,7 @@ def decorate_all_tests(cls, decorator): def skip_if_no_uuid(f): """Decorator to skip a test if uuid is not supported by Py/PG.""" + @wraps(f) def skip_if_no_uuid_(self): try: import uuid @@ -104,6 +107,7 @@ def skip_if_no_uuid(f): def skip_if_tpc_disabled(f): """Skip a test if the server has tpc support disabled.""" + @wraps(f) def skip_if_tpc_disabled_(self): from psycopg2 import ProgrammingError cnn = self.connect() @@ -123,11 +127,11 @@ def skip_if_tpc_disabled(f): "set max_prepared_transactions to > 0 to run the test") return f(self) - skip_if_tpc_disabled_.__name__ = f.__name__ return skip_if_tpc_disabled_ def skip_if_no_namedtuple(f): + @wraps(f) def skip_if_no_namedtuple_(self): try: from collections import namedtuple @@ -136,12 +140,12 @@ def skip_if_no_namedtuple(f): else: return f(self) - skip_if_no_namedtuple_.__name__ = f.__name__ return skip_if_no_namedtuple_ def skip_if_no_iobase(f): """Skip a test if io.TextIOBase is not available.""" + @wraps(f) def skip_if_no_iobase_(self): try: from io import TextIOBase @@ -157,6 +161,7 @@ def skip_before_postgres(*ver): """Skip a test on PostgreSQL before a certain version.""" ver = ver + (0,) * (3 - len(ver)) def skip_before_postgres_(f): + @wraps(f) def skip_before_postgres__(self): if self.conn.server_version < int("%d%02d%02d" % ver): 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.""" ver = ver + (0,) * (3 - len(ver)) def skip_after_postgres_(f): + @wraps(f) def skip_after_postgres__(self): if self.conn.server_version >= int("%d%02d%02d" % ver): return self.skipTest("skipped because PostgreSQL %s" @@ -184,6 +190,7 @@ def skip_after_postgres(*ver): def skip_before_python(*ver): """Skip a test on Python before a certain version.""" def skip_before_python_(f): + @wraps(f) def skip_before_python__(self): if sys.version_info[:len(ver)] < ver: return self.skipTest("skipped because Python %s" @@ -197,6 +204,7 @@ def skip_before_python(*ver): def skip_from_python(*ver): """Skip a test on Python after (including) a certain version.""" def skip_from_python_(f): + @wraps(f) def skip_from_python__(self): if sys.version_info[:len(ver)] >= ver: return self.skipTest("skipped because Python %s" @@ -209,6 +217,7 @@ def skip_from_python(*ver): def skip_if_no_superuser(f): """Skip a test if the database user running the test is not a superuser""" + @wraps(f) def skip_if_no_superuser_(self): from psycopg2 import ProgrammingError try: @@ -222,16 +231,20 @@ def skip_if_no_superuser(f): return skip_if_no_superuser_ -def skip_copy_if_green(f): - def skip_copy_if_green_(self): - from testconfig import green - if green: - return self.skipTest("copy in async mode currently not supported") - else: - return f(self) +def skip_if_green(reason): + def skip_if_green_(f): + @wraps(f) + def skip_if_green__(self): + from testconfig import green + if green: + 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): """Convert a script to Python3 syntax if required."""