| """Tests for utils.atomic_yaml_write — crash-safe YAML file writes.""" |
|
|
| from pathlib import Path |
| from unittest.mock import patch |
|
|
| import pytest |
| import yaml |
|
|
| from utils import atomic_yaml_write |
|
|
|
|
| class TestAtomicYamlWrite: |
| def test_writes_valid_yaml(self, tmp_path): |
| target = tmp_path / "data.yaml" |
| data = {"key": "value", "nested": {"a": 1}} |
|
|
| atomic_yaml_write(target, data) |
|
|
| assert yaml.safe_load(target.read_text(encoding="utf-8")) == data |
|
|
| def test_cleans_up_temp_file_on_baseexception(self, tmp_path): |
| class SimulatedAbort(BaseException): |
| pass |
|
|
| target = tmp_path / "data.yaml" |
| original = {"preserved": True} |
| target.write_text(yaml.safe_dump(original), encoding="utf-8") |
|
|
| with patch("utils.yaml.dump", side_effect=SimulatedAbort): |
| with pytest.raises(SimulatedAbort): |
| atomic_yaml_write(target, {"new": True}) |
|
|
| tmp_files = [f for f in tmp_path.iterdir() if ".tmp" in f.name] |
| assert len(tmp_files) == 0 |
| assert yaml.safe_load(target.read_text(encoding="utf-8")) == original |
|
|
| def test_appends_extra_content(self, tmp_path): |
| target = tmp_path / "data.yaml" |
|
|
| atomic_yaml_write(target, {"key": "value"}, extra_content="\n# comment\n") |
|
|
| text = target.read_text(encoding="utf-8") |
| assert "key: value" in text |
| assert "# comment" in text |
|
|