| 1 | import unittest |
| 2 | |
| 3 | from lib import schema, snippet |
| 4 | |
| 5 | |
| 6 | def make_item(**overrides): |
| 7 | payload = { |
| 8 | "item_id": "i1", |
| 9 | "source": "grounding", |
| 10 | "title": "OpenClaw comparison guide", |
| 11 | "body": "", |
| 12 | "url": "https://example.com", |
| 13 | "snippet": "", |
| 14 | } |
| 15 | payload.update(overrides) |
| 16 | return schema.SourceItem(**payload) |
| 17 | |
| 18 | |
| 19 | class SnippetV3Tests(unittest.TestCase): |
| 20 | def test_truncate_words_preserves_short_text_and_truncates_long_text(self): |
| 21 | self.assertEqual("short text", snippet._truncate_words("short text", 5)) |
| 22 | self.assertEqual("one two three...", snippet._truncate_words("one two three four", 3)) |
| 23 | |
| 24 | def test_windows_handles_empty_short_and_overlapping_inputs(self): |
| 25 | self.assertEqual([], snippet._windows([], size=5, overlap=2)) |
| 26 | self.assertEqual(["one two"], snippet._windows(["one", "two"], size=5, overlap=2)) |
| 27 | self.assertEqual( |
| 28 | ["one two three", "two three four", "three four five", "four five", "five"], |
| 29 | snippet._windows(["one", "two", "three", "four", "five"], size=3, overlap=2), |
| 30 | ) |
| 31 | |
| 32 | def test_extract_best_snippet_prefers_existing_snippet(self): |
| 33 | item = make_item(snippet="existing evidence window " * 20) |
| 34 | result = snippet.extract_best_snippet(item, "ignored", max_words=5) |
| 35 | self.assertEqual("existing evidence window existing evidence...", result) |
| 36 | |
| 37 | def test_extract_best_snippet_falls_back_to_title_when_body_missing(self): |
| 38 | item = make_item(title="OpenClaw vs NanoClaw", body="") |
| 39 | self.assertEqual("OpenClaw vs NanoClaw", snippet.extract_best_snippet(item, "openclaw")) |
| 40 | |
| 41 | def test_extract_best_snippet_selects_best_matching_body_window(self): |
| 42 | body = " ".join( |
| 43 | [ |
| 44 | "generic filler words" for _ in range(40) |
| 45 | ] |
| 46 | + [ |
| 47 | "openclaw nanoclaw ironclaw comparison details" for _ in range(15) |
| 48 | ] |
| 49 | + [ |
| 50 | "more generic filler words" for _ in range(40) |
| 51 | ] |
| 52 | ) |
| 53 | item = make_item(body=body) |
| 54 | result = snippet.extract_best_snippet(item, "openclaw nanoclaw ironclaw", max_words=20) |
| 55 | self.assertIn("openclaw nanoclaw ironclaw", result) |
| 56 | |
| 57 | if __name__ == "__main__": |
| 58 | unittest.main() |
| 59 |