使用技術
graphene-django
graphene-django-extras
graphene-django-jwt
Djangoでの認証を作る際に今まではfirebaseを使っていた為、自前でmiddlewareを書いて都度tokenを確認に行く様にしていた。
これに対してテストを書くときはDummyMiddlewareとしてtestuserに対してuidをうまく返していた。
今回djangoで完結できる機能要件のものに対応する為にgraphene-django-jwtを採用した。
かなり良くできていて、middlewareの設定とdecoratorでほぼ実装は終わる。
mutation/create_foo_user.py
class CreateFooUser(graphene.Mutation):
foo_user = graphene.Field(FooUserType)
class Arguments:
email = graphene.String(required=True)
password = graphene.String(required=True)
foo_id = graphene.String(required=True)
@superuser_required
def mutate(self, info, **kwargs):
user = FooUser.objects.create_user(**kwargs)
return CreateFooUser(foo_user=user)
また、これをtestする時にgraphene-django-jwtはJSONWebTokenTestCaseを作成しており、middlewareの差し替え、またはdecorator剥がしなどせずに綺麗に書ける。
またgraphene-djangoでのtestは基本的にsnapshot testで行う為JSONWebTokenTestCaseとsnapshottest.TestCaseの両方を使う。
結構綺麗に書けてgraphene-django-jwtいいなと思った。
tests/basic_mutation_test.py
from snapshottest import TestCase
from graphql_jwt.testcases import JSONWebTokenTestCase
class FooBasicMutationTestCase(JSONWebTokenTestCase, TestCase):
def setUp(self):
self.user = get_user_model().objects.create(
email='test@admin.com',
password='testadminpass',
is_active=True,
is_superuser=True,
)
self.client.authenticate(self.user)
def test_create_foo_user(self):
foo = FooFactory()
query = '''
mutation FooUser($foo_id: String!) {
createFooUser(email: "test@test.com", password: "password", fooId: $foo_id){
FooUser {
user {
email
}
}
}
}
'''
variables = {
'foo_id': foo.id,
}
self.assertMatchSnapshot(self.client.execute(query, variables).to_dict())
snap_test_basic_mutation.py
snapshots['FooBasicMutationTestCase::test_create_foo_user 1'] = {
'data': {
'createFooUser': {
'FooUser': {
'user': {
'email': 'test@test.com'
}
}
}
}
}