Я пытаюсь протестировать свои Django Rest Framework (DRF) представления с токеном JWT, созданным Firebase. Я использую пакет под названием drf-firebase-auth
для реализации фактического бэкэнда аутентификации. Вот мои текущие настройки DRF:
REST_FRAMEWORK = {
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination",
"PAGE_SIZE": 10,
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticated",
],
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.SessionAuthentication",
"drf_firebase_auth.authentication.FirebaseAuthentication",
],
}
Когда я использую Postman для запроса API разработки с правильным токеном JWT, кажется, что все работает нормально. Я получаю ответ с кодом 200 et c. и полезная нагрузка содержит то, что, как я знаю, находится в моей базе данных разработки.
Однако, когда я начинаю писать тесты для своих представлений, я начинаю получать коды 403
и 500
. Вот пример, где я использую клиент * DRF RequestsClient
для фактического тестирования:
class UserViewsetTestCase(APITestCase):
def setUp(self):
self.token = get_firebase_id_token_v2()
self.client = RequestsClient()
self.base_url = "http://127.0.0.1:8000/api/users/"
self.client.headers.update({"Authorization": f"JWT {self.token}"})
def test_user(self):
response = self.client.get(self.base_url)
self.assertEqual(response.status_code, 200)
Это приводит к ошибке утверждения, отмечающей, что 500 != 200
:
======================================================================
FAIL: test_user (organizations.tests.test_views.UserViewsetTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Path/to/project/organizations/tests/test_views.py", line 32, in test_user
self.assertEqual(response.status_code, 200)
AssertionError: 500 != 200
Примечание что служебная функция get_firebase_id_token_v2
возвращает мне на сервере токен JWT на основе Firebase:
def get_firebase_id_token_v2():
api_key = settings.FIREBASE_PUBLIC_API_KEY
url = f"https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key={api_key}"
data = {
"email": "admin@myemail.com",
"password": "password",
"returnSecureToken": True,
}
r = requests.post(url, params=data)
payload = json.loads(r.text)
auth_token = payload["idToken"]
return auth_token
Вот еще один пример использования клиента APIClient
для того же:
class AnotherUserViewsetTestCase(APITestCase):
def setUp(self):
self.token = get_firebase_id_token_v2()
self.client = APIClient()
self.client.credentials(HTTP_AUTHORIZATION=f"JWT {self.token}")
return super().setUp()
def test_user(self):
response = self.client.get("/api/users/")
self.assertEqual(response.status_code, 200)
Это приводит к другой ошибке утверждения, на этот раз говорящей мне, что 403 != 200
:
======================================================================
FAIL: test_user (organizations.tests.test_views.AnotherUserViewsetTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Path/to/myproject/organizations/tests/test_views.py", line 45, in test_user
self.assertEqual(response.status_code, 200)
AssertionError: 403 != 200
Я могу обойти это, используя метод force_authenticate
на APIClient, но это действительно не идеально, так как Я хотел бы проверить представления, используя токены JWT. Кроме того, ошибка 500
в первом тесте, похоже, указывает на то, что проблема не обязательно связана с аутентификацией в этом случае.
Что мне здесь не хватает?