Strawberry Django ログイン状態のテストを Django unittest で実装する
はじめに#
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 のテストを簡潔に書けるので、ぜひ試してみてください。