Dev 13 #15

Merged
KerradKerridi merged 15 commits from dev-13 into master 2026-02-01 21:29:08 +00:00
3 changed files with 67 additions and 42 deletions
Showing only changes of commit 849a033ce9 - Show all commits

View File

@@ -1,4 +1,4 @@
from datetime import datetime from datetime import datetime, timezone
from typing import Any, Dict, List, Optional from typing import Any, Dict, List, Optional
from database.base import DatabaseConnection from database.base import DatabaseConnection
@@ -176,10 +176,10 @@ class AudioRepository(DatabaseConnection):
if row: if row:
date_added = row[0] date_added = row[0]
# Преобразуем UNIX timestamp в читаемую дату # Преобразуем UNIX timestamp в читаемую дату (UTC для одинакового результата везде)
readable_date = datetime.fromtimestamp(date_added).strftime( readable_date = datetime.fromtimestamp(
"%d.%m.%Y %H:%M" date_added, tz=timezone.utc
) ).strftime("%d.%m.%Y %H:%M")
self.logger.info(f"Получена дата {readable_date} для файла {file_name}") self.logger.info(f"Получена дата {readable_date} для файла {file_name}")
return readable_date return readable_date
return None return None

View File

@@ -1,5 +1,5 @@
import time import time
from datetime import datetime from datetime import datetime, timezone
from unittest.mock import AsyncMock, MagicMock, Mock, patch from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest import pytest
@@ -268,14 +268,16 @@ class TestAudioRepository:
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_get_date_by_file_name(self, audio_repository): async def test_get_date_by_file_name(self, audio_repository):
"""Тест получения даты по имени файла""" """Тест получения даты по имени файла (UTC, без зависимости от локали)."""
timestamp = 1642404600 # 2022-01-17 10:30:00 timestamp = 1642404600 # 2022-01-17 10:30:00 UTC
audio_repository._execute_query_with_result.return_value = [(timestamp,)] audio_repository._execute_query_with_result.return_value = [(timestamp,)]
result = await audio_repository.get_date_by_file_name("test_audio.ogg") result = await audio_repository.get_date_by_file_name("test_audio.ogg")
# Должна вернуться читаемая дата expected = datetime.fromtimestamp(timestamp, tz=timezone.utc).strftime(
assert result == "17.01.2022 10:30" "%d.%m.%Y %H:%M"
)
assert result == expected
audio_repository._execute_query_with_result.assert_called_once_with( audio_repository._execute_query_with_result.assert_called_once_with(
"SELECT date_added FROM audio_message_reference WHERE file_name = ?", "SELECT date_added FROM audio_message_reference WHERE file_name = ?",
("test_audio.ogg",), ("test_audio.ogg",),
@@ -403,17 +405,19 @@ class TestAudioRepository:
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_get_date_by_file_name_logging(self, audio_repository): async def test_get_date_by_file_name_logging(self, audio_repository):
"""Тест логирования при получении даты по имени файла""" """Тест логирования при получении даты по имени файла (UTC)."""
timestamp = 1642404600 # 2022-01-17 10:30:00 timestamp = 1642404600 # 2022-01-17 10:30:00 UTC
audio_repository._execute_query_with_result.return_value = [(timestamp,)] audio_repository._execute_query_with_result.return_value = [(timestamp,)]
await audio_repository.get_date_by_file_name("test_audio.ogg") await audio_repository.get_date_by_file_name("test_audio.ogg")
# Проверяем, что лог записан expected = datetime.fromtimestamp(timestamp, tz=timezone.utc).strftime(
"%d.%m.%Y %H:%M"
)
audio_repository.logger.info.assert_called_once() audio_repository.logger.info.assert_called_once()
log_message = audio_repository.logger.info.call_args[0][0] log_message = audio_repository.logger.info.call_args[0][0]
assert "Получена дата" in log_message assert "Получена дата" in log_message
assert "17.01.2022 10:30" in log_message assert expected in log_message
assert "test_audio.ogg" in log_message assert "test_audio.ogg" in log_message

View File

@@ -1,5 +1,5 @@
import time import time
from datetime import datetime from datetime import datetime, timezone
from unittest.mock import AsyncMock, MagicMock, Mock, patch from unittest.mock import AsyncMock, MagicMock, Mock, patch
import pytest import pytest
@@ -188,45 +188,56 @@ class TestAudioRepositoryNewSchema:
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_get_date_by_file_name_timestamp_conversion(self, audio_repository): async def test_get_date_by_file_name_timestamp_conversion(self, audio_repository):
"""Тест преобразования UNIX timestamp в читаемую дату""" """Тест преобразования UNIX timestamp в читаемую дату (UTC)."""
test_timestamp = 1642248600 # 2022-01-17 10:30:00 test_timestamp = 1642248600 # 2022-01-15 12:10:00 UTC
audio_repository._execute_query_with_result.return_value = [(test_timestamp,)] audio_repository._execute_query_with_result.return_value = [(test_timestamp,)]
result = await audio_repository.get_date_by_file_name("test_audio.ogg") result = await audio_repository.get_date_by_file_name("test_audio.ogg")
# Должна вернуться читаемая дата в формате dd.mm.yyyy HH:MM expected = datetime.fromtimestamp(test_timestamp, tz=timezone.utc).strftime(
assert result == "15.01.2022 15:10" "%d.%m.%Y %H:%M"
)
assert result == expected
assert isinstance(result, str) assert isinstance(result, str)
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_get_date_by_file_name_different_timestamp(self, audio_repository): async def test_get_date_by_file_name_different_timestamp(self, audio_repository):
"""Тест преобразования другого timestamp в читаемую дату""" """Тест преобразования другого timestamp в читаемую дату (UTC)."""
test_timestamp = 1705312800 # 2024-01-16 12:00:00 test_timestamp = 1705312800 # 2024-01-16 12:00:00 UTC
audio_repository._execute_query_with_result.return_value = [(test_timestamp,)] audio_repository._execute_query_with_result.return_value = [(test_timestamp,)]
result = await audio_repository.get_date_by_file_name("test_audio.ogg") result = await audio_repository.get_date_by_file_name("test_audio.ogg")
assert result == "15.01.2024 13:00" expected = datetime.fromtimestamp(test_timestamp, tz=timezone.utc).strftime(
"%d.%m.%Y %H:%M"
)
assert result == expected
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_get_date_by_file_name_midnight(self, audio_repository): async def test_get_date_by_file_name_midnight(self, audio_repository):
"""Тест преобразования timestamp для полуночи""" """Тест преобразования timestamp для полуночи (UTC)."""
test_timestamp = 1705190400 # 2024-01-15 00:00:00 test_timestamp = 1705190400 # 2024-01-14 00:00:00 UTC
audio_repository._execute_query_with_result.return_value = [(test_timestamp,)] audio_repository._execute_query_with_result.return_value = [(test_timestamp,)]
result = await audio_repository.get_date_by_file_name("test_audio.ogg") result = await audio_repository.get_date_by_file_name("test_audio.ogg")
assert result == "14.01.2024 03:00" expected = datetime.fromtimestamp(test_timestamp, tz=timezone.utc).strftime(
"%d.%m.%Y %H:%M"
)
assert result == expected
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_get_date_by_file_name_year_end(self, audio_repository): async def test_get_date_by_file_name_year_end(self, audio_repository):
"""Тест преобразования timestamp для конца года""" """Тест преобразования timestamp для конца года (UTC)."""
test_timestamp = 1704067200 # 2023-12-31 23:59:59 test_timestamp = 1704067200 # 2023-12-31 00:00:00 UTC
audio_repository._execute_query_with_result.return_value = [(test_timestamp,)] audio_repository._execute_query_with_result.return_value = [(test_timestamp,)]
result = await audio_repository.get_date_by_file_name("test_audio.ogg") result = await audio_repository.get_date_by_file_name("test_audio.ogg")
assert result == "01.01.2024 03:00" expected = datetime.fromtimestamp(test_timestamp, tz=timezone.utc).strftime(
"%d.%m.%Y %H:%M"
)
assert result == expected
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_foreign_keys_enabled_called(self, audio_repository): async def test_foreign_keys_enabled_called(self, audio_repository):
@@ -288,18 +299,20 @@ class TestAudioRepositoryNewSchema:
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_get_date_by_file_name_logging_format(self, audio_repository): async def test_get_date_by_file_name_logging_format(self, audio_repository):
"""Тест формата лога при получении даты""" """Тест формата лога при получении даты (UTC)."""
test_timestamp = 1642248600 # 2022-01-17 10:30:00 test_timestamp = 1642248600 # 2022-01-15 12:10:00 UTC
audio_repository._execute_query_with_result.return_value = [(test_timestamp,)] audio_repository._execute_query_with_result.return_value = [(test_timestamp,)]
await audio_repository.get_date_by_file_name("test_audio.ogg") await audio_repository.get_date_by_file_name("test_audio.ogg")
# Проверяем формат лога expected = datetime.fromtimestamp(test_timestamp, tz=timezone.utc).strftime(
"%d.%m.%Y %H:%M"
)
log_call = audio_repository.logger.info.call_args log_call = audio_repository.logger.info.call_args
log_message = log_call[0][0] log_message = log_call[0][0]
assert "Получена дата" in log_message assert "Получена дата" in log_message
assert "15.01.2022 15:10" in log_message assert expected in log_message
assert "test_audio.ogg" in log_message assert "test_audio.ogg" in log_message
@@ -400,30 +413,38 @@ class TestAudioRepositoryEdgeCases:
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_get_date_by_file_name_zero_timestamp(self, audio_repository): async def test_get_date_by_file_name_zero_timestamp(self, audio_repository):
"""Тест получения даты для timestamp = 0 (1970-01-01)""" """Тест получения даты для timestamp = 0 (1970-01-01 UTC)."""
audio_repository._execute_query_with_result.return_value = [(0,)] audio_repository._execute_query_with_result.return_value = [(0,)]
result = await audio_repository.get_date_by_file_name("test_audio.ogg") result = await audio_repository.get_date_by_file_name("test_audio.ogg")
assert result == "01.01.1970 03:00" expected = datetime.fromtimestamp(0, tz=timezone.utc).strftime("%d.%m.%Y %H:%M")
assert result == expected
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_get_date_by_file_name_negative_timestamp(self, audio_repository): async def test_get_date_by_file_name_negative_timestamp(self, audio_repository):
"""Тест получения даты для отрицательного timestamp""" """Тест получения даты для отрицательного timestamp (UTC)."""
audio_repository._execute_query_with_result.return_value = [ ts = -3600 # 1969-12-31 23:00:00 UTC
(-3600,) audio_repository._execute_query_with_result.return_value = [(ts,)]
] # 1969-12-31 23:00:00
result = await audio_repository.get_date_by_file_name("test_audio.ogg") result = await audio_repository.get_date_by_file_name("test_audio.ogg")
assert result == "01.01.1970 02:00" expected = datetime.fromtimestamp(ts, tz=timezone.utc).strftime(
"%d.%m.%Y %H:%M"
)
assert result == expected
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_get_date_by_file_name_future_timestamp(self, audio_repository): async def test_get_date_by_file_name_future_timestamp(self, audio_repository):
"""Тест получения даты для будущего timestamp""" """Тест получения даты для будущего timestamp (UTC, без зависимости от локали)."""
future_timestamp = int(datetime(2030, 12, 31, 23, 59, 59).timestamp()) future_timestamp = int(
datetime(2030, 12, 31, 23, 59, 59, tzinfo=timezone.utc).timestamp()
)
audio_repository._execute_query_with_result.return_value = [(future_timestamp,)] audio_repository._execute_query_with_result.return_value = [(future_timestamp,)]
result = await audio_repository.get_date_by_file_name("test_audio.ogg") result = await audio_repository.get_date_by_file_name("test_audio.ogg")
assert result == "31.12.2030 23:59" expected = datetime.fromtimestamp(future_timestamp, tz=timezone.utc).strftime(
"%d.%m.%Y %H:%M"
)
assert result == expected