alessandro trinca tornidor
commited on
Commit
·
a9c8d84
1
Parent(s):
a707261
test: update test cases, optimize some imports
Browse files
my_ghost_writer/jsonpath_comparator.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
| 1 |
-
from jsonpath_ng import parse
|
| 2 |
from jsonpath_ng.ext import parse as parse_ext
|
| 3 |
from typing import Dict, Set, Any, List
|
| 4 |
|
|
|
|
|
|
|
| 1 |
from jsonpath_ng.ext import parse as parse_ext
|
| 2 |
from typing import Dict, Set, Any, List
|
| 3 |
|
tests/my_ghost_writer/test_custom_synonym_handler.py
CHANGED
|
@@ -5,75 +5,96 @@ from my_ghost_writer.type_hints import RelatedEntry, TermRelationships
|
|
| 5 |
|
| 6 |
|
| 7 |
class TestCustomSynonymHandler(unittest.TestCase):
|
| 8 |
-
def
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
self.assertEqual(
|
| 21 |
-
|
| 22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
expected_lexicon = {
|
| 24 |
"happy": {
|
| 25 |
-
|
| 26 |
-
{
|
| 27 |
-
|
| 28 |
-
"definition": "definition of happy"
|
| 29 |
-
},
|
| 30 |
-
{
|
| 31 |
-
"words": ["content", "cheerful", "joyful"],
|
| 32 |
-
"definition": "another definition of happy"
|
| 33 |
-
}
|
| 34 |
],
|
| 35 |
-
|
| 36 |
-
{
|
| 37 |
-
"words": ["sad", "sadness"],
|
| 38 |
-
"definition": "definition of sad"
|
| 39 |
-
}
|
| 40 |
]
|
| 41 |
}
|
| 42 |
}
|
| 43 |
expected_inverted_index = {
|
| 44 |
-
"joy":
|
| 45 |
-
"
|
| 46 |
-
"
|
| 47 |
-
"sadness": { "happy" },
|
| 48 |
-
"content": { "happy" },
|
| 49 |
-
"cheerful": { "happy" },
|
| 50 |
-
"joyful": { "happy" }
|
| 51 |
}
|
| 52 |
-
self.assertEqual(
|
| 53 |
-
self.assertEqual(
|
| 54 |
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
self.
|
|
|
|
| 62 |
|
| 63 |
-
|
| 64 |
-
|
|
|
|
|
|
|
| 65 |
])
|
| 66 |
-
self.
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
self.
|
| 76 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 77 |
|
| 78 |
|
| 79 |
if __name__ == '__main__':
|
|
|
|
| 5 |
|
| 6 |
|
| 7 |
class TestCustomSynonymHandler(unittest.TestCase):
|
| 8 |
+
def setUp(self):
|
| 9 |
+
"""Set up a fresh handler and test data for each test."""
|
| 10 |
+
self.handler = CustomSynonymHandler()
|
| 11 |
+
self.happy_related_data = [
|
| 12 |
+
{'definition': 'definition of happy', 'type': 'synonym', 'words': ['joy', 'cheer']},
|
| 13 |
+
{'definition': 'definition of sad', 'type': 'antonym', 'words': ['sad', 'sadness']},
|
| 14 |
+
{'definition': 'another definition of happy', 'type': 'synonym', 'words': ['content', 'cheerful', 'joyful']}
|
| 15 |
+
]
|
| 16 |
+
self.happy_related_entries = [RelatedEntry(**rel) for rel in self.happy_related_data]
|
| 17 |
+
|
| 18 |
+
def test_initial_state(self):
|
| 19 |
+
"""Tests that a new handler is empty."""
|
| 20 |
+
self.assertEqual(self.handler.lexicon, {})
|
| 21 |
+
self.assertEqual(self.handler.inverted_index, {})
|
| 22 |
+
|
| 23 |
+
def test_add_entry_populates_lexicon_and_index(self):
|
| 24 |
+
"""Tests that add_entry correctly populates the lexicon and inverted index."""
|
| 25 |
+
# Act
|
| 26 |
+
self.handler.add_entry("happy", self.happy_related_entries)
|
| 27 |
+
|
| 28 |
+
# Assert
|
| 29 |
expected_lexicon = {
|
| 30 |
"happy": {
|
| 31 |
+
TermRelationships.SYNONYM: [
|
| 32 |
+
{"words": ["joy", "cheer"], "definition": "definition of happy"},
|
| 33 |
+
{"words": ["content", "cheerful", "joyful"], "definition": "another definition of happy"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
],
|
| 35 |
+
TermRelationships.ANTONYM: [
|
| 36 |
+
{"words": ["sad", "sadness"], "definition": "definition of sad"}
|
|
|
|
|
|
|
|
|
|
| 37 |
]
|
| 38 |
}
|
| 39 |
}
|
| 40 |
expected_inverted_index = {
|
| 41 |
+
"joy": {"happy"}, "cheer": {"happy"}, "sad": {"happy"},
|
| 42 |
+
"sadness": {"happy"}, "content": {"happy"}, "cheerful": {"happy"},
|
| 43 |
+
"joyful": {"happy"}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
}
|
| 45 |
+
self.assertEqual(self.handler.lexicon, expected_lexicon)
|
| 46 |
+
self.assertEqual(self.handler.inverted_index, expected_inverted_index)
|
| 47 |
|
| 48 |
+
def test_get_related_retrieves_correct_data(self):
|
| 49 |
+
"""Tests that get_related returns the correct entries for a given relationship type."""
|
| 50 |
+
# Add a new entry
|
| 51 |
+
self.handler.add_entry("happy", self.happy_related_entries)
|
| 52 |
+
|
| 53 |
+
# get synonyms and antonyms
|
| 54 |
+
synonyms = self.handler.get_related("happy", TermRelationships.SYNONYM)
|
| 55 |
+
antonyms = self.handler.get_related("happy", TermRelationships.ANTONYM)
|
| 56 |
|
| 57 |
+
# Assert
|
| 58 |
+
self.assertCountEqual(synonyms, [
|
| 59 |
+
{'words': ['joy', 'cheer'], 'definition': 'definition of happy'},
|
| 60 |
+
{'words': ['content', 'cheerful', 'joyful'], 'definition': 'another definition of happy'}
|
| 61 |
])
|
| 62 |
+
self.assertCountEqual(antonyms, [{'words': ['sad', 'sadness'], 'definition': 'definition of sad'}])
|
| 63 |
+
|
| 64 |
+
def test_get_related_returns_empty_for_no_match(self):
|
| 65 |
+
"""Tests that get_related returns an empty list for non-existent words or types."""
|
| 66 |
+
# Add a new entry
|
| 67 |
+
self.handler.add_entry("happy", self.happy_related_entries)
|
| 68 |
+
|
| 69 |
+
# get hypernyms and synonyms
|
| 70 |
+
empty_result_for_type = self.handler.get_related("happy", TermRelationships.HYPERNYM)
|
| 71 |
+
empty_result_for_word = self.handler.get_related("sad", TermRelationships.SYNONYM)
|
| 72 |
+
|
| 73 |
+
# Assert
|
| 74 |
+
self.assertEqual(empty_result_for_type, [])
|
| 75 |
+
self.assertEqual(empty_result_for_word, [])
|
| 76 |
+
|
| 77 |
+
def test_delete_entry_removes_from_lexicon_and_index(self):
|
| 78 |
+
"""Tests that delete_entry correctly removes a word and its associations."""
|
| 79 |
+
# Add a new entry
|
| 80 |
+
self.handler.add_entry("happy", self.happy_related_entries)
|
| 81 |
+
text_entry = RelatedEntry(**{'definition': 'text def', 'type': 'synonym', 'words': ['word']})
|
| 82 |
+
self.handler.add_entry("text", [text_entry])
|
| 83 |
+
|
| 84 |
+
# delete
|
| 85 |
+
self.handler.delete_entry("text")
|
| 86 |
+
|
| 87 |
+
# Assert
|
| 88 |
+
self.assertNotIn("text", self.handler.lexicon)
|
| 89 |
+
self.assertNotIn("word", self.handler.inverted_index)
|
| 90 |
+
# Ensure other entries are unaffected
|
| 91 |
+
self.assertIn("happy", self.handler.lexicon)
|
| 92 |
+
self.assertIn("joy", self.handler.inverted_index)
|
| 93 |
+
|
| 94 |
+
def test_delete_nonexistent_entry_raises_key_error(self):
|
| 95 |
+
"""Tests that deleting a word not in the lexicon raises a KeyError."""
|
| 96 |
+
with self.assertRaises(KeyError):
|
| 97 |
+
self.handler.delete_entry("nonexistent")
|
| 98 |
|
| 99 |
|
| 100 |
if __name__ == '__main__':
|
tests/my_ghost_writer/test_text_parsers2.py
CHANGED
|
@@ -4,11 +4,11 @@ from unittest.mock import patch, MagicMock
|
|
| 4 |
|
| 5 |
from fastapi import HTTPException
|
| 6 |
|
|
|
|
| 7 |
from my_ghost_writer.text_parsers2 import (extract_contextual_info_by_indices, get_wordnet_synonyms, inflect_synonym,
|
| 8 |
is_nlp_available, process_synonym_groups)
|
| 9 |
-
from my_ghost_writer.
|
| 10 |
-
from my_ghost_writer.
|
| 11 |
-
from my_ghost_writer.type_hints import TermRelationships
|
| 12 |
from tests import EVENTS_FOLDER
|
| 13 |
from tests.my_ghost_writer.helpers_tests import analyze_detailed_report_lists
|
| 14 |
|
|
@@ -256,6 +256,41 @@ class TestTextParsers2(unittest.TestCase):
|
|
| 256 |
# Test with a regular verb
|
| 257 |
self.assertEqual(inflect_synonym("look", original_token_info), "look")
|
| 258 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 259 |
def test_process_synonym_groups(self):
|
| 260 |
"""Tests the full processing pipeline for a verb."""
|
| 261 |
word = "look"
|
|
@@ -318,6 +353,41 @@ class TestTextParsers2(unittest.TestCase):
|
|
| 318 |
result = process_synonym_groups("look", context_info)
|
| 319 |
self.assertListEqual(result, [])
|
| 320 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 321 |
|
| 322 |
if __name__ == '__main__':
|
| 323 |
unittest.main()
|
|
|
|
| 4 |
|
| 5 |
from fastapi import HTTPException
|
| 6 |
|
| 7 |
+
from my_ghost_writer.custom_synonym_handler import CustomSynonymHandler
|
| 8 |
from my_ghost_writer.text_parsers2 import (extract_contextual_info_by_indices, get_wordnet_synonyms, inflect_synonym,
|
| 9 |
is_nlp_available, process_synonym_groups)
|
| 10 |
+
from my_ghost_writer.jsonpath_extractor import JSONPathStructureAnalyzer
|
| 11 |
+
from my_ghost_writer.type_hints import TermRelationships, RelatedEntry
|
|
|
|
| 12 |
from tests import EVENTS_FOLDER
|
| 13 |
from tests.my_ghost_writer.helpers_tests import analyze_detailed_report_lists
|
| 14 |
|
|
|
|
| 256 |
# Test with a regular verb
|
| 257 |
self.assertEqual(inflect_synonym("look", original_token_info), "look")
|
| 258 |
|
| 259 |
+
def test_inflect_synonym_verbs(self):
|
| 260 |
+
"""Tests various verb inflections using subtests."""
|
| 261 |
+
test_cases = [
|
| 262 |
+
# (tag, synonym, expected_inflection)
|
| 263 |
+
("VBD", "write", "wrote"), # Past tense
|
| 264 |
+
("VBD", "look", "looked"),
|
| 265 |
+
("VBG", "write", "writing"), # Present participle
|
| 266 |
+
("VBG", "look", "looking"),
|
| 267 |
+
("VBZ", "write", "writes"), # 3rd person singular
|
| 268 |
+
("VBZ", "look", "looks"),
|
| 269 |
+
]
|
| 270 |
+
|
| 271 |
+
for tag, synonym, expected in test_cases:
|
| 272 |
+
with self.subTest(tag=tag, synonym=synonym):
|
| 273 |
+
original_token_info = {
|
| 274 |
+
'pos': 'VERB', 'tag': tag, 'is_lower': True, 'is_title': False, 'is_upper': False
|
| 275 |
+
}
|
| 276 |
+
self.assertEqual(inflect_synonym(synonym, original_token_info), expected)
|
| 277 |
+
|
| 278 |
+
def test_inflect_synonym_casing(self):
|
| 279 |
+
"""Tests that casing is correctly applied during inflection."""
|
| 280 |
+
test_cases = [
|
| 281 |
+
# (is_title, is_upper, synonym, expected)
|
| 282 |
+
(True, False, "write", "Wrote"),
|
| 283 |
+
(False, True, "write", "WROTE"),
|
| 284 |
+
(False, False, "look", "looked"),
|
| 285 |
+
]
|
| 286 |
+
for is_title, is_upper, synonym, expected in test_cases:
|
| 287 |
+
with self.subTest(is_title=is_title, is_upper=is_upper):
|
| 288 |
+
original_token_info = {
|
| 289 |
+
'pos': 'VERB', 'tag': 'VBD', 'is_lower': not (is_title or is_upper),
|
| 290 |
+
'is_title': is_title, 'is_upper': is_upper
|
| 291 |
+
}
|
| 292 |
+
self.assertEqual(inflect_synonym(synonym, original_token_info), expected)
|
| 293 |
+
|
| 294 |
def test_process_synonym_groups(self):
|
| 295 |
"""Tests the full processing pipeline for a verb."""
|
| 296 |
word = "look"
|
|
|
|
| 353 |
result = process_synonym_groups("look", context_info)
|
| 354 |
self.assertListEqual(result, [])
|
| 355 |
|
| 356 |
+
@patch("my_ghost_writer.text_parsers2.custom_synonym_handler", new_callable=CustomSynonymHandler)
|
| 357 |
+
def test_process_synonym_groups_includes_custom_entries(self, mock_handler):
|
| 358 |
+
"""Tests that custom synonyms are correctly processed and included in the results."""
|
| 359 |
+
# Arrange
|
| 360 |
+
# 1. Add a custom synonym to our mocked handler
|
| 361 |
+
custom_entry = RelatedEntry(
|
| 362 |
+
type=TermRelationships.SYNONYM,
|
| 363 |
+
words=["gleeful", "elated"],
|
| 364 |
+
definition="A custom definition for happy"
|
| 365 |
+
)
|
| 366 |
+
mock_handler.add_entry("happy", [custom_entry])
|
| 367 |
+
|
| 368 |
+
# 2. Define the context for the word "happy"
|
| 369 |
+
word = "happy"
|
| 370 |
+
context_info = {
|
| 371 |
+
'lemma': 'happy', 'pos': 'ADJ', 'tag': 'JJ', 'is_lower': True,
|
| 372 |
+
'is_title': False, 'is_upper': False
|
| 373 |
+
}
|
| 374 |
+
|
| 375 |
+
# Act
|
| 376 |
+
result_groups = process_synonym_groups(word, context_info)
|
| 377 |
+
|
| 378 |
+
# Assert
|
| 379 |
+
# 1. Find the group that came from our custom source
|
| 380 |
+
custom_group = next((g for g in result_groups if g.related_words and g.related_words[0].is_custom), None)
|
| 381 |
+
|
| 382 |
+
# 2. Assert that the custom group was found and has the correct data
|
| 383 |
+
self.assertIsNotNone(custom_group, "A custom synonym group should have been found in the results.")
|
| 384 |
+
self.assertEqual(custom_group.definition, "A custom definition for happy")
|
| 385 |
+
self.assertEqual(custom_group.relation_type, TermRelationships.SYNONYM)
|
| 386 |
+
|
| 387 |
+
# 3. Check that the custom words are present
|
| 388 |
+
custom_base_forms = {word.base_form for word in custom_group.related_words}
|
| 389 |
+
self.assertEqual(custom_base_forms, {"gleeful", "elated"})
|
| 390 |
+
|
| 391 |
|
| 392 |
if __name__ == '__main__':
|
| 393 |
unittest.main()
|