- Add pytest test suite across all modules (config, database, file_processor, ai_processor, api, scheduler, monitoring, ftp_server) - 145 tests covering normal paths, error handling, edge cases - Mock external dependencies (AI endpoint, requests, pyftpdlib) - 95% code coverage with fail-under=90 threshold in CI - Update CI workflow to run pytest with coverage enforcement - Add pyproject.toml with pytest/coverage configuration
115 lines
3.7 KiB
Python
115 lines
3.7 KiB
Python
"""Tests for file_processor module."""
|
|
|
|
import os
|
|
import pytest
|
|
import tempfile
|
|
import json
|
|
|
|
from factsdb.file_processor import FileProcessor
|
|
|
|
|
|
@pytest.fixture
|
|
def processor():
|
|
return FileProcessor()
|
|
|
|
|
|
class TestDetectFileType:
|
|
def test_txt(self, processor):
|
|
assert processor.detect_file_type("file.txt") == "txt"
|
|
|
|
def test_html(self, processor):
|
|
assert processor.detect_file_type("page.html") == "html"
|
|
|
|
def test_htm(self, processor):
|
|
assert processor.detect_file_type("page.htm") == "htm"
|
|
|
|
def test_pdf(self, processor):
|
|
assert processor.detect_file_type("doc.pdf") == "pdf"
|
|
|
|
def test_json(self, processor):
|
|
assert processor.detect_file_type("data.json") == "json"
|
|
|
|
def test_xml(self, processor):
|
|
assert processor.detect_file_type("data.xml") == "xml"
|
|
|
|
def test_uppercase(self, processor):
|
|
assert processor.detect_file_type("file.TXT") == "txt"
|
|
|
|
def test_no_extension(self, processor):
|
|
assert processor.detect_file_type("file") == ""
|
|
|
|
|
|
class TestIsSupportedFileType:
|
|
def test_supported(self, processor, tmp_path):
|
|
for ext in ["txt", "md", "log", "html", "htm", "pdf", "xml", "json"]:
|
|
f = tmp_path / f"file.{ext}"
|
|
f.touch()
|
|
assert processor.is_supported_file_type(str(f)) is True
|
|
|
|
def test_unsupported(self, processor, tmp_path):
|
|
f = tmp_path / "file.xyz"
|
|
f.touch()
|
|
assert processor.is_supported_file_type(str(f)) is False
|
|
|
|
|
|
class TestExtractTextFromFile:
|
|
def test_text_file(self, processor, tmp_path):
|
|
f = tmp_path / "test.txt"
|
|
f.write_text("Hello World")
|
|
assert processor.extract_text_from_file(str(f)) == "Hello World"
|
|
|
|
def test_html_file(self, processor, tmp_path):
|
|
f = tmp_path / "test.html"
|
|
f.write_text("<html><body><p>Hello</p></body></html>")
|
|
text = processor.extract_text_from_file(str(f))
|
|
assert "Hello" in text
|
|
|
|
def test_json_file(self, processor, tmp_path):
|
|
f = tmp_path / "test.json"
|
|
data = {"key": "value"}
|
|
f.write_text(json.dumps(data))
|
|
text = processor.extract_text_from_file(str(f))
|
|
assert "key" in text
|
|
|
|
def test_unsupported_type(self, processor, tmp_path):
|
|
f = tmp_path / "test.xyz"
|
|
f.write_text("x")
|
|
with pytest.raises(Exception, match="Unsupported file type"):
|
|
processor.extract_text_from_file(str(f))
|
|
|
|
def test_nonexistent_file(self, processor):
|
|
with pytest.raises(Exception):
|
|
processor.extract_text_from_file("/nonexistent/path/file.txt")
|
|
|
|
|
|
class TestHtmlExtraction:
|
|
def test_removes_scripts(self, processor, tmp_path):
|
|
f = tmp_path / "test.html"
|
|
f.write_text("<html><script>alert(1)</script><p>Content</p></html>")
|
|
text = processor.extract_text_from_file(str(f))
|
|
assert "alert" not in text
|
|
assert "Content" in text
|
|
|
|
def test_removes_styles(self, processor, tmp_path):
|
|
f = tmp_path / "test.html"
|
|
f.write_text("<html><style>body{}</style><p>Content</p></html>")
|
|
text = processor.extract_text_from_file(str(f))
|
|
assert "Content" in text
|
|
|
|
|
|
class TestGetFileInfo:
|
|
def test_basic_info(self, processor, tmp_path):
|
|
f = tmp_path / "test.txt"
|
|
f.write_text("hello")
|
|
info = processor.get_file_info(str(f))
|
|
assert info["name"] == "test.txt"
|
|
assert info["type"] == "txt"
|
|
assert info["is_supported"] is True
|
|
assert info["size"] == 5
|
|
|
|
def test_unsupported_info(self, processor, tmp_path):
|
|
f = tmp_path / "test.xyz"
|
|
f.write_text("hello")
|
|
info = processor.get_file_info(str(f))
|
|
assert info["is_supported"] is False
|