はじめに#

Strawberry x django を使っている場合において、GraphQLView を直接叩くテストの一般的な方法をご紹介します。 それに先立って、ユーザー認証がある場合、どのようにテストをすればいいのか解説します。 今回テストではpytestでなくDjango標準のunittestを使います。unittest だけで GraphQL の認証テストを完結させます。

ログイン状態でのtest の書き方#

loginしたユーザーをログアウトするテストを書いてみます。 今回はpost_with_sessionという認証用の関数を用意しました。あとは、いつもどおりのunittestを書くだけです。


from strawberry.django.views import GraphQLView

from django.contrib.sessions.middleware import SessionMiddleware
from django.test.client import RequestFactory
from yourapp.models import MyCustomUser # 例えばカスタムユーザー
from api.schema import schema # schemaのある場所


def post_with_session(factory: RequestFactory, query: str, variables: dict = {}, force_login_user: None | MyCustomUser = None):
    request = factory.post(
        "/graphql",
        content_type="application/json",
        data={"query": query, "variables": variables},
    )
    if force_login_user:
        request.user = force_login_user

    middleware = SessionMiddleware(get_response=lambda x: x)
    middleware.process_request(request)
    request.session.save()
    return GraphQLView.as_view(schema=schema)(request)


class AccountSchema(TestCase):
    def setUp(self):
        self.user, self.password = create_iamfax_user() # 各自このような関数をご用意ください
        self.factory = RequestFactory()
    def test_user_logout_mutation(self):
        mutation = get_mutation("logout_user") # get_mutationは、mutationをとってくる便利関数. 各自ご用意ください
        response = post_with_session(
            factory = self.factory,
            query = mutation,
            variables = {},
            force_login_user=self.user, # Noneであれば認証なしのテストとなります。
        ) 
        json_data = json.loads(response.content.decode("utf-8"))["data"]
        user = json_data["logoutUser"]
        self.assertEqual(user.get("username", None), self.user.username)
        # セッションからユーザーが削除されたことや、ログアウト後に認証が必要な操作ができないことなどを検証する、ログアウト後に再度ログインを試み、ログインが失敗することを確認するテストケースなど、続きを各自書いていってください。

get_mutationは単にgraphql queryをとってくる便利関数で、弊社で勝手に用意しています。(iamfax.comの場合は使うGraphqlのクエリーを所定のところに保存しており、そこからとってくて文字列に変換しています。)get_mutation関数を用意せず、次のようにGraphqlのquery, mutationのクエリーをベタ書きしてもいいのです。

mutation = """
mutation {
  logoutUser {
    username
  }
}
"""

こういうやり方は行数が多くて見にくくなります。また、.graphqlファイルで管理しておいたほうがエディターの補完や可読性が高いなどあります。そのあたりは各自判断してテストを書くといいでしょう。

まとめ#

ログイン状態をしている状態でのunit testはどうすればいいのか、という方法をご紹介しました。

なお、Strawberry django公式でも実装例が公開されております。公式test. よくまとまっているのですが、Strawberry GraphQL Django integrationをインストールする必要があるか、自分で部分的に取り入れないとだめです。

今回ご紹介した方法であれば余計なモジュールのインストールは不要です。djangoのunittestで閉じてますので何もインストールする必要もありません。

シンプルにDjango標準のunittest だけでログイン状態のテストを書きたい場合、本記事の方法で十分対応できます。 追加のライブラリを導入せず、GraphQL API のテストを簡潔に書けるので、ぜひ試してみてください。

戻る