Files
MABEA/backend/tests/test_lager.py
T
patrickandClaude Sonnet 5 b33d1c83a9
CI / backend-tests (push) Successful in 1m58s
CI / frontend-build (push) Successful in 18s
feat(warehouse): WH-005 Umlagerung zwischen Lagerplätzen
Atomare Aus+Ein-Buchung in einer Materialbewegung-Zeile statt zwei
Einzelschritten. NOTIF-001 war bereits produktiv umgesetzt, Backlog
war nur veraltet - korrigiert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-06 09:36:19 +02:00

140 lines
5.0 KiB
Python

import pytest
from tests.conftest import auth_header, login
@pytest.mark.asyncio
async def test_lagerort_hierarchie_und_lagerplatz(client, admin_user):
token = await login(client, "admin1")
wurzel = await client.post(
"/api/v1/lagerorte", json={"name": "Hauptwache", "typ": "standort"}, headers=auth_header(token)
)
assert wurzel.status_code == 201
kind = await client.post(
"/api/v1/lagerorte",
json={"name": "Lager Halle 1", "typ": "lager", "parent_id": wurzel.json()["id"]},
headers=auth_header(token),
)
assert kind.status_code == 201
assert kind.json()["parent_id"] == wurzel.json()["id"]
platz = await client.post(
"/api/v1/lagerplaetze",
json={"lagerort_id": kind.json()["id"], "code": "REGAL-A1", "bezeichnung": "Regal A, Fach 1"},
headers=auth_header(token),
)
assert platz.status_code == 201
doppelt = await client.post(
"/api/v1/lagerplaetze",
json={"lagerort_id": kind.json()["id"], "code": "REGAL-A1"},
headers=auth_header(token),
)
assert doppelt.status_code == 409
@pytest.mark.asyncio
async def test_ein_und_auslagerung_veraendert_bestand_korrekt(client, admin_user, material_factory):
token = await login(client, "admin1")
material = await material_factory("Verbandpäckchen")
lagerort = await client.post(
"/api/v1/lagerorte", json={"name": "Lager X", "typ": "lager"}, headers=auth_header(token)
)
platz = await client.post(
"/api/v1/lagerplaetze",
json={"lagerort_id": lagerort.json()["id"], "code": "PLATZ-1"},
headers=auth_header(token),
)
platz_id = platz.json()["id"]
ein = await client.post(
f"/api/v1/lagerplaetze/{platz_id}/einlagern",
json={"material_id": material.id, "menge": "10"},
headers=auth_header(token),
)
assert ein.status_code == 201
assert ein.json()["von_lagerplatz_id"] is None
assert ein.json()["nach_lagerplatz_id"] == platz_id
bestand = await client.get(f"/api/v1/lagerplaetze/{platz_id}/bestand", headers=auth_header(token))
assert bestand.json()[0]["menge"] == "10"
aus = await client.post(
f"/api/v1/lagerplaetze/{platz_id}/auslagern",
json={"material_id": material.id, "menge": "3"},
headers=auth_header(token),
)
assert aus.status_code == 201
bestand2 = await client.get(f"/api/v1/lagerplaetze/{platz_id}/bestand", headers=auth_header(token))
assert bestand2.json()[0]["menge"] == "7"
zu_viel = await client.post(
f"/api/v1/lagerplaetze/{platz_id}/auslagern",
json={"material_id": material.id, "menge": "999"},
headers=auth_header(token),
)
assert zu_viel.status_code == 409
bewegungen = await client.get(
f"/api/v1/materialbewegungen?lagerplatz_id={platz_id}", headers=auth_header(token)
)
assert len(bewegungen.json()) == 2
@pytest.mark.asyncio
async def test_umlagerung_verschiebt_bestand_atomar(client, admin_user, material_factory):
token = await login(client, "admin1")
material = await material_factory("Beatmungsbeutel")
lagerort = await client.post(
"/api/v1/lagerorte", json={"name": "Lager Y", "typ": "lager"}, headers=auth_header(token)
)
quelle = await client.post(
"/api/v1/lagerplaetze",
json={"lagerort_id": lagerort.json()["id"], "code": "QUELLE-1"},
headers=auth_header(token),
)
ziel = await client.post(
"/api/v1/lagerplaetze",
json={"lagerort_id": lagerort.json()["id"], "code": "ZIEL-1"},
headers=auth_header(token),
)
quelle_id, ziel_id = quelle.json()["id"], ziel.json()["id"]
await client.post(
f"/api/v1/lagerplaetze/{quelle_id}/einlagern",
json={"material_id": material.id, "menge": "10"},
headers=auth_header(token),
)
um = await client.post(
f"/api/v1/lagerplaetze/{quelle_id}/umlagern",
json={"nach_lagerplatz_id": ziel_id, "material_id": material.id, "menge": "4"},
headers=auth_header(token),
)
assert um.status_code == 201
assert um.json()["von_lagerplatz_id"] == quelle_id
assert um.json()["nach_lagerplatz_id"] == ziel_id
bestand_quelle = await client.get(f"/api/v1/lagerplaetze/{quelle_id}/bestand", headers=auth_header(token))
assert bestand_quelle.json()[0]["menge"] == "6"
bestand_ziel = await client.get(f"/api/v1/lagerplaetze/{ziel_id}/bestand", headers=auth_header(token))
assert bestand_ziel.json()[0]["menge"] == "4"
gleich = await client.post(
f"/api/v1/lagerplaetze/{quelle_id}/umlagern",
json={"nach_lagerplatz_id": quelle_id, "material_id": material.id, "menge": "1"},
headers=auth_header(token),
)
assert gleich.status_code == 409
zu_viel = await client.post(
f"/api/v1/lagerplaetze/{quelle_id}/umlagern",
json={"nach_lagerplatz_id": ziel_id, "material_id": material.id, "menge": "999"},
headers=auth_header(token),
)
assert zu_viel.status_code == 409