cloudkitty/cloudkitty/tests/test_tzutils.py

135 lines
5.3 KiB
Python

# Copyright 2019 Objectif Libre
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
import datetime
import unittest
from dateutil import tz
from oslo_utils import timeutils
from cloudkitty import tzutils
from cloudkitty import utils
class TestTZUtils(unittest.TestCase):
def setUp(self):
self.local_now = tzutils.localized_now()
self.naive_now = utils.utcnow().replace(microsecond=0)
def test_localized_now(self):
self.assertEqual(
self.local_now.astimezone(tz.tzutc()).replace(tzinfo=None),
self.naive_now)
self.assertIsNotNone(self.local_now.tzinfo)
def test_local_to_utc_naive(self):
naive_local = tzutils.local_to_utc(self.local_now, naive=True)
naive_naive = tzutils.local_to_utc(self.naive_now, naive=True)
self.assertIsNone(naive_local.tzinfo)
self.assertIsNone(naive_naive.tzinfo)
self.assertEqual(naive_local, naive_naive)
def test_local_to_utc_not_naive(self):
local = tzutils.local_to_utc(self.local_now)
naive = tzutils.local_to_utc(self.naive_now)
self.assertIsNotNone(local.tzinfo)
self.assertIsNotNone(naive.tzinfo)
self.assertEqual(local, naive)
def test_utc_to_local(self):
self.assertEqual(tzutils.utc_to_local(self.naive_now), self.local_now)
def test_dt_from_iso(self):
tester = '2019-06-06T16:30:54+02:00'
tester_utc = '2019-06-06T14:30:54+00:00'
dt = tzutils.dt_from_iso(tester)
self.assertIsNotNone(dt.tzinfo)
self.assertEqual(tzutils.dt_from_iso(tester, as_utc=True).isoformat(),
tester_utc)
def _test_add_substract_delta(self, obj, tzone):
delta = datetime.timedelta(seconds=3600)
naive = obj.astimezone(tz.tzutc()).replace(tzinfo=None)
self.assertEqual(
tzutils.add_delta(obj, delta).astimezone(tzone),
(naive + delta).replace(tzinfo=tz.tzutc()).astimezone(tzone),
)
self.assertEqual(
tzutils.substract_delta(obj, delta).astimezone(tzone),
(naive - delta).replace(tzinfo=tz.tzutc()).astimezone(tzone),
)
def test_add_substract_delta_summertime(self):
tzone = tz.gettz('Europe/Paris')
obj = datetime.datetime(2019, 3, 31, 1, tzinfo=tzone)
self._test_add_substract_delta(obj, tzone)
def test_add_substract_delta(self):
tzone = tz.gettz('Europe/Paris')
obj = datetime.datetime(2019, 1, 1, tzinfo=tzone)
self._test_add_substract_delta(obj, tzone)
def test_get_month_start_no_arg(self):
naive_utc_now = timeutils.utcnow()
naive_month_start = datetime.datetime(
naive_utc_now.year, naive_utc_now.month, 1)
month_start = tzutils.get_month_start()
self.assertIsNotNone(month_start.tzinfo)
self.assertEqual(
naive_month_start,
month_start.replace(tzinfo=None))
def test_get_month_start_with_arg(self):
param = datetime.datetime(2019, 1, 3, 4, 5)
month_start = tzutils.get_month_start(param)
self.assertIsNotNone(month_start.tzinfo)
self.assertEqual(month_start.replace(tzinfo=None),
datetime.datetime(2019, 1, 1))
def test_get_month_start_with_arg_naive(self):
param = datetime.datetime(2019, 1, 3, 4, 5)
month_start = tzutils.get_month_start(param, naive=True)
self.assertIsNone(month_start.tzinfo)
self.assertEqual(month_start, datetime.datetime(2019, 1, 1))
def test_diff_seconds_positive_arg_naive_objects(self):
one = datetime.datetime(2019, 1, 1, 1, 1, 30)
two = datetime.datetime(2019, 1, 1, 1, 1)
self.assertEqual(tzutils.diff_seconds(one, two), 30)
def test_diff_seconds_negative_arg_naive_objects(self):
one = datetime.datetime(2019, 1, 1, 1, 1, 30)
two = datetime.datetime(2019, 1, 1, 1, 1)
self.assertEqual(tzutils.diff_seconds(two, one), 30)
def test_diff_seconds_positive_arg_aware_objects(self):
one = datetime.datetime(2019, 1, 1, 1, 1, 30, tzinfo=tz.tzutc())
two = datetime.datetime(2019, 1, 1, 1, 1, tzinfo=tz.tzutc())
self.assertEqual(tzutils.diff_seconds(one, two), 30)
def test_diff_seconds_negative_arg_aware_objects(self):
one = datetime.datetime(2019, 1, 1, 1, 1, 30, tzinfo=tz.tzutc())
two = datetime.datetime(2019, 1, 1, 1, 1, tzinfo=tz.tzutc())
self.assertEqual(tzutils.diff_seconds(two, one), 30)
def test_diff_seconds_negative_arg_aware_objects_on_summer_change(self):
one = datetime.datetime(2019, 3, 31, 1,
tzinfo=tz.gettz('Europe/Paris'))
two = datetime.datetime(2019, 3, 31, 3,
tzinfo=tz.gettz('Europe/Paris'))
self.assertEqual(tzutils.diff_seconds(two, one), 3600)