Skip to content

Commit

Permalink
Benymng/mutation delete single meal request (#111)
Browse files Browse the repository at this point in the history
* Add DeleteMealRequest mutation to MealRequestMutations

* Added test for admin and non admin for delete meal request endpoint

* fixed lint issues

* Updated tests

---------

Co-authored-by: Shahan Neda <shahan.neda@gmail.com>
  • Loading branch information
benymng and shahanneda authored Feb 27, 2024
1 parent 669c99d commit 91e46e8
Show file tree
Hide file tree
Showing 3 changed files with 189 additions and 0 deletions.
38 changes: 38 additions & 0 deletions backend/app/graphql/meal_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,11 +193,49 @@ def mutate(self, info, meal_request_id, requestor_id):
return CancelDonation(meal_request=meal_request)


class DeleteMealRequest(Mutation):
class Arguments:
meal_request_id = graphene.ID(required=True)
requestor_id = graphene.String(required=True)

meal_request = graphene.Field(MealRequestResponse)

def mutate(self, info, meal_request_id, requestor_id):
user = services["user_service"]
requestor_auth_id = user.get_auth_id_by_user_id(requestor_id)
requestor_role = user.get_user_role_by_auth_id(requestor_auth_id)

try:
meal_request = services["meal_request_service"].get_meal_request_by_id(
meal_request_id
)
if not meal_request:
raise Exception("Meal request not found")

if (requestor_role == "Admin") or (
meal_request.requestor["id"] == requestor_id
and not meal_request.donation_info
):
meal_request = services["meal_request_service"].delete_meal_request(
meal_request_id
)
else:
raise Exception(
"Only admins or requestors who have not found a donor can delete meal requests."
)

except Exception as e:
raise GraphQLError(str(e))

return DeleteMealRequest(meal_request=meal_request)


class MealRequestMutations(MutationList):
create_meal_request = CreateMealRequests.Field()
update_meal_request = UpdateMealRequest.Field()
commit_to_meal_request = CommitToMealRequest.Field()
cancel_donation = CancelDonation.Field()
delete_meal_request = DeleteMealRequest.Field()


class MealRequestQueries(QueryList):
Expand Down
18 changes: 18 additions & 0 deletions backend/app/services/implementations/meal_request_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,24 @@ def cancel_donation(self, meal_request_id: str) -> MealRequestDTO:
self.logger.error(str(error))
raise error

def delete_meal_request(self, meal_request_id: str) -> MealRequestDTO:
try:
meal_request = MealRequest.objects(id=meal_request_id).first()
if not meal_request:
raise Exception(f'Meal request "{meal_request_id}" not found')

meal_request.delete()

meal_request_dto = self.convert_meal_request_to_dto(
meal_request, meal_request.requestor
)

return meal_request_dto

except Exception as error:
self.logger.error(str(error))
raise error

def convert_meal_request_to_dto(
self, request: MealRequest, requestor: User
) -> MealRequestDTO:
Expand Down
133 changes: 133 additions & 0 deletions backend/tests/graphql/test_meal_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -605,6 +605,139 @@ def test_cancel_donation_as_non_admin(meal_request_setup):
assert executed.data["cancelDonation"] is None


def test_delete_meal_request_as_admin(meal_request_setup, user_setup):
_, _, meal_request = meal_request_setup
_, _, admin = user_setup
mutation = f"""
mutation testDeleteMealRequest {{
deleteMealRequest(
mealRequestId: "{str(meal_request.id)}",
requestorId: "{str(admin.id)}"
)
{{
mealRequest{{
id
status
dropOffDatetime
dropOffLocation
mealInfo{{
portions
dietaryRestrictions
}}
onsiteStaff{{
name
email
phone
}}
donationInfo{{
donor{{
id
info{{
email
}}
}}
}}
deliveryInstructions
}}
}}
}}
"""
executed = graphql_schema.execute(mutation)
assert executed.errors is None
result = executed.data["deleteMealRequest"]["mealRequest"]
assert result["id"] == str(meal_request.id)
assert MealRequest.objects(id=meal_request.id).first() is None


def test_delete_meal_request_as_asp(meal_request_setup):
asp, non_admin, meal_request = meal_request_setup
mutation = f"""
mutation testDeleteMealRequest {{
deleteMealRequest(
mealRequestId: "{str(meal_request.id)}",
requestorId: "{str(asp.id)}"
)
{{
mealRequest{{
id
status
dropOffDatetime
dropOffLocation
mealInfo{{
portions
dietaryRestrictions
}}
onsiteStaff{{
name
email
phone
}}
donationInfo{{
donor{{
id
info{{
email
}}
}}
}}
deliveryInstructions
}}
}}
}}
"""
executed = graphql_schema.execute(mutation)
assert executed.errors is None
result = executed.data["deleteMealRequest"]["mealRequest"]
assert result["id"] == str(meal_request.id)
assert MealRequest.objects(id=meal_request.id).first() is None


def test_delete_meal_request_as_non_admin_fails_if_donor(meal_request_setup):
asp, meal_donor, meal_request = meal_request_setup
test_commit_to_meal_request(meal_request_setup)

mutation = f"""
mutation testDeleteMealRequest {{
deleteMealRequest(
mealRequestId: "{str(meal_request.id)}",
requestorId: "{str(asp.id)}"
)
{{
mealRequest{{
id
status
dropOffDatetime
dropOffLocation
mealInfo{{
portions
dietaryRestrictions
}}
onsiteStaff{{
name
email
phone
}}
donationInfo{{
donor{{
id
info{{
email
}}
}}
}}
deliveryInstructions
}}
}}
}}
"""
executed = graphql_schema.execute(mutation)
assert (
executed.errors[0].message
== "Only admins or requestors who have not found a donor can delete meal requests."
)
assert MealRequest.objects(id=meal_request.id).first() is not None


def test_get_meal_request_by_donor_id(meal_request_setup):
_, donor, meal_request = meal_request_setup

Expand Down

0 comments on commit 91e46e8

Please sign in to comment.