test: набор pytest-тестов под site/ (unit + интеграционные + безопасность)
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
"""Unit-тесты services/classify.py — фильтры + JSON-парсинг + выжимка."""
|
||||
import json
|
||||
|
||||
import pytest
|
||||
|
||||
from services.classify import (
|
||||
_is_garbage_by_filename,
|
||||
_is_garbage_by_header,
|
||||
_safe_json_parse,
|
||||
_smart_extract,
|
||||
)
|
||||
|
||||
|
||||
class TestGarbageFilename:
|
||||
def test_invoice(self):
|
||||
assert _is_garbage_by_filename("счет-фактура №123.docx") is True
|
||||
|
||||
def test_act(self):
|
||||
assert _is_garbage_by_filename("Акт сверки.pdf") is True
|
||||
|
||||
def test_upd(self):
|
||||
assert _is_garbage_by_filename("УПД-2025.docx") is True
|
||||
|
||||
def test_not_garbage(self):
|
||||
assert _is_garbage_by_filename("договор.docx") is False
|
||||
assert _is_garbage_by_filename("спецификация.pdf") is False
|
||||
|
||||
|
||||
class TestGarbageHeader:
|
||||
def test_invoice_header(self):
|
||||
assert _is_garbage_by_header("СЧЕТ-ФАКТУРА № 123 от 01.01.2026") is True
|
||||
|
||||
def test_act_header(self):
|
||||
assert _is_garbage_by_header("АКТ ОКАЗАННЫХ УСЛУГ за май") is True
|
||||
|
||||
def test_not_garbage(self):
|
||||
assert _is_garbage_by_header("ДОГОВОР № 03700_1 об оказании услуг") is False
|
||||
|
||||
|
||||
class TestSafeJsonParse:
|
||||
def test_valid(self):
|
||||
d, fix = _safe_json_parse('{"a":1}')
|
||||
assert d == {"a": 1}
|
||||
assert fix is False
|
||||
|
||||
def test_markdown(self):
|
||||
d, fix = _safe_json_parse('```json\n{"a":1}\n```')
|
||||
assert d == {"a": 1}
|
||||
assert fix is False
|
||||
|
||||
def test_chatter(self):
|
||||
d, _ = _safe_json_parse('Вот ответ: {"a":1}. Спасибо!')
|
||||
assert d == {"a": 1}
|
||||
|
||||
def test_trailing_comma(self):
|
||||
d, fix = _safe_json_parse('{"a":1,}')
|
||||
assert d == {"a": 1}
|
||||
assert fix is True
|
||||
|
||||
def test_trailing_comma_in_list(self):
|
||||
d, fix = _safe_json_parse('{"a":[1,2,]}')
|
||||
assert d == {"a": [1, 2]}
|
||||
assert fix is True
|
||||
|
||||
def test_empty_raises(self):
|
||||
with pytest.raises(ValueError):
|
||||
_safe_json_parse("")
|
||||
|
||||
def test_none_raises(self):
|
||||
with pytest.raises(ValueError):
|
||||
_safe_json_parse(None)
|
||||
|
||||
|
||||
class TestSmartExtract:
|
||||
def test_paragraphs(self):
|
||||
ej = [{"type": "paragraph", "text": "Договор № 03700"}]
|
||||
out = _smart_extract(ej)
|
||||
assert "Договор" in out
|
||||
|
||||
def test_table(self):
|
||||
ej = [{"type": "table", "rows": [["Аренда", "50000"]]}]
|
||||
out = _smart_extract(ej)
|
||||
assert "Аренда" in out
|
||||
|
||||
def test_string_json(self):
|
||||
ej = json.dumps([{"type": "paragraph", "text": "Спецификация"}])
|
||||
out = _smart_extract(ej)
|
||||
assert "Спецификация" in out
|
||||
|
||||
def test_empty(self):
|
||||
assert _smart_extract(None) == ""
|
||||
assert _smart_extract("") == ""
|
||||
Reference in New Issue
Block a user