dopt-basics/tests/test_datetime.py

149 lines
4.3 KiB
Python

from datetime import UTC, datetime, timedelta
from unittest.mock import patch
import pytest
from dopt_basics import datetime as datetime_
from dopt_basics.datetime import TIMEZONE_CEST, TimeUnitsTimedelta
def test_dt_with_UTC():
year = 2024
month = 3
day = 28
hour = 3
minute = 0
dt_target = datetime(year, month, day, hour, minute, tzinfo=UTC)
dt_ret = datetime_.dt_with_tz_UTC(year, month, day, hour, minute)
assert dt_target == dt_ret
@pytest.mark.parametrize(
"time_unit, expected",
[
("hours", timedelta(hours=2.0)),
("minutes", timedelta(minutes=2.0)),
("seconds", timedelta(seconds=2.0)),
("milliseconds", timedelta(milliseconds=2.0)),
("microseconds", timedelta(microseconds=2.0)),
(TimeUnitsTimedelta.HOURS, timedelta(hours=2.0)),
(TimeUnitsTimedelta.MINUTES, timedelta(minutes=2.0)),
],
)
def test_timedelta_from_val_Success(time_unit, expected):
val = 2.0
td = datetime_.timedelta_from_val(val, time_unit)
assert td == expected
def test_timedelta_from_val_FailWrongTimeUnit():
val = 2.0
time_unit = "years"
with pytest.raises(ValueError):
datetime_.timedelta_from_val(val, time_unit) # type: ignore
def test_round_td_by_seconds():
hours = 2.0
minutes = 30.0
seconds = 30.0
microseconds = 600
td = timedelta(hours=hours, minutes=minutes, seconds=seconds, microseconds=microseconds)
rounded_td = datetime_.round_td_by_seconds(td, round_to_next_seconds=1)
assert rounded_td == timedelta(hours=2.0, minutes=30.0, seconds=30.0)
def test_current_time_tz():
tz = datetime_.TIMEZONE_UTC
mock_dt = datetime(2024, 6, 1, 12, 15, 30, 1000, tzinfo=tz)
with patch("dopt_basics.datetime.Datetime") as mock_obj:
mock_obj.now.return_value = mock_dt
ret = datetime_.current_time_tz(cut_microseconds=False)
assert ret.tzinfo is not None
assert ret == mock_dt
with patch("dopt_basics.datetime.Datetime") as mock_obj:
mock_obj.now.return_value = mock_dt
ret = datetime_.current_time_tz(cut_microseconds=True)
target = datetime(2024, 6, 1, 12, 15, 30, tzinfo=tz)
assert ret.tzinfo is not None
assert ret == target
def test_get_timestamp_WithTime():
tz = datetime_.TIMEZONE_UTC
mock_dt = datetime(2024, 6, 1, 12, 15, 30, 1000, tzinfo=tz)
with patch("dopt_basics.datetime.Datetime") as mock_obj:
mock_obj.now.return_value = mock_dt
ret = datetime_.get_timestamp(tz=tz, with_time=True)
target = "2024-06-01--12-15-30"
assert ret == target
def test_get_timestamp_WithoutTime():
tz = datetime_.TIMEZONE_UTC
mock_dt = datetime(2024, 6, 1, 12, 15, 30, 1000, tzinfo=tz)
with patch("dopt_basics.datetime.Datetime") as mock_obj:
mock_obj.now.return_value = mock_dt
ret = datetime_.get_timestamp(tz=tz, with_time=False)
target = "2024-06-01"
assert ret == target
def test_add_timedelta_FailWithoutTZInfo():
year = 2024
month = 3
day = 30
hour = 3
minute = 0
dt = datetime(year, month, day, hour, minute)
td = timedelta(hours=2.0)
with pytest.raises(ValueError):
datetime_.add_timedelta_with_tz(dt, td)
def test_add_timedelta_with_tz():
year = 2024
month = 3
day = 30
hour = 23
minute = 0
dt = datetime(year, month, day, hour, minute, tzinfo=TIMEZONE_CEST)
td = timedelta(hours=6.0)
new_dt = datetime_.add_timedelta_with_tz(dt, td)
assert new_dt == datetime(2024, 3, 31, 6, 0, tzinfo=TIMEZONE_CEST)
def test_validate_dt_UTC_Success():
dt = datetime(2024, 3, 30, 0, 0, tzinfo=UTC)
datetime_.validate_dt_UTC(dt)
def test_validate_dt_FailWrongTZInfo():
dt = datetime(2024, 3, 30, 0, 0, tzinfo=TIMEZONE_CEST)
with pytest.raises(ValueError):
datetime_.validate_dt_UTC(dt)
def test_dt_to_timezone_Success():
dt = datetime(2024, 3, 30, 2, 0, tzinfo=UTC)
new_dt = datetime_.dt_to_timezone(dt, TIMEZONE_CEST)
assert new_dt == datetime(2024, 3, 30, 3, tzinfo=TIMEZONE_CEST)
def test_dt_to_timezone_FailWithoutTZInfo():
dt = datetime(2024, 3, 30, 2, 0)
with pytest.raises(ValueError):
datetime_.dt_to_timezone(dt, TIMEZONE_CEST)
def test_cut_microseconds():
dt = datetime(2024, 3, 30, 2, 0, 0, 600)
new_dt = datetime_.cut_dt_microseconds(dt)
assert new_dt == datetime(2024, 3, 30, 2, 0, 0, 0)