from django.test import TestCase, RequestFactory from graphene.test import Client from graphql_relay import to_global_id from api.schema import schema from portfolio.factories import ProjectFactory from users.factories import SchoolClassFactory from users.models import User from users.services import create_users from api.test_utils import create_client, DefaultUserTestCase from portfolio.models import Project class ProjectQuery(TestCase): def setUp(self): create_users() self.teacher = User.objects.get(username='teacher') self.teacher2 = User.objects.get(username='teacher2') self.student = User.objects.get(username='student1') self.student2 = User.objects.get(username='student2') school_class1 = SchoolClassFactory(users=[self.teacher, self.student]) school_class2 = SchoolClassFactory(users=[self.teacher2, self.student2]) self.project1 = ProjectFactory(student=self.student) self.mutation = ''' mutation DeleteProject($input: DeleteProjectInput!) { deleteProject(input: $input) { success errors } } ''' self.variables = { 'input': { 'id': to_global_id('ProjectNode', self.project1.id) } } def test_should_be_able_to_delete_own_projects(self): self.assertEqual(Project.objects.count(), 1) request = RequestFactory().get('/') request.user = self.student self.client = Client(schema=schema, context_value=request) result = self.client.execute(self.mutation, variables=self.variables) self.assertIsNone(result.get('errors')) self.assertEqual(Project.objects.count(), 0) def test_should_not_be_able_to_delete_other_projects(self): self.assertEqual(Project.objects.count(), 1) request = RequestFactory().get('/') request.user = self.student2 self.client = Client(schema=schema, context_value=request) result = self.client.execute(self.mutation, variables=self.variables) self.assertEqual(result.get('errors')[0]['message'], 'Permission denied: Incorrect project') class ProjectMutationsTestCase(DefaultUserTestCase): def test_add_project(self): client = create_client(self.student1) mutation = """ mutation AddProjectMutation($input: AddProjectInput!){ addProject(input: $input){ project { id } errors } } """ result = client.execute(mutation, variables={ 'input': { "project": { "title": "Rick Astley", "description": "She wants to dance with me", "objectives": "Dance with me", "appearance": "green" } } }) self.assertIsNone(result.get('errors')) self.assertEqual(Project.objects.count(), 1)