Update mutation.py (#811)

* Update mutation.py

* Add tests

Co-authored-by: Jonathan Kim <jkimbo@gmail.com>
This commit is contained in:
Sergey Protasov 2020-02-23 14:49:39 +05:00 committed by GitHub
parent a12fc9299a
commit 235096362f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 70 additions and 2 deletions

View File

@ -47,7 +47,7 @@ class BaseDjangoFormMutation(ClientIDMutation):
else: else:
errors = ErrorType.from_errors(form.errors) errors = ErrorType.from_errors(form.errors)
return cls(errors=errors) return cls(errors=errors, **form.data)
@classmethod @classmethod
def get_form(cls, root, info, **input): def get_form(cls, root, info, **input):
@ -100,7 +100,7 @@ class DjangoFormMutation(BaseDjangoFormMutation):
@classmethod @classmethod
def perform_mutate(cls, form, info): def perform_mutate(cls, form, info):
form.save() form.save()
return cls(errors=[]) return cls(errors=[], **form.cleaned_data)
class DjangoModelDjangoFormMutationOptions(DjangoFormMutationOptions): class DjangoModelDjangoFormMutationOptions(DjangoFormMutationOptions):

View File

@ -1,5 +1,6 @@
from django import forms from django import forms
from django.test import TestCase from django.test import TestCase
from django.core.exceptions import ValidationError
from py.test import raises from py.test import raises
from graphene import ObjectType, Schema, String, Field from graphene import ObjectType, Schema, String, Field
@ -13,6 +14,15 @@ from ..mutation import DjangoFormMutation, DjangoModelFormMutation
class MyForm(forms.Form): class MyForm(forms.Form):
text = forms.CharField() text = forms.CharField()
def clean_text(self):
text = self.cleaned_data["text"]
if text == "INVALID_INPUT":
raise ValidationError("Invalid input")
return text
def save(self):
pass
class PetForm(forms.ModelForm): class PetForm(forms.ModelForm):
class Meta: class Meta:
@ -83,6 +93,64 @@ class MockQuery(ObjectType):
a = String() a = String()
class FormMutationTests(TestCase):
def test_form_invalid_form(self):
class MyMutation(DjangoFormMutation):
class Meta:
form_class = MyForm
class Mutation(ObjectType):
my_mutation = MyMutation.Field()
schema = Schema(query=MockQuery, mutation=Mutation)
result = schema.execute(
""" mutation MyMutation {
myMutation(input: { text: "INVALID_INPUT" }) {
errors {
field
messages
}
text
}
}
"""
)
self.assertIs(result.errors, None)
self.assertEqual(
result.data["myMutation"]["errors"],
[{"field": "text", "messages": ["Invalid input"]}],
)
def test_form_valid_input(self):
class MyMutation(DjangoFormMutation):
class Meta:
form_class = MyForm
class Mutation(ObjectType):
my_mutation = MyMutation.Field()
schema = Schema(query=MockQuery, mutation=Mutation)
result = schema.execute(
""" mutation MyMutation {
myMutation(input: { text: "VALID_INPUT" }) {
errors {
field
messages
}
text
}
}
"""
)
self.assertIs(result.errors, None)
self.assertEqual(result.data["myMutation"]["errors"], [])
self.assertEqual(result.data["myMutation"]["text"], "VALID_INPUT")
class ModelFormMutationTests(TestCase): class ModelFormMutationTests(TestCase):
def test_default_meta_fields(self): def test_default_meta_fields(self):
class PetMutation(DjangoModelFormMutation): class PetMutation(DjangoModelFormMutation):