From 8dc5d7dfaf0247e17c204a2d1b3dc9f2b6671a1d Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Mon, 15 Oct 2018 20:08:22 +0200 Subject: [PATCH] Add initial tests for assignment --- server/assignments/factories.py | 16 ++++ server/assignments/tests.py | 3 - server/assignments/tests/__init__.py | 0 .../tests/test_assignment_permissions.py | 86 +++++++++++++++++++ server/users/managers.py | 9 +- server/users/services.py | 18 +++- 6 files changed, 120 insertions(+), 12 deletions(-) create mode 100644 server/assignments/factories.py delete mode 100644 server/assignments/tests.py create mode 100644 server/assignments/tests/__init__.py create mode 100644 server/assignments/tests/test_assignment_permissions.py diff --git a/server/assignments/factories.py b/server/assignments/factories.py new file mode 100644 index 00000000..2c0638e1 --- /dev/null +++ b/server/assignments/factories.py @@ -0,0 +1,16 @@ +import random + +import factory + +from books.factories import ModuleFactory +from .models import Assignment + +from core.factories import fake + +class AssignmentFactory(factory.django.DjangoModelFactory): + class Meta: + model = Assignment + + title = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(4, 8))) + assignment = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(4, 8))) + module = factory.SubFactory(ModuleFactory) diff --git a/server/assignments/tests.py b/server/assignments/tests.py deleted file mode 100644 index 7ce503c2..00000000 --- a/server/assignments/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/server/assignments/tests/__init__.py b/server/assignments/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/server/assignments/tests/test_assignment_permissions.py b/server/assignments/tests/test_assignment_permissions.py new file mode 100644 index 00000000..755c9dcf --- /dev/null +++ b/server/assignments/tests/test_assignment_permissions.py @@ -0,0 +1,86 @@ +from unittest import TestCase + +from django.test import RequestFactory +from graphene.test import Client +from graphql_relay import to_global_id + +from api.utils import get_graphql_mutation +from assignments.models import Assignment, StudentSubmission +from books.factories import ModuleFactory +from ..factories import AssignmentFactory +from users.models import User +from users.services import create_users +from api.schema import schema + + +class AssignmentPermissionsTestCase(TestCase): + def setUp(self): + create_users() + + self.teacher = User.objects.get(username='teacher') + self.teacher2 = User.objects.get(username='teacher2') + self.student1 = User.objects.get(username='student1') + self.student2 = User.objects.get(username='student2') + self.assignment = AssignmentFactory( + owner=self.teacher + ) + + request = RequestFactory().get('/') + request.user = self.student1 + self.client = Client(schema=schema, context_value=request) + + """ + to test: + create assignment + should be visible to teachers + should be visible to students + student1 submits result + teacher1 should see result + student1 should see result + student2 should not see result + teacher2 should not see result + """ + + def test_count(self): + self.assertEqual(Assignment.objects.count(), 1) + + def test_submit_submission(self): + """ + id = graphene.ID(required=True) + answer = graphene.String(required=True) + document = graphene.String() + final = graphene.Boolean() + """ + + id = to_global_id('Assignment', self.assignment.pk) + + mutation = ''' + mutation UpdateAssignment($input: UpdateAssignmentInput!) { + updateAssignment(input: $input){ + updatedAssignment { + id + title + assignment + submission { + id + text + final + document + } + } + } + } + + ''' + + result = self.client.execute(mutation, variables={ + 'input': { + "assignment": { + "id": id, + "answer": 'Halo', + "final": True + } + } + }) + self.assertIsNone(result.get('errors')) + self.assertEqual(StudentSubmission.objects.count(), 1) diff --git a/server/users/managers.py b/server/users/managers.py index 90afec13..8bd35110 100644 --- a/server/users/managers.py +++ b/server/users/managers.py @@ -33,20 +33,13 @@ class RoleManager(models.Manager): def create_default_roles(self): for key, value in self.DEFAULT_ROLES.items(): - role = self.create(name=value, key=key) - role.save() + role, created = self.get_or_create(name=value, key=key) can_manage_school_class_content, = self._create_default_permissions() if key == "teacher": role.role_permission.add(can_manage_school_class_content.id) - # elif key == "school_admin": - # role.role_permission.add() - # - # elif key == "student": - # role.role_permission.add() - def get_default_teacher_role(self): return self._get_default_role(self.TEACHER_KEY) diff --git a/server/users/services.py b/server/users/services.py index 85eb2ee7..2c91049e 100644 --- a/server/users/services.py +++ b/server/users/services.py @@ -13,10 +13,26 @@ def create_users(data=None): teacher = UserFactory(username='teacher') UserRole.objects.create(user=teacher, role=teacher_role) + students = [] for i in range(1, 7): student = UserFactory(username='student{}'.format(i)) UserRole.objects.create(user=student, role=student_role) - SchoolClassFactory(users=[teacher, student]) + students.append(student) + + SchoolClassFactory( + users=[teacher] + students, + year='2018', + name='skillbox' + ) + teacher2 = UserFactory(username='teacher2') + SchoolClassFactory( + users=[teacher2], + year='2018', + name='second_class' + ) + + + else: for school_class in data: