mirror of
https://github.com/kiviktnm/decman.git
synced 2026-09-19 12:08:28 +00:00
104 lines
2.6 KiB
Python
104 lines
2.6 KiB
Python
import json
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from decman.core.store import Store
|
|
|
|
|
|
def test_store_initially_empty_when_file_missing(tmp_path: Path) -> None:
|
|
path = tmp_path / "store.json"
|
|
assert not path.exists()
|
|
|
|
store = Store(path)
|
|
|
|
assert store.get("missing") is None
|
|
with pytest.raises(KeyError):
|
|
_ = store["missing"]
|
|
|
|
|
|
def test_store_loads_existing_file(tmp_path: Path) -> None:
|
|
path = tmp_path / "store.json"
|
|
original = {"foo": "bar", "number": 123}
|
|
path.write_text(json.dumps(original), encoding="utf-8")
|
|
|
|
store = Store(path)
|
|
|
|
assert store["foo"] == "bar"
|
|
assert store["number"] == 123
|
|
# underlying representation is dict-like
|
|
assert json.loads(path.read_text(encoding="utf-8")) == original
|
|
|
|
|
|
def test_setitem_and_getitem_roundtrip(tmp_path: Path) -> None:
|
|
path = tmp_path / "store.json"
|
|
|
|
store = Store(path)
|
|
store["foo"] = "bar"
|
|
store["number"] = 123
|
|
|
|
assert store["foo"] == "bar"
|
|
assert store["number"] == 123
|
|
|
|
|
|
def test_get_with_default(tmp_path: Path) -> None:
|
|
path = tmp_path / "store.json"
|
|
|
|
store = Store(path)
|
|
store["present"] = "value"
|
|
|
|
assert store.get("present") == "value"
|
|
assert store.get("missing") is None
|
|
assert store.get("missing", "default") == "default"
|
|
|
|
|
|
def test_save_creates_parent_directory_and_persists(tmp_path: Path) -> None:
|
|
# use nested directory to ensure parent creation is exercised
|
|
path = tmp_path / "nested" / "store.json"
|
|
|
|
store = Store(path)
|
|
store["foo"] = "bar"
|
|
|
|
store.save()
|
|
|
|
assert path.is_file()
|
|
data = json.loads(path.read_text(encoding="utf-8"))
|
|
assert data == {"foo": "bar"}
|
|
|
|
|
|
def test_context_manager_saves_on_normal_exit(tmp_path: Path) -> None:
|
|
path = tmp_path / "store.json"
|
|
|
|
with Store(path) as store:
|
|
store["foo"] = "bar"
|
|
store["number"] = 123
|
|
|
|
assert path.is_file()
|
|
data = json.loads(path.read_text(encoding="utf-8"))
|
|
assert data == {"foo": "bar", "number": 123}
|
|
|
|
|
|
def test_context_manager_saves_even_on_exception(tmp_path: Path) -> None:
|
|
path = tmp_path / "store.json"
|
|
|
|
with pytest.raises(RuntimeError):
|
|
with Store(path) as store:
|
|
store["foo"] = "bar"
|
|
raise RuntimeError("boom")
|
|
|
|
# file should still be written despite the exception
|
|
assert path.is_file()
|
|
data = json.loads(path.read_text(encoding="utf-8"))
|
|
assert data == {"foo": "bar"}
|
|
|
|
|
|
def test_repr_matches_underlying_dict(tmp_path: Path) -> None:
|
|
path = tmp_path / "store.json"
|
|
|
|
store = Store(path)
|
|
store["foo"] = "bar"
|
|
store["number"] = 123
|
|
|
|
expected = repr({"foo": "bar", "number": 123})
|
|
assert repr(store) == expected
|