""" EPUB 解析器测试 """ import pytest import tempfile import os from pathlib import Path from ebooklib import epub from src.epub_parser import EPUBParser class TestEPUBParser: """EPUB 解析器测试类""" @pytest.fixture def sample_epub(self): """创建测试用的 EPUB 文件""" # 创建临时 EPUB 文件 with tempfile.NamedTemporaryFile(suffix='.epub', delete=False) as tmp_file: # 创建简单的 EPUB book = epub.EpubBook() book.set_identifier('test123') book.set_title('Test Book') book.set_language('en') book.add_author('Test Author') # 添加章节 c1 = epub.EpubHtml( title='Chapter 1', file_name='chap_01.xhtml', lang='en' ) c1.content = ''' Chapter 1

Chapter 1

This is the first paragraph of the first chapter.

This is the second paragraph with more content to test parsing.

''' book.add_item(c1) # 添加序言 preface = epub.EpubHtml( title='Preface', file_name='preface.xhtml', lang='en' ) preface.content = ''' Preface

Preface

This is the preface of the book.

It contains important background information.

''' book.add_item(preface) # 设置目录 book.toc = ( epub.Link("preface.xhtml", "Preface", "preface"), epub.Link("chap_01.xhtml", "Chapter 1", "chap_01"), ) book.add_item(epub.EpubNcx()) book.add_item(epub.EpubNav()) book.spine = ['nav', preface, c1] # 写入文件 epub.write_epub(tmp_file.name, book, {}) yield tmp_file.name # 清理 os.unlink(tmp_file.name) def test_parser_initialization(self, sample_epub): """测试解析器初始化""" parser = EPUBParser(sample_epub) assert parser.epub_path.exists() assert parser.book is not None assert parser.metadata['title'] == 'Test Book' assert parser.metadata['author'] == 'Test Author' def test_extract_metadata(self, sample_epub): """测试元数据提取""" parser = EPUBParser(sample_epub) assert parser.metadata['title'] == 'Test Book' assert parser.metadata['author'] == 'Test Author' assert parser.metadata['language'] == 'en' def test_parse_toc(self, sample_epub): """测试目录解析""" parser = EPUBParser(sample_epub) assert parser.toc_structure['preface'] is not None assert len(parser.toc_structure['chapters']) >= 1 assert parser.toc_structure['preface']['title'] == 'Preface' def test_extract_translatable_content(self, sample_epub): """测试可翻译内容提取""" parser = EPUBParser(sample_epub) content_items = parser.extract_translatable_content() assert len(content_items) >= 1 assert any(item['type'] == 'preface' for item in content_items) assert any(item['type'] == 'chapter' for item in content_items) def test_get_preface_content(self, sample_epub): """测试序言内容获取""" parser = EPUBParser(sample_epub) preface_text = parser.get_preface_content() assert len(preface_text) > 0 assert 'preface' in preface_text.lower() assert 'background information' in preface_text def test_sample_content_for_prompt(self, sample_epub): """测试内容采样""" parser = EPUBParser(sample_epub) samples = parser.sample_content_for_prompt(ratio=0.5) assert isinstance(samples, list) assert len(samples) >= 0 def test_get_book_info(self, sample_epub): """测试书籍信息获取""" parser = EPUBParser(sample_epub) book_info = parser.get_book_info() assert 'title' in book_info assert 'author' in book_info assert 'chapter_count' in book_info assert book_info['title'] == 'Test Book' assert book_info['has_preface'] is True def test_nonexistent_file(self): """测试不存在的文件""" with pytest.raises(FileNotFoundError): EPUBParser('nonexistent.epub')