mirror of
https://github.com/graphql-python/graphene.git
synced 2025-02-02 12:44:15 +03:00
Added mutations in examples
This commit is contained in:
parent
a682ef8bc3
commit
97a81120b7
|
@ -85,31 +85,30 @@ def initialize():
|
|||
executor.save()
|
||||
|
||||
|
||||
def createShip(shipName, factionId):
|
||||
nextShip = len(data['Ship'].keys())+1
|
||||
newShip = Ship(
|
||||
id=str(nextShip),
|
||||
name=shipName
|
||||
def create_ship(ship_name, faction_id):
|
||||
new_ship = Ship(
|
||||
name=ship_name,
|
||||
faction_id=faction_id
|
||||
)
|
||||
newShip.save()
|
||||
return newShip
|
||||
new_ship.save()
|
||||
return new_ship
|
||||
|
||||
|
||||
def getShip(_id):
|
||||
def get_ship(_id):
|
||||
return Ship.objects.get(id=_id)
|
||||
|
||||
|
||||
def getShips():
|
||||
def get_ships():
|
||||
return Ship.objects.all()
|
||||
|
||||
|
||||
def getFaction(_id):
|
||||
def get_faction(_id):
|
||||
return Faction.objects.get(id=_id)
|
||||
|
||||
|
||||
def getRebels():
|
||||
return getFaction(1)
|
||||
def get_rebels():
|
||||
return get_faction(1)
|
||||
|
||||
|
||||
def getEmpire():
|
||||
return getFaction(2)
|
||||
def get_empire():
|
||||
return get_faction(2)
|
||||
|
|
|
@ -7,11 +7,12 @@ from graphene.contrib.django import (
|
|||
from .models import (
|
||||
Ship as ShipModel, Faction as FactionModel, Character as CharacterModel)
|
||||
from .data import (
|
||||
getFaction,
|
||||
getShip,
|
||||
getShips,
|
||||
getRebels,
|
||||
getEmpire,
|
||||
get_faction,
|
||||
get_ship,
|
||||
get_ships,
|
||||
get_rebels,
|
||||
get_empire,
|
||||
create_ship
|
||||
)
|
||||
|
||||
schema = graphene.Schema(name='Starwars Django Relay Schema')
|
||||
|
@ -23,7 +24,7 @@ class Ship(DjangoNode):
|
|||
|
||||
@classmethod
|
||||
def get_node(cls, id):
|
||||
return Ship(getShip(id))
|
||||
return Ship(get_ship(id))
|
||||
|
||||
|
||||
@schema.register
|
||||
|
@ -38,7 +39,24 @@ class Faction(DjangoNode):
|
|||
|
||||
@classmethod
|
||||
def get_node(cls, id):
|
||||
return Faction(getFaction(id))
|
||||
return Faction(get_faction(id))
|
||||
|
||||
|
||||
class IntroduceShip(relay.ClientIDMutation):
|
||||
class Input:
|
||||
ship_name = graphene.StringField(required=True)
|
||||
faction_id = graphene.StringField(required=True)
|
||||
|
||||
ship = graphene.Field(Ship)
|
||||
faction = graphene.Field(Faction)
|
||||
|
||||
@classmethod
|
||||
def mutate_and_get_payload(cls, input, info):
|
||||
ship_name = input.get('ship_name')
|
||||
faction_id = input.get('faction_id')
|
||||
ship = create_ship(ship_name, faction_id)
|
||||
faction = get_faction(faction_id)
|
||||
return IntroduceShip(ship=ship, faction=faction)
|
||||
|
||||
|
||||
class Query(graphene.ObjectType):
|
||||
|
@ -49,15 +67,20 @@ class Query(graphene.ObjectType):
|
|||
|
||||
@resolve_only_args
|
||||
def resolve_ships(self):
|
||||
return [Ship(s) for s in getShips()]
|
||||
return [Ship(s) for s in get_ships()]
|
||||
|
||||
@resolve_only_args
|
||||
def resolve_rebels(self):
|
||||
return Faction(getRebels())
|
||||
return Faction(get_rebels())
|
||||
|
||||
@resolve_only_args
|
||||
def resolve_empire(self):
|
||||
return Faction(getEmpire())
|
||||
return Faction(get_empire())
|
||||
|
||||
|
||||
class Mutation(graphene.ObjectType):
|
||||
introduce_ship = graphene.Field(IntroduceShip)
|
||||
|
||||
|
||||
schema.query = Query
|
||||
schema.mutation = Mutation
|
||||
|
|
78
examples/starwars_django/tests/test_mutation.py
Normal file
78
examples/starwars_django/tests/test_mutation.py
Normal file
|
@ -0,0 +1,78 @@
|
|||
import pytest
|
||||
from ..schema import schema
|
||||
from ..data import initialize
|
||||
|
||||
pytestmark = pytest.mark.django_db
|
||||
|
||||
|
||||
def test_mutations():
|
||||
initialize()
|
||||
|
||||
query = '''
|
||||
mutation MyMutation {
|
||||
introduceShip(input:{clientMutationId:"abc", shipName: "Peter", factionId: "1"}) {
|
||||
ship {
|
||||
id
|
||||
name
|
||||
}
|
||||
faction {
|
||||
name
|
||||
ships {
|
||||
edges {
|
||||
node {
|
||||
id
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
'''
|
||||
expected = {
|
||||
'introduceShip': {
|
||||
'ship': {
|
||||
'id': 'U2hpcDo5',
|
||||
'name': 'Peter'
|
||||
},
|
||||
'faction': {
|
||||
'name': 'Alliance to Restore the Republic',
|
||||
'ships': {
|
||||
'edges': [{
|
||||
'node': {
|
||||
'id': 'U2hpcDox',
|
||||
'name': 'X-Wing'
|
||||
}
|
||||
}, {
|
||||
'node': {
|
||||
'id': 'U2hpcDoy',
|
||||
'name': 'Y-Wing'
|
||||
}
|
||||
}, {
|
||||
'node': {
|
||||
'id': 'U2hpcDoz',
|
||||
'name': 'A-Wing'
|
||||
}
|
||||
}, {
|
||||
'node': {
|
||||
'id': 'U2hpcDo0',
|
||||
'name': 'Millenium Falcon'
|
||||
}
|
||||
}, {
|
||||
'node': {
|
||||
'id': 'U2hpcDo1',
|
||||
'name': 'Home One'
|
||||
}
|
||||
}, {
|
||||
'node': {
|
||||
'id': 'U2hpcDo5',
|
||||
'name': 'Peter'
|
||||
}
|
||||
}]
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
result = schema.execute(query)
|
||||
assert not result.errors
|
||||
assert result.data == expected
|
|
@ -77,28 +77,29 @@ def setup():
|
|||
}
|
||||
|
||||
|
||||
def createShip(shipName, factionId):
|
||||
nextShip = len(data['Ship'].keys())+1
|
||||
newShip = Ship(
|
||||
id=str(nextShip),
|
||||
name=shipName
|
||||
def create_ship(ship_name, faction_id):
|
||||
from .schema import Ship
|
||||
next_ship = len(data['Ship'].keys()) + 1
|
||||
new_ship = Ship(
|
||||
id=str(next_ship),
|
||||
name=ship_name
|
||||
)
|
||||
data['Ship'][newShip.id] = newShip
|
||||
data['Faction'][factionId].ships.append(newShip.id)
|
||||
return newShip
|
||||
data['Ship'][new_ship.id] = new_ship
|
||||
data['Faction'][faction_id].ships.append(new_ship.id)
|
||||
return new_ship
|
||||
|
||||
|
||||
def getShip(_id):
|
||||
def get_ship(_id):
|
||||
return data['Ship'][_id]
|
||||
|
||||
|
||||
def getFaction(_id):
|
||||
def get_faction(_id):
|
||||
return data['Faction'][_id]
|
||||
|
||||
|
||||
def getRebels():
|
||||
return getFaction('1')
|
||||
def get_rebels():
|
||||
return get_faction('1')
|
||||
|
||||
|
||||
def getEmpire():
|
||||
return getFaction('2')
|
||||
def get_empire():
|
||||
return get_faction('2')
|
||||
|
|
|
@ -2,10 +2,11 @@ import graphene
|
|||
from graphene import resolve_only_args, relay
|
||||
|
||||
from .data import (
|
||||
getFaction,
|
||||
getShip,
|
||||
getRebels,
|
||||
getEmpire,
|
||||
get_faction,
|
||||
get_ship,
|
||||
get_rebels,
|
||||
get_empire,
|
||||
create_ship,
|
||||
)
|
||||
|
||||
schema = graphene.Schema(name='Starwars Relay Schema')
|
||||
|
@ -17,7 +18,7 @@ class Ship(relay.Node):
|
|||
|
||||
@classmethod
|
||||
def get_node(cls, id):
|
||||
return getShip(id)
|
||||
return get_ship(id)
|
||||
|
||||
|
||||
class Faction(relay.Node):
|
||||
|
@ -29,11 +30,28 @@ class Faction(relay.Node):
|
|||
@resolve_only_args
|
||||
def resolve_ships(self, **args):
|
||||
# Transform the instance ship_ids into real instances
|
||||
return [getShip(ship_id) for ship_id in self.ships]
|
||||
return [get_ship(ship_id) for ship_id in self.ships]
|
||||
|
||||
@classmethod
|
||||
def get_node(cls, id):
|
||||
return getFaction(id)
|
||||
return get_faction(id)
|
||||
|
||||
|
||||
class IntroduceShip(relay.ClientIDMutation):
|
||||
class Input:
|
||||
ship_name = graphene.StringField(required=True)
|
||||
faction_id = graphene.StringField(required=True)
|
||||
|
||||
ship = graphene.Field(Ship)
|
||||
faction = graphene.Field(Faction)
|
||||
|
||||
@classmethod
|
||||
def mutate_and_get_payload(cls, input, info):
|
||||
ship_name = input.get('ship_name')
|
||||
faction_id = input.get('faction_id')
|
||||
ship = create_ship(ship_name, faction_id)
|
||||
faction = get_faction(faction_id)
|
||||
return IntroduceShip(ship=ship, faction=faction)
|
||||
|
||||
|
||||
class Query(graphene.ObjectType):
|
||||
|
@ -43,11 +61,16 @@ class Query(graphene.ObjectType):
|
|||
|
||||
@resolve_only_args
|
||||
def resolve_rebels(self):
|
||||
return getRebels()
|
||||
return get_rebels()
|
||||
|
||||
@resolve_only_args
|
||||
def resolve_empire(self):
|
||||
return getEmpire()
|
||||
return get_empire()
|
||||
|
||||
|
||||
class Mutation(graphene.ObjectType):
|
||||
introduce_ship = graphene.Field(IntroduceShip)
|
||||
|
||||
|
||||
schema.query = Query
|
||||
schema.mutation = Mutation
|
||||
|
|
75
examples/starwars_relay/tests/test_mutation.py
Normal file
75
examples/starwars_relay/tests/test_mutation.py
Normal file
|
@ -0,0 +1,75 @@
|
|||
from ..schema import schema
|
||||
from ..data import setup
|
||||
|
||||
setup()
|
||||
|
||||
|
||||
def test_mutations():
|
||||
query = '''
|
||||
mutation MyMutation {
|
||||
introduceShip(input:{clientMutationId:"abc", shipName: "Peter", factionId: "1"}) {
|
||||
ship {
|
||||
id
|
||||
name
|
||||
}
|
||||
faction {
|
||||
name
|
||||
ships {
|
||||
edges {
|
||||
node {
|
||||
id
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
'''
|
||||
expected = {
|
||||
'introduceShip': {
|
||||
'ship': {
|
||||
'id': 'U2hpcDo5',
|
||||
'name': 'Peter'
|
||||
},
|
||||
'faction': {
|
||||
'name': 'Alliance to Restore the Republic',
|
||||
'ships': {
|
||||
'edges': [{
|
||||
'node': {
|
||||
'id': 'U2hpcDox',
|
||||
'name': 'X-Wing'
|
||||
}
|
||||
}, {
|
||||
'node': {
|
||||
'id': 'U2hpcDoy',
|
||||
'name': 'Y-Wing'
|
||||
}
|
||||
}, {
|
||||
'node': {
|
||||
'id': 'U2hpcDoz',
|
||||
'name': 'A-Wing'
|
||||
}
|
||||
}, {
|
||||
'node': {
|
||||
'id': 'U2hpcDo0',
|
||||
'name': 'Millenium Falcon'
|
||||
}
|
||||
}, {
|
||||
'node': {
|
||||
'id': 'U2hpcDo1',
|
||||
'name': 'Home One'
|
||||
}
|
||||
}, {
|
||||
'node': {
|
||||
'id': 'U2hpcDo5',
|
||||
'name': 'Peter'
|
||||
}
|
||||
}]
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
result = schema.execute(query)
|
||||
assert not result.errors
|
||||
assert result.data == expected
|
Loading…
Reference in New Issue
Block a user