# 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)
102 lines
3.8 KiB
Python
102 lines
3.8 KiB
Python
import datetime
|
|
from zoneinfo import ZoneInfo
|
|
|
|
import pytest
|
|
import pytz
|
|
from rest_framework import serializers
|
|
|
|
import common.api_helpers.custom_fields as cf
|
|
|
|
|
|
class TestTimeZoneField:
|
|
@pytest.mark.parametrize("tz", pytz.all_timezones)
|
|
def test_valid_timezones(self, tz):
|
|
class MySerializer(serializers.Serializer):
|
|
tz = cf.TimeZoneField()
|
|
|
|
try:
|
|
serializer = MySerializer(data={"tz": tz})
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
assert serializer.validated_data["tz"] == tz
|
|
except Exception:
|
|
pytest.fail()
|
|
|
|
def test_invalid_timezone(self):
|
|
class MySerializer(serializers.Serializer):
|
|
tz = cf.TimeZoneField()
|
|
|
|
with pytest.raises(serializers.ValidationError, match="Invalid timezone"):
|
|
serializer = MySerializer(data={"tz": "potato"})
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
def test_it_works_with_allow_null(self):
|
|
class MySerializer(serializers.Serializer):
|
|
tz = cf.TimeZoneField(allow_null=True)
|
|
|
|
try:
|
|
serializer = MySerializer(data={"tz": None})
|
|
serializer.is_valid(raise_exception=True)
|
|
assert serializer.validated_data["tz"] is None
|
|
|
|
serializer = MySerializer(data={"tz": "UTC"})
|
|
serializer.is_valid(raise_exception=True)
|
|
assert serializer.validated_data["tz"] == "UTC"
|
|
except Exception:
|
|
pytest.fail()
|
|
|
|
def test_it_works_with_required(self):
|
|
class MySerializer(serializers.Serializer):
|
|
tz = cf.TimeZoneField(required=True)
|
|
|
|
with pytest.raises(serializers.ValidationError, match="This field is required"):
|
|
serializer = MySerializer(data={})
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
try:
|
|
serializer = MySerializer(data={"tz": "UTC"})
|
|
serializer.is_valid(raise_exception=True)
|
|
assert serializer.validated_data["tz"] == "UTC"
|
|
except Exception:
|
|
pytest.fail()
|
|
|
|
|
|
class TestTimeZoneAwareDatetimeField:
|
|
@pytest.mark.parametrize(
|
|
"test_case,expected_persisted_value",
|
|
[
|
|
# UTC format
|
|
("2023-07-20T12:00:00Z", datetime.datetime(2023, 7, 20, 12, 0, 0, tzinfo=ZoneInfo("UTC"))),
|
|
# UTC format w/ microseconds
|
|
("2023-07-20T12:00:00.245652Z", datetime.datetime(2023, 7, 20, 12, 0, 0, 245652, tzinfo=ZoneInfo("UTC"))),
|
|
# UTC offset w/ colons + no microseconds
|
|
("2023-07-20T12:00:00+07:00", datetime.datetime(2023, 7, 20, 5, 0, 0, tzinfo=ZoneInfo("UTC"))),
|
|
# UTC offset w/ colons + microseconds
|
|
(
|
|
"2023-07-20T12:00:00.245652+07:00",
|
|
datetime.datetime(2023, 7, 20, 5, 0, 0, 245652, tzinfo=ZoneInfo("UTC")),
|
|
),
|
|
# UTC offset w/ no colons + no microseconds
|
|
("2023-07-20T12:00:00+0700", datetime.datetime(2023, 7, 20, 5, 0, 0, tzinfo=ZoneInfo("UTC"))),
|
|
# UTC offset w/ no colons + microseconds
|
|
(
|
|
"2023-07-20T12:00:00.245652+0700",
|
|
datetime.datetime(2023, 7, 20, 5, 0, 0, 245652, tzinfo=ZoneInfo("UTC")),
|
|
),
|
|
("2023-07-20 12:00:00", None),
|
|
("20230720T120000Z", None),
|
|
],
|
|
)
|
|
def test_various_datetimes(self, test_case, expected_persisted_value):
|
|
class MySerializer(serializers.Serializer):
|
|
dt = cf.TimeZoneAwareDatetimeField()
|
|
|
|
serializer = MySerializer(data={"dt": test_case})
|
|
|
|
if expected_persisted_value:
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
assert serializer.validated_data["dt"] == expected_persisted_value
|
|
else:
|
|
with pytest.raises(serializers.ValidationError):
|
|
serializer.is_valid(raise_exception=True)
|