2860fb5d18
Security / Dependency review (push) Has been skipped
Scorecard / Scorecard analysis (push) Failing after 0s
Validate / eval (push) Failing after 0s
Security / Dependency audit (push) Failing after 1s
Security / Secret scan (push) Failing after 1s
Validate / tests (push) Failing after 0s
Validate / mcp-tests (push) Failing after 1s
GitHub Actions Security Analysis with zizmor 🌈 / zizmor (push) Failing after 1s
Security / SAST scan (push) Failing after 13m52s
164 lines
5.9 KiB
Python
164 lines
5.9 KiB
Python
"""Tests for entity_extract module."""
|
|
|
|
import unittest
|
|
|
|
# Add lib to path
|
|
|
|
from lib import entity_extract
|
|
|
|
|
|
class TestExtractXHandles(unittest.TestCase):
|
|
def test_basic_author_handle(self):
|
|
items = [{"author_handle": "techguru", "text": ""}]
|
|
result = entity_extract._extract_x_handles(items)
|
|
self.assertEqual(result, ["techguru"])
|
|
|
|
def test_mentions_in_text(self):
|
|
items = [{"text": "Great thread by @airesearcher and @mldev"}]
|
|
result = entity_extract._extract_x_handles(items)
|
|
self.assertIn("airesearcher", result)
|
|
self.assertIn("mldev", result)
|
|
|
|
def test_generic_handles_filtered(self):
|
|
items = [
|
|
{"author_handle": "@openai", "text": ""},
|
|
{"author_handle": "@elonmusk", "text": ""},
|
|
{"author_handle": "realexpert", "text": ""},
|
|
]
|
|
result = entity_extract._extract_x_handles(items)
|
|
self.assertEqual(result, ["realexpert"])
|
|
|
|
def test_case_normalization(self):
|
|
items = [{"author_handle": "@CamelCase", "text": ""}]
|
|
result = entity_extract._extract_x_handles(items)
|
|
self.assertEqual(result, ["camelcase"])
|
|
|
|
def test_frequency_ranking(self):
|
|
items = [
|
|
{"author_handle": "popular", "text": ""},
|
|
{"author_handle": "popular", "text": ""},
|
|
{"author_handle": "popular", "text": ""},
|
|
{"author_handle": "rare", "text": ""},
|
|
]
|
|
result = entity_extract._extract_x_handles(items)
|
|
self.assertEqual(result[0], "popular")
|
|
|
|
def test_leading_at_stripped(self):
|
|
items = [{"author_handle": "@withatsign", "text": ""}]
|
|
result = entity_extract._extract_x_handles(items)
|
|
self.assertEqual(result, ["withatsign"])
|
|
|
|
def test_empty_input(self):
|
|
result = entity_extract._extract_x_handles([])
|
|
self.assertEqual(result, [])
|
|
|
|
def test_mixed_items(self):
|
|
items = [
|
|
{"author_handle": "poster1", "text": "Check @mentioned"},
|
|
{"text": "No author here"},
|
|
{"author_handle": "", "text": ""},
|
|
]
|
|
result = entity_extract._extract_x_handles(items)
|
|
self.assertIn("poster1", result)
|
|
self.assertIn("mentioned", result)
|
|
self.assertEqual(len(result), 2)
|
|
|
|
|
|
class TestExtractXHashtags(unittest.TestCase):
|
|
def test_basic_hashtag(self):
|
|
items = [{"text": "Exciting news #AI"}]
|
|
result = entity_extract._extract_x_hashtags(items)
|
|
self.assertEqual(result, ["#ai"])
|
|
|
|
def test_multiple_tags(self):
|
|
items = [{"text": "#Python and #MachineLearning are trending"}]
|
|
result = entity_extract._extract_x_hashtags(items)
|
|
self.assertIn("#python", result)
|
|
self.assertIn("#machinelearning", result)
|
|
|
|
def test_frequency_ranking(self):
|
|
items = [
|
|
{"text": "#ai is great"},
|
|
{"text": "#ai again"},
|
|
{"text": "#rare tag"},
|
|
]
|
|
result = entity_extract._extract_x_hashtags(items)
|
|
self.assertEqual(result[0], "#ai")
|
|
|
|
def test_single_char_tag_filtered(self):
|
|
items = [{"text": "#X is not enough chars but #AI is"}]
|
|
result = entity_extract._extract_x_hashtags(items)
|
|
# #X is only 1 char, filtered by \w{2,30} regex
|
|
self.assertNotIn("#x", result)
|
|
self.assertIn("#ai", result)
|
|
|
|
def test_empty_input(self):
|
|
result = entity_extract._extract_x_hashtags([])
|
|
self.assertEqual(result, [])
|
|
|
|
|
|
class TestExtractSubreddits(unittest.TestCase):
|
|
def test_basic_subreddit_field(self):
|
|
items = [{"subreddit": "MachineLearning"}]
|
|
result = entity_extract._extract_subreddits(items)
|
|
self.assertEqual(result, ["MachineLearning"])
|
|
|
|
def test_cross_ref_in_comment_insights(self):
|
|
items = [{"subreddit": "AI", "comment_insights": ["Check out r/localLLaMA for more"]}]
|
|
result = entity_extract._extract_subreddits(items)
|
|
self.assertIn("localLLaMA", result)
|
|
|
|
def test_cross_ref_in_top_comments(self):
|
|
items = [{"subreddit": "tech", "top_comments": [{"excerpt": "Also see r/programming"}]}]
|
|
result = entity_extract._extract_subreddits(items)
|
|
self.assertIn("programming", result)
|
|
|
|
def test_frequency_ranking(self):
|
|
items = [
|
|
{"subreddit": "popular"},
|
|
{"subreddit": "popular"},
|
|
{"subreddit": "rare"},
|
|
]
|
|
result = entity_extract._extract_subreddits(items)
|
|
self.assertEqual(result[0], "popular")
|
|
|
|
def test_leading_r_slash_stripped(self):
|
|
items = [{"subreddit": "r/stripped"}]
|
|
result = entity_extract._extract_subreddits(items)
|
|
self.assertEqual(result, ["stripped"])
|
|
|
|
def test_empty_input(self):
|
|
result = entity_extract._extract_subreddits([])
|
|
self.assertEqual(result, [])
|
|
|
|
|
|
class TestExtractEntities(unittest.TestCase):
|
|
def test_integration(self):
|
|
reddit = [{"subreddit": "AI", "comment_insights": ["r/localLLaMA"]}]
|
|
x = [{"author_handle": "researcher", "text": "#deeplearning @colleague"}]
|
|
result = entity_extract.extract_entities(reddit, x)
|
|
self.assertIn("researcher", result["x_handles"])
|
|
self.assertIn("#deeplearning", result["x_hashtags"])
|
|
self.assertIn("AI", result["reddit_subreddits"])
|
|
|
|
def test_max_limits(self):
|
|
x = [
|
|
{"author_handle": f"user{i}", "text": ""}
|
|
for i in range(10)
|
|
]
|
|
result = entity_extract.extract_entities([], x, max_handles=2)
|
|
self.assertLessEqual(len(result["x_handles"]), 2)
|
|
|
|
def test_empty_inputs(self):
|
|
result = entity_extract.extract_entities([], [])
|
|
self.assertEqual(result["x_handles"], [])
|
|
self.assertEqual(result["x_hashtags"], [])
|
|
self.assertEqual(result["reddit_subreddits"], [])
|
|
|
|
def test_return_keys(self):
|
|
result = entity_extract.extract_entities([], [])
|
|
self.assertSetEqual(set(result.keys()), {"x_handles", "x_hashtags", "reddit_subreddits"})
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|