Skip to content

graphene_django.utils.testing.graphql_query and Django 4.2+ #1501

Open
@hokkaido

Description

@hokkaido

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.

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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions