Skip to content

Commit 85d5a7b

Browse files
committed
add tests and mutations
1 parent 68ab6c6 commit 85d5a7b

7 files changed

Lines changed: 275 additions & 54 deletions

File tree

README.md

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ This repository holds the source code for the https://jsprep.org site.
2222

2323
This site is a progressive web application built with React, GraphQL, backed by Django.
2424

25+
The `client` folder contains all necessary code for running React front-end application.
26+
The `server` folder contains the back-end Django application.
27+
2528
## Client
2629

2730
### Getting started
@@ -110,8 +113,6 @@ _with variables:_
110113
}
111114
```
112115

113-
114-
115116
_Query all units from the database:_
116117

117118
```
@@ -126,8 +127,6 @@ query {
126127
}
127128
```
128129

129-
130-
131130
_Create exercise:_
132131

133132
```
@@ -156,8 +155,6 @@ _with variables:_
156155
}
157156
```
158157

159-
160-
161158
_Query all unit exercises from the database:_
162159

163160
```
@@ -173,8 +170,6 @@ query ($id: ID!) {
173170
}
174171
```
175172

176-
177-
178173
### Testing
179174

180175
For run tests, you need to:

server/jsprep/fixtures.py

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,40 @@
11
import pytest
2-
from .models import Unit
3-
from mongoengine import connect
2+
from .models import Unit, Exercise
43

4+
def fixture_exercise_data():
5+
Exercise.drop_collection()
6+
exercise_one = Exercise(
7+
id="678f1f77bcf86cd799439011",
8+
name="Test Exercise 1",
9+
unit= "60570791cd82a786dc25de50",
10+
description= "Test Exercise Description 1",
11+
position=1
512

13+
)
14+
exercise_one.save()
15+
exercise_two = Exercise(
16+
id="307f1f77bcf86cd799439011",
17+
name="Test Exercise 2",
18+
unit= "10570791cd82a786dc25de50",
19+
description= "Test Exercise Description 2",
20+
position=2
21+
22+
)
23+
exercise_two.save()
24+
exercise_three = Exercise(
25+
id="447f1f77bcf86cd799439011",
26+
name="Test Exercise 3",
27+
unit= "60570791cd82a786dc25de50",
28+
description= "Test Exercise Description 3",
29+
position=3
30+
31+
)
32+
exercise_three.save()
33+
634
def fixture_unit_data():
735
Unit.drop_collection()
836
unit_one = Unit(
37+
id="907f1f77bcf86cd799439011",
938
title="Unit 1",
1039
about=["A", "B", "C", "D"],
1140
description="This is a test unit 1",
@@ -14,6 +43,7 @@ def fixture_unit_data():
1443
unit_one.save()
1544

1645
unit_two = Unit(
46+
id="607f1f77bcf86cd799439011",
1747
title="UNIT 2",
1848
about=["a", "b", "c"],
1949
description="THIS IS a test unit 2",
@@ -31,25 +61,12 @@ def fixture_unit_data():
3161
unit_three.save()
3262

3363

34-
# def fixture_shop_data():
35-
# Shop.drop_collection()
36-
# shop_one = Shop(
37-
# name="Big Wheel Bicycles",
38-
# address="2438 Hart Ridge Road",
39-
# website="https://www.bigwheelunit.test",
40-
# )
41-
# shop_one.save()
42-
# shop_two = Shop(
43-
# name="Unit Tech",
44-
# address="2175 Pearl Street",
45-
# website="https://www.unittech.test",
46-
# )
47-
# shop_two.save()
64+
4865

4966

5067
@pytest.fixture(scope="module")
5168
def fixtures_data():
5269
fixture_unit_data()
53-
# fixture_shop_data()
70+
fixture_exercise_data()
5471

5572
return True

server/jsprep/mutations_exercise.py

Lines changed: 72 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from django.core.exceptions import ObjectDoesNotExist
33
from .models import Exercise
44
from .types import ExerciseType
5+
from .util import order_objects_by_position
56
from enum import Enum
67

78
class ExerciseCategory(Enum):
@@ -21,6 +22,9 @@ class ExerciseInput(graphene.InputObjectType):
2122
position = graphene.Int()
2223

2324

25+
26+
27+
2428
class CreateExerciseMutation(graphene.Mutation):
2529
exercise = graphene.Field(ExerciseType)
2630

@@ -29,17 +33,14 @@ class Arguments:
2933
category_enum = graphene.Argument(graphene.Enum.from_enum(ExerciseCategory))
3034

3135
def mutate(self, info, exercise_data=None, category_enum=None):
32-
exercises = Exercise.objects.all()
33-
num_exercises = exercises.count()
34-
if (exercises is not None):
35-
last_exercise = exercises.order_by('-position').first()
36-
if (last_exercise is not None):
37-
last_position = last_exercise.position
38-
if (last_position is not None and last_position != num_exercises):
39-
for idx, val in enumerate(Exercise.objects):
40-
val.position=idx + 1
41-
val.save()
42-
36+
num_exercises = len(Exercise.objects)
37+
sort=False
38+
if (exercise_data.position is not None):
39+
position = exercise_data.position
40+
sort=True
41+
else:
42+
position =num_exercises + 1
43+
4344
exercise = Exercise(
4445
unit=exercise_data.unit,
4546
name=exercise_data.name,
@@ -48,8 +49,66 @@ def mutate(self, info, exercise_data=None, category_enum=None):
4849
code=exercise_data.code,
4950
test=exercise_data.test,
5051
category=category_enum,
51-
position=num_exercises + 1
52+
position=position
5253
)
5354
exercise.save()
55+
if (sort is True):
56+
exercises = Exercise.objects.all()
57+
order_objects_by_position(exercises)
58+
59+
return CreateExerciseMutation(exercise=exercise)
60+
61+
62+
class UpdateExerciseMutation(graphene.Mutation):
63+
exercise = graphene.Field(ExerciseType)
64+
65+
class Arguments:
66+
exercise_data = ExerciseInput(required=True)
67+
68+
@staticmethod
69+
def get_object(id):
70+
return Exercise.objects.get(pk=id)
71+
72+
73+
def mutate(self, info, exercise_data=None):
74+
exercise = UpdateExerciseMutation.get_object(exercise_data.id)
75+
if (exercise_data is not exercise):
76+
if exercise_data.unit:
77+
exercise.unit = exercise_data.unit
78+
if exercise_data.name:
79+
exercise.name = exercise_data.name
80+
if exercise_data.description:
81+
exercise.description = exercise_data.description
82+
if exercise_data.content:
83+
exercise.content = exercise_data.content
84+
if exercise_data.category:
85+
exercise.category = exercise_data.category
86+
if exercise_data.code:
87+
exercise.code = exercise_data.code
88+
if exercise_data.test:
89+
exercise.test = exercise_data.test
90+
if exercise_data.position:
91+
exercise.position = exercise_data.position
92+
exercise.save()
93+
exercises = Exercise.objects.all()
94+
order_objects_by_position(exercises)
95+
96+
exercise.save()
97+
98+
return UpdateExerciseMutation(exercise=exercise)
99+
100+
101+
class DeleteExerciseMutation(graphene.Mutation):
102+
class Arguments:
103+
id = graphene.ID(required=True)
104+
105+
success = graphene.Boolean()
106+
107+
def mutate(self, info, id):
108+
try:
109+
Exercise.objects.get(pk=id).delete()
110+
success = True
111+
except ObjectDoesNotExist:
112+
success = False
54113

55-
return CreateExerciseMutation(exercise=exercise)
114+
return DeleteExerciseMutation(success=success)

server/jsprep/mutations_unit.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from .util import order_objects_by_position
12
import graphene
23
from django.core.exceptions import ObjectDoesNotExist
34
from .models import Unit, Exercise
@@ -20,25 +21,25 @@ class Arguments:
2021
unit_data = UnitInput(required=True)
2122

2223
def mutate(self, info, unit_data=None):
23-
units = Unit.objects.all()
24-
num_units = units.count()
25-
if (units is not None):
26-
last_unit = units.order_by('-position').first()
27-
if (last_unit is not None):
28-
last_position = last_unit.position
29-
if (last_position is not None and last_position != num_units):
30-
for idx, val in enumerate(Unit.objects):
31-
val.position=idx + 1
32-
val.save()
24+
num_units = len(Unit.objects)
25+
sort=False
26+
if (unit_data.position is not None):
27+
position = unit_data.position
28+
sort=True
29+
else:
30+
position =num_units + 1
3331

3432
unit = Unit(
3533
title=unit_data.title,
3634
about=unit_data.about,
3735
description=unit_data.description,
3836
image_url=unit_data.image_url,
39-
position=num_units + 1
37+
position=position
4038
)
4139
unit.save()
40+
if (sort is True):
41+
units = Unit.objects.all()
42+
order_objects_by_position(units)
4243

4344
return CreateUnitMutation(unit=unit)
4445

@@ -65,6 +66,9 @@ def mutate(self, info, unit_data=None):
6566
unit.image_url = unit_data.image_url
6667
if unit_data.position:
6768
unit.position = unit_data.position
69+
unit.save()
70+
units= Unit.objects.all()
71+
order_objects_by_position(units)
6872

6973
unit.save()
7074

server/jsprep/schema.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from .models import Unit, Exercise
33
from .types import UnitType, ExerciseType
44
from .mutations_unit import CreateUnitMutation, UpdateUnitMutation, DeleteUnitMutation
5-
from .mutations_exercise import CreateExerciseMutation
5+
from .mutations_exercise import CreateExerciseMutation, UpdateExerciseMutation, DeleteExerciseMutation
66

77

88
class Mutations(graphene.ObjectType):
@@ -11,15 +11,15 @@ class Mutations(graphene.ObjectType):
1111
delete_unit = DeleteUnitMutation.Field()
1212

1313
create_exercise = CreateExerciseMutation.Field()
14-
# update_exercise = UpdateExerciseMutation.Field()
15-
# delete_exercise = DeleteExerciseMutation.Field()
14+
update_exercise = UpdateExerciseMutation.Field()
15+
delete_exercise = DeleteExerciseMutation.Field()
1616

1717

1818
class Query(graphene.ObjectType):
1919
unit_list = graphene.List(UnitType)
2020

2121
def resolve_unit_list(self, info):
22-
return Unit.objects.all()
22+
return Unit.objects.order_by('position')
2323

2424
exercise = graphene.Field(ExerciseType)
2525
exercise_list = graphene.List(ExerciseType, unit_id=graphene.ID())
@@ -29,7 +29,7 @@ def resolve_exercise(self, info, id):
2929

3030
def resolve_exercise_list(self, info, unit_id = None, **kwargs):
3131
if unit_id:
32-
return Exercise.objects.filter(unit=unit_id)
32+
return Exercise.objects.filter(unit=unit_id).order_by('position')
3333

3434

3535
schema = graphene.Schema(query=Query, mutation=Mutations, types=[UnitType, ExerciseType])

0 commit comments

Comments
 (0)