125 lines
4.5 KiB
Python
125 lines
4.5 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
from yuxi.channels.adapters.nextcloudtalk.chunking import chunk_text
|
||
|
|
|
||
|
|
|
||
|
|
class TestChunkText:
|
||
|
|
def test_short_text_returns_single_chunk(self):
|
||
|
|
result = chunk_text("Hello World", limit=4000)
|
||
|
|
assert result == ["Hello World"]
|
||
|
|
|
||
|
|
def test_exact_limit_text(self):
|
||
|
|
text = "A" * 4000
|
||
|
|
result = chunk_text(text, limit=4000)
|
||
|
|
assert len(result) == 1
|
||
|
|
assert result[0] == text
|
||
|
|
|
||
|
|
def test_empty_string(self):
|
||
|
|
result = chunk_text("", limit=1000)
|
||
|
|
assert result == [""]
|
||
|
|
|
||
|
|
def test_chunk_markdown_paragraphs(self):
|
||
|
|
paragraphs = []
|
||
|
|
for i in range(100):
|
||
|
|
paragraphs.append(f"Paragraph {i}: " + "x" * 80)
|
||
|
|
text = "\n\n".join(paragraphs)
|
||
|
|
result = chunk_text(text, limit=500, mode="markdown")
|
||
|
|
assert len(result) > 1
|
||
|
|
assert all(len(c) <= 500 for c in result)
|
||
|
|
reconstructed = "".join(result)
|
||
|
|
assert reconstructed == text or all(p in reconstructed for p in paragraphs[:3])
|
||
|
|
|
||
|
|
def test_chunk_markdown_lines(self):
|
||
|
|
lines = []
|
||
|
|
for i in range(200):
|
||
|
|
lines.append(f"Line {i}: " + "y" * 60)
|
||
|
|
text = "\n".join(lines)
|
||
|
|
result = chunk_text(text, limit=500, mode="markdown")
|
||
|
|
assert len(result) > 1
|
||
|
|
assert all(len(c) <= 500 for c in result)
|
||
|
|
|
||
|
|
def test_chunk_markdown_sentences(self):
|
||
|
|
sentences = []
|
||
|
|
for i in range(200):
|
||
|
|
sentences.append(f"This is sentence number {i} with some content. ")
|
||
|
|
text = "".join(sentences)
|
||
|
|
result = chunk_text(text, limit=500, mode="markdown")
|
||
|
|
assert len(result) > 1
|
||
|
|
assert all(len(c) <= 500 for c in result)
|
||
|
|
|
||
|
|
def test_chunk_markdown_no_breaks_falls_back_to_length(self):
|
||
|
|
text = "A" * 5000
|
||
|
|
result = chunk_text(text, limit=1000, mode="markdown")
|
||
|
|
assert len(result) > 1
|
||
|
|
assert all(len(c) <= 1001 for c in result)
|
||
|
|
|
||
|
|
def test_chunk_newline_mode(self):
|
||
|
|
lines = [f"Line {i:03d}: " + "x" * 200 for i in range(30)]
|
||
|
|
text = "\n".join(lines)
|
||
|
|
result = chunk_text(text, limit=500, mode="newline")
|
||
|
|
assert len(result) > 1
|
||
|
|
assert all(len(c) <= 500 for c in result)
|
||
|
|
|
||
|
|
def test_chunk_newline_single_line_equals_limit(self):
|
||
|
|
text = "A" * 500
|
||
|
|
result = chunk_text(text, limit=500, mode="newline")
|
||
|
|
assert len(result) == 1
|
||
|
|
assert result[0] == text
|
||
|
|
|
||
|
|
def test_chunk_newline_long_line(self):
|
||
|
|
text = "A" * 600
|
||
|
|
result = chunk_text(text, limit=500, mode="newline")
|
||
|
|
assert len(result) >= 1
|
||
|
|
|
||
|
|
def test_chunk_by_length(self):
|
||
|
|
text = "B" * 2500
|
||
|
|
result = chunk_text(text, limit=500, mode="length")
|
||
|
|
assert len(result) == 5
|
||
|
|
for chunk in result:
|
||
|
|
assert len(chunk) == 500
|
||
|
|
|
||
|
|
def test_chunk_by_length_uneven(self):
|
||
|
|
text = "C" * 1234
|
||
|
|
result = chunk_text(text, limit=500, mode="length")
|
||
|
|
assert len(result) == 3
|
||
|
|
assert len(result[0]) == 500
|
||
|
|
assert len(result[1]) == 500
|
||
|
|
assert len(result[2]) == 234
|
||
|
|
|
||
|
|
def test_chunk_unknown_mode_falls_back_to_length(self):
|
||
|
|
text = "D" * 1500
|
||
|
|
result = chunk_text(text, limit=500, mode="unknown_mode")
|
||
|
|
assert len(result) == 3
|
||
|
|
assert all(len(c) == 500 for c in result)
|
||
|
|
|
||
|
|
def test_chunk_with_limit_zero_uses_default(self):
|
||
|
|
text = "Short text"
|
||
|
|
result = chunk_text(text, limit=4000)
|
||
|
|
assert result == ["Short text"]
|
||
|
|
|
||
|
|
def test_chunk_markdown_borderline(self):
|
||
|
|
text = "A" * 500 + "\n\n" + "B" * 500
|
||
|
|
result = chunk_text(text, limit=550, mode="markdown")
|
||
|
|
assert len(result) >= 1
|
||
|
|
assert all(len(c) <= 550 for c in result)
|
||
|
|
|
||
|
|
def test_chunk_markdown_small_limit_forces_sentence_split(self):
|
||
|
|
text = "First. Second very long sentence with lots of words. Third. Fourth."
|
||
|
|
result = chunk_text(text, limit=20, mode="markdown")
|
||
|
|
assert len(result) >= 2
|
||
|
|
|
||
|
|
def test_chunk_newline_empty_lines(self):
|
||
|
|
text = "\n\n\nA\n\nB\n\n"
|
||
|
|
result = chunk_text(text, limit=500, mode="newline")
|
||
|
|
assert "A" in "".join(result)
|
||
|
|
assert "B" in "".join(result)
|
||
|
|
|
||
|
|
def test_chunk_preserves_all_content(self):
|
||
|
|
text = "Hello World\n\nThis is a test.\n\nMore content here."
|
||
|
|
result = chunk_text(text, limit=20, mode="markdown")
|
||
|
|
reconstructed = "".join(result)
|
||
|
|
assert "Hello World" in reconstructed
|
||
|
|
assert "This is a test" in reconstructed
|
||
|
|
assert "More content here" in reconstructed
|