no-mistakes(review): Guard photo cleanup; add transitions helper and assign auto-advance
This commit is contained in:
@@ -181,6 +181,87 @@ async def test_users_endpoint_lists_technicians(client):
|
||||
assert {"id", "full_name", "role"} <= set(users[0].keys())
|
||||
|
||||
|
||||
# ── Transitions helper (status dropdown) ─────────────────────────────
|
||||
async def test_transitions_helper_returns_valid_targets(client):
|
||||
"""GET /api/tickets/{id}/transitions returns the valid next statuses."""
|
||||
from app.services.ticket import VALID_TRANSITIONS
|
||||
|
||||
token = await _login(client)
|
||||
ticket = await _create_ticket(client, token, description="transitions helper") # status: Logged
|
||||
|
||||
resp = await client.get(f"/api/tickets/{ticket['id']}/transitions")
|
||||
assert resp.status_code == 200, resp.text
|
||||
data = resp.json()
|
||||
assert data["current_status"] == "Logged"
|
||||
assert set(data["transitions"]) == set(VALID_TRANSITIONS["Logged"])
|
||||
|
||||
|
||||
async def test_transitions_helper_terminal_is_empty(client):
|
||||
"""A cancelled ticket exposes no selectable next statuses."""
|
||||
token = await _login(client)
|
||||
ticket = await _create_ticket(client, token, description="terminal transitions")
|
||||
resp = await client.patch(
|
||||
f"/api/tickets/{ticket['id']}",
|
||||
json={"status": "Cancelled"},
|
||||
headers={"Authorization": f"Bearer {token}"},
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
|
||||
data = (await client.get(f"/api/tickets/{ticket['id']}/transitions")).json()
|
||||
assert data["current_status"] == "Cancelled"
|
||||
assert data["transitions"] == []
|
||||
|
||||
|
||||
# ── Assign auto-advance ───────────────────────────────────────────────
|
||||
async def _first_tech_id(client, token: str) -> int:
|
||||
users = (await client.get("/api/auth/users", headers={"Authorization": f"Bearer {token}"})).json()
|
||||
return next(u["id"] for u in users if u["role"] == "Tech")
|
||||
|
||||
|
||||
async def test_assign_auto_advances_to_assigned(client):
|
||||
"""Assigning a pre-Assigned ticket advances it to Assigned with a timeline entry."""
|
||||
token = await _login(client)
|
||||
ticket = await _create_ticket(client, token, description="assign advance") # status: Logged
|
||||
tech_id = await _first_tech_id(client, token)
|
||||
|
||||
resp = await client.patch(
|
||||
f"/api/tickets/{ticket['id']}",
|
||||
json={"assigned_to": tech_id},
|
||||
headers={"Authorization": f"Bearer {token}"},
|
||||
)
|
||||
assert resp.status_code == 200, resp.text
|
||||
data = resp.json()
|
||||
assert data["status"] == "Assigned"
|
||||
assert data["assigned_to"] == tech_id
|
||||
assert data["timeline"][-1]["to_status"] == "Assigned"
|
||||
|
||||
|
||||
async def test_assign_does_not_regress_past_assigned(client):
|
||||
"""Re-assigning a ticket already past Assigned leaves its status untouched."""
|
||||
token = await _login(client)
|
||||
ticket = await _create_ticket(client, token, description="no regression")
|
||||
|
||||
for step in ("Triage", "Assigned", "Accepted"):
|
||||
resp = await client.patch(
|
||||
f"/api/tickets/{ticket['id']}",
|
||||
json={"status": step},
|
||||
headers={"Authorization": f"Bearer {token}"},
|
||||
)
|
||||
assert resp.status_code == 200, resp.text
|
||||
|
||||
users = (await client.get("/api/auth/users", headers={"Authorization": f"Bearer {token}"})).json()
|
||||
techs = [u["id"] for u in users if u["role"] == "Tech"]
|
||||
other_tech = techs[1] if len(techs) > 1 else techs[0]
|
||||
|
||||
resp = await client.patch(
|
||||
f"/api/tickets/{ticket['id']}",
|
||||
json={"assigned_to": other_tech},
|
||||
headers={"Authorization": f"Bearer {token}"},
|
||||
)
|
||||
assert resp.status_code == 200, resp.text
|
||||
assert resp.json()["status"] == "Accepted"
|
||||
|
||||
|
||||
# ── Ticket numbering survives deletions ───────────────────────────────
|
||||
async def test_ticket_number_uses_max_plus_one(client, seed_tickets):
|
||||
"""After deleting a middle ticket, numbering must skip over surviving numbers."""
|
||||
|
||||
Reference in New Issue
Block a user