Добавлен класс CoreViewSet и тесты к нему

This commit is contained in:
2026-07-16 11:52:51 +03:00
parent 4ce8a1ba58
commit b713a2124b
32 changed files with 2263 additions and 55 deletions

View File

@@ -0,0 +1,11 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Пакет базовых классов для реализации тестов
"""
from .core_test_case import CoreTestCase

View File

@@ -0,0 +1,175 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса CoreTestCase
"""
import json
from django.core.management import call_command
from django.test import TestCase
from rest_framework.parsers import JSONParser
from rest_framework.request import Request
from rest_framework.test import APIRequestFactory
from net.xeaf.rack.management.userstory import AccountTestData
from net.xeaf.rack.management.userstory import SessionTestData
from net.xeaf.rack.models import AccountModel
from net.xeaf.rack.models import SessionModel
class CoreTestCase(TestCase):
"""
Реализует инициализацию тестовой базы данных перед каждым тестом
"""
factory: APIRequestFactory
""" Фабрика запросов """
def setUp(self):
"""
Подготовка к тестированию
"""
call_command("rack_test_database")
self.factory = APIRequestFactory()
def create_request(self, method, path, data=None, query_params=None, auth=None):
"""
Создает DRF Request объект для тестирования
:param method: HTTP метод (GET, POST, PUT, PATCH, DELETE)
:param path: URL путь
:param data: Данные для тела запроса
:param query_params: Параметры запроса
:param auth: Объект аутентификации (сессия)
:return: DRF Request объект
"""
method = method.upper()
data = data or {}
query_params = query_params or {}
# Создаем WSGI request в зависимости от метода
if method == 'GET':
wsgi_request = self.factory.get(path, data=query_params)
elif method == 'POST':
wsgi_request = self.factory.post(path, data=data, format='json')
elif method == 'PUT':
wsgi_request = self.factory.put(path, data=data, format='json')
elif method == 'PATCH':
wsgi_request = self.factory.patch(path, data=data, format='json')
elif method == 'DELETE':
wsgi_request = self.factory.delete(path, data=data, format='json')
else:
wsgi_request = self.factory.generic(
method,
path,
content_type='application/json',
data=json.dumps(data) if data else ''
)
# Преобразуем в DRF Request
drf_request = Request(wsgi_request, parsers=[JSONParser()])
# Добавляем аутентификацию если передана
if auth:
drf_request.auth = auth
if hasattr(auth, 'account'):
drf_request.user = auth.account
# Добавляем query_params для не-GET запросов
if query_params and method != 'GET':
# noinspection PyTypeChecker
drf_request.query_params._mutable = True
for key, value in query_params.items():
drf_request.query_params[key] = value
drf_request.query_params._mutable = False
return drf_request
def create_authenticated_request(self, method, path, token, data=None, query_params=None):
"""
Создает аутентифицированный DRF Request
:param method: HTTP метод
:param path: URL путь
:param token: Токен сессии
:param data: Данные для тела запроса
:param query_params: Параметры запроса
:return: DRF Request с аутентификацией
"""
session = SessionModel.objects.get(token=token)
return self.create_request(method, path, data, query_params, auth=session)
@classmethod
def get_i_ivanov_account(cls) -> AccountModel:
"""
Возвращает аккаунт Ивана И. Иванова
:return: Аккаунт Ивана И. Иванова
"""
return AccountTestData.get_i_ivanov_account()
@classmethod
def get_i_ivanov_session(cls) -> SessionModel:
"""
Возвращает сессию Ивана И. Иванова
:return: Сессия Ивана И. Иванова
"""
return SessionTestData.get_i_ivanov_session()
def create_i_ivanov_request(self, method, path, data=None, query_params=None):
"""
Создает запрос от имени Ивана И. Иванова
"""
return self.create_authenticated_request(
method,
path,
SessionTestData.I_IVANOV_SESSION_TOKEN,
data,
query_params
)
@classmethod
def get_p_petrov_account(cls) -> AccountModel:
"""
Возвращает аккаунт Петра П. Петрова
:return: Аккаунт Петра П. Петрова
"""
return AccountTestData.get_p_petrov_account()
@classmethod
def get_p_petrov_session(cls) -> SessionModel:
"""
Возвращает сессию Петра П. Петрова
:return: Сессия Петра П. Петрова
"""
return SessionTestData.get_p_petrov_session()
def create_p_petrov_request(self, method, path, data=None, query_params=None):
"""
Создает запрос от имени Петра П. Петрова
"""
return self.create_authenticated_request(
method,
path,
SessionTestData.P_PETROV_SESSION_TOKEN,
data,
query_params
)