import json import os import stat from pathlib import Path from k1link.artifacts import write_json_atomic def test_write_json_atomic(tmp_path: Path) -> None: output = tmp_path / "nested" / "artifact.json" write_json_atomic(output, {"value": "тест"}) assert json.loads(output.read_text(encoding="utf-8")) == {"value": "тест"} assert not list(output.parent.glob("*.tmp")) def test_write_json_atomic_flushes_file_and_parent_directory( tmp_path: Path, monkeypatch, ) -> None: output = tmp_path / "nested" / "artifact.json" flushed_kinds: list[str] = [] real_fsync = os.fsync def observing_fsync(descriptor: int) -> None: mode = os.fstat(descriptor).st_mode flushed_kinds.append("directory" if stat.S_ISDIR(mode) else "file") real_fsync(descriptor) monkeypatch.setattr(os, "fsync", observing_fsync) write_json_atomic(output, {"durable": True}) assert flushed_kinds == ["file", "directory"]