Задача курса

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-тесты, которые:

  1. 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".

  2. 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).

  3. 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 напрямую, передавая им управление. Функции должны быть определены на верхнем уровне модуля.

Попробуйте решить

РешениеPython
Без регистрации · результат не сохраняется