# 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)
124 lines
3.4 KiB
Python
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)
|