70 lines
2.4 KiB
Python
70 lines
2.4 KiB
Python
"""EPUBSplitter 测试."""
|
||
import pytest
|
||
|
||
|
||
class TestEPUBSplitterMissingDep:
|
||
"""缺失依赖时的行为测试(不 skip 整个文件)."""
|
||
|
||
def test_split_raises_clear_import_error(self, monkeypatch):
|
||
"""未安装 ebooklib 时给出明确提示."""
|
||
from src.core.splitters.epub import EPUBSplitter
|
||
s = EPUBSplitter()
|
||
import builtins
|
||
original_import = builtins.__import__
|
||
|
||
def mock_import(name, *args, **kwargs):
|
||
if name == "ebooklib" or name.startswith("ebooklib."):
|
||
raise ImportError("No module named 'ebooklib'")
|
||
return original_import(name, *args, **kwargs)
|
||
|
||
monkeypatch.setattr(builtins, "__import__", mock_import)
|
||
with pytest.raises(ImportError, match="ebooklib"):
|
||
s.split("dummy.epub", source_file="test.epub")
|
||
|
||
|
||
class TestEPUBSplitter:
|
||
"""EPUBSplitter 测试(需 ebooklib)."""
|
||
ebooklib = pytest.importorskip("ebooklib", reason="ebooklib 未安装")
|
||
|
||
def test_split_simple_epub(self, tmp_path):
|
||
"""用 ebooklib 创建一个简单 EPUB 并测试分块."""
|
||
from ebooklib import epub
|
||
|
||
from src.core.splitters.epub import EPUBSplitter
|
||
|
||
epub_path = tmp_path / "test.epub"
|
||
|
||
book = epub.EpubBook()
|
||
book.set_identifier("test123")
|
||
book.set_title("测试书名")
|
||
book.set_language("zh")
|
||
|
||
chapter = epub.EpubHtml(
|
||
title="第一章",
|
||
file_name="chap01.xhtml",
|
||
lang="zh",
|
||
)
|
||
chapter.content = "<h1>第一章</h1><p>这是EPUB电子书的内容。</p><p>第二段文字在这里。</p>"
|
||
book.add_item(chapter)
|
||
|
||
book.toc = [epub.Link("chap01.xhtml", "第一章", "chap01")]
|
||
book.add_item(epub.EpubNcx())
|
||
book.add_item(epub.EpubNav())
|
||
book.spine = ["nav", chapter]
|
||
|
||
epub.write_epub(str(epub_path), book)
|
||
|
||
s = EPUBSplitter(max_size=500)
|
||
chunks = s.split(str(epub_path), source_file="test.epub")
|
||
assert len(chunks) >= 1
|
||
all_text = "".join(c["content"] for c in chunks)
|
||
assert "第一章" in all_text
|
||
assert "EPUB电子书" in all_text
|
||
assert "第二段文字" in all_text
|
||
|
||
def test_epub_has_split_method(self):
|
||
"""EPUBSplitter 遵循 Splitter Protocol."""
|
||
from src.core.splitters.epub import EPUBSplitter
|
||
s = EPUBSplitter()
|
||
assert hasattr(s, "split")
|