summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorDS/Charlie <82801887+ds-cbo@users.noreply.github.com>2023-01-11 11:34:43 +0100
committerGitHub <noreply@github.com>2023-01-11 12:34:43 +0200
commit14216ed8f90832eed9c8ea24442d5b63da4389eb (patch)
treec6f5fecc12d5c62da148a0840eaf180e74c0b7f4 /tests
parent53637ddbacaef2474429b22176091a362ce6567f (diff)
downloadbabel-14216ed8f90832eed9c8ea24442d5b63da4389eb.tar.gz
Implement zoneinfo support and make pytz optional (#940)
Diffstat (limited to 'tests')
-rw-r--r--tests/test_date_intervals.py6
-rw-r--r--tests/test_dates.py183
-rw-r--r--tests/test_support.py12
3 files changed, 108 insertions, 93 deletions
diff --git a/tests/test_date_intervals.py b/tests/test_date_intervals.py
index dc3ae34..eb3aa89 100644
--- a/tests/test_date_intervals.py
+++ b/tests/test_date_intervals.py
@@ -1,8 +1,8 @@
import datetime
from babel import dates
-from babel.dates import get_timezone
from babel.util import UTC
+from .test_dates import timezone_getter
TEST_DT = datetime.datetime(2016, 1, 8, 11, 46, 15)
TEST_TIME = TEST_DT.time()
@@ -31,10 +31,10 @@ def test_format_interval_no_difference():
assert dates.format_interval(t1, t2, "yMd", fuzzy=False, locale="fi") == "8.1.2016"
-def test_format_interval_in_tz():
+def test_format_interval_in_tz(timezone_getter):
t1 = TEST_DT.replace(tzinfo=UTC)
t2 = t1 + datetime.timedelta(minutes=18)
- hki_tz = get_timezone("Europe/Helsinki")
+ hki_tz = timezone_getter("Europe/Helsinki")
assert dates.format_interval(t1, t2, "Hmv", tzinfo=hki_tz, locale="fi") == "13.46\u201314.04 aikavyöhyke: Suomi"
diff --git a/tests/test_dates.py b/tests/test_dates.py
index b62f542..9fd7314 100644
--- a/tests/test_dates.py
+++ b/tests/test_dates.py
@@ -12,36 +12,46 @@
import calendar
from datetime import date, datetime, time, timedelta
-import unittest
import freezegun
import pytest
-import pytz
-from pytz import timezone
+
+# for tests it can be useful to have both zoneinfo and pytz available
+try:
+ import zoneinfo
+except ModuleNotFoundError:
+ try:
+ from backports import zoneinfo
+ except ImportError:
+ zoneinfo = None
+
+try:
+ import pytz
+except ModuleNotFoundError:
+ pytz = None
from babel import dates, Locale
-from babel.dates import NO_INHERITANCE_MARKER
+from babel.dates import NO_INHERITANCE_MARKER, _localize, _get_tz_name, LOCALTZ
from babel.util import FixedOffsetTimezone
-@pytest.fixture(params=["pytz.timezone", "zoneinfo.ZoneInfo"])
+@pytest.fixture(params=["pytz.timezone", "zoneinfo.ZoneInfo"], scope="package")
def timezone_getter(request):
if request.param == "pytz.timezone":
- return timezone
+ if pytz:
+ return pytz.timezone
+ else:
+ pytest.skip("pytz not available")
elif request.param == "zoneinfo.ZoneInfo":
- try:
- import zoneinfo
- except ImportError:
- try:
- from backports import zoneinfo
- except ImportError:
- pytest.skip("zoneinfo not available")
- return zoneinfo.ZoneInfo
+ if zoneinfo:
+ return zoneinfo.ZoneInfo
+ else:
+ pytest.skip("zoneinfo not available")
else:
raise NotImplementedError
-class DateTimeFormatTestCase(unittest.TestCase):
+class DateTimeFormatTestCase:
def test_quarter_format(self):
d = date(2006, 6, 8)
@@ -205,33 +215,33 @@ class DateTimeFormatTestCase(unittest.TestCase):
d = time(0, 0, 0)
assert dates.DateTimeFormat(d, locale='en_US')['AAAA'] == '0000'
- def test_timezone_rfc822(self):
- tz = timezone('Europe/Berlin')
- t = tz.localize(datetime(2015, 1, 1, 15, 30))
+ def test_timezone_rfc822(self, timezone_getter):
+ tz = timezone_getter('Europe/Berlin')
+ t = _localize(tz, datetime(2015, 1, 1, 15, 30))
assert dates.DateTimeFormat(t, locale='de_DE')['Z'] == '+0100'
- def test_timezone_gmt(self):
- tz = timezone('Europe/Berlin')
- t = tz.localize(datetime(2015, 1, 1, 15, 30))
+ def test_timezone_gmt(self, timezone_getter):
+ tz = timezone_getter('Europe/Berlin')
+ t = _localize(tz, datetime(2015, 1, 1, 15, 30))
assert dates.DateTimeFormat(t, locale='de_DE')['ZZZZ'] == 'GMT+01:00'
- def test_timezone_name(self):
- tz = timezone('Europe/Paris')
- dt = tz.localize(datetime(2007, 4, 1, 15, 30))
+ def test_timezone_name(self, timezone_getter):
+ tz = timezone_getter('Europe/Paris')
+ dt = _localize(tz, datetime(2007, 4, 1, 15, 30))
assert dates.DateTimeFormat(dt, locale='fr_FR')['v'] == 'heure : France'
- def test_timezone_location_format(self):
- tz = timezone('Europe/Paris')
- dt = datetime(2007, 4, 1, 15, 30, tzinfo=tz)
+ def test_timezone_location_format(self, timezone_getter):
+ tz = timezone_getter('Europe/Paris')
+ dt = _localize(tz, datetime(2007, 4, 1, 15, 30))
assert dates.DateTimeFormat(dt, locale='fr_FR')['VVVV'] == 'heure : France'
- def test_timezone_walltime_short(self):
- tz = timezone('Europe/Paris')
+ def test_timezone_walltime_short(self, timezone_getter):
+ tz = timezone_getter('Europe/Paris')
t = time(15, 30, tzinfo=tz)
assert dates.DateTimeFormat(t, locale='fr_FR')['v'] == 'heure : France'
- def test_timezone_walltime_long(self):
- tz = timezone('Europe/Paris')
+ def test_timezone_walltime_long(self, timezone_getter):
+ tz = timezone_getter('Europe/Paris')
t = time(15, 30, tzinfo=tz)
assert dates.DateTimeFormat(t, locale='fr_FR')['vvvv'] == u'heure d’Europe centrale'
@@ -249,7 +259,7 @@ class DateTimeFormatTestCase(unittest.TestCase):
assert dates.format_time(t, 'K a', locale=l) == '0 PM'
-class FormatDateTestCase(unittest.TestCase):
+class FormatDateTestCase:
def test_with_time_fields_in_pattern(self):
with pytest.raises(AttributeError):
@@ -265,18 +275,18 @@ class FormatDateTestCase(unittest.TestCase):
assert dates.format_date(d, 'w', locale='en_US') == '14'
-class FormatDatetimeTestCase(unittest.TestCase):
+class FormatDatetimeTestCase:
- def test_with_float(self):
- d = datetime(2012, 4, 1, 15, 30, 29, tzinfo=timezone('UTC'))
+ def test_with_float(self, timezone_getter):
+ UTC = timezone_getter('UTC')
+ d = datetime(2012, 4, 1, 15, 30, 29, tzinfo=UTC)
epoch = float(calendar.timegm(d.timetuple()))
formatted_string = dates.format_datetime(epoch, format='long', locale='en_US')
assert formatted_string == u'April 1, 2012 at 3:30:29 PM UTC'
- def test_timezone_formats_los_angeles(self):
- dt = datetime(2016, 1, 13, 7, 8, 35)
- tz = dates.get_timezone('America/Los_Angeles')
- dt = tz.localize(dt)
+ def test_timezone_formats_los_angeles(self, timezone_getter):
+ tz = timezone_getter('America/Los_Angeles')
+ dt = _localize(tz, datetime(2016, 1, 13, 7, 8, 35))
assert dates.format_datetime(dt, 'z', locale='en') == u'PST'
assert dates.format_datetime(dt, 'zz', locale='en') == u'PST'
assert dates.format_datetime(dt, 'zzz', locale='en') == u'PST'
@@ -300,10 +310,9 @@ class FormatDatetimeTestCase(unittest.TestCase):
assert dates.format_datetime(dt, 'xxxx', locale='en') == u'-0800'
assert dates.format_datetime(dt, 'xxxxx', locale='en') == u'-08:00'
- def test_timezone_formats_utc(self):
- dt = datetime(2016, 1, 13, 7, 8, 35)
- tz = dates.get_timezone('UTC')
- dt = tz.localize(dt)
+ def test_timezone_formats_utc(self, timezone_getter):
+ tz = timezone_getter('UTC')
+ dt = _localize(tz, datetime(2016, 1, 13, 7, 8, 35))
assert dates.format_datetime(dt, 'Z', locale='en') == u'+0000'
assert dates.format_datetime(dt, 'ZZ', locale='en') == u'+0000'
assert dates.format_datetime(dt, 'ZZZ', locale='en') == u'+0000'
@@ -323,10 +332,9 @@ class FormatDatetimeTestCase(unittest.TestCase):
assert dates.format_datetime(dt, 'xxxx', locale='en') == u'+0000'
assert dates.format_datetime(dt, 'xxxxx', locale='en') == u'+00:00'
- def test_timezone_formats_kolkata(self):
- dt = datetime(2016, 1, 13, 7, 8, 35)
- tz = dates.get_timezone('Asia/Kolkata')
- dt = tz.localize(dt)
+ def test_timezone_formats_kolkata(self, timezone_getter):
+ tz = timezone_getter('Asia/Kolkata')
+ dt = _localize(tz, datetime(2016, 1, 13, 7, 8, 35))
assert dates.format_datetime(dt, 'zzzz', locale='en') == u'India Standard Time'
assert dates.format_datetime(dt, 'ZZZZ', locale='en') == u'GMT+05:30'
assert dates.format_datetime(dt, 'ZZZZZ', locale='en') == u'+05:30'
@@ -345,18 +353,19 @@ class FormatDatetimeTestCase(unittest.TestCase):
assert dates.format_datetime(dt, 'xxxxx', locale='en') == u'+05:30'
-class FormatTimeTestCase(unittest.TestCase):
+class FormatTimeTestCase:
- def test_with_naive_datetime_and_tzinfo(self):
+ def test_with_naive_datetime_and_tzinfo(self, timezone_getter):
assert dates.format_time(
datetime(2007, 4, 1, 15, 30),
'long',
- tzinfo=timezone('US/Eastern'),
+ tzinfo=timezone_getter('US/Eastern'),
locale='en',
) == '11:30:00 AM EDT'
- def test_with_float(self):
- d = datetime(2012, 4, 1, 15, 30, 29, tzinfo=timezone('UTC'))
+ def test_with_float(self, timezone_getter):
+ tz = timezone_getter('UTC')
+ d = _localize(tz, datetime(2012, 4, 1, 15, 30, 29))
epoch = float(calendar.timegm(d.timetuple()))
assert dates.format_time(epoch, format='long', locale='en_US') == u'3:30:29 PM UTC'
@@ -369,7 +378,7 @@ class FormatTimeTestCase(unittest.TestCase):
dates.format_time(datetime(2007, 4, 1, 15, 30), "yyyy-MM-dd HH:mm", locale='en_US')
-class FormatTimedeltaTestCase(unittest.TestCase):
+class FormatTimedeltaTestCase:
def test_zero_seconds(self):
td = timedelta(seconds=0)
@@ -398,7 +407,7 @@ class FormatTimedeltaTestCase(unittest.TestCase):
dates.format_timedelta(timedelta(hours=1), format=format)
-class TimeZoneAdjustTestCase(unittest.TestCase):
+class TimeZoneAdjustTestCase:
def _utc(self):
class EvilFixedOffsetTimezone(FixedOffsetTimezone):
@@ -410,7 +419,7 @@ class TimeZoneAdjustTestCase(unittest.TestCase):
assert hasattr(UTC, 'normalize') is False
return UTC
- def test_can_format_time_with_non_pytz_timezone(self):
+ def test_can_format_time_with_custom_timezone(self):
# regression test for #257
utc = self._utc()
t = datetime(2007, 4, 1, 15, 30, tzinfo=utc)
@@ -465,13 +474,13 @@ def test_get_time_format():
u'HH:mm:ss zzzz')
-def test_get_timezone_gmt():
+def test_get_timezone_gmt(timezone_getter):
dt = datetime(2007, 4, 1, 15, 30)
assert dates.get_timezone_gmt(dt, locale='en') == u'GMT+00:00'
assert dates.get_timezone_gmt(dt, locale='en', return_z=True) == 'Z'
assert dates.get_timezone_gmt(dt, locale='en', width='iso8601_short') == u'+00'
- tz = timezone('America/Los_Angeles')
- dt = tz.localize(datetime(2007, 4, 1, 15, 30))
+ tz = timezone_getter('America/Los_Angeles')
+ dt = _localize(tz, datetime(2007, 4, 1, 15, 30))
assert dates.get_timezone_gmt(dt, locale='en') == u'GMT-07:00'
assert dates.get_timezone_gmt(dt, 'short', locale='en') == u'-0700'
assert dates.get_timezone_gmt(dt, locale='en', width='iso8601_short') == u'-07'
@@ -582,21 +591,27 @@ def test_format_date():
u"Sun, Apr 1, '07")
-def test_format_datetime():
+def test_format_datetime(timezone_getter):
dt = datetime(2007, 4, 1, 15, 30)
assert (dates.format_datetime(dt, locale='en_US') ==
u'Apr 1, 2007, 3:30:00 PM')
- full = dates.format_datetime(dt, 'full', tzinfo=timezone('Europe/Paris'),
- locale='fr_FR')
+ full = dates.format_datetime(
+ dt, 'full',
+ tzinfo=timezone_getter('Europe/Paris'),
+ locale='fr_FR'
+ )
assert full == (u'dimanche 1 avril 2007 à 17:30:00 heure '
u'd\u2019\xe9t\xe9 d\u2019Europe centrale')
- custom = dates.format_datetime(dt, "yyyy.MM.dd G 'at' HH:mm:ss zzz",
- tzinfo=timezone('US/Eastern'), locale='en')
+ custom = dates.format_datetime(
+ dt, "yyyy.MM.dd G 'at' HH:mm:ss zzz",
+ tzinfo=timezone_getter('US/Eastern'),
+ locale='en'
+ )
assert custom == u'2007.04.01 AD at 11:30:00 EDT'
-def test_format_time():
+def test_format_time(timezone_getter):
t = time(15, 30)
assert dates.format_time(t, locale='en_US') == u'3:30:00 PM'
assert dates.format_time(t, format='short', locale='de_DE') == u'15:30'
@@ -604,31 +619,31 @@ def test_format_time():
assert (dates.format_time(t, "hh 'o''clock' a", locale='en') ==
u"03 o'clock PM")
- t = datetime(2007, 4, 1, 15, 30)
- tzinfo = timezone('Europe/Paris')
- t = tzinfo.localize(t)
- fr = dates.format_time(t, format='full', tzinfo=tzinfo, locale='fr_FR')
- assert fr == u'15:30:00 heure d\u2019\xe9t\xe9 d\u2019Europe centrale'
- custom = dates.format_time(t, "hh 'o''clock' a, zzzz",
- tzinfo=timezone('US/Eastern'), locale='en')
+ paris = timezone_getter('Europe/Paris')
+ eastern = timezone_getter('US/Eastern')
+
+ t = _localize(paris, datetime(2007, 4, 1, 15, 30))
+ fr = dates.format_time(t, format='full', tzinfo=paris, locale='fr_FR')
+ assert fr == '15:30:00 heure d’été d’Europe centrale'
+
+ custom = dates.format_time(t, "hh 'o''clock' a, zzzz", tzinfo=eastern, locale='en')
assert custom == u"09 o'clock AM, Eastern Daylight Time"
t = time(15, 30)
- paris = dates.format_time(t, format='full',
- tzinfo=timezone('Europe/Paris'), locale='fr_FR')
- assert paris == u'15:30:00 heure normale d\u2019Europe centrale'
- us_east = dates.format_time(t, format='full',
- tzinfo=timezone('US/Eastern'), locale='en_US')
+ paris = dates.format_time(t, format='full', tzinfo=paris, locale='fr_FR')
+ assert paris == '15:30:00 heure normale d’Europe centrale'
+
+ us_east = dates.format_time(t, format='full', tzinfo=eastern, locale='en_US')
assert us_east == u'3:30:00 PM Eastern Standard Time'
-def test_format_skeleton():
+def test_format_skeleton(timezone_getter):
dt = datetime(2007, 4, 1, 15, 30)
assert (dates.format_skeleton('yMEd', dt, locale='en_US') == u'Sun, 4/1/2007')
assert (dates.format_skeleton('yMEd', dt, locale='th') == u'อา. 1/4/2007')
assert (dates.format_skeleton('EHm', dt, locale='en') == u'Sun 15:30')
- assert (dates.format_skeleton('EHm', dt, tzinfo=timezone('Asia/Bangkok'), locale='th') == u'อา. 22:30 น.')
+ assert (dates.format_skeleton('EHm', dt, tzinfo=timezone_getter('Asia/Bangkok'), locale='th') == u'อา. 22:30 น.')
def test_format_timedelta():
@@ -721,18 +736,18 @@ def test_format_current_moment():
@pytest.mark.all_locales
-def test_no_inherit_metazone_marker_never_in_output(locale):
+def test_no_inherit_metazone_marker_never_in_output(locale, timezone_getter):
# See: https://github.com/python-babel/babel/issues/428
- tz = pytz.timezone('America/Los_Angeles')
- t = tz.localize(datetime(2016, 1, 6, 7))
+ tz = timezone_getter('America/Los_Angeles')
+ t = _localize(tz, datetime(2016, 1, 6, 7))
assert NO_INHERITANCE_MARKER not in dates.format_time(t, format='long', locale=locale)
assert NO_INHERITANCE_MARKER not in dates.get_timezone_name(t, width='short', locale=locale)
-def test_no_inherit_metazone_formatting():
+def test_no_inherit_metazone_formatting(timezone_getter):
# See: https://github.com/python-babel/babel/issues/428
- tz = pytz.timezone('America/Los_Angeles')
- t = tz.localize(datetime(2016, 1, 6, 7))
+ tz = timezone_getter('America/Los_Angeles')
+ t = _localize(tz, datetime(2016, 1, 6, 7))
assert dates.format_time(t, format='long', locale='en_US') == "7:00:00 AM PST"
assert dates.format_time(t, format='long', locale='en_GB') == "07:00:00 Pacific Standard Time"
assert dates.get_timezone_name(t, width='short', locale='en_US') == "PST"
diff --git a/tests/test_support.py b/tests/test_support.py
index c73e53b..d39d8ef 100644
--- a/tests/test_support.py
+++ b/tests/test_support.py
@@ -23,6 +23,8 @@ from io import BytesIO
from babel import support
from babel.messages import Catalog
from babel.messages.mofile import write_mo
+from babel.dates import get_timezone
+from .test_dates import timezone_getter
SKIP_LGETTEXT = sys.version_info >= (3, 8)
@@ -300,16 +302,14 @@ def test_format_date():
assert fmt.date(date(2007, 4, 1)) == 'Apr 1, 2007'
-def test_format_datetime():
- from pytz import timezone
- fmt = support.Format('en_US', tzinfo=timezone('US/Eastern'))
+def test_format_datetime(timezone_getter):
+ fmt = support.Format('en_US', tzinfo=timezone_getter('US/Eastern'))
when = datetime(2007, 4, 1, 15, 30)
assert fmt.datetime(when) == 'Apr 1, 2007, 11:30:00 AM'
-def test_format_time():
- from pytz import timezone
- fmt = support.Format('en_US', tzinfo=timezone('US/Eastern'))
+def test_format_time(timezone_getter):
+ fmt = support.Format('en_US', tzinfo=timezone_getter('US/Eastern'))
assert fmt.time(datetime(2007, 4, 1, 15, 30)) == '11:30:00 AM'