diff options
author | Stefan Kögl <stefan@skoegl.net> | 2012-12-14 12:37:46 +0100 |
---|---|---|
committer | Stefan Kögl <stefan@skoegl.net> | 2012-12-14 12:37:46 +0100 |
commit | d2c553591bbbaf72d74e93f75d49fb1bd839c0c0 (patch) | |
tree | bd38d47008d495f4433a3642bdc648fd91318e02 /ext_tests.py | |
parent | 16a766075173d4437c26bc5551b5efab1669afbd (diff) | |
download | python-json-patch-d2c553591bbbaf72d74e93f75d49fb1bd839c0c0.tar.gz |
script for running external tests from a json file
Diffstat (limited to 'ext_tests.py')
-rwxr-xr-x | ext_tests.py | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/ext_tests.py b/ext_tests.py new file mode 100755 index 0000000..ade3cbf --- /dev/null +++ b/ext_tests.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# python-json-patch - An implementation of the JSON Patch format +# https://github.com/stefankoegl/python-json-patch +# +# Copyright (c) 2011 Stefan Kögl <stefan@skoegl.net> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +""" Script to run external tests, eg from +https://github.com/json-patch/json-patch-tests """ + +from functools import partial +import json +import doctest +import unittest +import jsonpatch +import sys + + +class TestCaseTemplate(unittest.TestCase): + """ A generic test case for running external tests """ + + def _test(self, test): + if not 'doc' in test or not 'patch' in test: + # incomplete + return + + if 'error' in test: + self.assertRaises( + (jsonpatch.JsonPatchException, jsonpatch.JsonPointerException), + jsonpatch.apply_patch, test['doc'], test['patch'] + ) + + else: + res = jsonpatch.apply_patch(test['doc'], test['patch']) + self.assertEquals(res, test['expected']) + + +def make_test_case(tests): + + class MyTestCase(TestCaseTemplate): + pass + + for n, test in enumerate(tests): + add_test_method(MyTestCase, 'test_%d' % n, test) + + return MyTestCase + + +def add_test_method(cls, name, test): + setattr(cls, name, lambda self: self._test(test)) + + + +modules = ['jsonpatch'] +coverage_modules = [] + + +def get_suite(filenames): + suite = unittest.TestSuite() + + for testfile in filenames: + with open(testfile) as f: + tests = json.load(f) + cls = make_test_case(tests) + suite.addTest(unittest.makeSuite(cls)) + + return suite + + +suite = get_suite(sys.argv[1:]) + +for module in modules: + m = __import__(module, fromlist=[module]) + coverage_modules.append(m) + suite.addTest(doctest.DocTestSuite(m)) + +runner = unittest.TextTestRunner(verbosity=1) + +try: + import coverage +except ImportError: + coverage = None + +if coverage is not None: + coverage.erase() + coverage.start() + +result = runner.run(suite) + +if not result.wasSuccessful(): + sys.exit(1) + +if coverage is not None: + coverage.stop() + coverage.report(coverage_modules) + coverage.erase() + +if coverage is None: + sys.stderr.write(""" +No coverage reporting done (Python module "coverage" is missing) +Please install the python-coverage package to get coverage reporting. +""") + sys.stderr.flush() |