oncall-engine/engine/apps/schedules/tests/test_shift_swap_request.py
Joey Orlando 74b919ee3e
shift swap requests model + CRUD endpoints (#2597)
# What this PR does

This PR should allow us to start working on _most_ of the remaining
tasks for this feature set.
- Adds a basic `ShiftSwapRequest` model + CRUD endpoints. 
- Adds a `POST /api/internal/v1/shift_swaps/<id>/take` endpoint which
allows a benefactor to take a request (only when certain conditions
about the ssr are met)

Closes #2587 

## Checklist

- [x] Unit, integration, and e2e (if applicable) tests updated
- [x] Documentation added (or `pr:no public docs` PR label added if not
required) will be done in #2589
- [x] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required) (will update once we ship the finalized feature set)
2023-07-21 19:35:19 +00:00

124 lines
3.4 KiB
Python

import datetime
import pytest
from django.utils import timezone
from apps.schedules import exceptions
from apps.schedules.models import OnCallScheduleWeb, ShiftSwapRequest
@pytest.fixture
def ssr_setup(make_schedule, make_organization_and_user, make_user_for_organization, make_shift_swap_request):
def _ssr_setup():
organization, beneficiary = make_organization_and_user()
benefactor = make_user_for_organization(organization)
schedule = make_schedule(organization, schedule_class=OnCallScheduleWeb)
tomorrow = timezone.now() + datetime.timedelta(days=1)
two_days_from_now = tomorrow + datetime.timedelta(days=1)
ssr = make_shift_swap_request(schedule, beneficiary, swap_start=tomorrow, swap_end=two_days_from_now)
return ssr, beneficiary, benefactor
return _ssr_setup
@pytest.mark.django_db
def test_soft_delete(ssr_setup):
ssr, _, _ = ssr_setup()
assert ssr.deleted_at is None
ssr.delete()
ssr.refresh_from_db()
assert ssr.deleted_at is not None
assert ShiftSwapRequest.objects.all().count() == 0
assert ShiftSwapRequest.objects_with_deleted.all().count() == 1
@pytest.mark.django_db
def test_status_open(ssr_setup) -> None:
ssr, _, _ = ssr_setup()
assert ssr.status == ShiftSwapRequest.Statuses.OPEN
@pytest.mark.django_db
def test_status_taken(ssr_setup) -> None:
ssr, _, benefactor = ssr_setup()
assert ssr.status == ShiftSwapRequest.Statuses.OPEN
ssr.benefactor = benefactor
ssr.save()
assert ssr.status == ShiftSwapRequest.Statuses.TAKEN
@pytest.mark.django_db
def test_status_past_due(ssr_setup) -> None:
ssr, _, _ = ssr_setup()
assert ssr.status == ShiftSwapRequest.Statuses.OPEN
ssr.swap_start = ssr.swap_start - datetime.timedelta(days=5)
ssr.save()
assert ssr.status == ShiftSwapRequest.Statuses.PAST_DUE
@pytest.mark.django_db
def test_status_deleted(ssr_setup) -> None:
ssr, _, _ = ssr_setup()
assert ssr.status == ShiftSwapRequest.Statuses.OPEN
ssr.delete()
assert ssr.status == ShiftSwapRequest.Statuses.DELETED
@pytest.mark.django_db
def test_take(ssr_setup) -> None:
ssr, _, benefactor = ssr_setup()
original_updated_at = ssr.updated_at
ssr.take(benefactor)
assert ssr.benefactor == benefactor
assert ssr.updated_at != original_updated_at
# TODO:
@pytest.mark.django_db
def test_take_only_works_for_open_requests(ssr_setup) -> None:
# already taken
ssr, _, benefactor = ssr_setup()
ssr.benefactor = benefactor
ssr.save()
assert ssr.status == ShiftSwapRequest.Statuses.TAKEN
with pytest.raises(exceptions.ShiftSwapRequestNotOpenForTaking):
ssr.take(benefactor)
# past due
ssr, _, benefactor = ssr_setup()
ssr.swap_start = ssr.swap_start - datetime.timedelta(days=5)
ssr.save()
assert ssr.status == ShiftSwapRequest.Statuses.PAST_DUE
with pytest.raises(exceptions.ShiftSwapRequestNotOpenForTaking):
ssr.take(benefactor)
# deleted
ssr, _, benefactor = ssr_setup()
ssr.delete()
assert ssr.status == ShiftSwapRequest.Statuses.DELETED
with pytest.raises(exceptions.ShiftSwapRequestNotOpenForTaking):
ssr.take(benefactor)
@pytest.mark.django_db
def test_take_own_ssr(ssr_setup) -> None:
ssr, beneficiary, _ = ssr_setup()
with pytest.raises(exceptions.BeneficiaryCannotTakeOwnShiftSwapRequest):
ssr.take(beneficiary)