import pytest
from pathlib import Path
from domin8.tools.request_change import split_diff_by_file, extract_files_from_unified_diff, classify_action_from_diff
from domin8.git_ops import create_diff
@pytest.fixture
def sample_multi_diff():
a = Path('docs/refactor_plan.md')
b = Path('docs/request_change_config.md')
assert a.exists() and b.exists()
a_orig = a.read_text()
a_new = a_orig.replace('Phase 1 – Single Tool Contract', 'Phase 1 — Single Tool Contract')
b_orig = b.read_text()
b_new = b_orig.replace('allow', 'allow (edited)')
diff_a = create_diff(a_orig, a_new, str(a))
diff_b = create_diff(b_orig, b_new, str(b))
# Concatenate diffs to simulate a multi-file patch as produced by git
return diff_a + "\n" + diff_b
def test_split_and_extract_files(sample_multi_diff):
chunks = split_diff_by_file(sample_multi_diff)
assert len(chunks) >= 2
files = extract_files_from_unified_diff(sample_multi_diff)
assert 'docs/refactor_plan.md' in files
assert 'docs/request_change_config.md' in files
def test_classify_actions_per_chunk(sample_multi_diff):
chunks = split_diff_by_file(sample_multi_diff)
files = extract_files_from_unified_diff(sample_multi_diff)
# ensure classification runs per chunk and returns plausible actions
for chunk, path in zip(chunks, files):
act = classify_action_from_diff(chunk, path)
assert act in ('create', 'edit', 'delete', 'rename')