""" tests/test_feedback.py — Tests for feedback loop (no API required) """ import sys import tempfile from pathlib import Path import pytest sys.path.insert(0, str(Path(__file__).parent.parent)) from feedback.diff_engine import DiffEngine from feedback.pattern_store import PatternStore class TestDiffEngine: def setup_method(self): self.engine = DiffEngine() def test_identical_texts(self): diff = self.engine.compute("hello world", "hello world") assert diff.change_ratio == 0.0 assert diff.additions == [] assert diff.deletions == [] def test_added_content(self): diff = self.engine.compute("line one", "line one\nline two") assert len(diff.additions) > 0 assert diff.change_ratio > 0 def test_deleted_content(self): diff = self.engine.compute("line one\nline two", "line one") assert len(diff.deletions) > 0 def test_replaced_content(self): diff = self.engine.compute("old text here", "new text here") assert len(diff.additions) > 0 assert len(diff.deletions) > 0 def test_change_ratio_range(self): diff = self.engine.compute("aaa", "zzz") assert 0.0 <= diff.change_ratio <= 1.0 def test_large_edit(self): original = "Section 1\nContent A\nSection 2\nContent B" edited = "Section 1\nContent A Modified\nSection 2\nContent B\nSection 3\nNew content" diff = self.engine.compute(original, edited) assert diff.change_ratio > 0.05 class TestPatternStore: @pytest.fixture def store(self): with tempfile.TemporaryDirectory() as tmpdir: yield PatternStore(db_path=Path(tmpdir) / "test.db") def test_save_and_retrieve(self, store): pid = store.save_pattern("Always list dates chronologically", "contract") patterns = store.get_active_patterns() assert len(patterns) == 1 assert patterns[0][1] == "Always list dates chronologically" def test_deactivate_pattern(self, store): pid = store.save_pattern("Test pattern", "memo") store.deactivate_pattern(pid) patterns = store.get_active_patterns() assert len(patterns) == 0 def test_update_pattern(self, store): pid = store.save_pattern("Old rule", "contract") store.update_pattern(pid, "New improved rule") patterns = store.get_active_patterns() assert patterns[0][1] == "New improved rule" def test_pattern_count(self, store): assert store.pattern_count() == 0 store.save_pattern("Rule 1", "contract") store.save_pattern("Rule 2", "memo") assert store.pattern_count() == 2 def test_draft_history(self, store): store.save_draft("d1", "Case Fact Summary", "file.pdf", "Draft text here") draft = store.get_draft("d1") assert draft is not None assert draft["draft_type"] == "Case Fact Summary" def test_feedback_log(self, store): store.log_feedback("d1", "original", "edited", 0.15, "p1") def test_filter_by_doc_type(self, store): store.save_pattern("Contract rule", "contract") store.save_pattern("Memo rule", "memo") contract_patterns = store.get_active_patterns(doc_type="contract") assert len(contract_patterns) == 1 assert "Contract" in contract_patterns[0][1] def test_get_all_patterns(self, store): store.save_pattern("Rule A", "contract") store.save_pattern("Rule B", "memo") all_p = store.get_all_patterns() assert len(all_p) == 2 assert "pattern" in all_p[0]