Skip to content

Commit ca40156

Browse files
committed
Replace existing run_tests.py script with a pytest script
The existing run_test.py script is quite old, a bit restrictive, and doesn't always behave as documented. The pytest testing tool is mature, well documented, and maintained. The run_tests.py script is generating by installing py.test and running: py.tests --genscript=run_tests.py Note: to generate a script that is compatible with python2.6 the command needs to be run using python2.6
1 parent 4dba96b commit ca40156

File tree

9 files changed

+3234
-896
lines changed

9 files changed

+3234
-896
lines changed

run_tests.py

Lines changed: 3124 additions & 873 deletions
Large diffs are not rendered by default.

test/db_test_base.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import gpgmelib
2121
from email.parser import FeedParser
2222

23+
import pytest
2324
from roundup.hyperdb import String, Password, Link, Multilink, Date, \
2425
Interval, DatabaseError, Boolean, Number, Node
2526
from roundup.mailer import Mailer
@@ -2019,14 +2020,12 @@ def dummy_snd(s, to, msg, res=res) :
20192020
roundupdb._ = old_translate_
20202021
Mailer.smtp_send = backup
20212022

2023+
@pytest.mark.skipif(gpgmelib.pyme is None, reason='Skipping PGPNosy test')
20222024
def testPGPNosyMail(self) :
20232025
"""Creates one issue with two attachments, one smaller and one larger
20242026
than the set max_attachment_size. Recipients are one with and
20252027
one without encryption enabled via a gpg group.
20262028
"""
2027-
if gpgmelib.pyme is None:
2028-
print "Skipping PGPNosy test"
2029-
return
20302029
old_translate_ = roundupdb._
20312030
roundupdb._ = i18n.get_translation(language='C').gettext
20322031
db = self.db

test/test_dates.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,19 @@
2020
import datetime
2121
import calendar
2222

23+
import pytest
2324
from roundup import date, i18n
2425
from roundup.date import Date, Interval, Range, fixTimeOverflow, \
2526
get_timezone
2627

28+
try:
29+
import pytz
30+
SKIP_PYTZ = False
31+
except ImportError:
32+
SKIP_PYTZ = True
33+
34+
skip_pytz = pytest.mark.skipif(SKIP_PYTZ, reason="'pytz' not installed")
35+
2736

2837
class DateTestCase(unittest.TestCase):
2938
def setUp(self):
@@ -452,6 +461,8 @@ def testTimestamp(self):
452461
ae (date.timestamp(), -61125753600.0)
453462
ae(str(date), '0033-01-01.00:00:00')
454463

464+
465+
@skip_pytz
455466
class TimezoneTestCase(unittest.TestCase):
456467

457468
def testTZ(self):

test/test_indexer.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,27 @@
2020

2121
import os, unittest, shutil
2222

23+
import pytest
2324
from roundup.backends import get_backend, have_backend
2425
from roundup.backends.indexer_rdbms import Indexer
2526

2627
# borrow from other tests
2728
from db_test_base import setupSchema, config
28-
from test_postgresql import postgresqlOpener
29-
from test_mysql import mysqlOpener
29+
from .test_postgresql import postgresqlOpener, skip_postgresql
30+
from .test_mysql import mysqlOpener, skip_mysql
3031
from test_sqlite import sqliteOpener
3132

33+
try:
34+
import xapian
35+
SKIP_XAPIAN = False
36+
except ImportError:
37+
SKIP_XAPIAN = True
38+
39+
skip_xapian = pytest.mark.skipif(
40+
SKIP_XAPIAN,
41+
reason="Skipping Xapian indexer tests: 'xapian' not installed")
42+
43+
3244
class db:
3345
class config(dict):
3446
DATABASE = 'test-index'
@@ -139,6 +151,8 @@ def test_manyresults(self):
139151
def tearDown(self):
140152
shutil.rmtree('test-index')
141153

154+
155+
@skip_xapian
142156
class XapianIndexerTest(IndexerTest):
143157
def setUp(self):
144158
if os.path.exists('test-index'):
@@ -164,6 +178,7 @@ def tearDown(self):
164178
shutil.rmtree(config.DATABASE)
165179

166180

181+
@skip_postgresql
167182
class postgresqlIndexerTest(postgresqlOpener, RDBMSIndexerTest, IndexerTest):
168183
def setUp(self):
169184
postgresqlOpener.setUp(self)
@@ -173,6 +188,7 @@ def tearDown(self):
173188
postgresqlOpener.tearDown(self)
174189

175190

191+
@skip_mysql
176192
class mysqlIndexerTest(mysqlOpener, RDBMSIndexerTest, IndexerTest):
177193
def setUp(self):
178194
mysqlOpener.setUp(self)

test/test_mailgw.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,16 @@
1515
import gpgmelib
1616
import unittest, tempfile, os, shutil, errno, imp, sys, difflib, time
1717

18+
import pytest
19+
1820
try:
1921
import pyme, pyme.core
22+
SKIP_PGP = False
2023
except ImportError:
21-
pyme = None
24+
SKIP_PGP = True
25+
26+
skip_pgp = pytest.mark.skipif(
27+
SKIP_PGP, reason="Skipping PGP tests: 'pyme' not installed")
2228

2329

2430
from cStringIO import StringIO
@@ -3263,6 +3269,7 @@ def testForwardedMessageAttachment(self):
32633269
self.assertEqual(self.db.file.get(fileid, 'type'), 'message/rfc822')
32643270

32653271

3272+
@skip_pgp
32663273
class MailgwPGPTestCase(MailgwTestAbstractBase, unittest.TestCase):
32673274
pgphome = gpgmelib.pgphome
32683275
def setUp(self):

test/test_mysql.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import unittest, os, shutil, time, imp
1919

20+
import pytest
2021
from roundup.hyperdb import DatabaseError
2122
from roundup.backends import get_backend, have_backend
2223

@@ -39,24 +40,44 @@ def nuke_database(self):
3940
self.module.db_nuke(config)
4041

4142

43+
if not have_backend('mysql'):
44+
SKIP_MYSQL = True
45+
SKIP_MYSQL_REASON = 'Skipping MySQL tests: not enabled'
46+
else:
47+
try:
48+
import MySQLdb
49+
mysqlOpener.module.db_exists(config)
50+
SKIP_MYSQL = False
51+
SKIP_MYSQL_REASON = ''
52+
except (MySQLdb.MySQLError, DatabaseError) as msg:
53+
SKIP_MYSQL = True
54+
SKIP_MYSQL_REASON = 'Skipping MySQL tests: %s' % str(msg)
55+
56+
skip_mysql = pytest.mark.skipif(SKIP_MYSQL, reason=SKIP_MYSQL_REASON)
57+
58+
59+
@skip_mysql
4260
class mysqlDBTest(mysqlOpener, DBTest, unittest.TestCase):
4361
def setUp(self):
4462
mysqlOpener.setUp(self)
4563
DBTest.setUp(self)
4664

4765

66+
@skip_mysql
4867
class mysqlROTest(mysqlOpener, ROTest, unittest.TestCase):
4968
def setUp(self):
5069
mysqlOpener.setUp(self)
5170
ROTest.setUp(self)
5271

5372

73+
@skip_mysql
5474
class mysqlSchemaTest(mysqlOpener, SchemaTest, unittest.TestCase):
5575
def setUp(self):
5676
mysqlOpener.setUp(self)
5777
SchemaTest.setUp(self)
5878

5979

80+
@skip_mysql
6081
class mysqlClassicInitTest(mysqlOpener, ClassicInitTest, unittest.TestCase):
6182
backend = 'mysql'
6283
def setUp(self):
@@ -67,6 +88,7 @@ def tearDown(self):
6788
self.nuke_database()
6889

6990

91+
@skip_mysql
7092
class mysqlConcurrencyTest(mysqlOpener, ConcurrentDBTest, unittest.TestCase):
7193
backend = 'mysql'
7294
def setUp(self):
@@ -77,6 +99,7 @@ def tearDown(self):
7799
self.nuke_database()
78100

79101

102+
@skip_mysql
80103
class mysqlHTMLItemTest(mysqlOpener, HTMLItemTest, unittest.TestCase):
81104
backend = 'mysql'
82105
def setUp(self):
@@ -87,6 +110,7 @@ def tearDown(self):
87110
self.nuke_database()
88111

89112

113+
@skip_mysql
90114
class mysqlFilterCacheTest(mysqlOpener, FilterCacheTest, unittest.TestCase):
91115
backend = 'mysql'
92116
def setUp(self):
@@ -98,6 +122,7 @@ def tearDown(self):
98122

99123

100124
from session_common import RDBMSTest
125+
@skip_mysql
101126
class mysqlSessionTest(mysqlOpener, RDBMSTest, unittest.TestCase):
102127
def setUp(self):
103128
mysqlOpener.setUp(self)

test/test_postgresql.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import unittest
1919

20+
import pytest
2021
from roundup.hyperdb import DatabaseError
2122

2223
from db_test_base import DBTest, ROTest, config, SchemaTest, ClassicInitTest
@@ -25,6 +26,15 @@
2526

2627
from roundup.backends import get_backend, have_backend
2728

29+
if not have_backend('postgresql'):
30+
SKIP_POSTGRESQL = True
31+
else:
32+
SKIP_POSTGRESQL = False
33+
34+
skip_postgresql = pytest.mark.skipif(
35+
SKIP_POSTGRESQL, reason='Skipping PostgreSQL tests: not enabled')
36+
37+
2838
class postgresqlOpener:
2939
if have_backend('postgresql'):
3040
module = get_backend('postgresql')
@@ -40,6 +50,7 @@ def nuke_database(self):
4050
self.module.db_nuke(config)
4151

4252

53+
@skip_postgresql
4354
class postgresqlDBTest(postgresqlOpener, DBTest, unittest.TestCase):
4455
def setUp(self):
4556
postgresqlOpener.setUp(self)
@@ -50,6 +61,7 @@ def tearDown(self):
5061
postgresqlOpener.tearDown(self)
5162

5263

64+
@skip_postgresql
5365
class postgresqlROTest(postgresqlOpener, ROTest, unittest.TestCase):
5466
def setUp(self):
5567
postgresqlOpener.setUp(self)
@@ -60,6 +72,7 @@ def tearDown(self):
6072
postgresqlOpener.tearDown(self)
6173

6274

75+
@skip_postgresql
6376
class postgresqlConcurrencyTest(postgresqlOpener, ConcurrentDBTest,
6477
unittest.TestCase):
6578
backend = 'postgresql'
@@ -72,6 +85,7 @@ def tearDown(self):
7285
postgresqlOpener.tearDown(self)
7386

7487

88+
@skip_postgresql
7589
class postgresqlJournalTest(postgresqlOpener, ClassicInitBase,
7690
unittest.TestCase):
7791
backend = 'postgresql'
@@ -122,6 +136,7 @@ def testConcurrentRepeatableRead(self):
122136
self.assertRaises(exc, self._test_journal, [])
123137

124138

139+
@skip_postgresql
125140
class postgresqlHTMLItemTest(postgresqlOpener, HTMLItemTest,
126141
unittest.TestCase):
127142
backend = 'postgresql'
@@ -134,6 +149,7 @@ def tearDown(self):
134149
postgresqlOpener.tearDown(self)
135150

136151

152+
@skip_postgresql
137153
class postgresqlFilterCacheTest(postgresqlOpener, FilterCacheTest,
138154
unittest.TestCase):
139155
backend = 'postgresql'
@@ -146,6 +162,7 @@ def tearDown(self):
146162
postgresqlOpener.tearDown(self)
147163

148164

165+
@skip_postgresql
149166
class postgresqlSchemaTest(postgresqlOpener, SchemaTest, unittest.TestCase):
150167
def setUp(self):
151168
postgresqlOpener.setUp(self)
@@ -156,6 +173,7 @@ def tearDown(self):
156173
postgresqlOpener.tearDown(self)
157174

158175

176+
@skip_postgresql
159177
class postgresqlClassicInitTest(postgresqlOpener, ClassicInitTest,
160178
unittest.TestCase):
161179
backend = 'postgresql'
@@ -169,6 +187,7 @@ def tearDown(self):
169187

170188

171189
from session_common import RDBMSTest
190+
@skip_postgresql
172191
class postgresqlSessionTest(postgresqlOpener, RDBMSTest, unittest.TestCase):
173192
def setUp(self):
174193
postgresqlOpener.setUp(self)

test/test_userauditor.py

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import os, unittest, shutil
2+
3+
import pytest
4+
25
from db_test_base import setupTracker
6+
from .test_dates import skip_pytz
7+
38

49
class UserAuditorTest(unittest.TestCase):
510
def setUp(self):
@@ -8,12 +13,6 @@ def setUp(self):
813
self.db = self.instance.open('admin')
914
self.db.tx_Source = "cli"
1015

11-
try:
12-
import pytz
13-
self.pytz = True
14-
except ImportError:
15-
self.pytz = False
16-
1716
self.db.user.create(username='kyle', address='[email protected]',
1817
realname='Kyle Broflovski', roles='User')
1918

@@ -34,19 +33,21 @@ def testBadTimezones(self):
3433
self.assertRaises(ValueError, self.db.user.set, userid, timezone='-24')
3534
self.assertRaises(ValueError, self.db.user.set, userid, timezone='-3000')
3635

37-
if self.pytz:
38-
try:
39-
from pytz import UnknownTimeZoneError
40-
except:
41-
UnknownTimeZoneError = ValueError
42-
self.assertRaises(UnknownTimeZoneError, self.db.user.set, userid, timezone='MiddleOf/Nowhere')
36+
@skip_pytz
37+
def testBadTimezonesPyTZ(self):
38+
userid = self.db.user.lookup('kyle')
39+
40+
try:
41+
from pytz import UnknownTimeZoneError
42+
except:
43+
UnknownTimeZoneError = ValueError
44+
45+
self.assertRaises(UnknownTimeZoneError, self.db.user.set, userid,
46+
timezone='MiddleOf/Nowhere')
4347

4448
def testGoodTimezones(self):
4549
self.db.user.create(username='test_user01', timezone='12')
4650

47-
if self.pytz:
48-
self.db.user.create(username='test_user02', timezone='MST')
49-
5051
userid = self.db.user.lookup('kyle')
5152

5253
# TODO: roundup should accept non-integer offsets since those are valid
@@ -57,8 +58,12 @@ def testGoodTimezones(self):
5758
self.db.user.set(userid, timezone='23')
5859
self.db.user.set(userid, timezone='0')
5960

60-
if self.pytz:
61-
self.db.user.set(userid, timezone='US/Eastern')
61+
@skip_pytz
62+
def testGoodTimezonesPyTZ(self):
63+
userid = self.db.user.lookup('kyle')
64+
65+
self.db.user.create(username='test_user02', timezone='MST')
66+
self.db.user.set(userid, timezone='US/Eastern')
6267

6368
def testBadEmailAddresses(self):
6469
userid = self.db.user.lookup('kyle')

0 commit comments

Comments
 (0)