# DRF Rack # Библиотека классов расширений для Django REST Framework # # Автор: Николай В. Анохин # Все права защищены. Лицензия: MIT """ Описание класса DateUtilsTest """ import datetime from unittest.mock import patch from django.test import SimpleTestCase from django.utils import timezone from net.xeaf.rack.utils import DateUtils class DateUtilsTestCase(SimpleTestCase): """ Классы для DateUtils. """ def test_now_returns_frozen_current_time(self) -> None: """ Должен вернуть точно зафиксированное текущее время через mock.patch """ fixed_time = datetime.datetime(2026, 7, 14, 12, 0, 0, tzinfo=timezone.get_current_timezone()) with patch("django.utils.timezone.now", return_value=fixed_time): result = DateUtils.now() self.assertEqual(result, fixed_time) def test_now_returns_timezone_aware_datetime(self) -> None: """ Должен возвращать объект datetime с информацией о часовом поясе (is_aware) """ result = DateUtils.now() self.assertTrue(timezone.is_aware(result)) def test_shift_time_uses_now_if_date_time_is_none(self) -> None: """ Должен автоматически взять текущее время (now), если date_time передан как None """ fixed_now = datetime.datetime(2026, 7, 14, 12, 0, 0, tzinfo=datetime.timezone.utc) expected_time = datetime.datetime(2026, 7, 17, 12, 0, 0, tzinfo=datetime.timezone.utc) with patch("django.utils.timezone.now", return_value=fixed_now): result = DateUtils.shift_time(date_time=None, days=3) self.assertEqual(result, expected_time) def test_shift_time_uses_now_by_omission(self) -> None: """ Должен автоматически взять текущее время (now), если параметр date_time вообще опущен """ fixed_now = datetime.datetime(2026, 7, 14, 12, 0, 0, tzinfo=datetime.timezone.utc) expected_time = datetime.datetime(2026, 7, 14, 14, 0, 0, tzinfo=datetime.timezone.utc) with patch("django.utils.timezone.now", return_value=fixed_now): result = DateUtils.shift_time(hours=2) self.assertEqual(result, expected_time) def test_shift_time_adds_days_correctly_with_explicit_date(self) -> None: """ Должен корректно сдвигать время вперед, если передан явный объект datetime """ base_time = datetime.datetime(2026, 7, 14, 12, 0, 0, tzinfo=datetime.timezone.utc) expected_time = datetime.datetime(2026, 7, 19, 12, 0, 0, tzinfo=datetime.timezone.utc) result = DateUtils.shift_time(base_time, days=5) self.assertEqual(result, expected_time) def test_shift_time_subtracts_hours_correctly(self) -> None: """ Должен корректно сдвигать время назад при передаче отрицательных значений """ base_time = datetime.datetime(2026, 7, 14, 12, 0, 0, tzinfo=datetime.timezone.utc) expected_time = datetime.datetime(2026, 7, 14, 9, 0, 0, tzinfo=datetime.timezone.utc) result = DateUtils.shift_time(base_time, hours=-3) self.assertEqual(result, expected_time) def test_shift_time_complex_modification(self) -> None: """ Должен атомарно применять комбинированный сдвиг по всем осям времени """ base_time = datetime.datetime(2026, 7, 14, 12, 0, 0, tzinfo=datetime.timezone.utc) expected_time = datetime.datetime(2026, 7, 15, 14, 30, 15, tzinfo=datetime.timezone.utc) result = DateUtils.shift_time(base_time, days=1, hours=2, minutes=30, seconds=15) self.assertEqual(result, expected_time)