Mercurial > hg > simpypi
annotate tests/test.py @ 74:0e84dd7d740a
note additional dependency
| author | Jeff Hammel <jhammel@mozilla.com> |
|---|---|
| date | Fri, 02 Mar 2012 13:12:08 -0800 |
| parents | e62d2fddb275 |
| children |
| rev | line source |
|---|---|
| 6 | 1 #!/usr/bin/env python |
| 2 | |
| 3 """ | |
| 32 | 4 doctest runner for simpypi tests |
| 6 | 5 """ |
| 6 | |
|
58
cd88f80d1ab1
note about changing test fixtures
Jeff Hammel <jhammel@mozilla.com>
parents:
57
diff
changeset
|
7 # XXX could use http://blog.ianbicking.org/2010/04/02/webtest-http-testing/ |
|
cd88f80d1ab1
note about changing test fixtures
Jeff Hammel <jhammel@mozilla.com>
parents:
57
diff
changeset
|
8 # vs paste.fixture.TestApp: |
|
cd88f80d1ab1
note about changing test fixtures
Jeff Hammel <jhammel@mozilla.com>
parents:
57
diff
changeset
|
9 # http://pythonpaste.org/testing-applications.html |
|
cd88f80d1ab1
note about changing test fixtures
Jeff Hammel <jhammel@mozilla.com>
parents:
57
diff
changeset
|
10 |
| 6 | 11 import doctest |
|
64
bb8d993376aa
* convenience methods for multipart form
Jeff Hammel <jhammel@mozilla.com>
parents:
63
diff
changeset
|
12 import multipart |
| 6 | 13 import os |
| 8 | 14 import shutil |
| 6 | 15 import sys |
| 8 | 16 import tempfile |
|
56
2e60fb704454
add test server to the test globs
Jeff Hammel <jhammel@mozilla.com>
parents:
55
diff
changeset
|
17 import testserver |
|
55
143adebe4caa
install package in a virtualenv and make sure importing is sane
Jeff Hammel <jhammel@mozilla.com>
parents:
32
diff
changeset
|
18 import virtualenv |
| 6 | 19 from optparse import OptionParser |
| 9 | 20 |
|
55
143adebe4caa
install package in a virtualenv and make sure importing is sane
Jeff Hammel <jhammel@mozilla.com>
parents:
32
diff
changeset
|
21 def create_virtualenv(path): |
|
143adebe4caa
install package in a virtualenv and make sure importing is sane
Jeff Hammel <jhammel@mozilla.com>
parents:
32
diff
changeset
|
22 """create a virtualenv and return the path to the python interpreter therein""" |
|
68
e62d2fddb275
use the actual paths i mean
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
23 |
|
55
143adebe4caa
install package in a virtualenv and make sure importing is sane
Jeff Hammel <jhammel@mozilla.com>
parents:
32
diff
changeset
|
24 virtualenv.create_environment(path) |
|
68
e62d2fddb275
use the actual paths i mean
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
25 |
|
65
83327bc715be
make the virtualenv convenience method return more stuff
Jeff Hammel <jhammel@mozilla.com>
parents:
64
diff
changeset
|
26 for scripts, ext in (('bin', ''), ('Scripts', '.exe')): |
|
83327bc715be
make the virtualenv convenience method return more stuff
Jeff Hammel <jhammel@mozilla.com>
parents:
64
diff
changeset
|
27 scripts = os.path.join(path, scripts) |
|
83327bc715be
make the virtualenv convenience method return more stuff
Jeff Hammel <jhammel@mozilla.com>
parents:
64
diff
changeset
|
28 if os.path.exists(scripts): |
|
83327bc715be
make the virtualenv convenience method return more stuff
Jeff Hammel <jhammel@mozilla.com>
parents:
64
diff
changeset
|
29 break |
|
83327bc715be
make the virtualenv convenience method return more stuff
Jeff Hammel <jhammel@mozilla.com>
parents:
64
diff
changeset
|
30 else: |
|
83327bc715be
make the virtualenv convenience method return more stuff
Jeff Hammel <jhammel@mozilla.com>
parents:
64
diff
changeset
|
31 raise Exception("bin/Scripts not found in %s" % path) |
|
83327bc715be
make the virtualenv convenience method return more stuff
Jeff Hammel <jhammel@mozilla.com>
parents:
64
diff
changeset
|
32 binaries = ['python', 'easy_install', 'pip'] |
|
68
e62d2fddb275
use the actual paths i mean
Jeff Hammel <jhammel@mozilla.com>
parents:
65
diff
changeset
|
33 binaries = dict([(i, os.path.join(scripts, i + ext)) for i in binaries]) |
|
65
83327bc715be
make the virtualenv convenience method return more stuff
Jeff Hammel <jhammel@mozilla.com>
parents:
64
diff
changeset
|
34 return type('virtualenv', (), binaries) |
|
55
143adebe4caa
install package in a virtualenv and make sure importing is sane
Jeff Hammel <jhammel@mozilla.com>
parents:
32
diff
changeset
|
35 |
| 6 | 36 def run_tests(raise_on_error=False, report_first=False): |
| 37 | |
| 38 # add results here | |
| 39 results = {} | |
| 40 | |
| 41 # doctest arguments | |
| 42 directory = os.path.dirname(os.path.abspath(__file__)) | |
|
56
2e60fb704454
add test server to the test globs
Jeff Hammel <jhammel@mozilla.com>
parents:
55
diff
changeset
|
43 extraglobs = {'here': directory, |
|
2e60fb704454
add test server to the test globs
Jeff Hammel <jhammel@mozilla.com>
parents:
55
diff
changeset
|
44 'create_virtualenv': create_virtualenv, |
|
64
bb8d993376aa
* convenience methods for multipart form
Jeff Hammel <jhammel@mozilla.com>
parents:
63
diff
changeset
|
45 'testserver': testserver.TestWSGIServer, |
|
bb8d993376aa
* convenience methods for multipart form
Jeff Hammel <jhammel@mozilla.com>
parents:
63
diff
changeset
|
46 'MultiPartForm': multipart.MultiPartForm |
|
bb8d993376aa
* convenience methods for multipart form
Jeff Hammel <jhammel@mozilla.com>
parents:
63
diff
changeset
|
47 } |
| 6 | 48 doctest_args = dict(extraglobs=extraglobs, raise_on_error=raise_on_error) |
| 49 if report_first: | |
| 50 doctest_args['optionflags'] = doctest.REPORT_ONLY_FIRST_FAILURE | |
| 51 | |
| 52 # gather tests | |
|
63
af1476a936fc
add a multipart processor so we can post damn files
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
53 tests = [test for test in os.listdir(directory) |
|
af1476a936fc
add a multipart processor so we can post damn files
Jeff Hammel <jhammel@mozilla.com>
parents:
61
diff
changeset
|
54 if test.endswith('.txt')] |
| 6 | 55 |
| 56 # run the tests | |
| 57 for test in tests: | |
| 8 | 58 |
| 59 # make a temporary directory | |
| 60 tmpdir = tempfile.mkdtemp() | |
| 61 doctest_args['extraglobs']['directory'] = tmpdir | |
| 62 | |
| 6 | 63 try: |
| 64 results[test] = doctest.testfile(test, **doctest_args) | |
| 65 except doctest.DocTestFailure, failure: | |
| 66 raise | |
| 67 except doctest.UnexpectedException, failure: | |
| 68 raise failure.exc_info[0], failure.exc_info[1], failure.exc_info[2] | |
| 8 | 69 finally: |
| 70 if os.path.exists(tmpdir): | |
| 71 shutil.rmtree(tmpdir) | |
| 6 | 72 |
| 73 return results | |
| 74 | |
| 75 def main(args=sys.argv[1:]): | |
| 76 | |
| 77 # parse command line args | |
| 78 parser = OptionParser(description=__doc__) | |
| 79 parser.add_option('--raise', dest='raise_on_error', | |
| 80 default=False, action='store_true', | |
| 81 help="raise on first error") | |
| 82 parser.add_option('--report-first', dest='report_first', | |
| 83 default=False, action='store_true', | |
| 84 help="report the first error only (all tests will still run)") | |
| 85 options, args = parser.parse_args(args) | |
| 86 | |
| 87 # run the tests | |
| 88 results = run_tests(**options.__dict__) | |
| 89 if sum([i.failed for i in results.values()]): | |
| 90 sys.exit(1) # error | |
| 91 | |
| 92 if __name__ == '__main__': | |
| 93 main() | |
| 94 |
