Как отправить запрос с токеном csrf с помощью макетного клиента django
Я написал API, который использует аутентификацию JWT.
Я протестировал api с помощью postman, и мне удалось получить cookie csrf и acces token после того, как пользователь вошел в систему, а затем я смог использовать эти токены для конечных точек API.
Для тестирования я использую pytest-django, который создает макет базы данных. Все работает, когда я тестирую регистрацию пользователя, вход пользователя и когда я использую конечные точки GET. Для POST я должен отправить в заголовках (как в Postman) токен csrf и access_token, проблема в том, что я не понимаю, как их отправлять.
Например, в тесте GET я могу получить маркер доступа следующим образом
def test_get_signal():
form_data = {
"username": "testuser",
"email": "email@email.com",
"password": "mytestpassword",
}
CustomUser.objects.create_user(**form_data)
response = APIclient.post("/login/", form_data)
assert response.status_code == 200
response_content = json.loads(response.content)
token = response_content["access_token"]
APIclient.credentials(HTTP_AUTHORIZATION="Bearer " + token)
response = APIclient.get(
path="/api/v1/signals/",
)
assert response.status_code == 200
но я не знаю, как отправить токен csrf в заголовке для запроса post.
По этой причине (поскольку все работает в postman) я реализовал агостичный способ тестирования, который требует живого сервера
@pytest.mark.skip_in_ci
@pytest.mark.skip(reason="This test needs localhost django server running")
def test_post_signal():
client = APIClient(enforce_csrf_checks=True)
form_data = {
"username": "testuser",
"email": "email@email.com",
"password": "mytestpassword",
}
user = CustomUser.objects.create_user(**form_data)
response = client.post("/login/", form_data)
csrf_token = client.cookies["csrftoken"].value
response_content = json.loads(response.content)
access_token = response_content["access_token"]
assert response.status_code == 200
user
url = "http://localhost:8000/api/v1/signals/"
payload = json.dumps(
{"data": [101, 1, 3, 3, 401, 3, 4, 1, 2, 10], "threshold": 3, "user": user.pk}
)
headers = {
"X-CSRFTOKEN": csrf_token,
"Authorization": "Bearer " + access_token,
"Content-Type": "application/json",
"Cookie": "csrftoken=" + csrf_token,
}
res = requests.request("POST", url, headers=headers, data=payload)
assert res.status_code == 201
content = json.loads(res.text)
signal_id = content["pk"]
url = "http://localhost:8000/api/v1/signals/" + str(signal_id) + "/"
res = requests.request("DELETE", url, headers=headers)
Этот тест пишет на живой базе данных. Интересно, есть ли способ переписать тест с помощью pytest-django без использования живого сервера