diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_date_intervals.py | 6 | ||||
-rw-r--r-- | tests/test_dates.py | 183 | ||||
-rw-r--r-- | tests/test_support.py | 12 |
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' |