Передача токена JWT в заголовке метода получения werkzeug test_client

#python #flask #jwt #werkzeug

#python #flask #jwt #werkzeug

Вопрос:

В настоящее время я пишу модульные тесты для своего Flask REST API. Конечная точка, которую я тестирую, требует токена, который я успешно извлекаю из другой конечной точки. При передаче этого токена test_client.get() методу я получаю ошибку, которую не могу решить.

Вот код моего модульного теста:

 def test_get_all_users(self):
        # encoding credentials of a user inserted in setup method of test class
        credentials = b64encode(b"user1@mail.com:1234").decode('utf-8')
        # fetch the token using test_client().get()
        # note: self.test_api is my werkzeug test_client() instantiated beforehand
        result = json.loads(self.test_api.get("/users/api/v1/token", headers={"Authorization": f"Basic {credentials}"}).data)
        # encode the token so I can pass it to the get method
        token_encoded = b64encode(bytes(result['token'], 'utf-8')).decode('utf-8')
        # error happens at the next line because of headers?
        result = json.loads(self.test_api.get("/users/api/v1/user", headers={"Authorization": f"JWT {token_encoded}"}).data)
        assert result.status_code == 200
        # ...
  

Код тестируемой конечной точки:

 @api.route("/users/api/v1/user", methods=['GET'])
@token_required
def get_all_users(token):
    """ Function for retrieving all users in db """
    # checking if current user role is valid
    output = []
    # fetching all users
    users = User.query.all()
    # building output dict
    for user in users:
        output.append(dict(user))
    return jsonify({'users' : output})
  

Когда я запускаю тест, я получаю следующую ошибку:

 ============================================================================= FAILURES ==============================================================================
____________________________________________________________________ TestUser.test_get_all_users ____________________________________________________________________

self = <api.tests.test_users.TestUser testMethod=test_get_all_users>

    def test_get_all_users(self):
        # nominal test
        credentials = b64encode(b"user1@mail.com:1234").decode('utf-8')
        result = json.loads(self.test_api.get("/users/api/v1/token", headers={"Authorization": f"Basic {credentials}"}).data)
        print(result['token'])
        #token_encoded = bytes(result['token'], 'utf-8')
        token_encoded = b64encode(bytes(result['token'], 'utf-8')).decode('utf-8')
        result = json.loads(self.test_api.get("/users/api/v1/user", headers={"Authorization": f"JWT {token_encoded}"}).data)
>       assert result.status_code == 200
E       AttributeError: 'dict' object has no attribute 'status_code'

api/tests/test_users.py:83: AttributeError
====================================================================== short test summary info ======================================================================
FAILED api/tests/test_users.py::TestUser::test_get_all_users - AttributeError: 'dict' object has no attribute 'status_code'

  

Я почти уверен, что ошибка находится в заголовках метода get, потому что result кажется пустым. Я попробовал несколько разных вариантов, таких как ‘x-access-token’, ‘X-Auth’ и т.д. Но, похоже, ни один из них не сработал, поскольку я получил ту же ошибку.

Ребята, у вас есть какие-либо идеи о том, что не так в моем коде? Может ли кто-нибудь подсказать мне правильный способ объявления токена в заголовках этого метода get()? Я проверил в Интернете, но не смог найти ничего, что сработало для меня…

Заранее благодарю вас!

Ответ №1:

Итак, я вроде как нашел способ решить свою проблему. Я переписал конечные точки, используя модуль flask-jwt-extended. Он использует заголовки токенов на предъявителя, поэтому мои тесты теперь легко писать и все проходят!