Update `create team` mutation signature

This commit is contained in:
Ramon Wenger 2022-04-12 14:57:56 +02:00
parent e18218c007
commit c6ddb3b051
5 changed files with 53 additions and 23 deletions

View File

@ -1,9 +1,14 @@
#import "gql/fragments/teamParts.gql" #import "gql/fragments/teamParts.gql"
mutation CreateTeamMutation($input: CreateTeamInput!) { mutation CreateTeamMutation($input: CreateTeamInput!) {
createTeam(input: $input) { createTeam(input: $input) {
success result {
team { __typename
...TeamParts ...on TeamNode {
...TeamParts
}
...on DuplicateName {
reason
}
} }
} }
} }

View File

@ -367,11 +367,12 @@ input CreateTeamInput {
} }
type CreateTeamPayload { type CreateTeamPayload {
success: Boolean result: CreateTeamResult
team: TeamNode
clientMutationId: String clientMutationId: String
} }
union CreateTeamResult = TeamNode | DuplicateName
scalar Date scalar Date
scalar DateTime scalar DateTime

View File

@ -10,12 +10,13 @@ from api.utils import get_object
from core.logger import get_logger from core.logger import get_logger
from users.inputs import PasswordUpdateInput from users.inputs import PasswordUpdateInput
from users.models import SchoolClass, SchoolClassMember, Team from users.models import SchoolClass, SchoolClassMember, Team
from users.schema import SchoolClassNode, TeamNode, UpdateError, FieldError, CreateSchoolClassResult from users.schema import CreateSchoolClassResult, CreateTeamResult, FieldError, SchoolClassNode, TeamNode, UpdateError
from users.serializers import AvatarUrlSerializer, PasswordSerialzer from users.serializers import AvatarUrlSerializer, PasswordSerialzer
logger = get_logger(__name__) logger = get_logger(__name__)
DUPLICATE_REASON = {"reason": "Dieser Name wird bereits verwendet."}
class CodeNotFoundException(Exception): class CodeNotFoundException(Exception):
pass pass
@ -210,26 +211,28 @@ class CreateSchoolClass(TeacherOnlyMutation):
user.set_selected_class(school_class) user.set_selected_class(school_class)
return cls(result=school_class) return cls(result=school_class)
except IntegrityError: except IntegrityError:
return cls(result={"reason": "Dieser Name wird bereits verwendet."}) return cls(result=DUPLICATE_REASON)
class CreateTeam(TeacherOnlyMutation): class CreateTeam(TeacherOnlyMutation):
class Input: class Input:
name = graphene.String(required=True) name = graphene.String(required=True)
success = graphene.Boolean() result = CreateTeamResult()
team = graphene.Field(TeamNode)
@classmethod @classmethod
def mutate_and_get_payload(cls, root, info, **kwargs): def mutate_and_get_payload(cls, root, info, **kwargs):
name = kwargs.get('name') name = kwargs.get('name')
user = info.context.user user = info.context.user
team = Team.objects.create(name=name, creator=user) try:
team.generate_code() team = Team.objects.create(name=name, creator=user)
user.team = team team.generate_code()
user.save() user.team = team
return cls(success=True, team=team) user.save()
return cls(result=team)
except IntegrityError:
return cls(result=DUPLICATE_REASON)
class UpdateTeam(TeacherOnlyMutation): class UpdateTeam(TeacherOnlyMutation):

View File

@ -186,6 +186,17 @@ class DuplicateName(graphene.ObjectType):
reason = graphene.String() reason = graphene.String()
class CreateTeamResult(graphene.Union):
class Meta:
types = (TeamNode, DuplicateName)
@classmethod
def resolve_type(cls, instance, info):
if type(instance).__name__ == "Team":
return TeamNode
return DuplicateName
class CreateSchoolClassResult(graphene.Union): class CreateSchoolClassResult(graphene.Union):
class Meta: class Meta:
types = (SchoolClassNode, DuplicateName) types = (SchoolClassNode, DuplicateName)

View File

@ -101,22 +101,33 @@ class TeamTest(TestCase):
self.join_team(second_team.code, context) self.join_team(second_team.code, context)
self.check_me(context, second_team.name, second_team.code) self.check_me(context, second_team.name, second_team.code)
def test_create_team_mutation(self): def _get_team_mutation_result(self, name):
team_name = "Dunder Mifflin"
variables = { variables = {
"input": { "input": {
"name": team_name "name": name
} }
} }
result = self.client.execute(CREATE_TEAM_MUTATION, context=self.context, variables=variables) result = self.client.execute(CREATE_TEAM_MUTATION, context=self.context, variables=variables)
self.no_error(result) self.no_error(result)
create_team = result.get('data').get('createTeam') create_team = result.get('data').get('createTeam')
team = create_team.get('team') result = create_team.get('result')
success = create_team.get('success') typename = result.get('__typename')
self.assertTrue(success) return result, typename
def test_create_team_mutation_success(self):
team_name = "Dunder Mifflin"
team, typename = self._get_team_mutation_result(team_name)
self.assertEqual(typename, 'TeamNode')
self.assertEqual(team.get('name'), team_name) self.assertEqual(team.get('name'), team_name)
self.assertIsNotNone(team.get('code')) self.assertIsNotNone(team.get('code'))
def test_create_team_mutation_fail_duplicate_name(self):
team_name = "Dunder Mifflin"
Team.objects.create(name=team_name)
duplicate_name, typename = self._get_team_mutation_result(team_name)
self.assertEqual(typename, 'DuplicateName')
self.assertEqual(duplicate_name.get('reason'), 'Dieser Name wird bereits verwendet.')
def test_update_team_name(self): def test_update_team_name(self):
new_name = 'Team Böhmermann' new_name = 'Team Böhmermann'
variables = { variables = {
@ -149,7 +160,7 @@ class TeamTest(TestCase):
context = Context(user=schelm) context = Context(user=schelm)
team = Team.objects.get(pk=self.team.pk) team = Team.objects.get(pk=self.team.pk)
old_name = team.name old_name = team.name
self.assertFalse(self.team.members.filter(pk=schelm.pk).exists()) self.assertFalse(self.team.members.filter(pk=schelm.pk).exists())
variables = { variables = {
"input": { "input": {
"name": 'Not gonna happen', "name": 'Not gonna happen',
@ -199,4 +210,3 @@ class TeamTest(TestCase):
student_after = User.objects.get(pk=self.student.pk) student_after = User.objects.get(pk=self.student.pk)
self.assertIsNone(student_after.team) self.assertIsNone(student_after.team)