73 lines
2.7 KiB
Python
73 lines
2.7 KiB
Python
|
|
"""Extra spellcheck tests covering _load_known_names and speller edge cases."""
|
||
|
|
|
||
|
|
from unittest.mock import patch, MagicMock
|
||
|
|
|
||
|
|
from mempalace.spellcheck import (
|
||
|
|
_load_known_names,
|
||
|
|
spellcheck_user_text,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
class TestLoadKnownNames:
|
||
|
|
def test_returns_names_from_registry(self):
|
||
|
|
mock_reg = MagicMock()
|
||
|
|
mock_reg._data = {
|
||
|
|
"entities": {
|
||
|
|
"e1": {"canonical": "Alice", "aliases": ["ali"]},
|
||
|
|
"e2": {"canonical": "Bob", "aliases": []},
|
||
|
|
}
|
||
|
|
}
|
||
|
|
with patch("mempalace.entity_registry.EntityRegistry") as MockER:
|
||
|
|
MockER.load.return_value = mock_reg
|
||
|
|
names = _load_known_names()
|
||
|
|
assert "alice" in names
|
||
|
|
assert "ali" in names
|
||
|
|
assert "bob" in names
|
||
|
|
|
||
|
|
def test_returns_empty_on_exception(self):
|
||
|
|
with patch(
|
||
|
|
"mempalace.entity_registry.EntityRegistry.load",
|
||
|
|
side_effect=Exception("no registry"),
|
||
|
|
):
|
||
|
|
names = _load_known_names()
|
||
|
|
assert names == set()
|
||
|
|
|
||
|
|
|
||
|
|
class TestSpellerEdgeCases:
|
||
|
|
def test_capitalized_word_skipped(self):
|
||
|
|
"""Capitalized words (likely proper nouns) are not corrected."""
|
||
|
|
|
||
|
|
def fake_speller(word):
|
||
|
|
return "WRONG"
|
||
|
|
|
||
|
|
with patch("mempalace.spellcheck._get_speller", return_value=fake_speller):
|
||
|
|
with patch("mempalace.spellcheck._get_system_words", return_value=set()):
|
||
|
|
with patch("mempalace.spellcheck._load_known_names", return_value=set()):
|
||
|
|
result = spellcheck_user_text("Alice went home")
|
||
|
|
assert "Alice" in result
|
||
|
|
assert "WRONG" not in result
|
||
|
|
|
||
|
|
def test_system_word_not_corrected(self):
|
||
|
|
"""Words in system dict should not be corrected."""
|
||
|
|
|
||
|
|
def fake_speller(word):
|
||
|
|
return "WRONG"
|
||
|
|
|
||
|
|
with patch("mempalace.spellcheck._get_speller", return_value=fake_speller):
|
||
|
|
with patch("mempalace.spellcheck._get_system_words", return_value={"coherently"}):
|
||
|
|
with patch("mempalace.spellcheck._load_known_names", return_value=set()):
|
||
|
|
result = spellcheck_user_text("coherently")
|
||
|
|
assert "coherently" in result
|
||
|
|
|
||
|
|
def test_high_edit_distance_rejected(self):
|
||
|
|
"""Corrections with too many edits are rejected."""
|
||
|
|
|
||
|
|
def fake_speller(word):
|
||
|
|
return "completely_different_word"
|
||
|
|
|
||
|
|
with patch("mempalace.spellcheck._get_speller", return_value=fake_speller):
|
||
|
|
with patch("mempalace.spellcheck._get_system_words", return_value=set()):
|
||
|
|
with patch("mempalace.spellcheck._load_known_names", return_value=set()):
|
||
|
|
result = spellcheck_user_text("hello")
|
||
|
|
assert "hello" in result
|