import datetime import wtforms from babel.dates import LOCALTZ from canaille.app.forms import DateTimeUTCField from flask import current_app from werkzeug.datastructures import ImmutableMultiDict def test_datetime_utc_field_no_timezone_is_local_timezone(testclient): del current_app.config["TIMEZONE"] offset = LOCALTZ.utcoffset(datetime.datetime.utcnow()) class TestForm(wtforms.Form): dt = DateTimeUTCField() form = TestForm() form.validate() assert form.dt.data is None utc_date = datetime.datetime(2023, 6, 1, 12, tzinfo=datetime.timezone.utc) locale_date = datetime.datetime(2023, 6, 1, 12) + offset rendered_locale_date = locale_date.strftime("%Y-%m-%d %H:%M:%S") rendered_locale_date_form = locale_date.strftime("%Y-%m-%d %H:%M:%S") request_form = ImmutableMultiDict({"dt": rendered_locale_date_form}) form = TestForm(request_form) assert form.validate() assert form.dt.data == utc_date assert ( form.dt() == f'' ) form = TestForm(data={"dt": utc_date}) assert form.validate() assert form.dt.data == utc_date assert ( form.dt() == f'' ) class Foobar: dt = utc_date form = TestForm(obj=Foobar()) assert form.validate() assert form.dt.data == utc_date assert ( form.dt() == f'' ) def test_datetime_utc_field_utc(testclient): current_app.config["TIMEZONE"] = "UTC" class TestForm(wtforms.Form): dt = DateTimeUTCField() form = TestForm() form.validate() assert form.dt.data is None date = datetime.datetime(2023, 6, 1, 12, tzinfo=datetime.timezone.utc) rendered_date = date.strftime("%Y-%m-%d %H:%M:%S") rendered_date_form = date.strftime("%Y-%m-%d %H:%M:%S") request_form = ImmutableMultiDict({"dt": rendered_date_form}) form = TestForm(request_form) assert form.validate() assert form.dt.data == date assert ( form.dt() == f'' ) form = TestForm(data={"dt": date}) assert form.validate() assert form.dt.data == date assert ( form.dt() == f'' ) class Foobar: dt = date form = TestForm(obj=Foobar()) assert form.validate() assert form.dt.data == date assert ( form.dt() == f'' ) def test_datetime_utc_field_japan_timezone(testclient): current_app.config["TIMEZONE"] = "Japan" class TestForm(wtforms.Form): dt = DateTimeUTCField() form = TestForm() form.validate() assert form.dt.data is None utc_date = datetime.datetime(2023, 6, 1, 12, tzinfo=datetime.timezone.utc) locale_date = datetime.datetime(2023, 6, 1, 21) rendered_locale_date = locale_date.strftime("%Y-%m-%d %H:%M:%S") rendered_locale_date_form = locale_date.strftime("%Y-%m-%d %H:%M:%S") request_form = ImmutableMultiDict({"dt": rendered_locale_date_form}) form = TestForm(request_form) assert form.validate() assert form.dt.data == utc_date assert ( form.dt() == f'' ) form = TestForm(data={"dt": utc_date}) assert form.validate() assert form.dt.data == utc_date assert ( form.dt() == f'' ) class Foobar: dt = utc_date form = TestForm(obj=Foobar()) assert form.validate() assert form.dt.data == utc_date assert ( form.dt() == f'' ) def test_datetime_utc_field_invalid_timezone(testclient): current_app.config["TIMEZONE"] = "invalid" offset = LOCALTZ.utcoffset(datetime.datetime.utcnow()) class TestForm(wtforms.Form): dt = DateTimeUTCField() form = TestForm() form.validate() assert form.dt.data is None utc_date = datetime.datetime(2023, 6, 1, 12, tzinfo=datetime.timezone.utc) locale_date = datetime.datetime(2023, 6, 1, 12) + offset rendered_locale_date = locale_date.strftime("%Y-%m-%d %H:%M:%S") rendered_locale_date_form = locale_date.strftime("%Y-%m-%d %H:%M:%S") request_form = ImmutableMultiDict({"dt": rendered_locale_date_form}) form = TestForm(request_form) assert form.validate() assert form.dt.data == utc_date assert ( form.dt() == f'' ) form = TestForm(data={"dt": utc_date}) assert form.validate() assert form.dt.data == utc_date assert ( form.dt() == f'' ) class Foobar: dt = utc_date form = TestForm(obj=Foobar()) assert form.validate() assert form.dt.data == utc_date assert ( form.dt() == f'' )