Skip to content

Commit 3790a95

Browse files
committed
Merge pull request #167 from mjtamlyn/relay-mutation-with-context
Support with_context on ClientIDMutation.mutate_and_get_payload.
2 parents 398088a + 61e7bee commit 3790a95

File tree

2 files changed

+61
-4
lines changed

2 files changed

+61
-4
lines changed

graphene/relay/tests/test_mutations.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from graphql.type import GraphQLInputObjectField
22

33
import graphene
4-
from graphene import relay
4+
from graphene import relay, with_context
55
from graphene.core.schema import Schema
66

77
my_id = 0
8+
my_id_context = 0
89

910

1011
class Query(graphene.ObjectType):
@@ -25,8 +26,24 @@ def mutate_and_get_payload(cls, input, info):
2526
return ChangeNumber(result=my_id)
2627

2728

29+
class ChangeNumberContext(relay.ClientIDMutation):
30+
'''Result mutation'''
31+
class Input:
32+
to = graphene.Int()
33+
34+
result = graphene.String()
35+
36+
@classmethod
37+
@with_context
38+
def mutate_and_get_payload(cls, input, context, info):
39+
global my_id_context
40+
my_id_context = input.get('to', my_id_context + context)
41+
return ChangeNumber(result=my_id_context)
42+
43+
2844
class MyResultMutation(graphene.ObjectType):
2945
change_number = graphene.Field(ChangeNumber)
46+
change_number_context = graphene.Field(ChangeNumberContext)
3047

3148

3249
schema = Schema(query=Query, mutation=MyResultMutation)
@@ -79,3 +96,39 @@ def test_execute_mutations():
7996
result = schema.execute(query, root_value=object())
8097
assert not result.errors
8198
assert result.data == expected
99+
100+
101+
def test_context_mutations():
102+
query = '''
103+
mutation M{
104+
first: changeNumberContext(input: {clientMutationId: "mutation1"}) {
105+
clientMutationId
106+
result
107+
},
108+
second: changeNumberContext(input: {clientMutationId: "mutation2"}) {
109+
clientMutationId
110+
result
111+
}
112+
third: changeNumberContext(input: {clientMutationId: "mutation3", to: 5}) {
113+
result
114+
clientMutationId
115+
}
116+
}
117+
'''
118+
expected = {
119+
'first': {
120+
'clientMutationId': 'mutation1',
121+
'result': '-1',
122+
},
123+
'second': {
124+
'clientMutationId': 'mutation2',
125+
'result': '-2',
126+
},
127+
'third': {
128+
'clientMutationId': 'mutation3',
129+
'result': '5',
130+
}
131+
}
132+
result = schema.execute(query, root_value=object(), context_value=-1)
133+
assert not result.errors
134+
assert result.data == expected

graphene/relay/types.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from ..core.types.argument import ArgumentsGroup
1616
from ..core.types.definitions import NonNull
1717
from ..utils import memoize
18-
from ..utils.wrap_resolver_function import has_context
18+
from ..utils.wrap_resolver_function import has_context, with_context
1919
from .fields import GlobalIDField
2020

2121

@@ -192,9 +192,13 @@ class Meta:
192192
abstract = True
193193

194194
@classmethod
195-
def mutate(cls, instance, args, info):
195+
@with_context
196+
def mutate(cls, instance, args, context, info):
196197
input = args.get('input')
197-
payload = cls.mutate_and_get_payload(input, info)
198+
if has_context(cls.mutate_and_get_payload):
199+
payload = cls.mutate_and_get_payload(input, context, info)
200+
else:
201+
payload = cls.mutate_and_get_payload(input, info)
198202
client_mutation_id = input.get('clientMutationId') or input.get('client_mutation_id')
199203
setattr(payload, 'clientMutationId', client_mutation_id)
200204
return payload

0 commit comments

Comments
 (0)