Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
96 lines
2.8 KiB
Python
96 lines
2.8 KiB
Python
import base64
|
|
|
|
import pytest
|
|
from fastapi.testclient import TestClient
|
|
|
|
from src.main import app
|
|
|
|
|
|
@pytest.fixture
|
|
def client():
|
|
return TestClient(app)
|
|
|
|
|
|
def test_extract_valid_zugferd(client):
|
|
with open("tests/fixtures/EN16931_Einfach.pdf", "rb") as f:
|
|
pdf_base64 = base64.b64encode(f.read()).decode()
|
|
|
|
response = client.post("/extract", json={"pdf_base64": pdf_base64})
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert data["is_zugferd"] is True
|
|
assert data["zugferd_profil"] == "EN16931"
|
|
assert "xml_raw" in data
|
|
assert "xml_data" in data
|
|
assert "pdf_text" in data
|
|
assert "extraction_meta" in data
|
|
|
|
|
|
def test_extract_non_zugferd(client):
|
|
with open("tests/fixtures/EmptyPDFA1.pdf", "rb") as f:
|
|
pdf_base64 = base64.b64encode(f.read()).decode()
|
|
|
|
response = client.post("/extract", json={"pdf_base64": pdf_base64})
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert data["is_zugferd"] is False
|
|
assert data["zugferd_profil"] is None
|
|
assert "pdf_text" in data
|
|
assert "extraction_meta" in data
|
|
|
|
|
|
def test_extract_invalid_base64(client):
|
|
response = client.post("/extract", json={"pdf_base64": "invalid!!!"})
|
|
assert response.status_code == 400
|
|
data = response.json()
|
|
assert data["error"] == "invalid_base64"
|
|
assert "message" in data
|
|
|
|
|
|
def test_extract_non_pdf(client):
|
|
pdf_base64 = base64.b64encode(b"Hello World").decode()
|
|
response = client.post("/extract", json={"pdf_base64": pdf_base64})
|
|
assert response.status_code == 400
|
|
data = response.json()
|
|
assert "error" in data
|
|
|
|
|
|
def test_validate_pflichtfelder(client):
|
|
response = client.post(
|
|
"/validate",
|
|
json={
|
|
"xml_data": {
|
|
"invoice_number": "RE-001",
|
|
"invoice_date": "2025-02-04",
|
|
"supplier": {"name": "Test GmbH", "vat_id": "DE123456789"},
|
|
"buyer": {"name": "Kunde AG"},
|
|
"totals": {
|
|
"net": 100.0,
|
|
"gross": 119.0,
|
|
"vat_total": 19.0,
|
|
"line_total_sum": 100.0,
|
|
},
|
|
"line_items": [
|
|
{
|
|
"position": 1,
|
|
"description": "Test",
|
|
"quantity": 1.0,
|
|
"unit": "Stück",
|
|
"unit_price": 100.0,
|
|
"line_total": 100.0,
|
|
}
|
|
],
|
|
},
|
|
"checks": ["pflichtfelder"],
|
|
},
|
|
)
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert "result" in data
|
|
assert "is_valid" in data["result"]
|
|
|
|
|
|
def test_validate_empty_checks(client):
|
|
response = client.post("/validate", json={"xml_data": {}, "checks": []})
|
|
assert response.status_code == 200
|