Я создаю приложение 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)