Django Тестирование Rest Framework ViewSet с токенами JWT - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь протестировать свои 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 в первом тесте, похоже, указывает на то, что проблема не обязательно связана с аутентификацией в этом случае.

Что мне здесь не хватает?

...