update "test" behaviour according to latest spec

This commit is contained in:
Stefan Kögl
2012-09-17 20:13:01 +02:00
parent 46334177e5
commit d27ea8ca45
3 changed files with 45 additions and 6 deletions

2
README
View File

@@ -3,7 +3,7 @@ python-json-patch: Applying JSON Patches
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Library to apply JSON Patches according to
http://tools.ietf.org/html/draft-ietf-appsawg-json-patch-03
http://tools.ietf.org/html/draft-ietf-appsawg-json-patch-04
See Sourcecode for Examples

View File

@@ -31,7 +31,7 @@
#
"""Apply JSON-Patches according to
http://tools.ietf.org/html/draft-ietf-appsawg-json-patch-03"""
http://tools.ietf.org/html/draft-ietf-appsawg-json-patch-04"""
# Will be parsed by setup.py to determine package metadata
__author__ = 'Stefan Kögl <stefan@skoegl.net>'
@@ -63,6 +63,9 @@ class JsonPatchConflict(JsonPatchException):
- etc.
"""
class JsonPatchTestFailed(JsonPatchException, AssertionError):
""" A Test operation failed """
def apply_patch(doc, patch, in_place=False):
"""Apply list of patches to specified json document.
@@ -412,9 +415,17 @@ class TestOperation(PatchOperation):
"""Test value by specified location."""
def apply(self, obj):
value = self.operation['value']
try:
subobj, part = self.locate(obj, self.location)
assert subobj[part] == value
except JsonPatchConflict, c:
raise JsonPatchTestFailed(str(c))
val = subobj[part]
if 'value' in self.operation:
value = self.operation['value']
if val != value:
raise JsonPatchTestFailed('%s is not equal to tested value %s' % (val, value))
class CopyOperation(PatchOperation):

View File

@@ -105,11 +105,39 @@ class ApplyPatchTestCase(unittest.TestCase):
def test_test_error(self):
obj = {'bar': 'qux'}
self.assertRaises(AssertionError,
self.assertRaises(jsonpatch.JsonPatchTestFailed,
jsonpatch.apply_patch,
obj, [{'test': '/bar', 'value': 'bar'}])
def test_test_not_existing(self):
obj = {'bar': 'qux'}
self.assertRaises(jsonpatch.JsonPatchTestFailed,
jsonpatch.apply_patch,
obj, [{'test': '/baz', 'value': 'bar'}])
def test_test_noval_existing(self):
obj = {'bar': 'qux'}
jsonpatch.apply_patch(obj, [{'test': '/bar'}])
def test_test_noval_not_existing(self):
obj = {'bar': 'qux'}
self.assertRaises(jsonpatch.JsonPatchTestFailed,
jsonpatch.apply_patch,
obj, [{'test': '/baz'}])
def test_test_noval_not_existing_nested(self):
obj = {'bar': {'qux': 2}}
self.assertRaises(jsonpatch.JsonPatchTestFailed,
jsonpatch.apply_patch,
obj, [{'test': '/baz/qx'}])
class MakePatchTestCase(unittest.TestCase):
def test_apply_patch_to_copy(self):