test: FZA tests korrigiert (can_manual_time_entry, TimeEntryWithWarnings, CalDAV race fix)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+20
-11
@@ -303,9 +303,15 @@ async def test_fza_cancel_approved_refunds(
|
|||||||
assert r3.status_code == 200, r3.text
|
assert r3.status_code == 200, r3.text
|
||||||
assert r3.json()["status"] == "cancelled"
|
assert r3.json()["status"] == "cancelled"
|
||||||
|
|
||||||
# Rückbuchung prüfen
|
# Rückbuchung prüfen – frischen Query statt refresh (vermeidet Race mit CalDAV-Background-Task)
|
||||||
await db_session.refresh(ob)
|
import asyncio
|
||||||
taken_after_cancel = float(ob.taken_hours)
|
await asyncio.sleep(0.15) # CalDAV fire-and-forget abwarten
|
||||||
|
await db_session.execute(text("SET LOCAL app.bypass_rls = 'on'"))
|
||||||
|
ob2 = await db_session.scalar(
|
||||||
|
select(OvertimeBalance).where(OvertimeBalance.user_id == emp_me["id"])
|
||||||
|
.execution_options(populate_existing=True)
|
||||||
|
)
|
||||||
|
taken_after_cancel = float(ob2.taken_hours)
|
||||||
assert taken_after_cancel == pytest.approx(0.0, abs=0.1), f"Rückbuchung fehlgeschlagen, got {taken_after_cancel}"
|
assert taken_after_cancel == pytest.approx(0.0, abs=0.1), f"Rückbuchung fehlgeschlagen, got {taken_after_cancel}"
|
||||||
|
|
||||||
|
|
||||||
@@ -355,20 +361,23 @@ async def test_time_entry_approval_updates_overtime_balance(
|
|||||||
):
|
):
|
||||||
"""Nach Genehmigung eines Zeiteintrags wird OvertimeBalance.total_hours neu berechnet."""
|
"""Nach Genehmigung eines Zeiteintrags wird OvertimeBalance.total_hours neu berechnet."""
|
||||||
emp_me = (await client.get("/api/v1/auth/me", headers=fza_employee_headers)).json()
|
emp_me = (await client.get("/api/v1/auth/me", headers=fza_employee_headers)).json()
|
||||||
hr_me = (await client.get("/api/v1/auth/me", headers=fza_hr_headers)).json()
|
|
||||||
|
|
||||||
# Eintrag manuell anlegen (10h, 2h Überstunden bei 8h Soll)
|
# Manuelle Zeiterfassung für diesen User freischalten
|
||||||
|
emp_id = emp_me["id"]
|
||||||
|
r = await client.patch(f"/api/v1/users/{emp_id}", json={"can_manual_time_entry": True}, headers=fza_admin_headers)
|
||||||
|
assert r.status_code == 200, f"Manual entry freischalten fehlgeschlagen: {r.text}"
|
||||||
|
|
||||||
|
# Eintrag manuell anlegen (10h = 2h Überstunden bei 8h Soll-Tag)
|
||||||
resp = await client.post("/api/v1/time/entries", json={
|
resp = await client.post("/api/v1/time/entries", json={
|
||||||
"date": "2026-06-01",
|
"date": "2026-06-01",
|
||||||
"start_time": "08:00",
|
"start_time": "08:00",
|
||||||
"end_time": "18:00",
|
"end_time": "18:00",
|
||||||
"break_minutes": 0,
|
"break_minutes": 0,
|
||||||
}, headers=fza_employee_headers)
|
}, headers=fza_employee_headers)
|
||||||
# Kann 201 oder 200 sein je nach Implementation
|
assert resp.status_code == 201, resp.text
|
||||||
assert resp.status_code in (200, 201), resp.text
|
entry_id = resp.json()["entry"]["id"]
|
||||||
entry_id = resp.json()["id"]
|
|
||||||
|
|
||||||
# Genehmigen (HR != EMPLOYEE, Self-Approval ist geblockt)
|
# Genehmigen (HR, kein Self-Approval)
|
||||||
r2 = await client.post(f"/api/v1/time/entries/{entry_id}/approve", headers=fza_hr_headers)
|
r2 = await client.post(f"/api/v1/time/entries/{entry_id}/approve", headers=fza_hr_headers)
|
||||||
assert r2.status_code == 200, r2.text
|
assert r2.status_code == 200, r2.text
|
||||||
|
|
||||||
@@ -376,7 +385,7 @@ async def test_time_entry_approval_updates_overtime_balance(
|
|||||||
await db_session.execute(text("SET LOCAL app.bypass_rls = 'on'"))
|
await db_session.execute(text("SET LOCAL app.bypass_rls = 'on'"))
|
||||||
ob = await db_session.scalar(
|
ob = await db_session.scalar(
|
||||||
select(OvertimeBalance).where(OvertimeBalance.user_id == emp_me["id"])
|
select(OvertimeBalance).where(OvertimeBalance.user_id == emp_me["id"])
|
||||||
|
.execution_options(populate_existing=True)
|
||||||
)
|
)
|
||||||
if ob:
|
assert ob is not None, "OvertimeBalance wurde nicht angelegt"
|
||||||
await db_session.refresh(ob)
|
|
||||||
assert ob.last_calculated is not None, "last_calculated sollte nach Genehmigung gesetzt sein"
|
assert ob.last_calculated is not None, "last_calculated sollte nach Genehmigung gesetzt sein"
|
||||||
|
|||||||
Reference in New Issue
Block a user