| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- import uuid
- from httpx import AsyncClient
- from sqlalchemy import false, select
- from sqlalchemy.orm import Session
- from app.main import app
- from app.models import Project, Slot, Sms, User, Volunteer
- from app.tests.conftest import (
- default_project_id,
- default_volunteer_id,
- default_slot_id,
- )
- async def test_read_list_project_volunteers(
- client: AsyncClient, default_user_headers: dict, default_public_project: Project
- ):
- response = await client.get(
- app.url_path_for("list_project_volunteers", project_id=default_project_id),
- )
- assert response.status_code == 401
- response = await client.get(
- app.url_path_for("list_project_volunteers", project_id=uuid.uuid4()),
- headers=default_user_headers,
- )
- assert response.status_code == 404
- response = await client.get(
- app.url_path_for("list_project_volunteers", project_id="pas un uuid valid"),
- headers=default_user_headers,
- )
- assert response.status_code == 422
- response = await client.get(
- app.url_path_for("list_project_volunteers", project_id=default_project_id),
- headers=default_user_headers,
- )
- assert response.status_code == 200
- data = response.json()
- assert len(data) == 1
- volunteer_response = data[0]
- assert volunteer_response["name"] == "Arthur"
- assert volunteer_response["id"] == default_volunteer_id
- assert "created_at" in volunteer_response
- async def test_create_volunteer(
- client: AsyncClient,
- default_public_project: Project,
- default_user_headers: dict,
- session: Session,
- ):
- # Test without autentication
- response = await client.post(
- app.url_path_for("create_volunteer", project_id=default_project_id)
- )
- assert response.status_code == 401
- payload = {
- "name": "Lancelot",
- "email": "lancelot@dulac.fr",
- "phone_number": "03 14 15 92 65",
- }
- # test invalid project_id
- response = await client.post(
- app.url_path_for("create_volunteer", project_id=uuid.uuid4()),
- json=payload,
- headers=default_user_headers,
- )
- assert response.status_code == 404
- # Test normal payload
- response = await client.post(
- app.url_path_for("create_volunteer", project_id=default_project_id),
- json=payload,
- headers=default_user_headers,
- )
- assert response.status_code == 200
- assert response.json()["id"] != default_project_id
- assert response.json()["name"] == "Lancelot"
- assert response.json()["comment"] == ""
- result = session.execute(
- select(Volunteer).where(Volunteer.project_id == default_project_id)
- )
- volunteers = result.scalars().all()
- assert len(volunteers) > 1
- # test invalid payload
- del payload["name"]
- response = await client.post(
- app.url_path_for("create_volunteer", project_id=default_project_id),
- json=payload,
- headers=default_user_headers,
- )
- assert response.status_code == 422
- async def test_create_volunteer_comment(
- client: AsyncClient,
- default_public_project: Project,
- default_user_headers: dict,
- session: Session,
- ):
- payload = {
- "name": "Lancelot",
- "email": "lancelot@dulac.fr",
- "phone_number": "03 14 15 92 65",
- "comment": "it's a knight",
- }
- # Test normal payload
- response = await client.post(
- app.url_path_for("create_volunteer", project_id=default_project_id),
- json=payload,
- headers=default_user_headers,
- )
- assert response.status_code == 200
- assert response.json()["id"] != default_project_id
- assert response.json()["name"] == "Lancelot"
- assert response.json()["comment"] != ""
- new_id = response.json()["id"]
- result = session.execute(select(Volunteer).where(Volunteer.id == new_id))
- volunteer = result.scalar_one_or_none()
- assert volunteer is not None
- assert volunteer.comment == "it's a knight"
- async def test_update_volunteer(
- client: AsyncClient,
- default_public_project: Project,
- default_user_headers: dict,
- session: Session,
- ):
- # Test without autentication
- response = await client.post(
- app.url_path_for(
- "update_volunteer",
- project_id=default_project_id,
- volunteer_id=default_volunteer_id,
- )
- )
- assert response.status_code == 401
- payload = {
- "name": "Lancelot",
- "email": "lancelot@dulac.fr",
- "phone_number": "03 14 15 92 65",
- "automatic_sms": False,
- "comment": "new comment",
- }
- # test invalid project_id
- response = await client.post(
- app.url_path_for(
- "update_volunteer",
- project_id=uuid.uuid4(),
- volunteer_id=default_volunteer_id,
- ),
- json=payload,
- headers=default_user_headers,
- )
- assert response.status_code == 404
- # test invalid volunteer_id
- response = await client.post(
- app.url_path_for(
- "update_volunteer",
- project_id=default_project_id,
- volunteer_id=uuid.uuid4(),
- ),
- json=payload,
- headers=default_user_headers,
- )
- assert response.status_code == 404
- # Test normal payload
- for k, v in payload.items():
- response = await client.post(
- app.url_path_for(
- "update_volunteer",
- project_id=default_project_id,
- volunteer_id=default_volunteer_id,
- ),
- json={k: v},
- headers=default_user_headers,
- )
- assert response.status_code == 200
- assert response.json()["id"] == default_volunteer_id
- assert response.json()[k] == v
- async def test_update_volunteer_slots(
- client: AsyncClient,
- default_public_project: Project,
- default_user_headers: dict,
- session: Session,
- ):
- response = await client.post(
- app.url_path_for(
- "update_volunteer",
- project_id=default_project_id,
- volunteer_id=default_volunteer_id,
- ),
- json={"slots": []},
- headers=default_user_headers,
- )
- assert response.status_code == 200
- result = session.execute(select(Slot).where(Slot.id == default_slot_id))
- slot = result.scalars().first()
- assert slot is not None
- assert slot.volunteers_id == []
- response = await client.post(
- app.url_path_for(
- "update_volunteer",
- project_id=default_project_id,
- volunteer_id=default_volunteer_id,
- ),
- json={"slots": [default_slot_id]},
- headers=default_user_headers,
- )
- assert response.status_code == 200
- session.refresh(slot)
- assert slot is not None
- assert slot.volunteers_id == [default_volunteer_id]
- # An invalid slot list
- response = await client.post(
- app.url_path_for(
- "update_volunteer",
- project_id=default_project_id,
- volunteer_id=default_volunteer_id,
- ),
- json={"slots": [str(uuid.uuid4())]},
- headers=default_user_headers,
- )
- assert response.status_code == 400
- # An invalid slot list
- response = await client.post(
- app.url_path_for(
- "update_volunteer",
- project_id=default_project_id,
- volunteer_id=default_volunteer_id,
- ),
- json={"slots": ["not uuid str"]},
- headers=default_user_headers,
- )
- assert response.status_code == 422
- async def test_delete_volunteer(
- client: AsyncClient,
- default_user_headers: dict,
- session: Session,
- default_public_project: Project,
- ):
- # Fail deleting the project due to not logged in
- response = await client.delete(
- app.url_path_for(
- "delete_volunteer",
- project_id=default_project_id,
- volunteer_id=default_volunteer_id,
- )
- )
- assert response.status_code == 401
- result = session.execute(
- select(Volunteer).where(Volunteer.id == default_volunteer_id)
- )
- volunteer = result.scalars().first()
- assert volunteer is not None
- # Proper deletion
- response = await client.delete(
- app.url_path_for(
- "delete_volunteer",
- project_id=default_project_id,
- volunteer_id=default_volunteer_id,
- ),
- headers=default_user_headers,
- )
- assert response.status_code == 200
- result = session.execute(
- select(Volunteer).where(Volunteer.id == default_volunteer_id)
- )
- volunteer = result.scalars().first()
- assert volunteer is None
- # check deletion is cascaded to slots
- result = session.execute(select(Slot).where(Slot.id == default_slot_id))
- slot: Slot | None = result.scalar_one_or_none()
- assert slot is not None
- assert default_volunteer_id not in slot.volunteers_id
- # Idempotence test
- response = await client.delete(
- app.url_path_for(
- "delete_volunteer",
- project_id=default_project_id,
- volunteer_id=default_volunteer_id,
- ),
- headers=default_user_headers,
- )
- assert response.status_code == 200
- # can delete random uuid
- response = await client.delete(
- app.url_path_for(
- "delete_volunteer", project_id=default_project_id, volunteer_id=uuid.uuid4()
- ),
- headers=default_user_headers,
- )
- assert response.status_code == 200
- # Cannot delete non uuid string
- response = await client.delete(
- app.url_path_for(
- "delete_volunteer", project_id=default_project_id, volunteer_id="not uidstr"
- ),
- headers=default_user_headers,
- )
- assert response.status_code == 422
|