- CRUD complet, scopé par édition, sur Position, Shift, Volunteer, Assignment
(routers app/api/*, schémas Pydantic, dépendance get_edition partagée)
- Volunteer : gestion des compétences par codes (création à la volée),
suppression = effacement complet en cascade (RGPD)
- Shift : contrôle fin > début, poste de la même édition, compétences requises
- Assignment : toute écriture active passe par le moteur de validation ;
violation bloquante -> 422 error.validation_failed, avertissements renvoyés
dans la réponse. Endpoint POST .../assignments/validate en simulation.
app/validation/loader.py construit la ValidationInput depuis la base.
- GET /editions/{id}/matrix : postes -> créneaux -> {min, ideal, confirmed,
proposed}, source de l'écran principal
- 30 tests d'API (CRUD, 404/409/422, cascade, blocage, avertissements, matrice,
loader) ; 104 tests au total ; alembic check toujours vert
- Clés de traduction shift.* / assignment.* / volunteer.* ajoutées
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017uUsRg7XzopkCPWimwg9ZM
38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
import uuid
|
|
|
|
|
|
def _url(edition, suffix=""):
|
|
return f"/editions/{edition.id}/positions{suffix}"
|
|
|
|
|
|
def test_position_crud_roundtrip(client, edition):
|
|
created = client.post(
|
|
_url(edition),
|
|
json={"name": "Billetterie", "category": "TICKETING", "location": "Entrée A"},
|
|
)
|
|
assert created.status_code == 201
|
|
pid = created.json()["id"]
|
|
assert created.json()["category"] == "TICKETING"
|
|
|
|
assert client.get(_url(edition, f"/{pid}")).json()["name"] == "Billetterie"
|
|
assert [p["name"] for p in client.get(_url(edition)).json()] == ["Billetterie"]
|
|
|
|
patched = client.patch(
|
|
_url(edition, f"/{pid}"), json={"location": "Entrée B"}
|
|
)
|
|
assert patched.json()["location"] == "Entrée B"
|
|
assert patched.json()["name"] == "Billetterie"
|
|
|
|
assert client.delete(_url(edition, f"/{pid}")).status_code == 204
|
|
assert client.get(_url(edition, f"/{pid}")).status_code == 404
|
|
|
|
|
|
def test_unknown_position_is_404(client, edition):
|
|
assert client.get(_url(edition, f"/{uuid.uuid4()}")).status_code == 404
|
|
|
|
|
|
def test_unknown_edition_is_404(client):
|
|
assert (
|
|
client.get(f"/editions/{uuid.uuid4()}/positions").status_code == 404
|
|
)
|