tests/test_jsondb.py: add tests that replace a StoredDict element
after its parent has been removed. Related: #10000
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import contextlib
|
import contextlib
|
||||||
import copy
|
import copy
|
||||||
import traceback
|
import traceback
|
||||||
|
import json
|
||||||
|
|
||||||
import jsonpatch
|
import jsonpatch
|
||||||
from jsonpatch import JsonPatchException
|
from jsonpatch import JsonPatchException
|
||||||
@@ -8,6 +9,7 @@ from jsonpointer import JsonPointerException
|
|||||||
|
|
||||||
from . import ElectrumTestCase
|
from . import ElectrumTestCase
|
||||||
|
|
||||||
|
from electrum.json_db import JsonDB
|
||||||
|
|
||||||
class TestJsonpatch(ElectrumTestCase):
|
class TestJsonpatch(ElectrumTestCase):
|
||||||
|
|
||||||
@@ -84,3 +86,50 @@ class TestJsonpatch(ElectrumTestCase):
|
|||||||
with self._customAssertRaises(JsonPointerException) as ctx:
|
with self._customAssertRaises(JsonPointerException) as ctx:
|
||||||
data2 = jpatch.apply(data1)
|
data2 = jpatch.apply(data1)
|
||||||
fail_if_leaking_secret(ctx)
|
fail_if_leaking_secret(ctx)
|
||||||
|
|
||||||
|
|
||||||
|
class TestJsonDB(ElectrumTestCase):
|
||||||
|
|
||||||
|
async def test_jsonpatch_replace_after_remove(self):
|
||||||
|
data = { 'a':{} }
|
||||||
|
# op "add"
|
||||||
|
patches = [{"op": "add", "path": "/a/b", "value": "42"}]
|
||||||
|
jpatch = jsonpatch.JsonPatch(patches)
|
||||||
|
data = jpatch.apply(data)
|
||||||
|
# remove
|
||||||
|
patches = [{"op": "remove", "path": "/a/b"}]
|
||||||
|
jpatch = jsonpatch.JsonPatch(patches)
|
||||||
|
data = jpatch.apply(data)
|
||||||
|
# replace
|
||||||
|
patches = [{"op": "replace", "path": "/a/b", "value": "43"}]
|
||||||
|
jpatch = jsonpatch.JsonPatch(patches)
|
||||||
|
with self.assertRaises(JsonPatchException):
|
||||||
|
data = jpatch.apply(data)
|
||||||
|
|
||||||
|
async def test_jsondb_replace_after_remove(self):
|
||||||
|
data = { 'a': {'b': {'c': 0}}}
|
||||||
|
db = JsonDB(repr(data))
|
||||||
|
a = db.get_dict('a')
|
||||||
|
# remove
|
||||||
|
b = a.pop('b')
|
||||||
|
self.assertEqual(len(db.pending_changes), 1)
|
||||||
|
# replace item. this must not been written to db
|
||||||
|
b['c'] = 42
|
||||||
|
self.assertEqual(len(db.pending_changes), 1)
|
||||||
|
patches = json.loads('[' + ','.join(db.pending_changes) + ']')
|
||||||
|
jpatch = jsonpatch.JsonPatch(patches)
|
||||||
|
data = jpatch.apply(data)
|
||||||
|
|
||||||
|
async def test_jsondb_replace_after_remove_nested(self):
|
||||||
|
data = { 'a': {'b':{'c':0}}}
|
||||||
|
db = JsonDB(repr(data))
|
||||||
|
# remove
|
||||||
|
a = db.data.pop('a')
|
||||||
|
self.assertEqual(len(db.pending_changes), 1)
|
||||||
|
b = a['b']
|
||||||
|
# replace item. this must not be written to db
|
||||||
|
b['c'] = 42
|
||||||
|
self.assertEqual(len(db.pending_changes), 1)
|
||||||
|
patches = json.loads('[' + ','.join(db.pending_changes) + ']')
|
||||||
|
jpatch = jsonpatch.JsonPatch(patches)
|
||||||
|
data = jpatch.apply(data)
|
||||||
|
|||||||
Reference in New Issue
Block a user