Как отправить запрос с токеном 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 без использования живого сервера

Вернуться на верх