"""Smoke-Tests fuer Rechnungs-CRUD (Admin).""" import os import secrets def test_admin_create_invoice(client, admin): """POST /api/admin/invoices als Admin -> 201 mit Rechnungsnummer.""" r = client.post( "/api/admin/invoices", headers=admin["headers"], json={ "recipient_name": "Max Mustermann", "recipient_email": "max@example.com", "items": [{"description": "Pro-Jahresabo", "quantity": 1, "unit_price": 29.0}], "service_period": "2026-01-01 - 2026-12-31", "notes": "Test-Rechnung", }, ) assert r.status_code == 201, r.text data = r.json() assert data["invoice_number"].startswith("RG-") assert data["amount_gross"] == 29.0 assert data["status"] == "draft" assert len(data["items"]) == 1 def test_admin_list_invoices(client, admin): """GET /api/admin/invoices listet vorhandene Rechnungen.""" # Eine erstellen client.post( "/api/admin/invoices", headers=admin["headers"], json={ "recipient_name": "Tester Listing", "recipient_email": f"list-{secrets.token_hex(3)}@example.com", "items": [{"description": "Sub", "quantity": 1, "unit_price": 49.0}], }, ) r = client.get("/api/admin/invoices", headers=admin["headers"]) assert r.status_code == 200 data = r.json() assert isinstance(data, list) assert len(data) >= 1 def test_non_admin_cannot_create_invoice(client, user): """Normaler User -> 403.""" r = client.post( "/api/admin/invoices", headers=user["headers"], json={ "recipient_name": "x", "recipient_email": "x@example.com", "items": [{"description": "x", "quantity": 1, "unit_price": 1.0}], }, ) assert r.status_code == 403 def test_admin_send_invoice(client, admin, tmp_path, monkeypatch): """Send-Endpoint generiert PDF, ruft (gemockten) Mailer auf, setzt Status auf 'sent'.""" # Paperless-Verzeichnis auf tmp_path setzen scaninput = tmp_path / "scaninput" scaninput.mkdir() monkeypatch.setenv("SCANINPUT_DIR", str(scaninput)) monkeypatch.setenv("PAPERLESS_URL", "") # kein HTTP-Call monkeypatch.setenv("KLEINUNTERNEHMER", "true") # Rechnung anlegen r = client.post( "/api/admin/invoices", headers=admin["headers"], json={ "recipient_name": "Send-Test", "recipient_email": f"send-{secrets.token_hex(3)}@example.com", "items": [{"description": "Sub", "quantity": 1, "unit_price": 29.0}], "service_period": "2026-01-01 - 2026-12-31", }, ) assert r.status_code == 201, r.text inv = r.json() # Senden r2 = client.post(f"/api/admin/invoices/{inv['id']}/send", headers=admin["headers"]) assert r2.status_code == 200, r2.text # Status auf 'sent'? r3 = client.get(f"/api/admin/invoices/{inv['id']}", headers=admin["headers"]) assert r3.status_code == 200 assert r3.json()["status"] == "sent"