Как подделать авторизацию JWT вне контекста запроса и получить текущую личность? - PullRequest
0 голосов
/ 19 апреля 2019

Я создаю приложение Flask с авторизацией JWT и пытаюсь протестировать сервисы с помощью PyTest.

Я успешно добавил тесты в конечные точки, но когда я пытаюсь добавить модульные тесты для определенной функции, я не могу получить доступ к текущему пользователю, потому что flask_jwt_extended.get_current_user() возвращает None.

Вот простой пример:

@api.route('/listings', methods=['POST'])
@jwt_required
def create_listing():
    payload = request.json
    listing = listing_svc.create(payload)
    return listing


def create(payload):
    listing = ListingSchema().load(payload, db.session).data


class ListingSchema(ModelSchema):
    id = field_for(Project, 'id', dump_only=True)
    creator_user_id = field_for(Project, 'creator_user_id')
    # ...

    @pre_load
    def set_creator_id(self, data):
        current_user = flask_jwt_extended.get_current_user()
        data['creator_user_id'] = current_user.id

Работает, когда я авторизую и отправляю запрос, используя app_context:

with client.application.app_context():
    rv = client.post('/listings',
        # ...
    )

Но мне нужно протестировать функцию create без отправки запроса клиенту. В этом случае flask_jwt_extended.get_current_user() возвращает None, поэтому я думаю, что мне нужно как-то установить контекст запроса перед запуском этой функции.

Я пытался сделать это ...

fake_payload = {}
with client.application.test_request_context('/listings', headers={'Authorization': 'Bearer ' + access_token}):
    create(fake_payload)

но все еще получается current_user - это None

Вот как я получаю токен:

def login(email, password):
    user = get_by_email(email)
    if user and check_password_hash(user.password, password):
        return access_token = flask_jwt_extended.create_access_token(identity=email)

1 Ответ

0 голосов
/ 20 июня 2019

Если вы действительно хотите провести модульное тестирование, вам нужно выполнить модульное тестирование по одной функции за раз.На мой взгляд, это действительно тестовая разработка.Итак, сначала напишите тесты для создания, затем загрузите и так далее.Используйте исправления, чтобы высмеивать функциональность вызовов других функций.

...