Просмотр исходного кода

test and fix template reassignements

clovis 1 год назад
Родитель
Сommit
db6b2e0aaa
3 измененных файлов с 50 добавлено и 9 удалено
  1. 12 7
      app/api/endpoints/slots.py
  2. 2 2
      app/schemas/requests.py
  3. 36 0
      app/tests/test_slot.py

+ 12 - 7
app/api/endpoints/slots.py

@@ -88,13 +88,14 @@ async def update_slot(
         raise HTTPException(status_code=404, detail="Slot not found : ")
 
     if new_slot.template_id is not None:
-        await verify_id_list(
-            session,
-            [new_slot.template_id],
-            project_id,
-            SlotTemplate,
-            "Invalid template id",
-        )
+        if new_slot.template_id != "":
+            await verify_id_list(
+                session,
+                [new_slot.template_id],
+                project_id,
+                SlotTemplate,
+                "Invalid template id",
+            )
 
     input_dict = new_slot.model_dump(exclude_unset=True)
     if "volunteers" in input_dict:
@@ -116,6 +117,10 @@ async def update_slot(
 
         del input_dict["volunteers"]
 
+    if "template_id" in input_dict and input_dict["template_id"] == "":
+        slot.template_id = None
+        del input_dict["template_id"]
+
     update_object_from_payload(slot, input_dict)
     session.commit()
     session.refresh(slot)

+ 2 - 2
app/schemas/requests.py

@@ -1,5 +1,5 @@
 import datetime
-from typing import Optional
+from typing import Literal, Optional
 
 from pydantic import UUID4, BaseModel, EmailStr, Field
 
@@ -105,7 +105,7 @@ class SlotUpdateRequest(BaseRequest):
     ending_time: Optional[datetime.datetime] = None
     required_volunteers: Optional[int] = None
     volunteers: Optional[list[UUID4]] = None
-    template_id: Optional[UUID4] = None
+    template_id: Optional[UUID4 | Literal[""]] = None
 
 
 class TemplateCreateRequest(BaseRequest):

+ 36 - 0
app/tests/test_slot.py

@@ -10,6 +10,7 @@ from app.tests.conftest import (
     default_project_id,
     default_slot_id,
     default_volunteer_id,
+    default_template_id,
 )
 
 
@@ -197,6 +198,41 @@ async def test_update_slot(
             assert response.json()[k] == v
 
 
+async def test_update_slot_remove_template(
+    client: AsyncClient,
+    default_public_project: Project,
+    default_user_headers: dict,
+    session: Session,
+):
+    response = await client.post(
+        app.url_path_for(
+            "update_slot",
+            project_id=default_project_id,
+            slot_id=default_slot_id,
+        ),
+        json={"template_id": default_template_id},
+        headers=default_user_headers,
+    )
+    assert response.status_code == 200
+    slot = session.execute(
+        select(Slot).where(Slot.project_id == default_project_id)
+    ).scalar_one()
+    assert slot.template_id == default_template_id
+
+    response = await client.post(
+        app.url_path_for(
+            "update_slot",
+            project_id=default_project_id,
+            slot_id=default_slot_id,
+        ),
+        json={"template_id": ""},
+        headers=default_user_headers,
+    )
+    assert response.status_code == 200
+    session.refresh(slot)
+    assert slot.template_id is None
+
+
 async def test_update_bad_slot_template(
     client: AsyncClient,
     default_public_project: Project,