Corp/backend/test_pagination.py
Игорь Надеин b38d2bc44b fix: автоматическое обновление JWT токенов
- ApiClient теперь обрабатывает 401 и 403 ошибки для обновления токена
- Добавлен JWTRefreshMiddleware для проактивного обновления токенов за 5 минут до истечения
- Добавлена настройка JWT_REFRESH_THRESHOLD_MINUTES (по умолчанию 5)
- Исправлена проблема с периодическими 403 ошибками после истечения access token
2025-11-20 18:52:29 +03:00

107 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
"""
Скрипт для тестирования пагинации в API эндпоинтах.
Запуск: python backend/test_pagination.py
"""
import os
import sys
import django
# Настройка Django
sys.path.insert(0, os.path.dirname(__file__))
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'eusrr_backend.settings')
django.setup()
from django.contrib.auth import get_user_model
from api.client import get_api_client
from django.test import RequestFactory
User = get_user_model()
def test_pagination():
"""Тестирует пагинацию для всех основных эндпоинтов."""
# Создаём fake request для get_api_client
factory = RequestFactory()
# Берём первого суперпользователя
admin = User.objects.filter(is_superuser=True).first()
if not admin:
print("❌ Нет суперпользователя в БД")
return
print(f"✅ Используем пользователя: {admin.email}\n")
# Создаём fake HTTP request
fake_request = factory.get('/')
fake_request.user = admin
# Получаем API client
api = get_api_client(fake_request)
endpoints = [
('Отделы', 'v1/departments/'),
('Сотрудники', 'v1/employees/'),
('Документы', 'v1/documents/'),
('Заявления', 'v1/requests/'),
('Новости', 'v1/posts/'),
]
print("=" * 70)
print("ПРОВЕРКА ПАГИНАЦИИ API")
print("=" * 70 + "\n")
for name, endpoint in endpoints:
print(f"📍 {name} ({endpoint})")
print("-" * 70)
# Запрос без параметров
resp = api.get(endpoint)
if not resp.ok:
print(f" ❌ Ошибка: HTTP {resp.status}")
print()
continue
data = resp.json
# Проверяем формат ответа
if isinstance(data, dict):
if 'results' in data:
print(f" ✅ Пагинация ВКЛЮЧЕНА")
print(f" 📊 Всего: {data.get('count', '?')}")
print(f" 📄 На странице: {len(data.get('results', []))}")
print(f" ⏭️ Следующая: {'Да' if data.get('next') else 'Нет'}")
print(f" ⏮️ Предыдущая: {'Да' if data.get('previous') else 'Нет'}")
else:
print(f" ⚠️ Словарь БЕЗ 'results' (возможно другой формат)")
print(f" 📄 Ключи: {list(data.keys())[:5]}")
elif isinstance(data, list):
print(f" ❌ Пагинация ОТКЛЮЧЕНА (возвращается список)")
print(f" 📄 Элементов: {len(data)}")
else:
print(f" ⚠️ Неожиданный тип: {type(data)}")
# Тест с параметром page=2
print("\n 🔍 Тест page=2:")
resp2 = api.get(endpoint, params={'page': 2})
if resp2.ok:
data2 = resp2.json
if isinstance(data2, dict) and 'results' in data2:
print(f" ✅ Страница 2 работает ({len(data2.get('results', []))} элементов)")
else:
print(f" ⚠️ Страница 2: неожиданный формат")
else:
print(f" ⚠️ Страница 2: HTTP {resp2.status}")
print()
print("=" * 70)
print("ПРОВЕРКА ЗАВЕРШЕНА")
print("=" * 70)
if __name__ == '__main__':
test_pagination()