89 lines
3.2 KiB
Python
89 lines
3.2 KiB
Python
from pdf_mcp.server import search_text
|
|
|
|
|
|
class TestSearchTextBasic:
|
|
def test_unique_marker_on_two_pages(self, search_pdf):
|
|
hits = search_text(search_pdf, query="UNIQUE_MARKER_ALPHA")
|
|
pages = [h["page"] for h in hits]
|
|
assert pages == [1, 3]
|
|
|
|
def test_unique_marker_single_page(self, search_pdf):
|
|
hits = search_text(search_pdf, query="UNIQUE_MARKER_BETA")
|
|
assert len(hits) == 1
|
|
assert hits[0]["page"] == 2
|
|
|
|
def test_no_results(self, search_pdf):
|
|
hits = search_text(search_pdf, query="NONEXISTENT_TEXT_XYZ")
|
|
assert hits == []
|
|
|
|
def test_multi_page_hits(self, search_pdf):
|
|
hits = search_text(search_pdf, query="resistance")
|
|
pages = [h["page"] for h in hits]
|
|
assert 1 in pages
|
|
assert 2 in pages
|
|
|
|
|
|
class TestSearchTextCaseInsensitive:
|
|
def test_lowercase_query(self, search_pdf):
|
|
hits = search_text(search_pdf, query="unique_marker_alpha")
|
|
assert len(hits) == 2
|
|
|
|
def test_mixed_case_query(self, search_pdf):
|
|
hits = search_text(search_pdf, query="Unique_Marker_Alpha")
|
|
assert len(hits) == 2
|
|
|
|
def test_case_insensitive_content(self, search_pdf):
|
|
lower = search_text(search_pdf, query="resistance")
|
|
upper = search_text(search_pdf, query="RESISTANCE")
|
|
assert len(lower) == len(upper)
|
|
|
|
|
|
class TestSearchTextContext:
|
|
def test_context_contains_query(self, search_pdf):
|
|
hits = search_text(search_pdf, query="UNIQUE_MARKER_BETA")
|
|
assert "UNIQUE_MARKER_BETA" in hits[0]["context"]
|
|
|
|
def test_context_has_surrounding_text(self, search_pdf):
|
|
hits = search_text(search_pdf, query="UNIQUE_MARKER_BETA")
|
|
# The context should include text around the match
|
|
assert len(hits[0]["context"]) > len("UNIQUE_MARKER_BETA")
|
|
|
|
def test_custom_context_chars(self, search_pdf):
|
|
short = search_text(search_pdf, query="UNIQUE_MARKER_BETA", context_chars=10)
|
|
long = search_text(search_pdf, query="UNIQUE_MARKER_BETA", context_chars=200)
|
|
assert len(short[0]["context"]) <= len(long[0]["context"])
|
|
|
|
def test_zero_context(self, search_pdf):
|
|
hits = search_text(search_pdf, query="UNIQUE_MARKER_BETA", context_chars=0)
|
|
assert hits[0]["context"] == "UNIQUE_MARKER_BETA"
|
|
|
|
|
|
class TestSearchTextHitStructure:
|
|
def test_hit_has_page(self, search_pdf):
|
|
hits = search_text(search_pdf, query="resistance")
|
|
for hit in hits:
|
|
assert "page" in hit
|
|
assert isinstance(hit["page"], int)
|
|
|
|
def test_hit_has_context(self, search_pdf):
|
|
hits = search_text(search_pdf, query="resistance")
|
|
for hit in hits:
|
|
assert "context" in hit
|
|
assert isinstance(hit["context"], str)
|
|
|
|
|
|
class TestSearchTextOnOtherPdfs:
|
|
def test_search_basic_pdf(self, basic_pdf):
|
|
hits = search_text(basic_pdf, query="introductory")
|
|
assert len(hits) == 1
|
|
assert hits[0]["page"] == 1
|
|
|
|
def test_search_diagrams_pdf(self, diagrams_pdf):
|
|
hits = search_text(diagrams_pdf, query="Component A")
|
|
assert len(hits) == 1
|
|
assert hits[0]["page"] == 1
|
|
|
|
def test_search_nested_toc_pdf(self, nested_toc_pdf):
|
|
hits = search_text(nested_toc_pdf, query="Kubernetes")
|
|
assert len(hits) >= 1
|