from pathlib import Path
import json
import pytest
from domin8.storage.artifact_storage import (
atomic_write,
write_json_atomic,
compute_artifact_hash,
verify_artifact,
)
def test_atomic_and_json_write(tmp_path):
p = tmp_path / 'file.txt'
atomic_write(p, 'hello')
assert p.exists()
assert p.read_text() == 'hello'
j = tmp_path / 'meta.json'
write_json_atomic(j, {'a': 1, 'b': 2})
assert j.exists()
data = json.loads(j.read_text())
assert data == {'a': 1, 'b': 2}
def test_compute_and_verify_hash(tmp_path):
# Create artifact dir with required files
artifact_dir = tmp_path / 'artifacts' / 'a1'
artifact_dir.mkdir(parents=True)
meta = {'uuid': '1', 'repo_relative_path': 'x', 'action': 'edit', 'actor': {'id': 'agent', 'type': 'agent'}, 'created_at': '2026-01-12T00:00:00+00:00', 'pre_state_sha': 'pre', 'post_state_sha': None, 'deterministic_flags': {'schema_version': 1, 'tool_version': '0.1.0'}, 'status': 'pending'}
intent = {'summary': 'Fix bug in something'}
write_meta = artifact_dir / 'meta.json'
write_meta.write_text(json.dumps(meta, sort_keys=True, separators=(',', ':')))
write_intent = artifact_dir / 'intent.json'
write_intent.write_text(json.dumps(intent, sort_keys=True, separators=(',', ':')))
write_diff = artifact_dir / 'diff.patch'
write_diff.write_text('diff content')
# Compute hash and write verification file
h = compute_artifact_hash(artifact_dir)
(artifact_dir / 'verification.sha256').write_text(h)
assert verify_artifact(artifact_dir)
# Tamper with a file
(artifact_dir / 'intent.json').write_text(json.dumps({'tampered': True}))
assert not verify_artifact(artifact_dir)