-
Notifications
You must be signed in to change notification settings - Fork 765
Description
What is the current behavior?
This is with graphene-django==3.2.0 and Django==4.2.10 and it concerns the graphql_query function from graphene_django.utils.testing. Django 4.2.+ prefixes the header keys automatically with HTTP_, making the documentation of the graphql_query in that situation wrong.
Pseudo Code:
headers = {
'HTTP_AUTHORIZATION': f'Bearer {JWT_TOKEN}'
}
return graphql_query(.., .., client=client, headers=headers, graphql_url="/graphql/")
If we then later dump request.META we will see HTTP_HTTP_AUTHORIZATION.
The part of graphene where it handles the Django version can be found here:
| {"headers": headers} if _DJANGO_VERSION_AT_LEAST_4_2 else headers |
Further context
You see Django's behavior described here in an example: https://docs.djangoproject.com/en/4.2/topics/testing/tools/#django.test.Client.get
c = Client()
c.get(
... "/customers/details/",
... {"name": "fred", "age": 7},
... headers={"accept": "application/json"},
... )
…will send the HTTP header HTTP_ACCEPT to the details view, which is a good way to test code paths that use the django.http.HttpRequest.accepts() method.
Fix
So I suggest at a minimum to update the documentation / description of client_query that with Django 4.2+ headers don't have to be prefixed with HTTP_. Ideally the function it self would take care of it however.
graphene-django/graphene_django/utils/testing.py
Lines 33 to 36 in 4d0484f
| headers (dict) - If provided, the headers in POST request to GRAPHQL_URL | |
| will be set to this value. Keys should be prepended with | |
| "HTTP_" (e.g. to specify the "Authorization" HTTP header, | |
| use "HTTP_AUTHORIZATION" as the key). |