update "test" behaviour according to latest spec
This commit is contained in:
2
README
2
README
@@ -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
|
||||
|
||||
|
||||
17
jsonpatch.py
17
jsonpatch.py
@@ -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):
|
||||
|
||||
30
tests.py
30
tests.py
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user