You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
5.1 KiB
135 lines
5.1 KiB
6 years ago
|
import mock
|
||
|
import os
|
||
|
import pytz
|
||
|
import sys
|
||
|
import tzlocal.unix
|
||
|
import unittest
|
||
|
|
||
|
from datetime import datetime
|
||
|
|
||
|
|
||
|
class TzLocalTests(unittest.TestCase):
|
||
|
def setUp(self):
|
||
|
if 'TZ' in os.environ:
|
||
|
del os.environ['TZ']
|
||
|
|
||
|
self.path = os.path.split(__file__)[0]
|
||
|
|
||
|
def test_env(self):
|
||
|
tz_harare = tzlocal.unix._tz_from_env(':Africa/Harare')
|
||
|
self.assertEqual(tz_harare.zone, 'Africa/Harare')
|
||
|
|
||
|
# Some Unices allow this as well, so we must allow it:
|
||
|
tz_harare = tzlocal.unix._tz_from_env('Africa/Harare')
|
||
|
self.assertEqual(tz_harare.zone, 'Africa/Harare')
|
||
|
|
||
|
tz_local = tzlocal.unix._tz_from_env(':' + os.path.join(self.path, 'test_data', 'Harare'))
|
||
|
self.assertEqual(tz_local.zone, 'local')
|
||
|
# Make sure the local timezone is the same as the Harare one above.
|
||
|
# We test this with a past date, so that we don't run into future changes
|
||
|
# of the Harare timezone.
|
||
|
dt = datetime(2012, 1, 1, 5)
|
||
|
self.assertEqual(tz_harare.localize(dt), tz_local.localize(dt))
|
||
|
|
||
|
# Non-zoneinfo timezones are not supported in the TZ environment.
|
||
|
self.assertRaises(pytz.UnknownTimeZoneError, tzlocal.unix._tz_from_env, 'GMT+03:00')
|
||
|
|
||
|
# Test the _try function
|
||
|
os.environ['TZ'] = 'Africa/Harare'
|
||
|
tz_harare = tzlocal.unix._try_tz_from_env()
|
||
|
self.assertEqual(tz_harare.zone, 'Africa/Harare')
|
||
|
# With a zone that doesn't exist
|
||
|
os.environ['TZ'] = 'Just Nonsense'
|
||
|
tz_harare = tzlocal.unix._try_tz_from_env()
|
||
|
self.assertIsNone(tz_harare)
|
||
|
|
||
|
|
||
|
def test_timezone(self):
|
||
|
# Most versions of Ubuntu
|
||
|
|
||
|
tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data', 'timezone'))
|
||
|
self.assertEqual(tz.zone, 'Africa/Harare')
|
||
|
|
||
|
def test_zone_setting(self):
|
||
|
# A ZONE setting in /etc/sysconfig/clock, f ex CentOS
|
||
|
|
||
|
tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data', 'zone_setting'))
|
||
|
self.assertEqual(tz.zone, 'Africa/Harare')
|
||
|
|
||
|
def test_timezone_setting(self):
|
||
|
# A ZONE setting in /etc/conf.d/clock, f ex Gentoo
|
||
|
|
||
|
tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data', 'timezone_setting'))
|
||
|
self.assertEqual(tz.zone, 'Africa/Harare')
|
||
|
|
||
|
def test_symlink_localtime(self):
|
||
|
# A ZONE setting in the target path of a symbolic linked localtime, f ex systemd distributions
|
||
|
|
||
|
tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data', 'symlink_localtime'))
|
||
|
self.assertEqual(tz.zone, 'Africa/Harare')
|
||
|
|
||
|
def test_vardbzoneinfo_setting(self):
|
||
|
# A ZONE setting in /etc/conf.d/clock, f ex Gentoo
|
||
|
|
||
|
tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data', 'vardbzoneinfo'))
|
||
|
self.assertEqual(tz.zone, 'Africa/Harare')
|
||
|
|
||
|
def test_only_localtime(self):
|
||
|
tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data', 'localtime'))
|
||
|
self.assertEqual(tz.zone, 'local')
|
||
|
dt = datetime(2012, 1, 1, 5)
|
||
|
self.assertEqual(pytz.timezone('Africa/Harare').localize(dt), tz.localize(dt))
|
||
|
|
||
|
def test_get_reload(self):
|
||
|
os.environ['TZ'] = 'Africa/Harare'
|
||
|
tz_harare = tzlocal.unix.get_localzone()
|
||
|
self.assertEqual(tz_harare.zone, 'Africa/Harare')
|
||
|
# Changing the TZ makes no difference, because it's cached
|
||
|
os.environ['TZ'] = 'Africa/Johannesburg'
|
||
|
tz_harare = tzlocal.unix.get_localzone()
|
||
|
self.assertEqual(tz_harare.zone, 'Africa/Harare')
|
||
|
# So we reload it
|
||
|
tz_harare = tzlocal.unix.reload_localzone()
|
||
|
self.assertEqual(tz_harare.zone, 'Africa/Johannesburg')
|
||
|
|
||
|
def test_fail(self):
|
||
|
with self.assertRaises(pytz.exceptions.UnknownTimeZoneError):
|
||
|
tz = tzlocal.unix._get_localzone(_root=os.path.join(self.path, 'test_data'))
|
||
|
|
||
|
if sys.platform == 'win32':
|
||
|
|
||
|
import tzlocal.win32
|
||
|
class TzWin32Tests(unittest.TestCase):
|
||
|
|
||
|
def test_win32(self):
|
||
|
tzlocal.win32.get_localzone()
|
||
|
|
||
|
else:
|
||
|
|
||
|
class TzWin32Tests(unittest.TestCase):
|
||
|
|
||
|
def test_win32_on_unix(self):
|
||
|
# Yes, winreg is all mocked out, but this test means we at least
|
||
|
# catch syntax errors, etc.
|
||
|
winreg = mock.MagicMock()
|
||
|
winreg.OpenKey = mock.MagicMock()
|
||
|
winreg.OpenKey.close = mock.MagicMock()
|
||
|
winreg.QueryInfoKey = mock.MagicMock(return_value=(1, 1))
|
||
|
winreg.EnumValue = mock.MagicMock(
|
||
|
return_value=('TimeZoneKeyName','Belarus Standard Time'))
|
||
|
winreg.EnumKey = mock.Mock(return_value='Bahia Standard Time')
|
||
|
sys.modules['winreg'] = winreg
|
||
|
import tzlocal.win32
|
||
|
tz = tzlocal.win32.get_localzone()
|
||
|
self.assertEqual(tz.zone, 'Europe/Minsk')
|
||
|
|
||
|
tzlocal.win32.valuestodict = mock.Mock(return_value={
|
||
|
'StandardName': 'Mocked Standard Time',
|
||
|
'Std': 'Mocked Standard Time',
|
||
|
})
|
||
|
tz = tzlocal.win32.reload_localzone()
|
||
|
self.assertEqual(tz.zone, 'America/Bahia')
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
unittest.main()
|