NewsBlur/vendor/timezones/timezones_tests/tests.py

180 lines
6.2 KiB
Python
Raw Normal View History

import re
from datetime import datetime
import pytz
from django import forms
from django.conf import settings
from django.test import TestCase
2011-04-11 21:57:45 -04:00
import vendor.timezones.forms
import vendor.timezones.timezones_tests.models as test_models
2011-04-11 21:57:45 -04:00
from vendor.timezones.utilities import localtime_for_timezone, adjust_datetime_to_timezone
from vendor import timezones
class TimeZoneTestCase(TestCase):
def setUp(self):
# ensure UTC
self.ORIGINAL_TIME_ZONE = settings.TIME_ZONE
settings.TIME_ZONE = "UTC"
def tearDown(self):
settings.TIME_ZONE = self.ORIGINAL_TIME_ZONE
# little helpers
def assertFormIsValid(self, form):
is_valid = form.is_valid()
self.assertTrue(is_valid,
"Form did not validate (errors=%r, form=%r)" % (form._errors, form)
)
class UtilsTestCase(TimeZoneTestCase):
def test_localtime_for_timezone(self):
self.assertEqual(
localtime_for_timezone(
datetime(2008, 6, 25, 18, 0, 0), "America/Denver"
).strftime("%m/%d/%Y %H:%M:%S"),
"06/25/2008 12:00:00"
)
def test_adjust_datetime_to_timezone(self):
self.assertEqual(
adjust_datetime_to_timezone(
datetime(2008, 6, 25, 18, 0, 0), "UTC"
).strftime("%m/%d/%Y %H:%M:%S"),
"06/25/2008 18:00:00"
)
class TimeZoneFieldTestCase(TimeZoneTestCase):
def test_forms_clean_required(self):
f = timezones.forms.TimeZoneField()
self.assertEqual(
repr(f.clean("US/Eastern")),
"<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>"
)
self.assertRaises(forms.ValidationError, f.clean, "")
def test_forms_clean_not_required(self):
f = timezones.forms.TimeZoneField(required=False)
self.assertEqual(
repr(f.clean("US/Eastern")),
"<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>"
)
self.assertEqual(f.clean(""), "")
def test_forms_clean_bad_value(self):
f = timezones.forms.TimeZoneField()
try:
f.clean("BAD VALUE")
except forms.ValidationError as e:
self.assertEqual(e.messages, ["Select a valid choice. BAD VALUE is not one of the available choices."])
def test_models_as_a_form(self):
class ProfileForm(forms.ModelForm):
class Meta:
model = test_models.Profile
2020-06-23 07:21:56 -04:00
fields = "__all__"
form = ProfileForm()
rendered = form.as_p()
self.assertTrue(
bool(re.search(r'<option value="[\w/]+">\([A-Z]+(?:\+|\-)\d{4}\)\s[\w/]+</option>', rendered)),
"Did not find pattern in rendered form"
)
def test_models_modelform_validation(self):
class ProfileForm(forms.ModelForm):
class Meta:
model = test_models.Profile
2020-06-23 07:21:56 -04:00
fields = "__all__"
now = datetime.now()
tz = "America/Denver"
tz = "(GMT%s) %s" % (now.strftime("%z"), tz)
form = ProfileForm({"name": "Brian Rosner", "timezone": tz})
self.assertFormIsValid(form)
def test_models_modelform_save(self):
class ProfileForm(forms.ModelForm):
class Meta:
model = test_models.Profile
2020-06-23 07:21:56 -04:00
fields = "__all__"
tz = "America/Denver"
now = datetime.now()
tz = "(GMT%s) %s" % (now.strftime("%z"), tz)
form = ProfileForm({"name": "Brian Rosner", "timezone": tz})
self.assertFormIsValid(form)
p = form.save()
def test_models_string_value(self):
p = test_models.Profile(name="Brian Rosner", timezone="America/Denver")
p.save()
p = test_models.Profile.objects.get(pk=p.pk)
self.assertEqual(p.timezone, pytz.timezone("America/Denver"))
def test_models_string_value_lookup(self):
test_models.Profile(name="Brian Rosner", timezone="America/Denver").save()
qs = test_models.Profile.objects.filter(timezone="America/Denver")
self.assertEqual(qs.count(), 1)
def test_models_tz_value(self):
tz = pytz.timezone("America/Denver")
p = test_models.Profile(name="Brian Rosner", timezone=tz)
p.save()
p = test_models.Profile.objects.get(pk=p.pk)
self.assertEqual(p.timezone, tz)
def test_models_tz_value_lookup(self):
test_models.Profile(name="Brian Rosner", timezone="America/Denver").save()
qs = test_models.Profile.objects.filter(timezone=pytz.timezone("America/Denver"))
self.assertEqual(qs.count(), 1)
class LocalizedDateTimeFieldTestCase(TimeZoneTestCase):
def test_forms_clean_required(self):
# the default case where no timezone is given explicitly. uses settings.TIME_ZONE.
f = timezones.forms.LocalizedDateTimeField()
self.assertEqual(
repr(f.clean("2008-05-30 14:30:00")),
"datetime.datetime(2008, 5, 30, 14, 30, tzinfo=<UTC>)"
)
self.assertRaises(forms.ValidationError, f.clean, "")
def test_forms_clean_required(self):
# the default case where no timezone is given explicitly. uses settings.TIME_ZONE.
f = timezones.forms.LocalizedDateTimeField(required=False)
self.assertEqual(
repr(f.clean("2008-05-30 14:30:00")),
"datetime.datetime(2008, 5, 30, 14, 30, tzinfo=<UTC>)"
)
self.assertEqual(f.clean(""), None)
# @@@ old doctests that have not been finished (largely due to needing to
# better understand how these bits were created and use-cases)
NOT_USED = {"API_TESTS": r"""
>>> class Foo(object):
... datetime = datetime(2008, 6, 20, 23, 58, 17)
... @decorators.localdatetime('datetime')
... def localdatetime(self):
... return 'Australia/Lindeman'
...
>>> foo = Foo()
>>> foo.datetime
datetime.datetime(2008, 6, 20, 23, 58, 17)
>>> foo.localdatetime
datetime.datetime(2008, 6, 21, 9, 58, 17, tzinfo=<DstTzInfo 'Australia/Lindeman' EST+10:00:00 STD>)
>>> foo.localdatetime = datetime(2008, 6, 12, 23, 50, 0)
>>> foo.datetime
datetime.datetime(2008, 6, 12, 13, 50, tzinfo=<UTC>)
>>> foo.localdatetime
datetime.datetime(2008, 6, 12, 23, 50, tzinfo=<DstTzInfo 'Australia/Lindeman' EST+10:00:00 STD>)
"""}