Добавлен класс CoreViewSet и тесты к нему
This commit is contained in:
11
net/xeaf/rack/core/tests/__init__.py
Normal file
11
net/xeaf/rack/core/tests/__init__.py
Normal file
@@ -0,0 +1,11 @@
|
||||
# DRF Rack
|
||||
# Библиотека классов расширений для Django REST Framework
|
||||
#
|
||||
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
|
||||
# Все права защищены. Лицензия: MIT
|
||||
|
||||
"""
|
||||
Пакет базовых классов для реализации тестов
|
||||
"""
|
||||
|
||||
from .core_test_case import CoreTestCase
|
||||
175
net/xeaf/rack/core/tests/core_test_case.py
Normal file
175
net/xeaf/rack/core/tests/core_test_case.py
Normal 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
|
||||
)
|
||||
Reference in New Issue
Block a user