Задача курса
Python: Напиши тесты для генератора токенов с патчингом времени и случайности
Курс «Python для продвинутых: ООП, типизация и тестирование» · урок «monkeypatch и unittest.mock: контролируемая подмена времени и случайности»
Условие
Напиши тесты для генератора токенов с патчингом времени и случайности
Тебе нужно написать pytest-тесты для модуля tokengen, который генерирует токены доступа. Тесты должны быть детерминированными: время и случайность нужно изолировать через unittest.mock.patch.
Что уже дано
Проверяющая система скрыто создаёт файл tokengen.py со следующим содержимым:
import random
import time
TOKEN_TTL = 3600
def generate_token(user_id: int) -> dict:
"""Возвращает {'token': str, 'expires_at': int, 'user_id': int}."""
rand_part = random.randint(100_000, 999_999)
token_str = f"{user_id}-{rand_part}"
expires = int(time.time()) + TOKEN_TTL
return {"token": token_str, "expires_at": expires, "user_id": user_id}
Модуль tokengen использует import random и import time, поэтому:
random.randintдоступен внутриtokengenкакtokengen.random.randint;time.timeдоступен внутриtokengenкакtokengen.time.time.
Файл tokengen.py создаётся до твоего кода. Импортировать его нужно самостоятельно.
Что нужно сделать
Напиши в редакторе pytest-тесты, которые:
test_token_format— патчитtokengen.random.randintчерезpatchсreturn_value=42иtokengen.time.timeчерезpatchсreturn_value=1_700_000_000, вызываетgenerate_token(7)и проверяет, что ключ"token"равен"7-42".test_expires_at— патчит толькоtokengen.time.timeсreturn_value=1_700_000_000, вызываетgenerate_token(1)и проверяет, что"expires_at"равен1_700_003_600(то есть1_700_000_000 + 3600).test_random_called_with_correct_bounds— патчитtokengen.random.randintчерезpatch(задай любойreturn_value), вызываетgenerate_token(99)и проверяет черезassert_called_once_with(100_000, 999_999), что генератор вызван с правильными границами.
В каждом тесте используй patch как контекстный менеджер (with patch(...) as mock_obj:).
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно.
Проверяющая система запускает твои тест-функции test_token_format, test_expires_at и test_random_called_with_correct_bounds напрямую, передавая им управление. Функции должны быть определены на верхнем уровне модуля.
