More tests

This commit is contained in:
Alex committed 2026-03-31 00:07:19 +01:00
1 parent d5c0322e2a
commit a3b08a5b44
37 files changed
+21904 -6

No files matched your search

+41
View File
@@ -380,3 +380,44 @@ class TestDoclingSubclasses:
parser = DoclingXMLParser()
assert parser.export_format == "markdown"
# =====================================================================
# Coverage gap tests (lines 148-153, 289)
# =====================================================================
@pytest.mark.unit
class TestDoclingParserGaps:
def test_get_ocr_options_import_error_returns_none(self):
"""Cover lines 148-150: ImportError returns None."""
from application.parser.file.docling_parser import DoclingParser
parser = DoclingParser(ocr_enabled=True, use_rapidocr=True)
with patch.dict("sys.modules", {"docling.datamodel.pipeline_options": None}):
# Force re-import to trigger ImportError
with patch(
"builtins.__import__", side_effect=ImportError("no module")
):
result = parser._get_ocr_options()
assert result is None
def test_get_ocr_options_generic_error_returns_none(self):
"""Cover lines 151-153: generic Exception returns None."""
from application.parser.file.docling_parser import DoclingParser
parser = DoclingParser(ocr_enabled=True, use_rapidocr=True)
with patch(
"builtins.__import__",
side_effect=RuntimeError("unexpected"),
):
result = parser._get_ocr_options()
assert result is None
def test_csv_parser_init(self):
"""Cover line 289: DoclingCSVParser.__init__ calls super."""
from application.parser.file.docling_parser import DoclingCSVParser
parser = DoclingCSVParser()
assert parser.export_format == "markdown"
assert parser.ocr_enabled is True
+51
View File
@@ -185,3 +185,54 @@ class TestBaseParserProperties:
parser = PDFParser()
meta = parser.get_file_metadata(Path("test.pdf"))
assert meta == {}
# =====================================================================
# Coverage gap tests (lines 33-34, 59, 63)
# =====================================================================
@pytest.mark.unit
class TestDocsParserGaps:
def test_pdf_parser_parse_as_image(self, tmp_path):
"""Cover lines 33-34: PARSE_PDF_AS_IMAGE sends to external service."""
from application.parser.file.docs_parser import PDFParser
pdf_file = tmp_path / "test.pdf"
pdf_file.write_bytes(b"%PDF-1.4 fake content")
with patch(
"application.parser.file.docs_parser.settings"
) as mock_settings:
mock_settings.PARSE_PDF_AS_IMAGE = True
with patch(
"application.parser.file.docs_parser.requests.post"
) as mock_post:
mock_post.return_value = MagicMock(
json=MagicMock(return_value={"markdown": "# Parsed Content"})
)
parser = PDFParser()
result = parser.parse_file(pdf_file)
assert result == "# Parsed Content"
mock_post.assert_called_once()
def test_docx_parser_init_parser(self):
"""Cover line 59: DocxParser._init_parser returns empty dict."""
from application.parser.file.docs_parser import DocxParser
parser = DocxParser()
config = parser._init_parser()
assert config == {}
def test_docx_parser_import_error(self):
"""Cover line 63: ImportError when docx2txt not installed."""
from application.parser.file.docs_parser import DocxParser
parser = DocxParser()
with patch.dict("sys.modules", {"docx2txt": None}):
with patch(
"builtins.__import__",
side_effect=ImportError("No module named 'docx2txt'"),
):
with pytest.raises((ImportError, ValueError)):
parser.parse_file(Path("/tmp/fake.docx"))
+75
View File
@@ -0,0 +1,75 @@
"""Tests for application.parser.file.openapi3_parser covering lines 7-8, 45."""
import pytest
from unittest.mock import MagicMock, patch
@pytest.mark.unit
class TestOpenAPI3ParserImportFallback:
def test_import_fallback_to_base_parser(self):
"""Cover lines 7-8: try/except ModuleNotFoundError import fallback."""
# The fallback import is a module-level concern. Just verify the class works.
with patch("application.parser.file.openapi3_parser.parse"):
from application.parser.file.openapi3_parser import OpenAPI3Parser
parser = OpenAPI3Parser()
assert parser is not None
def test_get_base_urls(self):
"""Cover basic URL extraction."""
with patch("application.parser.file.openapi3_parser.parse"):
from application.parser.file.openapi3_parser import OpenAPI3Parser
parser = OpenAPI3Parser()
urls = parser.get_base_urls([
"https://api.example.com/v1/users",
"https://api.example.com/v1/items",
"https://other.example.com/v2/test",
])
assert "https://api.example.com" in urls
assert "https://other.example.com" in urls
assert len(urls) == 2
def test_get_info_from_paths_empty(self):
"""Cover path with no operations."""
with patch("application.parser.file.openapi3_parser.parse"):
from application.parser.file.openapi3_parser import OpenAPI3Parser
parser = OpenAPI3Parser()
mock_path = MagicMock()
mock_path.operations = []
result = parser.get_info_from_paths(mock_path)
assert result == ""
def test_parse_file_writes_results(self, tmp_path):
"""Cover line 45: parse_file writes to results.txt."""
with patch("application.parser.file.openapi3_parser.parse") as mock_parse:
from application.parser.file.openapi3_parser import OpenAPI3Parser
mock_server = MagicMock()
mock_server.url = "https://api.example.com"
mock_path = MagicMock()
mock_path.url = "/users"
mock_path.description = "Get users"
mock_path.parameters = []
mock_path.operations = []
mock_data = MagicMock()
mock_data.servers = [mock_server]
mock_data.paths = [mock_path]
mock_parse.return_value = mock_data
parser = OpenAPI3Parser()
import os
original_cwd = os.getcwd()
try:
os.chdir(str(tmp_path))
parser.parse_file(str(tmp_path / "spec.yaml"))
assert (tmp_path / "results.txt").exists()
content = (tmp_path / "results.txt").read_text()
assert "Base URL:" in content
assert "/users" in content
finally:
os.chdir(original_cwd)