Mercurial > hg > toolbox
comparison test/test.py @ 0:b0942f44413f
import from git://github.com/mozilla/toolbox.git
| author | Jeff Hammel <k0scist@gmail.com> |
|---|---|
| date | Sun, 11 May 2014 09:15:35 -0700 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:b0942f44413f |
|---|---|
| 1 #!/usr/bin/env python | |
| 2 | |
| 3 """ | |
| 4 doctest runner for toolbox | |
| 5 """ | |
| 6 | |
| 7 import doctest | |
| 8 import json | |
| 9 import os | |
| 10 import shutil | |
| 11 import sys | |
| 12 from cgi import escape | |
| 13 from optparse import OptionParser | |
| 14 from paste.fixture import TestApp | |
| 15 from time import time | |
| 16 from toolbox.dispatcher import Dispatcher | |
| 17 | |
| 18 # global | |
| 19 directory = os.path.dirname(os.path.abspath(__file__)) | |
| 20 | |
| 21 | |
| 22 class ToolboxTestApp(TestApp): | |
| 23 """WSGI app wrapper for testing JSON responses""" | |
| 24 | |
| 25 def __init__(self, **kw): | |
| 26 dispatcher_args = dict(model_type='memory_cache', fields=('usage', 'author', 'type', 'language', 'dependencies')) | |
| 27 dispatcher_args.update(kw) | |
| 28 app = Dispatcher(**dispatcher_args) | |
| 29 TestApp.__init__(self, app) | |
| 30 | |
| 31 def get(self, url='/', **kwargs): | |
| 32 kwargs.setdefault('params', {})['format'] = 'json' | |
| 33 response = TestApp.get(self, url, **kwargs) | |
| 34 return json.loads(response.body) | |
| 35 | |
| 36 def new(self, **kwargs): | |
| 37 kwargs['form-render-date'] = str(time()) | |
| 38 return self.post('/new', params=kwargs) | |
| 39 | |
| 40 def cleanup(self): | |
| 41 pass | |
| 42 | |
| 43 | |
| 44 class FileCacheTestApp(ToolboxTestApp): | |
| 45 """test the MemoryCache file-backed backend""" | |
| 46 | |
| 47 def __init__(self): | |
| 48 self.json_dir = os.path.join(directory, 'test_json') | |
| 49 shutil.rmtree(self.json_dir, ignore_errors=True) | |
| 50 os.makedirs(self.json_dir) | |
| 51 ToolboxTestApp.__init__(self, model_type='file_cache', directory=self.json_dir) | |
| 52 | |
| 53 def cleanup(self): | |
| 54 shutil.rmtree(self.json_dir, ignore_errors=True) | |
| 55 | |
| 56 | |
| 57 class CouchTestApp(ToolboxTestApp): | |
| 58 """test the MemoryCache file-backed backend""" | |
| 59 | |
| 60 def __init__(self): | |
| 61 ToolboxTestApp.__init__(self, model_type='couch', dbname='test_json') | |
| 62 for project in self.app.model.projects(): | |
| 63 self.app.model.delete(project) | |
| 64 | |
| 65 def cleanup(self): | |
| 66 for project in self.app.model.projects(): | |
| 67 self.app.model.delete(project) | |
| 68 | |
| 69 | |
| 70 app_classes = {'memory_cache': ToolboxTestApp, | |
| 71 'file_cache': FileCacheTestApp, | |
| 72 'couch': CouchTestApp} | |
| 73 | |
| 74 | |
| 75 def run_tests(app_cls, | |
| 76 raise_on_error=False, | |
| 77 cleanup=True, | |
| 78 report_first=False, | |
| 79 output=sys.stdout): | |
| 80 | |
| 81 results = {} | |
| 82 | |
| 83 # gather tests | |
| 84 tests = [ test for test in os.listdir(directory) | |
| 85 if test.endswith('.txt') ] | |
| 86 output.write("Tests:\n%s\n" % '\n'.join(tests)) | |
| 87 | |
| 88 for test in tests: | |
| 89 | |
| 90 # create an app | |
| 91 app = app_cls() | |
| 92 | |
| 93 # doctest arguments | |
| 94 extraglobs = {'here': directory, 'app': app, 'urlescape': escape} | |
| 95 doctest_args = dict(extraglobs=extraglobs, raise_on_error=raise_on_error) | |
| 96 if report_first: | |
| 97 doctest_args['optionflags'] = doctest.REPORT_ONLY_FIRST_FAILURE | |
| 98 | |
| 99 # run the test | |
| 100 try: | |
| 101 results[test] = doctest.testfile(test, **doctest_args) | |
| 102 except doctest.DocTestFailure, failure: | |
| 103 raise | |
| 104 except doctest.UnexpectedException, failure: | |
| 105 raise failure.exc_info[0], failure.exc_info[1], failure.exc_info[2] | |
| 106 finally: | |
| 107 if cleanup: | |
| 108 app.cleanup() | |
| 109 | |
| 110 return results | |
| 111 | |
| 112 | |
| 113 def main(args=sys.argv[1:]): | |
| 114 | |
| 115 # parse command line args | |
| 116 parser = OptionParser() | |
| 117 parser.add_option('--no-cleanup', dest='cleanup', | |
| 118 default=True, action='store_false', | |
| 119 help="cleanup following the tests") | |
| 120 parser.add_option('--raise', dest='raise_on_error', | |
| 121 default=False, action='store_true', | |
| 122 help="raise on first error") | |
| 123 parser.add_option('--report-first', dest='report_first', | |
| 124 default=False, action='store_true', | |
| 125 help="report the first error only (all tests will still run)") | |
| 126 parser.add_option('--model', dest='model', default='file_cache', | |
| 127 help="model to use") | |
| 128 options, args = parser.parse_args(args) | |
| 129 | |
| 130 # get arguments to run_tests | |
| 131 kw = dict([(i, getattr(options, i)) for i in ('raise_on_error', 'cleanup', 'report_first')]) | |
| 132 if options.model is not None: | |
| 133 try: | |
| 134 kw['app_cls'] = app_classes[options.model] | |
| 135 except KeyError: | |
| 136 parser.error("Model '%s' unknown (choose from: %s)" % (options.model, app_classes.keys())) | |
| 137 | |
| 138 # run the tests | |
| 139 results = run_tests(**kw) | |
| 140 if sum([i.failed for i in results.values()]): | |
| 141 sys.exit(1) # error | |
| 142 | |
| 143 | |
| 144 if __name__ == '__main__': | |
| 145 main() |
