返回 last30days-skill
test_youtube_relevance.py
根目录 / tests / test_youtube_relevance.py
1 """Tests for YouTube relevance scoring."""
2
3 import unittest
4
5 # Add lib to path
6
7 from lib.relevance import token_overlap_relevance as _compute_relevance, tokenize as _tokenize
8
9
10 class TestTokenize(unittest.TestCase):
11 def test_basic(self):
12 tokens = _tokenize("Claude Code Tutorial")
13 self.assertIn("claude", tokens)
14 self.assertIn("code", tokens)
15 self.assertIn("tutorial", tokens)
16
17 def test_removes_stopwords(self):
18 tokens = _tokenize("how to use Claude Code for beginners")
19 self.assertNotIn("how", tokens)
20 self.assertNotIn("to", tokens)
21 self.assertNotIn("for", tokens)
22 self.assertIn("claude", tokens)
23 self.assertIn("code", tokens)
24 self.assertIn("beginners", tokens)
25
26 def test_strips_punctuation(self):
27 tokens = _tokenize("What's new in Claude?")
28 self.assertIn("claude", tokens)
29 self.assertNotIn("what's", tokens)
30
31 def test_drops_single_char(self):
32 tokens = _tokenize("a b c Claude")
33 self.assertNotIn("a", tokens)
34 self.assertNotIn("b", tokens)
35 self.assertIn("claude", tokens)
36
37 def test_empty(self):
38 tokens = _tokenize("")
39 self.assertEqual(tokens, set())
40
41 def test_all_stopwords(self):
42 tokens = _tokenize("the a an to for how")
43 self.assertEqual(tokens, set())
44
45
46 class TestComputeRelevance(unittest.TestCase):
47 def test_exact_match(self):
48 result = _compute_relevance("Claude Code", "Claude Code")
49 self.assertEqual(result, 1.0)
50
51 def test_full_match_in_longer_title(self):
52 result = _compute_relevance("Claude Code", "Claude Code Tutorial")
53 self.assertEqual(result, 1.0)
54
55 def test_partial_match(self):
56 result = _compute_relevance("Claude Code Tips", "Claude Tips for Beginners")
57 self.assertGreater(result, 0.5)
58 self.assertLess(result, 1.0)
59
60 def test_no_match(self):
61 result = _compute_relevance("Claude Code", "Python Web Scraping")
62 self.assertEqual(result, 0.0)
63
64 def test_empty_query_returns_neutral(self):
65 result = _compute_relevance("", "Some Video Title")
66 self.assertEqual(result, 0.5)
67
68 def test_stopword_only_query(self):
69 result = _compute_relevance("how to the", "Some Video Title")
70 self.assertEqual(result, 0.5)
71
72 def test_empty_title(self):
73 result = _compute_relevance("Claude Code", "")
74 self.assertEqual(result, 0.0)
75
76 def test_case_insensitive(self):
77 result = _compute_relevance("claude code", "CLAUDE CODE Tutorial")
78 self.assertEqual(result, 1.0)
79
80 def test_stopwords_in_title_dont_inflate(self):
81 # "Claude Code" query against a title with lots of stopwords
82 # Should still match well since Claude and Code are present
83 result = _compute_relevance(
84 "Claude Code",
85 "How To Use Claude Code For Complete Beginners"
86 )
87 self.assertEqual(result, 1.0)
88
89 def test_no_match_returns_zero(self):
90 result = _compute_relevance("quantum computing", "cat videos compilation")
91 self.assertEqual(result, 0.0)
92
93 def test_cap_at_1_0(self):
94 result = _compute_relevance("AI", "AI AI AI AI AI")
95 self.assertLessEqual(result, 1.0)
96
97 def test_single_word_query(self):
98 result = _compute_relevance("Seedance", "Seedance AI Video Generator Review")
99 self.assertEqual(result, 1.0)
100
101 def test_single_word_no_match(self):
102 result = _compute_relevance("Seedance", "Random cooking video")
103 self.assertEqual(result, 0.0)
104
105 if __name__ == "__main__":
106 unittest.main()
107
107 lines PYTHON