summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kögl <stefan@skoegl.net>2012-12-14 12:37:46 +0100
committerStefan Kögl <stefan@skoegl.net>2012-12-14 12:37:46 +0100
commitd2c553591bbbaf72d74e93f75d49fb1bd839c0c0 (patch)
treebd38d47008d495f4433a3642bdc648fd91318e02
parent16a766075173d4437c26bc5551b5efab1669afbd (diff)
downloadpython-json-patch-d2c553591bbbaf72d74e93f75d49fb1bd839c0c0.tar.gz
script for running external tests from a json file
-rwxr-xr-xext_tests.py129
-rw-r--r--test.py21
2 files changed, 129 insertions, 21 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()
diff --git a/test.py b/test.py
deleted file mode 100644
index e8c4c9e..0000000
--- a/test.py
+++ /dev/null
@@ -1,21 +0,0 @@
-
-import jsonpatch
-import json
-
-
-def run_test(test):
- if 'comment' in test:
- print test['comment']
-
- if 'doc' in test and 'patch' in test:
- try:
- res = jsonpatch.apply_patch(test['doc'], test['patch'])
-
-
-
-
-
-def tests_from_obj(tests):
- for test in tests:
- run_test(test)
-