class TestRestDeadlinesBulkUpdateReadOrDelete(TestCase): def setUp(self): self.testhelper = TestHelper() self.testhelper.add(nodes='uni', subjects=['sub'], periods=['p1:begins(-2)']) # 2 months ago self.testhelper.sub_p1.start_time = datetime(2000, 1, 1, 22, 30, 49) self.testhelper.sub_p1.save() self.testhelper.add_to_path('uni;sub.p1.a1:admin(adm):pub(0)') # 0 days after period begins + 2 sec self.client = RestClient() for groupnum in xrange(3): # deadline 5 days after assignment starts self.testhelper.add_to_path('uni;sub.p1.a1.g{0}:candidate(cand1):examiner(exam1).d1:ends(5)'.format(groupnum)) def _geturl(self, deadline=None): deadline = deadline or self.testhelper.sub_p1_a1_g1_d1 bulkdeadline_id = encode_bulkdeadline_id(deadline) return '/devilry_subjectadmin/rest/deadlinesbulk/{0}/{1}'.format(self.testhelper.sub_p1_a1.id, bulkdeadline_id) def test_encode_unique_bulkdeadline_id(self): d = Deadline(deadline=datetime(2000, 12, 24, 22, 30, 49)) self.assertEquals(encode_bulkdeadline_id(d), '2000-12-24T22_30_49--') d.text = 'Hello world' self.assertEquals(encode_bulkdeadline_id(d), '2000-12-24T22_30_49--{0}'.format(sha1hash('Hello world'))) # Ensure unicode works d.text = u'\u00e5ello world' self.assertEquals(encode_bulkdeadline_id(d), '2000-12-24T22_30_49--{0}'.format(sha1hash(u'\u00e5ello world'))) def test_decode_unique_bulkdeadline_id(self): self.assertEquals(decode_bulkdeadline_id('2000-12-24T22_30_49--'), (datetime(2000, 12, 24, 22, 30, 49), '')) self.assertEquals(decode_bulkdeadline_id('2000-12-24T22_30_49--{0}'.format(sha1hash('Hello world'))), (datetime(2000, 12, 24, 22, 30, 49), sha1hash('Hello world'))) def _putas(self, username, data): self.client.login(username=username, password='******') return self.client.rest_put(self._geturl(), data) def test_put(self): self.assertEquals(self.testhelper.sub_p1_a1.publishing_time, datetime(2000, 1, 1, 22, 30, 51)) self.assertEquals(self.testhelper.sub_p1_a1_g1_d1.deadline, datetime(2000, 1, 1, 22, 30) + timedelta(days=5)) new_deadline = datetime(2004, 12, 24, 20, 30) content, response = self._putas('adm', {'deadline': format_datetime(new_deadline), 'text': 'Hello'}) self.assertEquals(response.status_code, 200) self.assertEquals(decode_bulkdeadline_id(content['bulkdeadline_id'])[0], new_deadline) self.assertEquals(len(content['groups']), 3) self.assertEquals(content['text'], 'Hello') self.assertEquals(content['deadline'], format_datetime(new_deadline)) for groupnum in xrange(3): deadline_id = getattr(self.testhelper, 'sub_p1_a1_g{0}_d1'.format(groupnum)).id deadline = Deadline.objects.get(id=deadline_id) self.assertEquals(deadline.deadline, new_deadline) self.assertEquals(deadline.text, 'Hello') def test_put_nonetext(self): self.assertEquals(self.testhelper.sub_p1_a1.publishing_time, datetime(2000, 1, 1, 22, 30, 51)) self.assertEquals(self.testhelper.sub_p1_a1_g1_d1.deadline, datetime(2000, 1, 1, 22, 30) + timedelta(days=5)) new_deadline = datetime(2004, 12, 24, 20, 30) content, response = self._putas('adm', {'deadline': format_datetime(new_deadline), 'text': None}) self.assertEquals(response.status_code, 200) for groupnum in xrange(3): deadline_id = getattr(self.testhelper, 'sub_p1_a1_g{0}_d1'.format(groupnum)).id deadline = Deadline.objects.get(id=deadline_id) self.assertEquals(deadline.deadline, new_deadline) self.assertEquals(deadline.text, '') def test_put_before_publishingtime(self): new_deadline = datetime(1990, 1, 1, 20, 30, 40) content, response = self._putas('adm', {'deadline': format_datetime(new_deadline), 'text': None}) self.assertEquals(response.status_code, 400) self.assertEquals(content['errors'], ['Deadline cannot be before publishing time.']) def test_put_nobody(self): self.testhelper.create_user('nobody') content, response = self._putas('nobody', {}) self.assertEquals(response.status_code, 403) def test_put_with_bulkdeadline_id(self): new_deadline = datetime(2004, 12, 24, 20, 30) content, response = self._putas('adm', {'deadline': format_datetime(new_deadline), 'bulkdeadline_id': 'ignored'}) self.assertEquals(response.status_code, 200) def test_put_group_ids(self): new_deadline = datetime(2004, 12, 24, 20, 30) g1 = self.testhelper.sub_p1_a1_g1 g2 = self.testhelper.sub_p1_a1_g2 self.assertEquals(g1.deadlines.count(), 1) content, response = self._putas('adm', {'deadline': format_datetime(new_deadline), 'text': 'Updated', 'group_ids': [g1.id, g2.id]}) self.assertEquals(response.status_code, 200) self.assertEquals(len(content['groups']), 2) group_ids = set([g['id'] for g in content['groups']]) self.assertEquals(group_ids, set([g1.id, g2.id])) for group in g1, g2: group = self.testhelper.reload_from_db(group) self.assertEquals(group.deadlines.count(), 1) deadline = group.deadlines.all()[0] self.assertEquals(deadline.deadline, new_deadline) self.assertEquals(deadline.text, 'Updated') def _getas(self, username, **data): self.client.login(username=username, password='******') return self.client.rest_get(self._geturl(), **data) def test_get(self): content, response = self._getas('adm') self.assertEquals(response.status_code, 200) self.assertEquals(decode_bulkdeadline_id(content['bulkdeadline_id'])[0], self.testhelper.sub_p1_a1_g1_d1.deadline) self.assertEquals(content['deadline'], format_datetime(self.testhelper.sub_p1_a1_g1_d1.deadline)) self.assertEquals(content['text'], None) self.assertEquals(len(content['groups']), 3) def test_get_nobody(self): self.testhelper.create_user('nobody') content, response = self._getas('nobody') self.assertEquals(response.status_code, 403) def _deleteas(self, username, deadline=None): self.client.login(username=username, password='******') return self.client.rest_delete(self._geturl(deadline)) def test_delete_sanity(self): # Test that the deadline method actually does what it is supposed to do (only deletes what it should delete) new_deadline = datetime(2004, 12, 24, 20, 30) created_deadline = None for groupnum in xrange(2): group = getattr(self.testhelper, 'sub_p1_a1_g{0}'.format(groupnum)) self.assertEquals(1, group.deadlines.count()) created_deadline = group.deadlines.create(deadline=new_deadline) # NOTE: Does not matter which deadline object we user, since we only need the datetime and text to generate bulkdeadline_id self.assertEquals(2, group.deadlines.count()) self.testhelper.sub_p1_a1_g2.deadlines.create(deadline=datetime(2006, 12, 24, 20, 30)) self.testhelper.create_superuser('superuser') content, response = self._deleteas('superuser', deadline=created_deadline) self.assertEquals(response.status_code, 200) self.assertEquals(len(content['deleted_deadline_ids']), 2) self.assertEquals(1, self.testhelper.sub_p1_a1_g0.deadlines.count()) self.assertEquals(1, self.testhelper.sub_p1_a1_g1.deadlines.count()) self.assertEquals(2, self.testhelper.sub_p1_a1_g2.deadlines.count()) def test_delete_with_content_as_superuser(self): self.testhelper.create_superuser('superuser') self.testhelper.add_delivery('sub.p1.a1.g1', {'bad.py': ['print ', 'bah']}) self.testhelper.add_feedback('sub.p1.a1.g1', verdict={'grade': 'F', 'points': 30, 'is_passing_grade': False}) content, response = self._deleteas('superuser') self.assertEquals(response.status_code, 200) def test_delete_with_content_as_assignmentadm(self): self.testhelper.add_delivery('sub.p1.a1.g1', {'bad.py': ['print ', 'bah']}) self.testhelper.add_feedback('sub.p1.a1.g1', verdict={'grade': 'F', 'points': 30, 'is_passing_grade': False}) content, response = self._deleteas('adm') self.assertEquals(response.status_code, 403) def test_delete_without_content_as_assignmentadm(self): content, response = self._deleteas('adm') self.assertEquals(response.status_code, 200) def test_delete_as_nobody(self): self.testhelper.create_user('nobody') content, response = self._deleteas('nobody') self.assertEquals(response.status_code, 403)
class TestRestInstanceAssignmentRest(TestCase): def setUp(self): self.testhelper = TestHelper() self.testhelper.add(nodes='uni:admin(uniadmin)', subjects=['duck2000:admin(duck2000admin)'], periods=['someperiod:begins(-2):ends(6)'], assignments=['first:admin(firstadmin)', 'second:admin(secondadmin,firstadmin)', 'third']) self.client = RestClient() def _geturl(self, assignmentid): return '/devilry_subjectadmin/rest/assignment/{0}'.format(assignmentid) def test_delete_denied(self): self.client.login(username='******', password='******') content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 403) def test_delete(self): self.client.login(username='******', password='******') content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertEquals(content['id'], self.testhelper.duck2000_someperiod_first.id) self.assertEquals(Assignment.objects.filter(id=self.testhelper.duck2000_someperiod_first.id).count(), 0) def test_get(self): self.testhelper.add_to_path('uni;duck2000.someperiod.first.g1:candidate(student1):examiner(examiner1).d1') self.testhelper.add_to_path('uni;duck2000.someperiod.first.g2:candidate(student2,student3,student4,student5):examiner(examiner1).d1') self.testhelper.add_delivery('duck2000.someperiod.first.g1', {'bad.py': ['print ', 'bah']}) self.testhelper.add_delivery('duck2000.someperiod.first.g1', {'good.py': ['print ', 'good']}) self.testhelper.add_delivery('duck2000.someperiod.first.g2', {'good.py': ['print ', 'good']}) self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertEquals(content['id'], self.testhelper.duck2000_someperiod_first.id) self.assertEquals(content['short_name'], self.testhelper.duck2000_someperiod_first.short_name) self.assertEquals(content['long_name'], self.testhelper.duck2000_someperiod_first.long_name) self.assertEquals(content['deadline_handling'], self.testhelper.duck2000_someperiod_first.deadline_handling) self.assertEquals(content['parentnode'], self.testhelper.duck2000_someperiod_first.parentnode_id) self.assertEquals(content['can_delete'], self.testhelper.duck2000_someperiod_first.can_delete(self.testhelper.duck2000admin)) self.assertEquals(content['can_delete'], False) self.assertEquals(content['number_of_groups'], 2) self.assertEquals(content['number_of_deliveries'], 3) self.assertEquals(content['number_of_candidates'], 5) self.assertEquals(content['has_valid_grading_setup'], True) self.assertEquals(content['gradingsystemplugin_title'], 'Passed/failed') self.assertEquals(set(content.keys()), set(['short_name', 'long_name', 'admins', 'etag', 'can_delete', 'parentnode', 'id', 'inherited_admins', 'publishing_time', 'delivery_types', 'is_published', 'publishing_time_offset_from_now', 'scale_points_percent', 'deadline_handling', 'first_deadline', 'breadcrumb', 'anonymous', 'number_of_deliveries', 'number_of_groups', 'number_of_candidates', 'number_of_groups_where_is_examiner', 'has_valid_grading_setup', 'gradingsystemplugin_title', 'max_points', 'points_to_grade_mapper', 'grading_system_plugin_id', 'passing_grade_min_points' ])) def test_get_admins(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertEquals(len(content['admins']), 1) self.assertEquals(content['admins'][0]['email'], '*****@*****.**') self.assertEquals(set(content['admins'][0].keys()), set(['email', 'username', 'id', 'full_name'])) def test_get_inherited_admins(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertEquals(len(content['inherited_admins']), 2) self.assertEquals(set(content['inherited_admins'][0].keys()), set(['basenode', 'user'])) self.assertEquals(set(content['inherited_admins'][0]['basenode'].keys()), set(['type', 'path', 'id', 'is_admin'])) self.assertEquals(set(content['inherited_admins'][0]['user'].keys()), set(['email', 'username', 'id', 'full_name'])) inherited_adminusernames = [user['user']['username'] for user in content['inherited_admins']] self.assertIn('uniadmin', inherited_adminusernames) self.assertIn('duck2000admin', inherited_adminusernames) def test_get_breadcrumb_assignmentadmin(self): self.testhelper.add(nodes='uni.inf', subjects=['sub'], periods=['p1'], assignments=['a1:admin(a1admin)']) self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.sub_p1_a1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals(content['breadcrumb'], [{u'id': th.sub_p1_a1.id, u'text': u'sub.p1.a1', u'type': u'Assignment'}]) def test_get_breadcrumb_periodadmin(self): self.testhelper.add(nodes='uni.inf', subjects=['sub'], periods=['p1:admin(p1admin)'], assignments=['a1']) self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.sub_p1_a1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals(content['breadcrumb'], [{u'id': th.sub_p1.id, u'text': u'sub.p1', u'type': u'Period'}, {u'id': th.sub_p1_a1.id, u'text': u'a1', u'type': u'Assignment'}]) def test_get_breadcrumb_subjectadmin(self): self.testhelper.add(nodes='uni.inf', subjects=['sub:admin(subadm)'], periods=['p1'], assignments=['a1']) self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.sub_p1_a1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals(content['breadcrumb'], [{u'id': th.sub.id, u'text': u'sub', u'type': u'Subject'}, {u'id': th.sub_p1.id, u'text': u'p1', u'type': u'Period'}, {u'id': th.sub_p1_a1.id, u'text': u'a1', u'type': u'Assignment'}]) def test_get_breadcrumb_nodeadmin(self): self.testhelper.add(nodes='uni:admin(uniadm).inf', subjects=['sub'], periods=['p1'], assignments=['a1']) self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.sub_p1_a1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals(content['breadcrumb'], [{u'id': th.uni.id, u'text': u'uni', u'type': u'Node'}, {u'id': th.uni_inf.id, u'text': u'inf', u'type': u'Node'}, {u'id': th.sub.id, u'text': u'sub', u'type': u'Subject'}, {u'id': th.sub_p1.id, u'text': u'p1', u'type': u'Period'}, {u'id': th.sub_p1_a1.id, u'text': u'a1', u'type': u'Assignment'}]) def test_get_breadcrumb_superuser(self): self.testhelper.add(nodes='uni.inf', subjects=['sub'], periods=['p1'], assignments=['a1']) self.testhelper.create_superuser('super') self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.sub_p1_a1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals(content['breadcrumb'], [{u'id': th.uni.id, u'text': u'uni', u'type': u'Node'}, {u'id': th.uni_inf.id, u'text': u'inf', u'type': u'Node'}, {u'id': th.sub.id, u'text': u'sub', u'type': u'Subject'}, {u'id': th.sub_p1.id, u'text': u'p1', u'type': u'Period'}, {u'id': th.sub_p1_a1.id, u'text': u'a1', u'type': u'Assignment'}]) def test_get_can_not_delete(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertFalse(content['can_delete']) def test_put(self): self.client.login(username='******', password='******') data = {'short_name': 'duck2000', 'long_name': 'Updated', 'admins': [], 'publishing_time': isoformat_relativetime(days=-2), 'scale_points_percent': 80, 'deadline_handling': 0, 'delivery_types': 0, 'parentnode': 1} content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000_someperiod_first.id), data=data) self.assertEquals(response.status_code, 200) self.assertEquals(content['id'], self.testhelper.duck2000_someperiod_first.id) self.assertEquals(content['short_name'], self.testhelper.duck2000.short_name) self.assertEquals(content['long_name'], 'Updated') self.assertEquals(content['parentnode'], 1) self.assertEquals(content['scale_points_percent'], 80) self.assertEquals(content['deadline_handling'], 0) self.assertEquals(content['delivery_types'], 0) self.assertEquals(set(content.keys()), set(['short_name', 'long_name', 'admins', 'etag', 'can_delete', 'parentnode', 'id', 'inherited_admins', 'publishing_time', 'delivery_types', 'is_published', 'publishing_time_offset_from_now', 'scale_points_percent', 'deadline_handling', 'first_deadline', 'breadcrumb', 'anonymous', 'number_of_deliveries', 'number_of_groups', 'number_of_candidates', 'number_of_groups_where_is_examiner', 'has_valid_grading_setup', 'gradingsystemplugin_title', 'max_points', 'points_to_grade_mapper', 'grading_system_plugin_id', 'passing_grade_min_points' ])) updated = Assignment.objects.get(id=self.testhelper.duck2000_someperiod_first.id) self.assertEquals(updated.long_name, 'Updated') def test_put_admins(self): self.client.login(username='******', password='******') self.testhelper.create_user('user1') self.testhelper.create_user('user2') self.testhelper.create_user('user3') data = {'short_name': 'duck2000', 'long_name': 'Updated', 'admins': [{'username': '******', 'email': 'ignored', 'full_name': 'ignored!'}, {'username': '******'}, {'id': self.testhelper.user3.id}], 'publishing_time': isoformat_relativetime(days=-2), 'scale_points_percent': 80, 'deadline_handling': 0, 'delivery_types': 0, 'parentnode': 1} content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000_someperiod_first.id), data=data) self.assertEquals(response.status_code, 200) admins = content['admins'] self.assertEquals(len(content['admins']), 3) admins.sort(cmp=lambda a,b: cmp(a['username'], b['username'])) self.assertEquals(admins[0]['username'], 'user1') self.assertEquals(admins[2]['username'], 'user3') updated = Assignment.objects.get(id=self.testhelper.duck2000_someperiod_first.id) self.assertEquals(updated.admins.all().count(), 3)
class TestRestInstancePeriodRest(TestCase): def setUp(self): self.testhelper = TestHelper() self.testhelper.add(nodes='uni:admin(uniadmin)', subjects=['duck2000:admin(duck2000admin)'], periods=['periodone:admin(oneadmin)', 'periodtwo', 'periodthree:admin(adminone)']) self.client = RestClient() def _geturl(self, periodid): return '/devilry_subjectadmin/rest/period/{0}'.format(periodid) def test_delete_denied(self): self.client.login(username='******', password='******') content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000_periodone.id)) self.assertEquals(response.status_code, 403) def test_delete(self): self.client.login(username='******', password='******') content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000_periodone.id)) self.assertEquals(response.status_code, 200) self.assertEquals(content['id'], self.testhelper.duck2000_periodone.id) self.assertEquals(Period.objects.filter(id=self.testhelper.duck2000_periodone.id).count(), 0) def test_get(self): period = self.testhelper.duck2000_periodone for username in ('student1', 'student2', 'student3', 'student4'): user = self.testhelper.create_user(username) period.relatedstudent_set.create(user=user) for username in ('examiner1', 'examiner2'): user = self.testhelper.create_user(username) period.relatedexaminer_set.create(user=user) self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_periodone.id)) self.assertEquals(response.status_code, 200) self.assertEquals(content['id'], self.testhelper.duck2000_periodone.id) self.assertEquals(content['short_name'], self.testhelper.duck2000_periodone.short_name) self.assertEquals(content['long_name'], self.testhelper.duck2000_periodone.long_name) self.assertEquals(content['parentnode'], self.testhelper.duck2000_periodone.parentnode_id) self.assertEquals(content['can_delete'], self.testhelper.duck2000_periodone.can_delete(self.testhelper.uniadmin)) self.assertEquals(content['number_of_relatedexaminers'], 2) self.assertEquals(content['number_of_relatedstudents'], 4) self.assertEquals(set(content.keys()), set(['short_name', 'long_name', 'admins', 'etag', 'can_delete', 'parentnode', 'id', 'inherited_admins', 'start_time', 'end_time', 'breadcrumb', 'number_of_relatedexaminers', 'number_of_relatedstudents'])) def test_get_admins(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_periodone.id)) self.assertEquals(response.status_code, 200) self.assertEquals(len(content['admins']), 1) self.assertEquals(content['admins'][0]['email'], '*****@*****.**') self.assertEquals(set(content['admins'][0].keys()), set(['email', 'username', 'id', 'full_name'])) def test_get_inherited_admins(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_periodone.id)) self.assertEquals(response.status_code, 200) self.assertEquals(len(content['inherited_admins']), 2) self.assertEquals(set(content['inherited_admins'][0].keys()), set(['basenode', 'user'])) self.assertEquals(set(content['inherited_admins'][0]['basenode'].keys()), set(['type', 'path', 'id', 'is_admin'])) self.assertEquals(set(content['inherited_admins'][0]['user'].keys()), set(['email', 'username', 'id', 'full_name'])) inherited_adminusernames = [user['user']['username'] for user in content['inherited_admins']] self.assertIn('uniadmin', inherited_adminusernames) self.assertIn('duck2000admin', inherited_adminusernames) def test_get_breadcrumb_periodadmin(self): self.testhelper.add(nodes='uni', subjects=['sub'], periods=['p1:admin(p1admin)']) self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.sub_p1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals(content['breadcrumb'], [{u'id': th.sub_p1.id, u'text': u'sub.p1', u'type': u'Period'}]) def test_get_breadcrumb_subjectadmin(self): self.testhelper.add(nodes='uni', subjects=['sub:admin(subadm)'], periods=['p1']) self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.sub_p1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals(content['breadcrumb'], [{u'id': th.sub.id, u'text': u'sub', u'type': u'Subject'}, {u'id': th.sub_p1.id, u'text': u'p1', u'type': u'Period'}]) def test_get_breadcrumb_nodeadmin(self): self.testhelper.add(nodes='uni:admin(uniadmin).inf', subjects=['sub'], periods=['p1']) self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.sub_p1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals(content['breadcrumb'], [{u'id': th.uni.id, u'text': u'uni', u'type': u'Node'}, {u'id': th.uni_inf.id, u'text': u'inf', u'type': u'Node'}, {u'id': th.sub.id, u'text': u'sub', u'type': u'Subject'}, {u'id': th.sub_p1.id, u'text': u'p1', u'type': u'Period'}]) def test_get_breadcrumb_superuser(self): self.testhelper.add(nodes='uni.inf', subjects=['sub'], periods=['p1']) self.testhelper.create_superuser('super') self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.sub_p1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals(content['breadcrumb'], [{u'id': th.uni.id, u'text': u'uni', u'type': u'Node'}, {u'id': th.uni_inf.id, u'text': u'inf', u'type': u'Node'}, {u'id': th.sub.id, u'text': u'sub', u'type': u'Subject'}, {u'id': th.sub_p1.id, u'text': u'p1', u'type': u'Period'}]) def test_get_can_not_delete(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_periodone.id)) self.assertFalse(content['can_delete']) def test_put(self): self.client.login(username='******', password='******') data = {'short_name': 'duck2000', 'long_name': 'Updated', 'admins': [], 'start_time': isoformat_relativetime(days=-2), 'end_time': isoformat_relativetime(days=2), 'parentnode': 1} content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000_periodone.id), data=data) self.assertEquals(response.status_code, 200) self.assertEquals(content['id'], self.testhelper.duck2000_periodone.id) self.assertEquals(content['short_name'], self.testhelper.duck2000.short_name) self.assertEquals(content['long_name'], 'Updated') self.assertEquals(content['parentnode'], 1) self.assertEquals(set(content.keys()), set(['short_name', 'long_name', 'admins', 'etag', 'can_delete', 'parentnode', 'id', 'inherited_admins', 'start_time', 'end_time', 'breadcrumb', 'number_of_relatedstudents', 'number_of_relatedexaminers'])) updated = Period.objects.get(id=self.testhelper.duck2000_periodone.id) self.assertEquals(updated.long_name, 'Updated') def test_put_admins(self): self.client.login(username='******', password='******') self.testhelper.create_user('user1') self.testhelper.create_user('user2') self.testhelper.create_user('user3') data = {'short_name': 'duck2000', 'long_name': 'Updated', 'admins': [{'username': '******', 'email': 'ignored', 'full_name': 'ignored!'}, {'username': '******'}, {'id': self.testhelper.user3.id}], 'start_time': isoformat_relativetime(days=-2), 'end_time': isoformat_relativetime(days=2), 'parentnode': 1} content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000_periodone.id), data=data) self.assertEquals(response.status_code, 200) admins = content['admins'] self.assertEquals(len(content['admins']), 3) admins.sort(cmp=lambda a,b: cmp(a['username'], b['username'])) self.assertEquals(admins[0]['username'], 'user1') self.assertEquals(admins[2]['username'], 'user3') updated = Period.objects.get(id=self.testhelper.duck2000_periodone.id) self.assertEquals(updated.admins.all().count(), 3)
class TestInstanceRelatedUserMixin(object): def setUp(self): self.client = RestClient() self.testhelper = TestHelper() self.testhelper.add(nodes="uni", subjects=["sub"], periods=["p1:admin(p1admin)", "p2:admin(p2admin)"]) self.testhelper.create_superuser("superuser") self.testreluser = self.create_reluser_on_p1("testuser", tags="group1,group2") def create_reluser_on_p1(self, username, tags): raise NotImplementedError() def get_url(self, periodid, reluserid): raise NotImplementedError() def get_valid_putdata(self): return {"period": self.testhelper.sub_p1.id, "tags": "group10,group20", "user": self.testhelper.testuser.id} def _getas(self, username, periodid, id, **data): self.client.login(username=username, password="******") return self.client.rest_get(self.get_url(periodid, id), **data) def test_get_404(self): content, response = self._getas("p1admin", self.testhelper.sub_p1.id, 40000000) self.assertEquals(response.status_code, 404) def test_get_unauthorized(self): content, response = self._getas("p2admin", self.testhelper.sub_p1.id, self.testreluser.id) self.assertEquals(response.status_code, 403) def test_get_superuser(self): content, response = self._getas("superuser", self.testhelper.sub_p1.id, self.testreluser.id) self.assertEquals(response.status_code, 200) def _putas(self, username, periodid, id, data): self.client.login(username=username, password="******") return self.client.rest_put(self.get_url(periodid, id), data) def test_put_unauthorized(self): content, response = self._putas( "p2admin", self.testhelper.sub_p1.id, self.testreluser.id, self.get_valid_putdata() ) self.assertEquals(response.status_code, 403) def test_put_superuser(self): content, response = self._putas( "superuser", self.testhelper.sub_p1.id, self.testreluser.id, self.get_valid_putdata() ) self.assertEquals(response.status_code, 200) def test_put(self): content, response = self._putas( "p1admin", self.testhelper.sub_p1.id, self.testreluser.id, self.get_valid_putdata() ) self.assertEquals(response.status_code, 200) self.assertEquals(content["period"], self.testhelper.sub_p1.id) self.assertEquals(content["tags"], "group10,group20") self.assertEquals(set(content["user"].keys()), set(["email", "full_name", "id", "username"])) self.assertEquals(content["user"]["id"], self.testreluser.user.id) self.assertEquals(content["user"]["username"], "testuser") return content def _deleteas(self, username, periodid, id): self.client.login(username=username, password="******") return self.client.rest_delete(self.get_url(periodid, id)) def test_delete(self): reluserid = self.testreluser.id self.assertEquals(self.modelcls.objects.filter(id=reluserid).count(), 1) content, response = self._deleteas("p1admin", self.testhelper.sub_p1.id, reluserid) self.assertEquals(response.status_code, 204) self.assertEquals(self.modelcls.objects.filter(id=reluserid).count(), 0) def test_delete_superuser(self): content, response = self._deleteas("superuser", self.testhelper.sub_p1.id, self.testreluser.id) self.assertEquals(response.status_code, 204) def test_delete_unauthorized(self): content, response = self._deleteas("p2admin", self.testhelper.sub_p1.id, self.testreluser.id) self.assertEquals(response.status_code, 403)
class TestRestInstanceAssignmentRest(TestCase): def setUp(self): self.testhelper = TestHelper() self.testhelper.add(nodes='uni:admin(uniadmin)', subjects=['duck2000:admin(duck2000admin)'], periods=['someperiod:begins(-2):ends(6)'], assignments=['first:admin(firstadmin)', 'second:admin(secondadmin,firstadmin)', 'third']) self.client = RestClient() def _geturl(self, assignmentid): return '/devilry_subjectadmin/rest/assignment/{0}'.format(assignmentid) def test_delete_denied(self): self.client.login(username='******', password='******') content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 403) def test_delete(self): self.client.login(username='******', password='******') content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertEquals(content['id'], self.testhelper.duck2000_someperiod_first.id) self.assertEquals(Assignment.objects.filter(id=self.testhelper.duck2000_someperiod_first.id).count(), 0) def test_get(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertEquals(content['id'], self.testhelper.duck2000_someperiod_first.id) self.assertEquals(content['short_name'], self.testhelper.duck2000_someperiod_first.short_name) self.assertEquals(content['long_name'], self.testhelper.duck2000_someperiod_first.long_name) self.assertEquals(content['deadline_handling'], self.testhelper.duck2000_someperiod_first.deadline_handling) self.assertEquals(content['parentnode'], self.testhelper.duck2000_someperiod_first.parentnode_id) self.assertEquals(content['can_delete'], self.testhelper.duck2000_someperiod_first.can_delete(self.testhelper.uniadmin)) self.assertEquals(set(content.keys()), set(['short_name', 'long_name', 'admins', 'etag', 'can_delete', 'parentnode', 'id', 'inherited_admins', 'publishing_time', 'delivery_types', 'is_published', 'publishing_time_offset_from_now', 'scale_points_percent', 'deadline_handling', 'first_deadline', 'breadcrumb', 'anonymous'])) def test_get_admins(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertEquals(len(content['admins']), 1) self.assertEquals(content['admins'][0]['email'], '*****@*****.**') self.assertEquals(set(content['admins'][0].keys()), set(['email', 'username', 'id', 'full_name'])) def test_get_inherited_admins(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertEquals(len(content['inherited_admins']), 2) self.assertEquals(set(content['inherited_admins'][0].keys()), set(['basenode', 'user'])) self.assertEquals(set(content['inherited_admins'][0]['basenode'].keys()), set(['type', 'path', 'id'])) self.assertEquals(set(content['inherited_admins'][0]['user'].keys()), set(['email', 'username', 'id', 'full_name'])) inherited_adminusernames = [user['user']['username'] for user in content['inherited_admins']] self.assertIn('uniadmin', inherited_adminusernames) self.assertIn('duck2000admin', inherited_adminusernames) def test_get_breadcrumb(self): self.testhelper.add(nodes='duck.mat.inf', subjects=['s1'], periods=['p1'], assignments=['a1:admin(a1admin)']) self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.s1_p1_a1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals(content['breadcrumb'], [{u'id': th.duck.id, u'short_name': u'duck', u'type': u'Node'}, {u'id': th.duck_mat.id, u'short_name': u'mat', u'type': u'Node'}, {u'id': th.duck_mat_inf.id, u'short_name': u'inf', u'type': u'Node'}, {u'id': th.s1.id, u'short_name': u's1', u'type': u'Subject'}, {u'id': th.s1_p1.id, u'short_name': u'p1', u'type': u'Period'}]) def test_get_can_not_delete(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertFalse(content['can_delete']) def test_put(self): self.client.login(username='******', password='******') data = {'short_name': 'duck2000', 'long_name': 'Updated', 'admins': [], 'publishing_time': isoformat_relativetime(days=-2), 'scale_points_percent': 80, 'deadline_handling': 0, 'delivery_types': 0, 'parentnode': 1} content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000_someperiod_first.id), data=data) self.assertEquals(response.status_code, 200) self.assertEquals(content['id'], self.testhelper.duck2000_someperiod_first.id) self.assertEquals(content['short_name'], self.testhelper.duck2000.short_name) self.assertEquals(content['long_name'], 'Updated') self.assertEquals(content['parentnode'], 1) self.assertEquals(content['scale_points_percent'], 80) self.assertEquals(content['deadline_handling'], 0) self.assertEquals(content['delivery_types'], 0) self.assertEquals(set(content.keys()), set(['short_name', 'long_name', 'admins', 'etag', 'can_delete', 'parentnode', 'id', 'inherited_admins', 'publishing_time', 'delivery_types', 'is_published', 'publishing_time_offset_from_now', 'scale_points_percent', 'deadline_handling', 'first_deadline', 'breadcrumb', 'anonymous'])) updated = Assignment.objects.get(id=self.testhelper.duck2000_someperiod_first.id) self.assertEquals(updated.long_name, 'Updated') def test_put_admins(self): self.client.login(username='******', password='******') self.testhelper.create_user('user1') self.testhelper.create_user('user2') self.testhelper.create_user('user3') data = {'short_name': 'duck2000', 'long_name': 'Updated', 'admins': [{'username': '******', 'email': 'ignored', 'full_name': 'ignored!'}, {'username': '******'}, {'id': self.testhelper.user3.id}], 'publishing_time': isoformat_relativetime(days=-2), 'scale_points_percent': 80, 'deadline_handling': 0, 'delivery_types': 0, 'parentnode': 1} content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000_someperiod_first.id), data=data) self.assertEquals(response.status_code, 200) admins = content['admins'] self.assertEquals(len(content['admins']), 3) admins.sort(cmp=lambda a,b: cmp(a['username'], b['username'])) self.assertEquals(admins[0]['username'], 'user1') self.assertEquals(admins[2]['username'], 'user3') updated = Assignment.objects.get(id=self.testhelper.duck2000_someperiod_first.id) self.assertEquals(updated.admins.all().count(), 3)
class TestInstanceRelatedUserMixin(object): def setUp(self): self.client = RestClient() self.testhelper = TestHelper() self.testhelper.add(nodes='uni', subjects=['sub'], periods=['p1:admin(p1admin)', 'p2:admin(p2admin)']) self.testhelper.create_superuser("superuser") self.testreluser = self.create_reluser_on_p1('testuser', tags='group1,group2') def create_reluser_on_p1(self, username, tags): raise NotImplementedError() def get_url(self, periodid, reluserid): raise NotImplementedError() def get_valid_putdata(self): return {'period': self.testhelper.sub_p1.id, 'tags': 'group10,group20', 'user': self.testhelper.testuser.id} def _getas(self, username, periodid, id, **data): self.client.login(username=username, password='******') return self.client.rest_get(self.get_url(periodid, id), **data) def test_get_404(self): content, response = self._getas('p1admin', self.testhelper.sub_p1.id, 40000000) self.assertEquals(response.status_code, 404) def test_get_unauthorized(self): content, response = self._getas('p2admin', self.testhelper.sub_p1.id, self.testreluser.id) self.assertEquals(response.status_code, 403) def test_get_superuser(self): content, response = self._getas('superuser', self.testhelper.sub_p1.id, self.testreluser.id) self.assertEquals(response.status_code, 200) def _putas(self, username, periodid, id, data): self.client.login(username=username, password='******') return self.client.rest_put(self.get_url(periodid, id), data) def test_put_unauthorized(self): content, response = self._putas('p2admin', self.testhelper.sub_p1.id, self.testreluser.id, self.get_valid_putdata()) self.assertEquals(response.status_code, 403) def test_put_superuser(self): content, response = self._putas('superuser', self.testhelper.sub_p1.id, self.testreluser.id, self.get_valid_putdata()) self.assertEquals(response.status_code, 200) def test_put(self): content, response = self._putas('p1admin', self.testhelper.sub_p1.id, self.testreluser.id, self.get_valid_putdata()) self.assertEquals(response.status_code, 200) self.assertEquals(content['period'], self.testhelper.sub_p1.id) self.assertEquals(content['tags'], 'group10,group20') self.assertEquals(set(content['user'].keys()), set(['email', 'full_name', 'id', 'username', 'displayname'])) self.assertEquals(content['user']['id'], self.testreluser.user.id) self.assertEquals(content['user']['username'], 'testuser') return content def _deleteas(self, username, periodid, id): self.client.login(username=username, password='******') return self.client.rest_delete(self.get_url(periodid, id)) def test_delete(self): reluserid = self.testreluser.id self.assertEquals(self.modelcls.objects.filter(id=reluserid).count(), 1) content, response = self._deleteas('p1admin', self.testhelper.sub_p1.id, reluserid) self.assertEquals(response.status_code, 204) self.assertEquals(self.modelcls.objects.filter(id=reluserid).count(), 0) def test_delete_superuser(self): content, response = self._deleteas('superuser', self.testhelper.sub_p1.id, self.testreluser.id) self.assertEquals(response.status_code, 204) def test_delete_unauthorized(self): content, response = self._deleteas('p2admin', self.testhelper.sub_p1.id, self.testreluser.id) self.assertEquals(response.status_code, 403)
class TestRestInstanceAssignmentRest(TestCase): def setUp(self): self.testhelper = TestHelper() self.testhelper.add( nodes="uni:admin(uniadmin)", subjects=["duck2000:admin(duck2000admin)"], periods=["someperiod:begins(-2):ends(6)"], assignments=["first:admin(firstadmin)", "second:admin(secondadmin,firstadmin)", "third"], ) self.client = RestClient() def _geturl(self, assignmentid): return "/devilry_subjectadmin/rest/assignment/{0}".format(assignmentid) def test_delete_denied(self): self.client.login(username="******", password="******") content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 403) def test_delete(self): self.client.login(username="******", password="******") content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertEquals(content["id"], self.testhelper.duck2000_someperiod_first.id) self.assertEquals(Assignment.objects.filter(id=self.testhelper.duck2000_someperiod_first.id).count(), 0) def test_get(self): self.testhelper.add_to_path("uni;duck2000.someperiod.first.g1:candidate(student1):examiner(examiner1).d1") self.testhelper.add_to_path( "uni;duck2000.someperiod.first.g2:candidate(student2,student3,student4,student5):examiner(examiner1).d1" ) self.testhelper.add_delivery("duck2000.someperiod.first.g1", {"bad.py": ["print ", "bah"]}) self.testhelper.add_delivery("duck2000.someperiod.first.g1", {"good.py": ["print ", "good"]}) self.testhelper.add_delivery("duck2000.someperiod.first.g2", {"good.py": ["print ", "good"]}) self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertEquals(content["id"], self.testhelper.duck2000_someperiod_first.id) self.assertEquals(content["short_name"], self.testhelper.duck2000_someperiod_first.short_name) self.assertEquals(content["long_name"], self.testhelper.duck2000_someperiod_first.long_name) self.assertEquals(content["deadline_handling"], self.testhelper.duck2000_someperiod_first.deadline_handling) self.assertEquals(content["parentnode"], self.testhelper.duck2000_someperiod_first.parentnode_id) self.assertEquals( content["can_delete"], self.testhelper.duck2000_someperiod_first.can_delete(self.testhelper.duck2000admin) ) self.assertEquals(content["can_delete"], False) self.assertEquals(content["number_of_groups"], 2) self.assertEquals(content["number_of_deliveries"], 3) self.assertEquals(content["number_of_candidates"], 5) self.assertEquals( content["gradeeditor"], { u"gradeeditorid": u"approved", u"title": u"Approved/not approved", u"shortformat": {u"widget": u"bool", u"shorthelp": u"Must be one of: true, false."}, }, ) self.assertEquals( set(content.keys()), set( [ "short_name", "long_name", "admins", "etag", "can_delete", "parentnode", "id", "inherited_admins", "publishing_time", "delivery_types", "is_published", "publishing_time_offset_from_now", "scale_points_percent", "deadline_handling", "first_deadline", "breadcrumb", "anonymous", "number_of_deliveries", "number_of_groups", "number_of_candidates", "gradeeditor", "number_of_groups_where_is_examiner", ] ), ) def test_get_admins(self): self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertEquals(len(content["admins"]), 1) self.assertEquals(content["admins"][0]["email"], "*****@*****.**") self.assertEquals(set(content["admins"][0].keys()), set(["email", "username", "id", "full_name"])) def test_get_inherited_admins(self): self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertEquals(len(content["inherited_admins"]), 2) self.assertEquals(set(content["inherited_admins"][0].keys()), set(["basenode", "user"])) self.assertEquals( set(content["inherited_admins"][0]["basenode"].keys()), set(["type", "path", "id", "is_admin"]) ) self.assertEquals( set(content["inherited_admins"][0]["user"].keys()), set(["email", "username", "id", "full_name"]) ) inherited_adminusernames = [user["user"]["username"] for user in content["inherited_admins"]] self.assertIn("uniadmin", inherited_adminusernames) self.assertIn("duck2000admin", inherited_adminusernames) def test_get_breadcrumb_assignmentadmin(self): self.testhelper.add(nodes="uni.inf", subjects=["sub"], periods=["p1"], assignments=["a1:admin(a1admin)"]) self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.sub_p1_a1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals( content["breadcrumb"], [{u"id": th.sub_p1_a1.id, u"text": u"sub.p1.a1", u"type": u"Assignment"}] ) def test_get_breadcrumb_periodadmin(self): self.testhelper.add(nodes="uni.inf", subjects=["sub"], periods=["p1:admin(p1admin)"], assignments=["a1"]) self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.sub_p1_a1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals( content["breadcrumb"], [ {u"id": th.sub_p1.id, u"text": u"sub.p1", u"type": u"Period"}, {u"id": th.sub_p1_a1.id, u"text": u"a1", u"type": u"Assignment"}, ], ) def test_get_breadcrumb_subjectadmin(self): self.testhelper.add(nodes="uni.inf", subjects=["sub:admin(subadm)"], periods=["p1"], assignments=["a1"]) self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.sub_p1_a1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals( content["breadcrumb"], [ {u"id": th.sub.id, u"text": u"sub", u"type": u"Subject"}, {u"id": th.sub_p1.id, u"text": u"p1", u"type": u"Period"}, {u"id": th.sub_p1_a1.id, u"text": u"a1", u"type": u"Assignment"}, ], ) def test_get_breadcrumb_nodeadmin(self): self.testhelper.add(nodes="uni:admin(uniadm).inf", subjects=["sub"], periods=["p1"], assignments=["a1"]) self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.sub_p1_a1.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals( content["breadcrumb"], [ {u"id": th.uni.id, u"text": u"uni", u"type": u"Node"}, {u"id": th.uni_inf.id, u"text": u"inf", u"type": u"Node"}, {u"id": th.sub.id, u"text": u"sub", u"type": u"Subject"}, {u"id": th.sub_p1.id, u"text": u"p1", u"type": u"Period"}, {u"id": th.sub_p1_a1.id, u"text": u"a1", u"type": u"Assignment"}, ], ) def test_get_can_not_delete(self): self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000_someperiod_first.id)) self.assertEquals(response.status_code, 200) self.assertFalse(content["can_delete"]) def test_put(self): self.client.login(username="******", password="******") data = { "short_name": "duck2000", "long_name": "Updated", "admins": [], "publishing_time": isoformat_relativetime(days=-2), "scale_points_percent": 80, "deadline_handling": 0, "delivery_types": 0, "parentnode": 1, } content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000_someperiod_first.id), data=data) self.assertEquals(response.status_code, 200) self.assertEquals(content["id"], self.testhelper.duck2000_someperiod_first.id) self.assertEquals(content["short_name"], self.testhelper.duck2000.short_name) self.assertEquals(content["long_name"], "Updated") self.assertEquals(content["parentnode"], 1) self.assertEquals(content["scale_points_percent"], 80) self.assertEquals(content["deadline_handling"], 0) self.assertEquals(content["delivery_types"], 0) self.assertEquals( set(content.keys()), set( [ "short_name", "long_name", "admins", "etag", "can_delete", "parentnode", "id", "inherited_admins", "publishing_time", "delivery_types", "is_published", "publishing_time_offset_from_now", "scale_points_percent", "deadline_handling", "first_deadline", "breadcrumb", "anonymous", "number_of_deliveries", "number_of_groups", "number_of_candidates", "gradeeditor", "number_of_groups_where_is_examiner", ] ), ) updated = Assignment.objects.get(id=self.testhelper.duck2000_someperiod_first.id) self.assertEquals(updated.long_name, "Updated") def test_put_admins(self): self.client.login(username="******", password="******") self.testhelper.create_user("user1") self.testhelper.create_user("user2") self.testhelper.create_user("user3") data = { "short_name": "duck2000", "long_name": "Updated", "admins": [ {"username": "******", "email": "ignored", "full_name": "ignored!"}, {"username": "******"}, {"id": self.testhelper.user3.id}, ], "publishing_time": isoformat_relativetime(days=-2), "scale_points_percent": 80, "deadline_handling": 0, "delivery_types": 0, "parentnode": 1, } content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000_someperiod_first.id), data=data) self.assertEquals(response.status_code, 200) admins = content["admins"] self.assertEquals(len(content["admins"]), 3) admins.sort(cmp=lambda a, b: cmp(a["username"], b["username"])) self.assertEquals(admins[0]["username"], "user1") self.assertEquals(admins[2]["username"], "user3") updated = Assignment.objects.get(id=self.testhelper.duck2000_someperiod_first.id) self.assertEquals(updated.admins.all().count(), 3)
class TestRestInstanceSubjectRest(TestCase): def setUp(self): self.testhelper = TestHelper() self.testhelper.add(nodes="uni:admin(uniadmin)", subjects=["duck2000:admin(duck2000admin):ln(Something fancy)"]) self.client = RestClient() def _geturl(self, subjectid): return "/devilry_subjectadmin/rest/subject/{0}".format(subjectid) def test_delete_denied(self): self.client.login(username="******", password="******") content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000.id)) self.assertEquals(response.status_code, 403) def test_delete(self): self.client.login(username="******", password="******") content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000.id)) self.assertEquals(response.status_code, 200) self.assertEquals(content["id"], self.testhelper.duck2000.id) self.assertEquals(Subject.objects.filter(id=self.testhelper.duck2000.id).count(), 0) def test_delete_notempty(self): self.testhelper.add_to_path("uni;duck2000.p1") self.client.login(username="******", password="******") content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000.id)) self.assertEquals(response.status_code, 403) self.assertIn("Only superadmins can delete non-empty items", content["detail"]) def test_get(self): self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000.id)) self.assertEquals(response.status_code, 200) self.assertEquals(content["id"], self.testhelper.duck2000.id) self.assertEquals(content["short_name"], self.testhelper.duck2000.short_name) self.assertEquals(content["long_name"], self.testhelper.duck2000.long_name) self.assertEquals(content["parentnode"], self.testhelper.duck2000.parentnode_id) self.assertEquals(content["can_delete"], self.testhelper.duck2000.can_delete(self.testhelper.uniadmin)) self.assertEquals( set(content.keys()), set( [ "short_name", "long_name", "admins", "etag", "can_delete", "parentnode", "id", "inherited_admins", "breadcrumb", ] ), ) def test_get_admins(self): self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000.id)) self.assertEquals(response.status_code, 200) self.assertEquals(len(content["admins"]), 1) self.assertEquals(content["admins"][0]["email"], "*****@*****.**") self.assertEquals(set(content["admins"][0].keys()), set(["email", "username", "id", "full_name"])) def test_get_inherited_admins(self): self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000.id)) self.assertEquals(response.status_code, 200) self.assertEquals(len(content["inherited_admins"]), 1) self.assertEquals(set(content["inherited_admins"][0].keys()), set(["basenode", "user"])) self.assertEquals( set(content["inherited_admins"][0]["basenode"].keys()), set(["type", "path", "id", "is_admin"]) ) self.assertEquals( set(content["inherited_admins"][0]["user"].keys()), set(["email", "username", "id", "full_name"]) ) inherited_adminusernames = [user["user"]["username"] for user in content["inherited_admins"]] self.assertEquals(inherited_adminusernames, ["uniadmin"]) def test_get_breadcrumb_subjectadmin(self): self.testhelper.add(nodes="uni.inf", subjects=["sub:admin(subadm)"]) self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.sub.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals(content["breadcrumb"], [{u"id": th.sub.id, u"text": u"sub", u"type": u"Subject"}]) def test_get_breadcrumb_nodeadmin(self): self.testhelper.add(nodes="uni:admin(uniadm).inf", subjects=["sub"]) self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.sub.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals( content["breadcrumb"], [ {u"id": th.uni.id, u"text": u"uni", u"type": u"Node"}, {u"id": th.uni_inf.id, u"text": u"inf", u"type": u"Node"}, {u"id": th.sub.id, u"text": u"sub", u"type": u"Subject"}, ], ) def test_get_breadcrumb_superuser(self): self.testhelper.add(nodes="uni.inf", subjects=["sub"]) self.testhelper.create_superuser("super") self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.sub.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals( content["breadcrumb"], [ {u"id": th.uni.id, u"text": u"uni", u"type": u"Node"}, {u"id": th.uni_inf.id, u"text": u"inf", u"type": u"Node"}, {u"id": th.sub.id, u"text": u"sub", u"type": u"Subject"}, ], ) def test_get_can_not_delete(self): self.client.login(username="******", password="******") content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000.id)) self.assertFalse(content["can_delete"]) def test_put(self): self.client.login(username="******", password="******") data = {"short_name": "duck2000", "long_name": "Updated", "admins": [], "parentnode": 1} content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000.id), data=data) self.assertEquals(response.status_code, 200) self.assertEquals(content["id"], self.testhelper.duck2000.id) self.assertEquals(content["short_name"], self.testhelper.duck2000.short_name) self.assertEquals(content["long_name"], "Updated") self.assertEquals(content["parentnode"], 1) self.assertEquals( set(content.keys()), set( [ "short_name", "long_name", "admins", "etag", "can_delete", "parentnode", "id", "inherited_admins", "breadcrumb", ] ), ) def test_put_admins(self): self.client.login(username="******", password="******") self.testhelper.create_user("user1") self.testhelper.create_user("user2") self.testhelper.create_user("user3") data = { "short_name": "duck2000", "long_name": "Updated", "admins": [ {"username": "******", "email": "ignored", "full_name": "ignored!"}, {"username": "******"}, {"id": self.testhelper.user3.id}, ], "parentnode": 1, } content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000.id), data=data) self.assertEquals(response.status_code, 200) admins = content["admins"] self.assertEquals(len(content["admins"]), 3) admins.sort(cmp=lambda a, b: cmp(a["username"], b["username"])) self.assertEquals(admins[0]["username"], "user1") self.assertEquals(admins[2]["username"], "user3") def test_put_generated_fields(self): self.client.login(username="******", password="******") data = { "short_name": "duck2000", "long_name": "Updated", "admins": [], "parentnode": 1, "breadcrumb": [], "can_delete": False, "inherited_admins": [], } content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000.id), data=data) self.assertEquals(response.status_code, 200)
class TestRestInstanceSubjectRest(TestCase): def setUp(self): self.testhelper = TestHelper() self.testhelper.add(nodes='uni:admin(uniadmin)', subjects=['duck2000:admin(duck2000admin):ln(Something fancy)']) self.client = RestClient() def _geturl(self, subjectid): return '/devilry_subjectadmin/rest/subject/{0}'.format(subjectid) def test_delete_denied(self): self.client.login(username='******', password='******') content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000.id)) self.assertEquals(response.status_code, 403) def test_delete(self): self.client.login(username='******', password='******') content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000.id)) self.assertEquals(response.status_code, 200) self.assertEquals(content['id'], self.testhelper.duck2000.id) self.assertEquals(Subject.objects.filter(id=self.testhelper.duck2000.id).count(), 0) def test_delete_notempty(self): self.testhelper.add_to_path('uni;duck2000.p1') self.client.login(username='******', password='******') content, response = self.client.rest_delete(self._geturl(self.testhelper.duck2000.id)) self.assertEquals(response.status_code, 403) self.assertIn('Only superadmins can delete non-empty items', content['detail']) def test_get(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000.id)) self.assertEquals(response.status_code, 200) self.assertEquals(content['id'], self.testhelper.duck2000.id) self.assertEquals(content['short_name'], self.testhelper.duck2000.short_name) self.assertEquals(content['long_name'], self.testhelper.duck2000.long_name) self.assertEquals(content['parentnode'], self.testhelper.duck2000.parentnode_id) self.assertEquals(content['can_delete'], self.testhelper.duck2000.can_delete(self.testhelper.uniadmin)) self.assertEquals(set(content.keys()), set(['short_name', 'long_name', 'admins', 'etag', 'can_delete', 'parentnode', 'id', 'inherited_admins', 'breadcrumb'])) def test_get_admins(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000.id)) self.assertEquals(response.status_code, 200) self.assertEquals(len(content['admins']), 1) self.assertEquals(content['admins'][0]['email'], '*****@*****.**') self.assertEquals(set(content['admins'][0].keys()), set(['email', 'username', 'id', 'full_name'])) def test_get_inherited_admins(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000.id)) self.assertEquals(response.status_code, 200) self.assertEquals(len(content['inherited_admins']), 1) self.assertEquals(set(content['inherited_admins'][0].keys()), set(['basenode', 'user'])) self.assertEquals(set(content['inherited_admins'][0]['basenode'].keys()), set(['type', 'path', 'id', 'is_admin'])) self.assertEquals(set(content['inherited_admins'][0]['user'].keys()), set(['email', 'username', 'id', 'full_name'])) inherited_adminusernames = [user['user']['username'] for user in content['inherited_admins']] self.assertEquals(inherited_adminusernames, ['uniadmin']) def test_get_breadcrumb_subjectadmin(self): self.testhelper.add(nodes='uni.inf', subjects=['sub:admin(subadm)']) self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.sub.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals(content['breadcrumb'], [{u'id': th.sub.id, u'text': u'sub', u'type': u'Subject'}]) def test_get_breadcrumb_nodeadmin(self): self.testhelper.add(nodes='uni:admin(uniadm).inf', subjects=['sub']) self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.sub.id)) self.assertEquals(response.status_code, 200) th = self.testhelper self.assertEquals(content['breadcrumb'], [{u'id': th.uni.id, u'text': u'uni', u'type': u'Node'}, {u'id': th.uni_inf.id, u'text': u'inf', u'type': u'Node'}, {u'id': th.sub.id, u'text': u'sub', u'type': u'Subject'}]) def test_get_can_not_delete(self): self.client.login(username='******', password='******') content, response = self.client.rest_get(self._geturl(self.testhelper.duck2000.id)) self.assertFalse(content['can_delete']) def test_put(self): self.client.login(username='******', password='******') data = {'short_name': 'duck2000', 'long_name': 'Updated', 'admins': [], 'parentnode': 1} content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000.id), data=data) self.assertEquals(response.status_code, 200) self.assertEquals(content['id'], self.testhelper.duck2000.id) self.assertEquals(content['short_name'], self.testhelper.duck2000.short_name) self.assertEquals(content['long_name'], 'Updated') self.assertEquals(content['parentnode'], 1) self.assertEquals(set(content.keys()), set(['short_name', 'long_name', 'admins', 'etag', 'can_delete', 'parentnode', 'id', 'inherited_admins', 'breadcrumb'])) def test_put_admins(self): self.client.login(username='******', password='******') self.testhelper.create_user('user1') self.testhelper.create_user('user2') self.testhelper.create_user('user3') data = {'short_name': 'duck2000', 'long_name': 'Updated', 'admins': [{'username': '******', 'email': 'ignored', 'full_name': 'ignored!'}, {'username': '******'}, {'id': self.testhelper.user3.id}], 'parentnode': 1} content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000.id), data=data) self.assertEquals(response.status_code, 200) admins = content['admins'] self.assertEquals(len(content['admins']), 3) admins.sort(cmp=lambda a,b: cmp(a['username'], b['username'])) self.assertEquals(admins[0]['username'], 'user1') self.assertEquals(admins[2]['username'], 'user3') def test_put_generated_fields(self): self.client.login(username='******', password='******') data = {'short_name': 'duck2000', 'long_name': 'Updated', 'admins': [], 'parentnode': 1, 'breadcrumb': [], 'can_delete': False, 'inherited_admins': []} content, response = self.client.rest_put(self._geturl(self.testhelper.duck2000.id), data=data) self.assertEquals(response.status_code, 200)