147 lines
4.4 KiB
Python
147 lines
4.4 KiB
Python
|
|
import os
|
||
|
|
import json
|
||
|
|
import unittest
|
||
|
|
from pathlib import Path
|
||
|
|
from .autosavedict import AutoSaveDict
|
||
|
|
|
||
|
|
|
||
|
|
BASE_DIR = f'{os.sep}'.join(__file__.split(os.sep)[:-1])
|
||
|
|
|
||
|
|
|
||
|
|
class TestAutoSaveDict(unittest.TestCase):
|
||
|
|
def setUp(self) -> None:
|
||
|
|
self.path = Path(BASE_DIR) / 'test.json'
|
||
|
|
self.default = {'a': 1, 'b': 2}
|
||
|
|
asd = AutoSaveDict(self.path, **self.default)
|
||
|
|
asd.init()
|
||
|
|
return super().setUp()
|
||
|
|
|
||
|
|
def tearDown(self) -> None:
|
||
|
|
os.remove(self.path)
|
||
|
|
return super().tearDown()
|
||
|
|
|
||
|
|
def test_init(self) -> None:
|
||
|
|
asd = AutoSaveDict(self.path, **self.default)
|
||
|
|
asd.init()
|
||
|
|
self.assertTrue(os.path.exists(self.path))
|
||
|
|
self.assertEqual(asd, self.default)
|
||
|
|
self.assertEqual(asd._pairs, self.default)
|
||
|
|
self.assertEqual(asd._read(), self.default)
|
||
|
|
|
||
|
|
def test_restore(self) -> None:
|
||
|
|
asd = AutoSaveDict(self.path, **self.default)
|
||
|
|
asd['c'] = 3
|
||
|
|
self.assertIn('c', asd)
|
||
|
|
asd.restore()
|
||
|
|
self.assertEqual(asd, self.default)
|
||
|
|
self.assertEqual(asd._read(), self.default)
|
||
|
|
self.assertEqual(asd._pairs, self.default)
|
||
|
|
|
||
|
|
def test_pop(self) -> None:
|
||
|
|
asd = AutoSaveDict(self.path, **self.default)
|
||
|
|
asd.init()
|
||
|
|
|
||
|
|
key = tuple(self.default.keys())[0]
|
||
|
|
asd.pop(key)
|
||
|
|
|
||
|
|
self.assertNotIn(key, asd._read())
|
||
|
|
self.assertNotIn(key, asd._pairs)
|
||
|
|
self.assertNotIn(key, asd)
|
||
|
|
|
||
|
|
def test_popitem(self) -> None:
|
||
|
|
asd = AutoSaveDict(self.path, **self.default)
|
||
|
|
asd.init()
|
||
|
|
key = tuple(asd.keys())[-1]
|
||
|
|
val = asd[key]
|
||
|
|
result = asd.popitem()
|
||
|
|
self.assertEqual(result, (key, val))
|
||
|
|
self.assertNotIn(key, asd)
|
||
|
|
self.assertNotIn(key, asd._read())
|
||
|
|
self.assertNotIn(key, asd._pairs)
|
||
|
|
|
||
|
|
def test_update(self) -> None:
|
||
|
|
asd = AutoSaveDict(self.path, **self.default)
|
||
|
|
asd.init()
|
||
|
|
new = {'b': 3}
|
||
|
|
asd.update(new)
|
||
|
|
self.assertEqual(asd['b'], new['b'])
|
||
|
|
self.assertEqual(asd._read()['b'], new['b'])
|
||
|
|
self.assertEqual(asd._pairs['b'], new['b'])
|
||
|
|
|
||
|
|
def test_copy(self) -> None:
|
||
|
|
copy_path = 'test_copy.json'
|
||
|
|
asd = AutoSaveDict(self.path, **self.default)
|
||
|
|
asd_copy = asd.copy(copy_path) # type: ignore
|
||
|
|
asd.init()
|
||
|
|
asd_copy.init()
|
||
|
|
|
||
|
|
self.assertEqual(asd_copy, asd)
|
||
|
|
self.assertEqual(asd_copy, asd._read())
|
||
|
|
self.assertEqual(asd_copy, asd._pairs)
|
||
|
|
os.remove(copy_path)
|
||
|
|
|
||
|
|
def test_fromfile(self) -> None:
|
||
|
|
file = 'test_fromfile.json'
|
||
|
|
config = {'b': 3, 'c': 4}
|
||
|
|
|
||
|
|
with open(file, mode='w') as f:
|
||
|
|
json.dump(config, f)
|
||
|
|
os.remove(self.path)
|
||
|
|
asd = AutoSaveDict.fromfile(file, self.path) # type: ignore
|
||
|
|
asd.init()
|
||
|
|
|
||
|
|
self.assertEqual(config, asd)
|
||
|
|
self.assertEqual(config, asd._pairs)
|
||
|
|
self.assertEqual(config, asd._read())
|
||
|
|
self.assertIsInstance(asd, AutoSaveDict)
|
||
|
|
os.remove(file)
|
||
|
|
|
||
|
|
def test_frommapping(self) -> None:
|
||
|
|
path = 'test_frommapping.json'
|
||
|
|
mapping = (
|
||
|
|
('a', 1),
|
||
|
|
('b', 2),
|
||
|
|
('c', 3),
|
||
|
|
)
|
||
|
|
expected = dict(mapping)
|
||
|
|
|
||
|
|
asd = AutoSaveDict.frommapping(mapping, path) # type: ignore
|
||
|
|
asd.init()
|
||
|
|
|
||
|
|
self.assertEqual(expected, asd)
|
||
|
|
self.assertEqual(expected, asd._read())
|
||
|
|
self.assertEqual(expected, asd._pairs)
|
||
|
|
os.remove(path)
|
||
|
|
|
||
|
|
def test_fromkeys(self) -> None:
|
||
|
|
path = 'test_fromkeys.json'
|
||
|
|
keys = 'test'
|
||
|
|
expected = dict.fromkeys(keys)
|
||
|
|
|
||
|
|
asd = AutoSaveDict.fromkeys(keys, file_path=path) # type: ignore
|
||
|
|
asd.init()
|
||
|
|
self.assertEqual(asd, expected)
|
||
|
|
self.assertEqual(asd._read(), expected)
|
||
|
|
self.assertEqual(asd._pairs, expected)
|
||
|
|
os.remove(path)
|
||
|
|
|
||
|
|
def test_setitem(self) -> None:
|
||
|
|
expected = {**self.default, "z": 3}
|
||
|
|
asd = AutoSaveDict(self.path, **self.default)
|
||
|
|
asd['z'] = 3
|
||
|
|
self.assertEqual(asd, expected)
|
||
|
|
self.assertEqual(asd._read(), expected)
|
||
|
|
self.assertEqual(asd._pairs, expected)
|
||
|
|
|
||
|
|
def test_delitem(self) -> None:
|
||
|
|
config = self.default.copy()
|
||
|
|
key = tuple(config.keys())[0]
|
||
|
|
asd = AutoSaveDict(self.path, **config)
|
||
|
|
asd.init()
|
||
|
|
|
||
|
|
del config[key]
|
||
|
|
del asd[key]
|
||
|
|
self.assertEqual(asd, config)
|
||
|
|
self.assertEqual(asd._read(), config)
|
||
|
|
self.assertEqual(asd._pairs, config)
|