mirror of
https://github.com/graphql-python/graphene-django.git
synced 2025-04-29 21:43:51 +03:00
116 lines
3.3 KiB
Python
116 lines
3.3 KiB
Python
from django.db import models
|
|
|
|
from graphene import Field, Schema, String, Mutation, ObjectType, AbstractType
|
|
from graphene.types.inputobjecttype import InputObjectType
|
|
from py.test import raises
|
|
from rest_framework import serializers
|
|
|
|
from ...types import DjangoObjectType
|
|
from ..mutation import SerializerMutation
|
|
|
|
|
|
class MyFakeModel(models.Model):
|
|
cool_name = models.CharField(max_length=50)
|
|
|
|
|
|
class MyModelSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = MyFakeModel
|
|
fields = '__all__'
|
|
|
|
|
|
class MySerializer(serializers.Serializer):
|
|
text = serializers.CharField()
|
|
model = MyModelSerializer()
|
|
|
|
|
|
def test_needs_serializer_class():
|
|
with raises(Exception) as exc:
|
|
class MyMutation(SerializerMutation):
|
|
pass
|
|
|
|
assert exc.value.args[0] == 'Missing serializer_class'
|
|
|
|
|
|
def test_has_fields():
|
|
class MyMutation(SerializerMutation):
|
|
class Meta:
|
|
serializer_class = MySerializer
|
|
|
|
assert 'text' in MyMutation._meta.fields
|
|
assert 'model' in MyMutation._meta.fields
|
|
assert 'errors' in MyMutation._meta.fields
|
|
|
|
|
|
def test_has_input_fields():
|
|
class MyMutation(SerializerMutation):
|
|
class Meta:
|
|
serializer_class = MySerializer
|
|
|
|
assert 'text' in MyMutation.Input._meta.fields
|
|
assert 'model' in MyMutation.Input._meta.fields
|
|
|
|
|
|
def test_nested_model():
|
|
|
|
class MyFakeModelGrapheneType(DjangoObjectType):
|
|
class Meta:
|
|
model = MyFakeModel
|
|
|
|
class MyMutation(SerializerMutation):
|
|
class Meta:
|
|
serializer_class = MySerializer
|
|
|
|
model_field = MyMutation._meta.fields['model']
|
|
assert isinstance(model_field, Field)
|
|
assert model_field.type == MyFakeModelGrapheneType
|
|
|
|
model_input = MyMutation.Input._meta.fields['model']
|
|
model_input_type = model_input._type.of_type
|
|
assert issubclass(model_input_type, InputObjectType)
|
|
assert 'cool_name' in model_input_type._meta.fields
|
|
|
|
|
|
def test_custom_serializer(capfd):
|
|
|
|
class MyBasicSerializer(serializers.Serializer):
|
|
whatever = serializers.CharField(required=False)
|
|
|
|
def create(self, data):
|
|
return {'user': self.context['request']['user']}
|
|
|
|
class MyBasicGrapheneType(ObjectType):
|
|
text = String()
|
|
|
|
class MyAwesomeMutation(SerializerMutation):
|
|
|
|
class Meta:
|
|
serializer_class = MyBasicSerializer
|
|
|
|
user = String()
|
|
|
|
@classmethod
|
|
def get_serializer(cls, instance, args, request, info):
|
|
input = args.get('input')
|
|
|
|
return cls._meta.serializer_class(data=dict(input),
|
|
context={'request': request})
|
|
|
|
class MyAbstractMutation(AbstractType, ObjectType):
|
|
myAwesomeMutation = MyAwesomeMutation.Field()
|
|
|
|
schema = Schema(query=MyBasicGrapheneType, mutation=MyAbstractMutation)
|
|
mutation = '''
|
|
mutation MutationTest($input: MyBasicSerializerInput!) {
|
|
myAwesomeMutation(input: $input) {
|
|
user
|
|
}
|
|
}
|
|
'''
|
|
|
|
result = schema.execute(mutation, variable_values={'input': {}},
|
|
context_value={'user': 1})
|
|
assert result.data['myAwesomeMutation']['user'] == '1'
|
|
|
|
|