class TestRestAssignmentListing(TestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        #self.testhelper.add(nodes='uni:admin(uniadmin)',
                            #subjects=['duck2000:admin(adminone,admintwo):ln(Something fancy)',
                                      #'duck3000',
                                      #'duck1000:admin(adminone)',
                                      #'duck4000:admin(adminone,admintwo,singleadmin)'])
        self.client = RestClient()


    def _get(self, **data):
        return self.client.rest_get(reverse('devilry_examiner-rest-assignmentlisting'), **data)

    def _getas(self, username, **data):
        self.client.login(username=username, password='******')
        return self._get(**data)

    def test_get(self):
        self.testhelper.create_user('examiner1')
        content, response = self._getas('examiner1')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(content, ['Hello', 'world'])

    def test_get_noauth(self):
        content, response = self._get()
        self.assertEquals(response.status_code, 401)
Esempio n. 2
0
class TestLanguageSelect(TestCase):
    def setUp(self):
        self.client = RestClient()

        self.url = '/devilry_i18n/rest/languageselect'
        self.testhelper = TestHelper()
        self.testhelper.create_user('testuser')

    def _getas(self, username):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self.url)

    def _get_languagecode(self, username):
        user = User.objects.get(username=username)
        return user.devilryuserprofile.languagecode

    def _set_languagecode(self, username, languagecode):
        profile = User.objects.get(username=username).devilryuserprofile
        profile.languagecode = languagecode
        profile.save()

    def test_get_languagecode_none(self):
        self.assertEquals(self._get_languagecode('testuser'), None)
        content, response = self._getas('testuser')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(content['preferred'], None)
        self.assertEquals(content['selected']['languagecode'],
                          settings.LANGUAGE_CODE)

    def test_get_languagecode_set(self):
        self._set_languagecode('testuser', 'nb')
        content, response = self._getas('testuser')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(content['preferred'], 'nb')
        self.assertEquals(content['selected']['languagecode'], 'nb')

    def _putas(self, username, data):
        self.client.login(username=username, password='******')
        return self.client.rest_put(self.url, data)

    def test_put(self):
        content, response = self._putas('testuser', {'preferred': 'nb'})
        self.assertEquals(response.status_code, 200)
        self.assertEquals(content['preferred'], 'nb')
        self.assertEquals(self._get_languagecode('testuser'), 'nb')

    def test_put_invalid(self):
        content, response = self._putas('testuser', {'preferred': 'invalid-code'})
        self.assertEquals(response.status_code, 400)
        self.assertEquals(content['field_errors']['preferred'],
                          [u'Invalid languagecode: invalid-code'])

    def test_put_with_extradata(self):
        content, response = self._putas('testuser', {'preferred': 'nb',
                                                     'selected': {'ignored': 'data'},
                                                     'available': ['ignored']})
        self.assertEquals(response.status_code, 200)
        self.assertEquals(content['preferred'], 'nb')
        self.assertEquals(self._get_languagecode('testuser'), 'nb')
Esempio n. 3
0
class TestAssignment(SubjectAdminSeleniumTestCase):
    def setUp(self):
        self.testhelper = TestHelper()

    def _browseToAssignment(self, id):
        self.browseTo('/assignment/{id}/'.format(id=id))

    def test_doesnotexists(self):
        self.testhelper.create_user('normal')
        self.login('normal')
        self._browseToAssignment(100000)
        self.waitForCssSelector('.devilry_extjsextras_alertmessagelist')
        self.assertTrue('403: FORBIDDEN' in self.selenium.page_source)

    def test_doesnotexists_superadmin(self):
        self.testhelper.create_superuser('grandma')
        self.login('grandma')
        self._browseToAssignment(100000)
        self.waitForCssSelector('.devilry_extjsextras_alertmessagelist')
        self.assertTrue('404: NOT FOUND' in self.selenium.page_source)

    def test_shortcuts_render(self):
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['period1'],
                            assignments=['week2:pub(2):admin(week2admin)'])
        self.login('week2admin')
        self._browseToAssignment(self.testhelper.sub_period1_week2.id)
        self.waitForCssSelector('.devilry_subjectadmin_assignmentoverview')
        self.assertTrue('Manage students' in self.selenium.page_source)
        self.assertTrue('Manage deadlines' in self.selenium.page_source)

    def test_title(self):
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['period1'],
                            assignments=['week2:pub(2):admin(week2admin)'])
        self.login('week2admin')
        self._browseToAssignment(self.testhelper.sub_period1_week2.id)
        self.waitForCssSelector('.devilry_subjectadmin_assignmentoverview')
        self.assertEquals(self.selenium.title, 'sub.period1.week2 - Devilry')

    def test_notpublished(self):
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['period1'],
                            assignments=['week2:pub(2):admin(week2admin)'])
        self.login('week2admin')
        self._browseToAssignment(self.testhelper.sub_period1_week2.id)
        self.waitForText('>Not published')

    def test_published(self):
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['period1:begins(-2)'],
                            assignments=['week2:admin(week2admin)'])
        self.login('week2admin')
        self._browseToAssignment(self.testhelper.sub_period1_week2.id)
        self.waitForText('>Published')
class TestRestRecentDeliveries(TestCase):
    def setUp(self):
        self.client = RestClient()
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['p1:begins(-1)'],
                            assignments=['a1'])
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1).d1')
        self.group = self.testhelper.sub_p1_a1_g1
        self.url = '/devilry_student/rest/recent-deliveries/'

    def _getas(self, username):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self.url)

    def test_nobody(self):
        fileinfo = {'ok.py': ['print ', 'meh']}
        self.testhelper.add_delivery('sub.p1.a1.g1', fileinfo)
        self.testhelper.create_user('nobody')
        content, response = self._getas('nobody')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(content, [])

    def test_recent_deliveries_minimal(self):
        fileinfo = {'ok.py': ['print ', 'meh']}
        self.testhelper.add_delivery('sub.p1.a1.g1', fileinfo)

        content, response = self._getas('student1')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        self.assertEquals(set(content[0].keys()),
                          set(['id', 'assignment', 'period', 'subject',
                               'time_of_delivery', 'group', 'number']))
        assignment = self.group.parentnode
        period = self.group.parentnode.parentnode
        subject = self.group.parentnode.parentnode.parentnode
        self.assertEquals(content[0]['assignment'],
                          {u'id': assignment.id, u'long_name': u'A1', u'short_name': u'a1'})
        self.assertEquals(content[0]['period'],
                          {u'id': period.id, u'long_name': u'P1', u'short_name': u'p1'})
        self.assertEquals(content[0]['subject'],
                          {u'id': subject.id, u'long_name': u'Sub', u'short_name': u'sub'})

    def test_recent_deliveries_over10(self):
        fileinfo = {'ok.py': ['print ', 'meh']}
        for x in xrange(8):
            self.testhelper.add_delivery('sub.p1.a1.g1', fileinfo)
        content, response = self._getas('student1')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 6)
Esempio n. 5
0
class TestRestFindGroups(TestCase):
    def setUp(self):
        self.client = RestClient()
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['p0:begins(-10):ends(2)',
                                     'p1:begins(-1)',
                                     'p2:begins(5)'],
                            assignments=['a1'])
        self.testhelper.create_user('testuser')
        self.url = '/devilry_student/rest/find-groups/'

    def _getas(self, username, **data):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self.url, **data)

    def test_find_groups_empty(self):
        content, response = self._getas('testuser')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(content, [])

    def test_find_groups(self):
        # Add to the past period (should show up)
        self.testhelper.add_to_path('uni;sub.p0.a1.gOld:candidate(student1).d1')

        # Add to the active period (show show up)
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1).d1')
        self.testhelper.add_to_path('uni;sub.p1.a1.g2:candidate(student1,student2).d1')

        # Add to the future period (should not show up)
        self.testhelper.add_to_path('uni;sub.p2.a1.gFut:candidate(student1).d1')

        content, response = self._getas('student1', query='sub')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 3)
        self.assertEquals(set(content[0].keys()),
                          set(['id', 'name', 'assignment', 'period', 'subject']))
        groupnames = set([group['name'] for group in content])
        self.assertEquals(groupnames, set(['g1', 'g2', 'gOld']))

        content, response = self._getas('student1', query='old')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)

        content, response = self._getas('student1', query='p1 g2')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        self.assertEquals(content[0]['name'], 'g2')
class TestRestRecentFeedbacks(TestCase):
    def setUp(self):
        self.client = RestClient()
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['p1:begins(-1)'],
                            assignments=['a1'])
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1):examiner(examiner1).d1')
        self.group = self.testhelper.sub_p1_a1_g1
        self.url = '/devilry_student/rest/recent-feedbacks/'

    def _getas(self, username):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self.url)

    def test_nobody(self):
        fileinfo = {'ok.py': ['print ', 'meh']}
        self.testhelper.add_delivery('sub.p1.a1.g1', fileinfo)
        self.testhelper.create_user('nobody')
        content, response = self._getas('nobody')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(content, [])

    def test_recent_feedbacks_minimal(self):
        fileinfo = {'ok.py': ['print ', 'meh']}
        delivery = self.testhelper.add_delivery('sub.p1.a1.g1', fileinfo)
        self.testhelper.add_feedback(delivery,
                                     verdict={'grade': 'F', 'points': 30, 'is_passing_grade': False})

        content, response = self._getas('student1')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        self.assertEquals(set(content[0].keys()),
                          set(['id', 'assignment', 'period', 'subject',
                               'number', 'last_feedback', 'group']))

    def test_recent_deliveries_overflow(self):
        fileinfo = {'ok.py': ['print ', 'meh']}
        for x in xrange(8):
            delivery = self.testhelper.add_delivery('sub.p1.a1.g1', fileinfo)
            self.testhelper.add_feedback(delivery,
                                         verdict={'grade': '{0}/100'.format(x), 'points': x, 'is_passing_grade': False})
        content, response = self._getas('student1')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 6)
Esempio n. 7
0
class TestEmailSendingDebugView(TestCase):
    def setUp(self):
        self.client = Client()
        self.testhelper = TestHelper()
        self.nobody = self.testhelper.create_user('nobody')
        self.superuser = self.testhelper.create_superuser('superuser')
        self.url = reverse('send_email_to_students_email_sending_debug',
                           kwargs={'username': '******'})

    def test_email_sending_debug_nobody(self):
        self.client.login(username='******', password='******')
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 403)

    def test_email_sending_debug(self):
        self.testhelper.create_user('targetuser')
        self.client.login(username='******', password='******')
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 200)
        self.assertTrue('<html>' in response.content)
        self.assertTrue('*****@*****.**' in response.content)

    def test_email_sending_debug_invaliduser(self):
        self.client.login(username='******', password='******')
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 404)
        self.assertEqual(response.content, 'ERROR: User "targetuser" does not exist')

    def test_email_sending_debug_noemail(self):
        targetuser = self.testhelper.create_user('targetuser')
        targetuser.email = ''
        targetuser.save()
        self.client.login(username='******', password='******')
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.content, 'ERROR: User "targetuser" has no email address')

    def test_email_sending_debug_superuser_noemail(self):
        targetuser = self.testhelper.create_user('targetuser')
        superuser = self.testhelper.superuser
        superuser.email = ''
        superuser.save()
        self.client.login(username='******', password='******')
        response = self.client.get(self.url)
        self.assertEqual(response.status_code, 400)
        self.assertEqual(response.content, 'ERROR: YOU (superuser) have no email address')
class TestRestPreview(TestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni:admin(uniadmin)',
            subjects=['sub'],
            periods=['p1:admin(periodadmin):begins(-3):ends(6)'])
        self.client = RestClient()
        self.testhelper.create_superuser('superuser')

    def _get_url(self, periodid):
        return reverse('devilry_qualifiesforexam-rest-preview', kwargs={'id': periodid})

    def _getas(self, username, periodid, previewdata, pluginsessionid='tst'):
        self.client.login(username=username, password='******')
        session = self.client.session
        session['qualifiesforexam-{0}'.format(pluginsessionid)] = previewdata.serialize()
        session.save()
        return self.client.rest_get(self._get_url(periodid),
            pluginsessionid=pluginsessionid)

    def _test_getas(self, username):
        content, response = self._getas(username, self.testhelper.sub_p1.id,
            PreviewData(passing_relatedstudentids=[1, 2, 4]))
        self.assertEqual(response.status_code, 200)
        self.assertEqual(set(content.keys()), set(['pluginoutput', 'perioddata']))
        self.assertEqual(content['pluginoutput'],
            {u'passing_relatedstudentids': [1, 2, 4]})

    def test_get_as_periodadmin(self):
        self._test_getas('periodadmin')
    def test_get_as_nodeadmin(self):
        self._test_getas('uniadmin')
    def test_get_as_superuser(self):
        self._test_getas('superuser')

    def test_getas_nobody(self):
        self.testhelper.create_user('nobody')
        content, response = self._getas('nobody', self.testhelper.sub_p1.id,
            PreviewData(passing_relatedstudentids=[]))
        self.assertEqual(response.status_code, 403)

    def test_get_invalid_period(self):
        periodid = 10000
        self.assertFalse(Period.objects.filter(id=periodid).exists()) # Just to be sure we dont get false positives
        content, response = self._getas('periodadmin', periodid, PreviewData(passing_relatedstudentids=[]))
        self.assertEqual(response.status_code, 403)
class TestRestAggregatedGroupInfo(TestCase):
    def setUp(self):
        self.client = RestClient()
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['p1:begins(-1)'],
                            assignments=['a1:admin(a1admin)'])
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1,student2):examiner(examiner1).d1:ends(5)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d2:ends(10)')
        self.group = self.testhelper.sub_p1_a1_g1
        self.url = '/devilry_subjectadmin/rest/aggregated-groupinfo/{0}'.format(self.group.id)

    def _getas(self, username):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self.url)

    def test_nobody(self):
        self.testhelper.create_user('nobody')
        content, response = self._getas('nobody')
        self.assertEquals(response.status_code, 403)

    def test_groupinfo(self):
        content, response = self._getas('a1admin')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(set(content.keys()),
                          set(['id', 'deadlines']))
        self.assertEquals(content['id'], self.group.id)

    def test_groupinfo_superuser(self):
        self.testhelper.create_superuser('superuser')
        content, response = self._getas('superuser')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(set(content.keys()),
                          set(['id', 'deadlines']))
        self.assertEquals(content['id'], self.group.id)

    def test_deadlines(self):
        content, response = self._getas('a1admin')
        deadlines = content['deadlines']
        self.assertEquals(len(deadlines), 2)
        self.assertEquals(set(deadlines[0].keys()),
                          set(['id', 'deadline', 'deliveries', 'text',
                               'offset_from_now', 'in_the_future']))
class TestRestDetailedPeriodOverview(TestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni:admin(uniadmin)',
            subjects=['sub'],
            periods=['p1:admin(periodadmin):begins(-3):ends(6)'])
        self.client = RestClient()
        self.testhelper.create_superuser('superuser')

    def _get_url(self, periodid):
        return reverse('devilry-subjectadmin-rest-detailedperiodoverview', kwargs={'id': periodid})

    def _getas(self, username, periodid):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self._get_url(periodid))

    def _test_get_as(self, username):
        content, response = self._getas(username, self.testhelper.sub_p1.id)
        self.assertEqual(response.status_code, 200)
        # NOTE: This is tested in more detail in the API that generates the data (devilry.utils.groups_groupedby_relatedstudent_and_assignment)
        self.assertEqual(set(content.keys()),
            set([u'students_with_feedback_that_is_candidate_but_not_in_related',
                 u'students_with_no_feedback_that_is_candidate_but_not_in_related',
                 u'relatedstudents', u'assignments']))

    def test_getlist_as_periodadmin(self):
        self._test_get_as('periodadmin')
    def test_getlist_as_nodeadmin(self):
        self._test_get_as('uniadmin')
    def test_getlist_as_superuser(self):
        self._test_get_as('superuser')

    def test_get_as_nobody(self):
        self.testhelper.create_user('nobody')
        content, response = self._getas('nobody', self.testhelper.sub_p1.id)
        self.assertEqual(response.status_code, 403)

    def test_get_invalid_id(self):
        content, response = self._getas('periodadmin', 10000)
        self.assertEqual(response.status_code, 403)
class TestRestToplevelNodeListing(TestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.add(nodes="uni:admin(uniadmin).inf:admin(infadmin)")
        self.testhelper.add(nodes="uni.fys:admin(fysadmin)")
        self.testhelper.add(nodes="uni.fys2:admin(fysadmin)")
        self.client = RestClient()

    def _geturl(self):
        return reverse("devilry_nodeadmin-rest_toplevel_nodes")

    def test_get_as_nodeadmin(self):
        self.client.login(username="******", password="******")
        content, response = self.client.rest_get(self._geturl())
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        self.assertEquals(content[0]["short_name"], "inf")

    def test_multiget_as_nodeadmin(self):
        self.client.login(username="******", password="******")
        content, response = self.client.rest_get(self._geturl())
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 2)
        self.assertEquals([n["short_name"] for n in content], ["fys", "fys2"])

    def test_get_as_superuser(self):
        self.testhelper.create_superuser("super")
        self.client.login(username="******", password="******")
        content, response = self.client.rest_get(self._geturl())
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        self.assertEquals(content[0]["short_name"], "uni")

    def test_nodata(self):
        self.testhelper.create_user("nobody")
        self.client.login(username="******", password="******")
        content, response = self.client.rest_get(self._geturl())
        self.assertEquals(response.status_code, 200)
        self.assertEquals(content, [])
class TestRestToplevelNodeListing(TestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni:admin(uniadmin).inf:admin(infadmin)')
        self.testhelper.add(nodes='uni.fys:admin(fysadmin)')
        self.testhelper.add(nodes='uni.fys2:admin(fysadmin)')
        self.client = RestClient()

    def _geturl(self):
        return reverse('devilry_nodeadmin-rest_toplevel_nodes')

    def test_get_as_nodeadmin(self):
        self.client.login(username='******', password='******')
        content, response = self.client.rest_get(self._geturl())
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        self.assertEquals(content[0]['short_name'], 'inf')

    def test_multiget_as_nodeadmin(self):
        self.client.login(username='******', password='******')
        content, response = self.client.rest_get(self._geturl())
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 2)
        self.assertEquals([n['short_name'] for n in content], ['fys', 'fys2'])

    def test_get_as_superuser(self):
        self.testhelper.create_superuser('super')
        self.client.login(username='******', password='******')
        content, response = self.client.rest_get(self._geturl())
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        self.assertEquals(content[0]['short_name'], 'uni')

    def test_nodata(self):
        self.testhelper.create_user('nobody')
        self.client.login(username='******', password='******')
        content, response = self.client.rest_get(self._geturl())
        self.assertEquals(response.status_code, 200)
        self.assertEquals(content, [])
Esempio n. 13
0
class TestStatusPrintView(TestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.create_superuser('superuser')

    def _get_url(self, status_id):
        return reverse('devilry_qualifiesforexam_statusprint', kwargs={'status_id': status_id})

    def _getas(self, username, status_id):
        self.client.login(username=username, password='******')
        return self.client.get(self._get_url(status_id))

    def test_status_not_found(self):
        response = self._getas('superuser', 1)
        self.assertEqual(response.status_code, 404)

    def test_status_forbidden(self):
        self.testhelper.add(nodes='uni',
            subjects=['sub'],
            periods=['p1:admin(periodadmin):begins(-3):ends(6)'])
        status = Status.objects.create(
                user=self.testhelper.superuser,
                period=self.testhelper.sub_p1,
                status=Status.READY)
        self.testhelper.create_user('nobody')
        response = self._getas('nobody', status.pk)
        self.assertEqual(response.status_code, 403)

    def test_status_not_ready(self):
        self.testhelper.add(nodes='uni',
            subjects=['sub'],
            periods=['p1:admin(periodadmin):begins(-3):ends(6)'])
        status = Status.objects.create(
                user=self.testhelper.superuser,
                period=self.testhelper.sub_p1,
                status=Status.NOTREADY)
        response = self._getas('superuser', status.pk)
        self.assertEqual(response.status_code, 404)
Esempio n. 14
0
class TestRestExaminerStats(TestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni:admin(uniadmin)',
            subjects=['sub'],
            periods=['p1:begins(-3):ends(6)'],
            assignments=['a1:admin(assignmentadmin)']
        )
        self.client = RestClient()
        self.testhelper.create_superuser('superuser')

    def _get_url(self, assignmentid):
        return reverse('devilry-subjectadmin-rest-examinerstats', kwargs={'id': assignmentid})

    def _getas(self, username, periodid):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self._get_url(periodid))

    def _test_get_as(self, username):
        content, response = self._getas(username, self.testhelper.sub_p1_a1.id)
        self.assertEqual(response.status_code, 200)

    def test_perms_as_assignmentadmin(self):
        self._test_get_as('assignmentadmin')
    def test_perms_as_nodeadmin(self):
        self._test_get_as('uniadmin')
    def test_perms_as_superuser(self):
        self._test_get_as('superuser')

    def test_perms_as_nobody(self):
        self.testhelper.create_user('nobody')
        content, response = self._getas('nobody', self.testhelper.sub_p1_a1.id)
        self.assertEqual(response.status_code, 403)

    def test_perms_invalid_id(self):
        content, response = self._getas('assignmentadmin', 10000)
        self.assertEqual(response.status_code, 403)
Esempio n. 15
0
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)
Esempio n. 16
0
class TestDashboardUI(StudentSeleniumTestCase):
    def setUp(self):
        self.fileinfo = {'ok.py': ['print ', 'meh']}
        self.testhelper = TestHelper()
        self.testhelper.create_user('student1')
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['p1:begins(-3):ends(10)'], # -3months
                            assignments=['a1:pub(1)', # 1 days after p1 begins
                                         'a2:pub(30)']) # 30days after p1 begins

    def _browseToDashboard(self):
        self.browseTo('')

    def test_not_student(self):
        self.login('student1')
        self._browseToDashboard()
        self.waitForCssSelector('.devilry_student_dashboard')
        self.assertTrue('You have no active electronic assignments' in self.selenium.page_source)
        self.assertTrue('Other assignments' in self.selenium.page_source)
        self.assertTrue('Browse all your assignments' in self.selenium.page_source)
        self.assertTrue('Search your assignments' in self.selenium.page_source)

    #
    #
    # Not expired deadlines
    #
    #

    def test_open_before_deadline(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1):examiner(examiner1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1:ends(110)') # 110 days after a1 published
        deadline1 = self.testhelper.sub_p1_a1_g1_d1

        self.login('student1')
        self._browseToDashboard()
        self.waitForCssSelector('.devilry_student_dashboard')
        self.waitForCssSelector('.devilry_student_opengroupsgrid.not_expired')
        grid = self.selenium.find_element_by_css_selector('.devilry_student_opengroupsgrid.not_expired')
        rows = grid.find_elements_by_css_selector('.x-grid-row')
        self.assertEquals(len(rows), 1)
        row0 = rows[0]
        self.assertEquals(row0.find_element_by_css_selector('.ident').text.strip(), 'sub - A1')
        self.assertEquals(row0.find_element_by_css_selector('.deliveries').text.strip(), 'Deliveries: 0')
        self.assertEquals(len(row0.find_elements_by_css_selector('.deadlinedelta.success')), 1)
        self.assertEquals(len(row0.find_elements_by_css_selector('.deadlinedelta.danger')), 0)
        self.assertEquals(row0.find_element_by_css_selector('.deadline').text.strip(),
                          'Deadline: {0}'.format(ui_datetimeformat(deadline1.deadline)))

    def test_multiple_open_before_deadline(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1:ends(110)') # 110 days after a1 published
        self.testhelper.add_to_path('uni;sub.p1.a2.g1:candidate(student1)')
        self.testhelper.add_to_path('uni;sub.p1.a2.g1.d1:ends(100)') # 100 days after a2 published

        self.login('student1')
        self._browseToDashboard()
        self.waitForCssSelector('.devilry_student_dashboard')
        self.waitForCssSelector('.devilry_student_opengroupsgrid.not_expired')
        grid = self.selenium.find_element_by_css_selector('.devilry_student_opengroupsgrid.not_expired')
        rows = grid.find_elements_by_css_selector('.x-grid-row')
        self.assertEquals(len(rows), 2)
        self.assertEquals(rows[0].find_element_by_css_selector('.ident').text.strip(), 'sub - A1')
        self.assertEquals(rows[1].find_element_by_css_selector('.ident').text.strip(), 'sub - A2')

    def test_open_before_deadline_deliveries(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1:ends(110)') # 110 days after a1 published
        for x in xrange(3):
            self.testhelper.add_delivery('sub.p1.a1.g1', self.fileinfo)

        self.login('student1')
        self._browseToDashboard()
        self.waitForCssSelector('.devilry_student_dashboard')
        self.waitForCssSelector('.devilry_student_opengroupsgrid.not_expired')
        grid = self.selenium.find_element_by_css_selector('.devilry_student_opengroupsgrid.not_expired')
        rows = grid.find_elements_by_css_selector('.x-grid-row')
        self.assertEquals(len(rows), 1)
        self.assertEquals(rows[0].find_element_by_css_selector('.ident').text.strip(), 'sub - A1')
        self.assertEquals(rows[0].find_element_by_css_selector('.deliveries').text.strip(), 'Deliveries: 3')



    #
    #
    # Expired deadlines
    #
    #

    def test_open_deadline_expired(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1:ends(20)') # 20 days after a1 published (which is in the past)
        deadline1 = self.testhelper.sub_p1_a1_g1_d1

        self.login('student1')
        self._browseToDashboard()
        self.waitForCssSelector('.devilry_student_dashboard')
        self.waitForCssSelector('.devilry_student_opengroupsgrid.expired')
        grid = self.selenium.find_element_by_css_selector('.devilry_student_opengroupsgrid.expired')
        rows = grid.find_elements_by_css_selector('.x-grid-row')
        self.assertEquals(len(rows), 1)
        row0 = rows[0]
        self.assertEquals(row0.find_element_by_css_selector('.ident').text.strip(), 'sub - A1')
        self.assertEquals(row0.find_element_by_css_selector('.deliveries').text.strip(), 'Deliveries: 0')
        self.assertEquals(len(row0.find_elements_by_css_selector('.deadlinedelta.success')), 0)
        self.assertEquals(len(row0.find_elements_by_css_selector('.deadlinedelta.danger')), 1)
        self.assertEquals(row0.find_element_by_css_selector('.deadline').text.strip(),
                          'Deadline: {0}'.format(ui_datetimeformat(deadline1.deadline)))
        self.assertTrue('You have no active electronic assignments' in self.selenium.page_source)

    def test_multiple_open_deadline_expired(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1:ends(20)') # 110 days after a1 published
        self.testhelper.add_to_path('uni;sub.p1.a2.g1:candidate(student1)')
        self.testhelper.add_to_path('uni;sub.p1.a2.g1.d1:ends(30)') # 100 days after a2 published

        self.login('student1')
        self._browseToDashboard()
        self.waitForCssSelector('.devilry_student_dashboard')
        self.waitForCssSelector('.devilry_student_opengroupsgrid.expired')
        grid = self.selenium.find_element_by_css_selector('.devilry_student_opengroupsgrid.expired')
        rows = grid.find_elements_by_css_selector('.x-grid-row')
        self.assertEquals(len(rows), 2)
        self.assertEquals(rows[0].find_element_by_css_selector('.ident').text.strip(), 'sub - A1')
        self.assertEquals(rows[1].find_element_by_css_selector('.ident').text.strip(), 'sub - A2')

    def test_open_deadline_expired_deliveries(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1:ends(20)') # 20 days after a1 published (which is in the past)
        for x in xrange(3):
            self.testhelper.add_delivery('sub.p1.a1.g1', self.fileinfo)

        self.login('student1')
        self._browseToDashboard()
        self.waitForCssSelector('.devilry_student_dashboard')
        self.waitForCssSelector('.devilry_student_opengroupsgrid.expired')
        grid = self.selenium.find_element_by_css_selector('.devilry_student_opengroupsgrid.expired')
        rows = grid.find_elements_by_css_selector('.x-grid-row')
        self.assertEquals(len(rows), 1)
        self.assertEquals(rows[0].find_element_by_css_selector('.ident').text.strip(), 'sub - A1')
        self.assertEquals(rows[0].find_element_by_css_selector('.deliveries').text.strip(), 'Deliveries: 3')


    #
    #
    # Hard deadlines
    #
    #
    def test_hard_deadlines(self):
        # Test that hard deadlines actually show up before they expire, but not after
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1:ends(10)') # 10 days after a1 published (in the past)
        self.testhelper.add_to_path('uni;sub.p1.a2.g1:candidate(student1)')
        self.testhelper.add_to_path('uni;sub.p1.a2.g1.d1:ends(110)') # 110 days after a1 published (in the future)
        self.assertTrue(self.testhelper.sub_p1_a1_g1_d1.deadline < datetime.now())
        self.assertTrue(self.testhelper.sub_p1_a2_g1_d1.deadline > datetime.now())

        # Hard deadlines
        for assignment in (self.testhelper.sub_p1_a1, self.testhelper.sub_p1_a2):
            assignment.deadline_handling = 1
            assignment.save()

        self.login('student1')
        self._browseToDashboard()
        self.waitForCssSelector('.devilry_student_dashboard')
        self.waitForCssSelector('.devilry_student_opengroupsgrid.not_expired')
        grid = self.selenium.find_element_by_css_selector('.devilry_student_opengroupsgrid.not_expired')
        rows = grid.find_elements_by_css_selector('.x-grid-row')
        self.assertEquals(len(rows), 1)
        self.assertEquals(rows[0].find_element_by_css_selector('.ident').text.strip(), 'sub - A2')

        # Make sure A1 does not end up in the expired SOFT deadlines grid
        expiredgrid = self.selenium.find_element_by_css_selector('.devilry_student_opengroupsgrid.expired')
        expiredrows = expiredgrid.find_elements_by_css_selector('.x-grid-row')
        self.assertEquals(len(expiredrows), 0)


    #
    #
    # Recent deliveries
    #
    #

    def test_recent_deliveries(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1:ends(110)') # 110 days after a1 published
        for x in xrange(3):
            self.testhelper.add_delivery('sub.p1.a1.g1', self.fileinfo, time_of_delivery=x)

        self.login('student1')
        self._browseToDashboard()
        self.waitForCssSelector('.devilry_student_dashboard')
        self.waitForCssSelector('.devilry_student_recentdeliveriesgrid')
        grid = self.selenium.find_element_by_css_selector('.devilry_student_recentdeliveriesgrid')
        rows = grid.find_elements_by_css_selector('.x-grid-row')
        self.assertEquals(len(rows), 3)
        self.assertEquals(rows[0].find_element_by_css_selector('.ident').text.strip(), 'sub - a1 - #3')
        self.assertEquals(rows[1].find_element_by_css_selector('.ident').text.strip(), 'sub - a1 - #2')
        self.assertEquals(rows[2].find_element_by_css_selector('.ident').text.strip(), 'sub - a1 - #1')

    def test_recent_feedbacks(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1):examiner(examiner1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1:ends(110)') # 110 days after a1 published

        # Add 2 deliveries, delivery1 has 2 feedbacks, and delivery2 has 1 feedback.
        delivery1 = self.testhelper.add_delivery('sub.p1.a1.g1', self.fileinfo)
        self.testhelper.add_feedback(delivery1,
                                     verdict={'grade': 'A', 'points': 10, 'is_passing_grade': True})
        delivery1feedback = self.testhelper.add_feedback(delivery1,
                                                 verdict={'grade': 'F', 'points': 2, 'is_passing_grade': False})
        delivery2 = self.testhelper.add_delivery('sub.p1.a1.g1', self.fileinfo)
        delivery2feedback = self.testhelper.add_feedback(delivery2,
                                                 verdict={'grade': 'C', 'points': 5, 'is_passing_grade': True})

        self.login('student1')
        self._browseToDashboard()
        self.waitForCssSelector('.devilry_student_dashboard')
        self.waitForCssSelector('.devilry_student_recentfeedbacksgrid')
        grid = self.selenium.find_element_by_css_selector('.devilry_student_recentfeedbacksgrid')
        rows = grid.find_elements_by_css_selector('.x-grid-row')
        self.assertEquals(len(rows), 2) # Notice that only 2 is included - because only active feedbacks are included
        self.assertEquals(rows[0].find_element_by_css_selector('.ident').text.strip(), 'sub - a1 - #2')
        self.assertEquals(rows[0].find_element_by_css_selector('.passing_grade.success').text.strip(), 'Passed')
        self.assertEquals(rows[0].find_element_by_css_selector('.grade').text.strip(), '(C)')
        self.assertEquals(rows[1].find_element_by_css_selector('.ident').text.strip(), 'sub - a1 - #1')
        self.assertEquals(rows[1].find_element_by_css_selector('.failing_grade.danger').text.strip(), 'Failed')
        self.assertEquals(rows[1].find_element_by_css_selector('.grade').text.strip(), '(F)')
class TestRestAllWhereIsAdmin(TestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.client = RestClient()
        self.url = '/devilry_subjectadmin/rest/allwhereisadmin/'

    def _listas(self, username, **data):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self.url, **data)

    def test_list_emptysubject(self):
        self.testhelper.add(nodes='uni',
                            subjects=['duck2000:admin(adm)'])
        content, response = self._listas('adm')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        self.assertEquals(content[0]['short_name'], 'duck2000')

    def test_list_emptyperiod(self):
        self.testhelper.add(nodes='uni',
                            subjects=['duck2000:admin(adm)'],
                            periods=['p1'])
        content, response = self._listas('adm')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        self.assertEquals(content[0]['short_name'], 'duck2000')
        self.assertEquals(content[0]['is_admin'], True)
        self.assertEquals(len(content[0]['periods']), 1)
        self.assertEquals(content[0]['periods'][0]['short_name'], 'p1')
        self.assertEquals(content[0]['periods'][0]['is_admin'], False)

        self.testhelper.add(nodes='uni',
                            subjects=['duck3000'],
                            periods=['p1:admin(adm)'])
        content, response = self._listas('adm')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 2)

    def test_list_nobody(self):
        self.testhelper.create_user('nobody')
        self.testhelper.add(nodes='uni',
                            subjects=['duck2000'])
        content, response = self._listas('nobody')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 0)

    def test_list(self):
        self.testhelper.add(nodes='uni',
                            subjects=['duck2000:admin(adm)', 'duck3000', 'duck4000'])
        self.testhelper.add_to_path('uni;duck2000.p2000')
        self.testhelper.add_to_path('uni;duck3000.p3000:admin(adm)')
        self.testhelper.add_to_path('uni;duck4000.p4000.a1:admin(adm)')
        content, response = self._listas('adm')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 3)

        self.assertEquals(content[0]['short_name'], 'duck2000')
        self.assertEquals(content[0]['is_admin'], True)
        self.assertEquals(content[0]['can_administer'], True)
        self.assertEquals(len(content[0]['periods']), 1)
        self.assertEquals(content[0]['periods'][0]['short_name'], 'p2000')
        self.assertEquals(content[0]['periods'][0]['can_administer'], True)
        self.assertEquals(content[0]['periods'][0]['is_admin'], False)

        self.assertEquals(content[1]['short_name'], 'duck3000')
        self.assertEquals(content[1]['is_admin'], False)
        self.assertEquals(content[1]['can_administer'], False)
        self.assertEquals(len(content[1]['periods']), 1)
        self.assertEquals(content[1]['periods'][0]['short_name'], 'p3000')
        self.assertEquals(content[1]['periods'][0]['can_administer'], True)
        self.assertEquals(content[1]['periods'][0]['is_admin'], True)

        self.assertEquals(content[2]['short_name'], 'duck4000')
        self.assertEquals(content[2]['is_admin'], False)
        self.assertEquals(content[2]['can_administer'], False)
        self.assertEquals(len(content[2]['periods']), 1)
        self.assertEquals(content[2]['periods'][0]['can_administer'], False)
        self.assertEquals(content[2]['periods'][0]['is_admin'], False)
        self.assertEquals(len(content[2]['periods'][0]['assignments']), 1)
        self.assertEquals(content[2]['periods'][0]['short_name'], 'p4000')
        self.assertEquals(content[2]['periods'][0]['assignments'][0]['can_administer'], True)
        self.assertEquals(content[2]['periods'][0]['assignments'][0]['is_admin'], True)


    def test_list_active_noassignments(self):
        self.testhelper.add(nodes='uni',
                            subjects=['duck2000:admin(adm)'],
                            periods=['p1:begins(-20)', 'p2:begins(-1)', 'p3:begins(20)'])
        content, response = self._listas('adm', only_active='yes')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        self.assertEquals(content[0]['short_name'], 'duck2000')
        self.assertEquals(len(content[0]['periods']), 1)
        self.assertEquals(content[0]['periods'][0]['short_name'], 'p2')

    def test_list_active(self):
        self.testhelper.add(nodes='uni',
                            subjects=['duck2000:admin(adm)'],
                            periods=['p1:begins(-20)', 'p2:begins(-1)', 'p3:begins(20)'],
                            assignments=['a1'])
        content, response = self._listas('adm', only_active='yes')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        self.assertEquals(content[0]['short_name'], 'duck2000')
        self.assertEquals(len(content[0]['periods']), 1)
        self.assertEquals(content[0]['periods'][0]['short_name'], 'p2')
        self.assertEquals(len(content[0]['periods'][0]['assignments']), 1)

    def test_list_multi_active_assignments(self):
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['p1:begins(-2):ends(6)',
                                     'p2:begins(-1):ends(6)'],
                            assignments=['a1:admin(a1admin)'])
        content, response = self._listas('a1admin', only_active='yes')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        periods = content[0]['periods']
        self.assertEquals(len(periods), 2)
        self.assertEquals(periods[0]['short_name'], 'p2')
        self.assertEquals(periods[1]['short_name'], 'p1')
        self.assertEquals(periods[0]['assignments'][0]['short_name'], 'a1')
        self.assertEquals(periods[1]['assignments'][0]['short_name'], 'a1')
class TestRestStatus(TransactionTestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni:admin(uniadmin)',
            subjects=['sub'],
            periods=[
                'oldperiod:admin(periodadmin):begins(-12):ends(2)',
                'p1:admin(periodadmin):begins(-3):ends(6)',
                'p2:admin(periodadmin):begins(-1):ends(6)'])
        self.client = RestClient()
        self.url = reverse('devilry_qualifiesforexam-rest-status')
        self.testhelper.create_superuser('superuser')

        qualifiesforexam_plugins.add(
            id = 'devilry_qualifiesforexam.test.noop-plugin',
            url = '/some/noop-url',
            title = 'Noop',
            post_statussave=noop,
            description = 'noop',
            pluginsettings_summary_generator = lambda status: 'noop summary'
        )

    def tearDown(self):
        for pluginid in ('devilry_qualifiesforexam.test.plugin', 'devilry_qualifiesforexam.test.noop-plugin'):
            if pluginid in qualifiesforexam_plugins:
                del qualifiesforexam_plugins.items[pluginid]

    def _get_url(self, periodid=None):
        if periodid:
            return '{0}{1}'.format(self.url, periodid)
        else:
            return self.url

    def _create_relatedstudent(self, username, fullname=None):
        user = getattr(self.testhelper, username, None)
        if not user:
            user = self.testhelper.create_user(username, fullname=fullname)
        relstudent = self.testhelper.sub_p1.relatedstudent_set.create(user=user)
        return relstudent

    def _postas(self, username, data):
        self.client.login(username=username, password='******')
        return self.client.rest_post(self._get_url(), data)

    def _test_post_as(self, username):
        self.assertEquals(Status.objects.count(), 0)
        relatedStudent1 = self._create_relatedstudent('student1', 'Student One')
        relatedStudent2 = self._create_relatedstudent('student2', 'Student Two')
        content, response = self._postas(username, {
            'period': self.testhelper.sub_p1.id,
            'status': 'ready',
            'message': 'This is a test',
            'plugin': 'devilry_qualifiesforexam.test.noop-plugin',
            'pluginsessionid': 'tst',
            'passing_relatedstudentids': [relatedStudent1.id]
        })
        self.assertEquals(response.status_code, 201)
        self.assertEquals(Status.objects.count(), 1)
        status = Status.objects.all()[0]
        self.assertEquals(status.period, self.testhelper.sub_p1)
        self.assertEquals(status.status, 'ready')
        self.assertEquals(status.message, 'This is a test')
        self.assertEquals(status.plugin, 'devilry_qualifiesforexam.test.noop-plugin')

        self.assertEqual(status.students.count(), 2)
        qualifies1 = status.students.get(relatedstudent=relatedStudent1)
        qualifies2 = status.students.get(relatedstudent=relatedStudent2)
        self.assertTrue(qualifies1.qualifies)
        self.assertFalse(qualifies2.qualifies)

    def test_post_as_periodadmin(self):
        self._test_post_as(self.testhelper.periodadmin)

    def test_post_as_nodeadmin(self):
        self._test_post_as(self.testhelper.uniadmin)

    def test_post_as_superuser(self):
        self._test_post_as(self.testhelper.superuser)

    def test_post_as_nobody(self):
        self.testhelper.create_user('nobody')
        content, response = self._postas('nobody', {
            'period': self.testhelper.sub_p1.id,
            'status': 'ready',
            'message': 'This is a test',
            'plugin': 'devilry_qualifiesforexam.test.noop-plugin',
            'pluginsessionid': 'tst',
            'passing_relatedstudentids': [10]
        })
        self.assertEqual(response.status_code, 403)

    def test_post_almostready(self):
        relatedStudent1 = self._create_relatedstudent('student1', 'Student One')
        relatedStudent2 = self._create_relatedstudent('student2', 'Student Two')
        content, response = self._postas('periodadmin', {
            'period': self.testhelper.sub_p1.id,
            'status': 'almostready',
            'message': 'This is a test',
            'plugin': 'devilry_qualifiesforexam.test.noop-plugin',
            'pluginsessionid': 'tst',
            'passing_relatedstudentids': [relatedStudent1.id],
            'notready_relatedstudentids': [relatedStudent2.id]
        })
        self.assertEquals(response.status_code, 201)
        status = Status.objects.all()[0]
        self.assertEquals(status.status, 'almostready')
        self.assertEqual(status.students.count(), 2)
        qualifies1 = status.students.get(relatedstudent=relatedStudent1)
        qualifies2 = status.students.get(relatedstudent=relatedStudent2)
        self.assertTrue(qualifies1.qualifies)
        self.assertIsNone(qualifies2.qualifies)

    def test_post_notreadystudents_with_invalidstatus(self):
        relatedStudent1 = self._create_relatedstudent('student1', 'Student One')
        content, response = self._postas('periodadmin', {
            'period': self.testhelper.sub_p1.id,
            'status': 'ready', # Could choose any status except almostready for this test to be valid
            'plugin': 'devilry_qualifiesforexam.test.noop-plugin',
            'pluginsessionid': 'tst',
            'notready_relatedstudentids': [relatedStudent1.id]
        })
        self.assertEquals(response.status_code, 400)
        self.assertEqual(content['details'],
            u'Only the ``almostready`` status allows marking students as not ready for export.')

    def test_post_notready_check_studentsignored(self):
        relatedStudent1 = self._create_relatedstudent('student1', 'Student One')
        content, response = self._postas('periodadmin', {
            'period': self.testhelper.sub_p1.id,
            'status': 'notready',
            'pluginsessionid': 'tst',
            'message': 'Test'
        })
        self.assertEquals(response.status_code, 201)
        status = Status.objects.all()[0]
        self.assertEquals(status.status, 'notready')
        self.assertEquals(status.message, 'Test')
        self.assertEqual(status.students.count(), 0)

    def test_post_notready_messagerequired(self):
        relatedStudent1 = self._create_relatedstudent('student1', 'Student One')
        content, response = self._postas('periodadmin', {
            'period': self.testhelper.sub_p1.id,
            'status': 'notready',
            'pluginsessionid': 'tst',
            'message': '  ',
            'plugin': 'devilry_qualifiesforexam.test.noop-plugin'
        })
        self.assertEquals(response.status_code, 400)
        self.assertEqual(content['errors'][0], u'Message can not be empty when status is ``notready``.')

    def test_post_invalidstatus(self):
        relatedStudent1 = self._create_relatedstudent('student1', 'Student One')
        content, response = self._postas('periodadmin', {
            'period': self.testhelper.sub_p1.id,
            'status': 'invalidstatus',
            'pluginsessionid': 'tst',
            'plugin': 'devilry_qualifiesforexam.test.noop-plugin',
            'passing_relatedstudentids': [relatedStudent1.id]
        })
        self.assertEqual(response.status_code, 400)
        self.assertEqual(content['field_errors']['status'][0],
            u'Select a valid choice. invalidstatus is not one of the available choices.')


    def _getinstanceas(self, username, periodid):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self._get_url(periodid))

    def _test_getinstance_as(self, username):
        relatedStudent1 = self._create_relatedstudent('student1', 'Student One')
        relatedStudent2 = self._create_relatedstudent('student2', 'Student Two')
        status = Status(
            period = self.testhelper.sub_p1,
            status = 'ready',
            message = 'Test',
            user = getattr(self.testhelper, username),
            plugin = 'devilry_qualifiesforexam.test.noop-plugin'
        )
        status.save()
        status.students.create(relatedstudent=relatedStudent1, qualifies=True)
        status.students.create(relatedstudent=relatedStudent2, qualifies=False)

        content, response = self._getinstanceas(username, self.testhelper.sub_p1.id)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(set(content.keys()),
            set(['id', 'perioddata', 'statuses', u'is_active', u'short_name', u'long_name', u'subject']))
        self.assertEqual(content['id'], self.testhelper.sub_p1.id)
        statuses = content['statuses']
        self.assertEqual(len(statuses), 1)
        self.assertEqual(set(statuses[0].keys()),
            set([u'id', u'status', u'plugin', u'statustext',
                 u'period', u'passing_relatedstudentids_map',
                 u'user', u'message', u'createtime', u'pluginsettings_summary',
                 u'plugin_description', u'plugin_title']))
        self.assertEqual(statuses[0]['period'], self.testhelper.sub_p1.id)
        self.assertEqual(statuses[0]['status'], 'ready')
        self.assertEqual(statuses[0]['message'], 'Test')
        self.assertEqual(statuses[0]['plugin'], 'devilry_qualifiesforexam.test.noop-plugin')
        self.assertEqual(statuses[0]['pluginsettings_summary'], 'noop summary')
        self.assertIn(str(relatedStudent1.id), statuses[0]['passing_relatedstudentids_map'])


    def test_getinstance_as_periodadmin(self):
        self._test_getinstance_as('periodadmin')
    def test_getinstance_as_nodeadmin(self):
        self._test_getinstance_as('uniadmin')
    def test_getinstance_as_superuser(self):
        self._test_getinstance_as('superuser')

    def test_getinstanceas_nobody(self):
        self.testhelper.create_user('nobody')
        content, response = self._getinstanceas('nobody', self.testhelper.sub_p1.id)
        self.assertEqual(response.status_code, 403)

    def test_getinstance_no_statuses(self):
        content, response = self._getinstanceas('periodadmin', self.testhelper.sub_p1.id)
        self.assertEqual(response.status_code, 404)
        self.assertEquals(content['detail'], u'The period has no statuses')

    def test_getinstance_invalid_period(self):
        periodid = 10000
        self.assertFalse(Period.objects.filter(id=periodid).exists()) # Just to be sure we dont get false positives
        content, response = self._getinstanceas('periodadmin', periodid)
        self.assertEqual(response.status_code, 404)
        self.assertEquals(content['detail'], u'The period with ID 10000 does not exist')



    def _getlistas(self, username, **kwargs):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self._get_url(), **kwargs)

    def _createlistteststatus(self, period, status='ready',
                              plugin='devilry_qualifiesforexam.test.noop-plugin'):
        status = Status(
            period = period,
            status = status,
            message = 'Test',
            user = self.testhelper.periodadmin,
            plugin = plugin
        )
        status.full_clean()
        status.save()
        return status

    def _test_getlist_as(self, username):
        self._createlistteststatus(self.testhelper.sub_oldperiod)
        self._createlistteststatus(self.testhelper.sub_p1, status='notready', plugin='')
        import time
        time.sleep(0.1) # Sleep to make sure the status below is the active status
        status = self._createlistteststatus(self.testhelper.sub_p1)

        content, response = self._getlistas(username)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(content), 2)
        p1info = content[0]
        self.assertEqual(p1info['id'], self.testhelper.sub_p1.id)
        self.assertEqual(p1info['active_status']['id'], status.id)
        p2info = content[1]
        self.assertEqual(p2info['id'], self.testhelper.sub_p2.id)
        self.assertEqual(p2info['active_status'], None)

    def test_getlist_as_periodadmin(self):
        self._test_getlist_as('periodadmin')
    def test_getlist_as_nodeadmin(self):
        self._test_getlist_as('uniadmin')
    def test_getlist_as_superuser(self):
        self._test_getlist_as('superuser')

    def test_getlist_as_nobody(self):
        self.testhelper.create_user('nobody')
        content, response = self._getlistas('nobody')
        self._createlistteststatus(self.testhelper.sub_p1,
            status='notready', plugin='')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(content), 0)


    def test_get_within_node(self):
        self.testhelper.add(nodes='uni.extra:admin(extraadmin)',
            subjects=['othersub'],
            periods=['p1:admin(periodadmin):begins(-3):ends(6)'])
        content, response = self._getlistas('extraadmin', node_id=self.testhelper.uni_extra.id)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(content), 1)
        p1info = content[0]
        self.assertEqual(p1info['id'], self.testhelper.othersub_p1.id)

    def test_get_within_node_notactive(self):
        self.testhelper.add(nodes='uni.extra:admin(extraadmin)',
            subjects=['othersub'],
            periods=['old:admin(periodadmin):begins(-12):ends(6)'])
        content, response = self._getlistas('extraadmin', node_id=self.testhelper.uni_extra.id)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(content), 0)

    def test_get_within_node_notadmin_on_requested(self):
        self.testhelper.add(nodes='uni.extra:admin(extraadmin)')
        content, response = self._getlistas('extraadmin', node_id=self.testhelper.uni.id)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(content), 0)


    def test_save_settings(self):
        savedsettings = {}
        def save_settings(status, settings):
            savedsettings['status'] = status
            savedsettings['settings'] = settings

        qualifiesforexam_plugins.add(
            id = 'devilry_qualifiesforexam.test.plugin',
            url = '/some/url',
            title = 'Test',
            description = 'A test',
            uses_settings=True,
            post_statussave = save_settings
        )
        self.client.login(username='******', password='******')
        session = self.client.session
        session[create_settings_sessionkey('tst')] = {'test': 'settings'}
        session.save()
        content, response = self._postas('periodadmin', {
            'period': self.testhelper.sub_p1.id,
            'status': 'ready',
            'plugin': 'devilry_qualifiesforexam.test.plugin',
            'pluginsessionid': 'tst',
            'passing_relatedstudentids': []
        })
        self.assertEqual(response.status_code, 201)
        self.assertEqual(len(savedsettings), 2)
        self.assertEqual(savedsettings['settings'], {'test': 'settings'})
        self.assertIsInstance(savedsettings['status'], Status)


    def test_save_settings_missing_sessiondata(self):

        def save_settings(status, settings):
            pass

        qualifiesforexam_plugins.add(
            id = 'devilry_qualifiesforexam.test.plugin',
            url = '/some/url',
            title = 'Test',
            uses_settings = True,
            description = 'A test',
            post_statussave = save_settings
        )
        self.assertEquals(Status.objects.count(), 0)
        content, response = self._postas('periodadmin', {
            'period': self.testhelper.sub_p1.id,
            'status': 'ready',
            'plugin': 'devilry_qualifiesforexam.test.plugin',
            'pluginsessionid': 'tst',
            'passing_relatedstudentids': []
        })
        self.assertEqual(response.status_code, 400)
        self.assertEqual(content['detail'],
            u'The "devilry_qualifiesforexam.test.plugin"-plugin requires settings - no settings found in the session.')
        self.assertEquals(Status.objects.count(), 0) # The database rolled back because of the error


    def test_fail_verification(self):

        def post_statussave(status, settings):
            raise PluginResultsFailedVerification('Invalid')

        qualifiesforexam_plugins.add(
            id = 'devilry_qualifiesforexam.test.plugin',
            url = '/some/url',
            title = 'Test',
            description = 'A test',
            post_statussave = post_statussave
        )
        self.assertEquals(Status.objects.count(), 0)
        content, response = self._postas('periodadmin', {
            'period': self.testhelper.sub_p1.id,
            'status': 'ready',
            'plugin': 'devilry_qualifiesforexam.test.plugin',
            'pluginsessionid': 'tst',
            'passing_relatedstudentids': []
        })
        self.assertEqual(response.status_code, 400)
        self.assertEqual(content['detail'], u'Invalid')
        self.assertEquals(Status.objects.count(), 0) # The database rolled back because of the error
Esempio n. 19
0
class TestInstanceGroupRest(TestCase, GroupManagerTestMixin):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['p1'],
                            assignments=['a1:admin(a1admin)'])
        self.client = RestClient()
        self.testhelper.create_superuser('grandma')
        self.testhelper.create_user('candidate1')
        self.testhelper.create_user('examiner1')
        self.testhelper.create_superuser('superuser')
        self.a1id = self.testhelper.sub_p1_a1.id

    def _geturl(self, assignment_id, group_id):
        return '/devilry_subjectadmin/rest/group/{0}/{1}'.format(assignment_id, group_id)

    def _putas(self, username, assignment_id, group_id, data={}):
        self.client.login(username=username, password='******')
        return self.client.rest_put(self._geturl(assignment_id, group_id), data)

    def _add_group(self, name, candidates, examiners):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate({candidates}):examiner({examiners})'.format(**vars()))
        return getattr(self.testhelper, 'sub_p1_a1_' + name)

    def test_put_minimal(self):
        group = self._add_group('g1', candidates='candidate1', examiners='examiner1')
        self.assertEquals(group.name, 'g1')
        self.assertEquals(group.is_open, True)
        data = {'name': 'changed',
                'is_open': False}
        content, response = self._putas('a1admin', self.a1id, group.id, data)
        self.assertEquals(response.status_code, 200)
        self.assertEquals(set(content.keys()),
                          set(['name', 'id', 'etag', 'is_open', 'parentnode',
                               'feedback', 'deadlines', 'candidates', 'tags',
                               'examiners', 'num_deliveries']))
        self.assertEquals(content['name'], 'changed')
        self.assertEquals(content['is_open'], False)
        self.assertEquals(content['parentnode'], self.a1id)
        self.assertEquals(content['num_deliveries'], 0)
        self.assertEquals(content['feedback'], None)
        self.assertEquals(content['deadlines'], [])
        self.assertEquals(content['candidates'], [])
        self.assertEquals(content['examiners'], [])
        self.assertEquals(content['tags'], [])

        groups = self.testhelper.sub_p1_a1.assignmentgroups.all()
        self.assertEquals(len(groups), 1)
        self.assertEquals(content['id'], groups[0].id)

    def _test_put_as(self, username):
        group = self._add_group('g1', candidates='candidate2', examiners='examiner2')
        data = {'name': 'changed',
                'is_open': False,
                'examiners': [self.create_examinerdict(username='******')],
                'candidates': [self.create_candidatedict(username='******')],
                'tags': [self.create_tagdict('mytag')]}
        content, response = self._putas(username, self.a1id, group.id, data)
        #from pprint import pprint
        #print 'Response content:'
        #pprint(content)
        self.assertEquals(response.status_code, 200)

        self.assertEquals(content['name'], 'changed')
        self.assertEquals(content['is_open'], False)
        self.assertEquals(content['parentnode'], self.a1id)
        self.assertEquals(content['num_deliveries'], 0)

        # Feedback
        self.assertEquals(content['feedback'], None)

        # Deadlines
        self.assertEquals(content['deadlines'], [])

        # Tags
        self.assertEquals(len(content['tags']), 1)
        tag = content['tags'][0]
        self.assertEquals(tag['tag'], 'mytag')
        self.assertEquals(set(tag.keys()), set(['id', 'tag']))

        # Examiners
        self.assertEquals(len(content['examiners']), 1)
        examiner = content['examiners'][0]
        self.assertEquals(set(examiner.keys()),
                          set(['id', 'user']))
        self.assertEquals(set(examiner['user'].keys()),
                          set(['email', 'full_name', 'id', 'username']))
        self.assertEquals(examiner['user']['id'], self.testhelper.examiner1.id)
        self.assertEquals(examiner['user']['username'], 'examiner1')

        # Candidates
        self.assertEquals(len(content['candidates']), 1)
        candidate = content['candidates'][0]
        self.assertEquals(set(candidate.keys()),
                          set(['id', 'user', 'candidate_id']))
        self.assertEquals(set(candidate['user'].keys()),
                          set(['email', 'full_name', 'id', 'username']))
        self.assertEquals(candidate['user']['id'], self.testhelper.candidate1.id)
        self.assertEquals(candidate['candidate_id'], '')
        self.assertEquals(candidate['user']['username'], 'candidate1')

        # It was actually updated?
        group = self.testhelper.sub_p1_a1.assignmentgroups.get(id=group.id)
        self.assertEquals(group.name, 'changed')

    def test_put_as_superuser(self):
        self._test_put_as('superuser')

    def test_put_as_assignmentadmin(self):
        self._test_put_as('a1admin')

    def test_put_doesnotexist(self):
        data = {'name': 'changed',
                'is_open': False}
        content, response = self._putas('grandma', 10000, 100000, data)
        self.assertEquals(response.status_code, 404)

    def test_put_denied(self):
        self.testhelper.create_user('nobody')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1')
        group = self.testhelper.sub_p1_a1_g1
        data = {'name': 'changed',
                'is_open': False}
        content, response = self._putas('nobody', self.a1id, group.id, data)
        self.assertEquals(response.status_code, 403)

    def test_put_ro_fields(self):
        group = self._add_group('g1', candidates='candidate1', examiners='examiner1')
        self.assertEquals(group.name, 'g1')
        self.assertEquals(group.is_open, True)
        data = {'name': 'changed',
                'is_open': False,
                'feedback': 'should be ignored',
                'id': 'should be ignored',
                'num_deliveries': 'should be ignored',
                'deadlines': 'should be ignored'}
        content, response = self._putas('a1admin', self.a1id, group.id, data)
        self.assertEquals(response.status_code, 200)




    #
    # GET
    #
    def _getas(self, username, assignment_id, group_id):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self._geturl(assignment_id, group_id))

    def _test_get_as(self, username):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(candidate1):examiner(examiner1).d1:ends(5)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d2:ends(10)')
        group = self.testhelper.sub_p1_a1_g1
        content, response = self._getas(username, self.a1id, group.id)
        #from pprint import pprint
        #print 'Response content:'
        #pprint(content)
        self.assertEquals(response.status_code, 200)
        self.assertEquals(set(content.keys()),
                          set(['name', 'id', 'etag', 'is_open', 'parentnode',
                               'feedback', 'deadlines', 'candidates', 'tags',
                               'examiners', 'num_deliveries']))
        self.assertEquals(content['name'], 'g1')
        self.assertEquals(content['is_open'], True)
        self.assertEquals(content['parentnode'], self.a1id)
        self.assertEquals(content['num_deliveries'], 0)
        self.assertEquals(content['feedback'], None)

        # Deadlines
        self.assertEquals(len(content['deadlines']), 2)
        self.assertEquals(set(content['deadlines'][0].keys()),
                          set(['id', 'deadline']))

        # Candidates
        self.assertEquals(len(content['candidates']), 1)
        candidate = content['candidates'][0]
        self.assertEquals(candidate['candidate_id'], None)
        self.assertEquals(candidate['user'], {'id': self.testhelper.candidate1.id,
                                              'username': '******',
                                              'email': '*****@*****.**',
                                              'full_name': None})

        # Examiners
        self.assertEquals(len(content['examiners']), 1)
        examiner = content['examiners'][0]
        self.assertEquals(examiner['user'], {'id': self.testhelper.examiner1.id,
                                              'username': '******',
                                              'email': '*****@*****.**',
                                              'full_name': None})

    def test_get_as_assignmentadmin(self):
        self._test_get_as('a1admin')

    def test_get_as_superuser(self):
        self._test_get_as('superuser')

    def test_get_denied(self):
        self.testhelper.create_user('nobody')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1')
        group = self.testhelper.sub_p1_a1_g1
        content, response = self._getas('nobody', self.a1id, group.id)
        self.assertEquals(response.status_code, 403)
Esempio n. 20
0
class TestAddDeliveryUI(StudentSeleniumTestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.create_user('student1')
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['p1:begins(-3):ends(10)'],
                            assignments=['a1:pub(1):ln(Assignment One)'])
        self.tstfile1 = join(this_dir, 'upload_testfile1.txt')

    def _browseToAddDelivery(self, groupid):
        self.browseTo('/group/{groupid}/@@add-delivery'.format(groupid=groupid))


    #def _add_file(self, path):
        #filefield = self.selenium.find_element_by_css_selector('.devilry_student_groupinfo_add_delivery input[type=file]')
        #filefield.send_keys(path)
        #filefield.send_keys(Keys.TAB)

    def test_add_delivery(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1).d1')
        deadline = self.testhelper.sub_p1_a1_g1_d1
        deadline.deadline = datetime.now() + timedelta(days=2)
        deadline.save()
        self.login('student1')
        self._browseToAddDelivery(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupinfo_add_delivery')
        widget = self.selenium.find_element_by_css_selector('.devilry_student_groupinfo_add_delivery')
        help = widget.find_element_by_css_selector('.add_delivery_help')
        self.assertEquals(help.find_element_by_css_selector('h2').text.strip(),
                          'Add delivery')
        self.assertEquals(help.find_element_by_css_selector('.initial_text').text.strip(),
                          'Upload files for your delivery. You can upload multiple files.')
        self.assertEquals(len(widget.find_elements_by_css_selector('.devilry_student_confirm_delivery_after_deadline')), 0)
        self.assertEquals(len(widget.find_elements_by_css_selector('.uploadedfilesbox li')), 0)
        #filefield = widget.find_element_by_css_selector('input[type=file]')
        #self._add_file(self.tstfile1)
        #self.waitFor(widget, lambda w: len(widget.find_elements_by_css_selector('.uploadedfilesbox li')) == 1)


    def test_add_delivery_after_deadline(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1).d1')
        deadline = self.testhelper.sub_p1_a1_g1_d1
        deadline.deadline = datetime.now() - timedelta(days=2)
        deadline.save()
        self.login('student1')
        self._browseToAddDelivery(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupinfo_add_delivery')
        widget = self.selenium.find_element_by_css_selector('.devilry_student_groupinfo_add_delivery')
        self.assertEquals(len(widget.find_elements_by_css_selector('.devilry_student_confirm_delivery_after_deadline')), 1)

    def test_add_delivery_closed_group(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.testhelper.sub_p1_a1_g1.is_open = False
        self.testhelper.sub_p1_a1_g1.save()
        self.login('student1')
        self._browseToAddDelivery(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_extjsextras_alertmessage')
        self.assertEquals(self.selenium.find_element_by_css_selector('.devilry_extjsextras_alertmessage').text.strip(),
                          'Error\nCan not add deliveries on closed groups.')

    def test_add_delivery_no_deadline(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.login('student1')
        self._browseToAddDelivery(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_extjsextras_alertmessage')
        self.assertEquals(self.selenium.find_element_by_css_selector('.devilry_extjsextras_alertmessage').text.strip(),
                          'Error\nCan not add deliveries on a group without a deadline.')
class TestRelatedStudentsUI(SubjectAdminSeleniumTestCase, RelatedUsersUITestMixin):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['p1:admin(p1admin)'])
        self.period = self.testhelper.sub_p1

    def _browseToManageStudentsAs(self, username, period_id):
        path = '/period/{0}/@@relatedstudents'.format(period_id)
        self.loginTo(username, path)
        self.waitForCssSelector('.devilry_subjectadmin_relatedstudents')


    def _add_relatedstudent(self, username, full_name=None, tags='', candidate_id=None):
        user = self.testhelper.create_user(username, fullname=full_name)
        self.period.relatedstudent_set.create(user=user,
                                              tags=tags,
                                              candidate_id=candidate_id)

    def test_render(self):
        self._add_relatedstudent('student1', full_name='Student One',
                                 tags='a,b',
                                 candidate_id='SEC-RET')
        self._add_relatedstudent('student2')
        self._add_relatedstudent('student3', full_name='Student Three')
        self._browseToManageStudentsAs('p1admin', self.period.id)

        self.waitForCssSelector('.devilry_subjectadmin_relatedusers')
        self.waitForGridRowCount(3)
        self.assertEquals(self.get_row_data(self.get_row_by_username('student1')),
                          {'full_name': 'Student One',
                           'username': '******',
                           'tags': 'a,b'})
        self.assertEquals(self.get_row_data(self.get_row_by_username('student2')),
                          {'full_name': 'Full name missing',
                           'username': '******',
                           'tags': ''})
        self.assertEquals(self.get_row_data(self.get_row_by_username('student3')),
                          {'full_name': 'Student Three',
                           'username': '******',
                           'tags': ''})

    def test_invalid_period_id(self):
        self._browseToManageStudentsAs('p1admin', 1000000)
        def find_permissiondeniedmessage(s):
            for message in self.selenium.find_elements_by_css_selector('.devilry_extjsextras_alertmessage'):
                if 'Permission denied' in message.text.strip():
                    return True
            return False
        self.waitFor(self.selenium, find_permissiondeniedmessage)

    def test_add_student(self):
        self._browseToManageStudentsAs('p1admin', self.period.id)
        self.waitForCssSelector('.devilry_subjectadmin_selectrelateduserpanel')
        self.testhelper.create_user('student1')
        self.assertFalse(self.period.relatedstudent_set.filter(user__username='******').exists())

        self.ui_add_related_user('student1')
        self.waitForGridRowCount(1)
        self.assertTrue(self.period.relatedstudent_set.filter(user__username='******').exists())

    def test_add_student_cancel(self):
        self._browseToManageStudentsAs('p1admin', self.period.id)
        self.waitForCssSelector('.devilry_subjectadmin_selectrelateduserpanel')
        self.testhelper.create_user('student1')
        self.ui_add_related_user('student1')
        self.click_add_related_user_button()
        cancelbutton = self.find_element('.devilry_subjectadmin_selectrelateduserpanel .cancelbutton button')
        self.waitForDisplayed(cancelbutton)
        cancelbutton.click()
        self.waitForNotDisplayed(cancelbutton)

    def test_remove_single(self):
        self._add_relatedstudent('student1')
        self._browseToManageStudentsAs('p1admin', self.period.id)
        self.waitForCssSelector('.devilry_subjectadmin_relatedusers')
        self.waitForGridRowCount(1)
        self.ui_remove_related_users('student1')
        self.waitForGridRowCount(0)
        self.assertFalse(self.period.relatedstudent_set.filter(user__username='******').exists())

    def test_remove_many(self):
        self._add_relatedstudent('student1')
        self._add_relatedstudent('student2', full_name='Student Two')
        self._add_relatedstudent('student3', full_name='Student Three')
        self._add_relatedstudent('ignored', full_name='Ignored student')
        self._browseToManageStudentsAs('p1admin', self.period.id)
        self.waitForCssSelector('.devilry_subjectadmin_relatedusers')
        self.waitForGridRowCount(4)
        self.ui_remove_related_users('student1', 'student2', 'student3')
        self.waitForGridRowCount(1)
        self.assertFalse(self.period.relatedstudent_set.filter(user__username='******').exists())
        self.assertFalse(self.period.relatedstudent_set.filter(user__username='******').exists())
        self.assertFalse(self.period.relatedstudent_set.filter(user__username='******').exists())
        self.assertTrue(self.period.relatedstudent_set.filter(user__username='******').exists())

    def test_remove_enable_disable(self):
        self._add_relatedstudent('student1')
        self._browseToManageStudentsAs('p1admin', self.period.id)
        removebutton = self.waitForAndFindElementByCssSelector('.remove_related_user_button button')
        self.assertFalse(removebutton.is_enabled())
        self.click_row_by_username('student1')
        self.waitForEnabled(removebutton)
        self.click_row_by_username('student1')
        self.waitForDisabled(removebutton)

    def test_add_tags(self):
        self._add_relatedstudent('student1', tags='good,bad')
        self._add_relatedstudent('student2', tags='a,b')
        self._add_relatedstudent('ignored', tags='unchanged')
        self._browseToManageStudentsAs('p1admin', self.period.id)

        self.click_row_by_username('student1')
        self.click_row_by_username('student2')
        self.ui_set_or_add_tags('add', ['bad', 'supergood', 'awesome'])

        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          'good,bad,supergood,awesome')
        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          'a,b,bad,supergood,awesome')
        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          'unchanged')

    def test_add_tags_cancel(self):
        self._add_relatedstudent('student1', tags='good,bad')
        self._add_relatedstudent('student2', tags='group1')
        self._browseToManageStudentsAs('p1admin', self.period.id)
        self.click_row_by_username('student1')
        self.click_row_by_username('student2')
        self.ui_set_or_add_tags_cancel('add')
        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          'good,bad')
        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          'group1')

    def test_set_tags(self):
        self._add_relatedstudent('student1', tags='good,bad')
        self._add_relatedstudent('student2', tags='a,b')
        self._add_relatedstudent('ignored', tags='unchanged')
        self._browseToManageStudentsAs('p1admin', self.period.id)

        self.click_row_by_username('student1')
        self.click_row_by_username('student2')
        self.ui_set_or_add_tags('set', ['bad', 'supergood', 'awesome'])

        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          'bad,supergood,awesome')
        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          'bad,supergood,awesome')
        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          'unchanged')

    def test_set_tags_cancel(self):
        self._add_relatedstudent('student1', tags='good,bad')
        self._add_relatedstudent('student2', tags='group1')
        self._browseToManageStudentsAs('p1admin', self.period.id)
        self.click_row_by_username('student1')
        self.click_row_by_username('student2')
        self.ui_set_or_add_tags_cancel('set')
        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          'good,bad')
        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          'group1')


    def test_clear_tags(self):
        self._add_relatedstudent('student1', tags='good,bad')
        self._add_relatedstudent('student2', tags='group1')
        self._browseToManageStudentsAs('p1admin', self.period.id)
        self.click_row_by_username('student1')
        self.click_row_by_username('student2')
        self.ui_clear_tags()
        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          '')
        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          '')

    def test_clear_tags_cancel(self):
        self._add_relatedstudent('student1', tags='good,bad')
        self._add_relatedstudent('student2', tags='group1')
        self._browseToManageStudentsAs('p1admin', self.period.id)
        self.click_row_by_username('student1')
        self.click_row_by_username('student2')

        panel = self.click_tagbutton('clear')
        cancelbutton = panel.find_element_by_css_selector('.cancelbutton')
        self.waitForDisplayed(cancelbutton)
        cancelbutton.click()

        helpbox = self.getHelpBox()
        self.waitForDisplayed(helpbox)

        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          'good,bad')
        self.assertEquals(self.period.relatedstudent_set.get(user__username='******').tags,
                          'group1')
Esempio n. 22
0
class TestRestListOrCreateAssignmentRest(TestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni:admin(uniadmin)',
                            subjects=['duck2000'],
                            periods=['someperiod:begins(-2):ends(6):admin(periodadm)'],
                            assignments=['first:admin(firstadmin)',
                                         'second:admin(secondadmin,firstadmin)',
                                         'third'])
        self.testhelper.add_to_path('uni;duck9000.otherperiod:begins(-3):ends(6).someassignment:admin(firstadmin)')
        self.client = RestClient()
        self.url = '/devilry_subjectadmin/rest/assignment/'
        self.testhelper.create_user('nobody')

    def _listas(self, username, **data):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self.url, **data)

    def test_list(self):
        content, response = self._listas('firstadmin')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 3)
        self.assertEquals(set(content[0].keys()),
                          set(['id', 'parentnode', 'etag', 'short_name', 'long_name',
                               'publishing_time', 'delivery_types',
                               'is_published', 'publishing_time_offset_from_now',
                               'scale_points_percent', 'first_deadline',
                               'anonymous', 'deadline_handling']))

    def test_list_nonadmin(self):
        self.testhelper.create_user('otheruser')
        content, response = self._listas('otheruser')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 0)

    def test_list_in_subject(self):
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['per'],
                            assignments=['a', 'b'])
        content, response = self._listas('uniadmin',
                                         parentnode=self.testhelper.sub_per.id)
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 2)
        shortnames = set([a['short_name'] for a in content])
        self.assertEquals(shortnames, set(['a', 'b']))

    def _createas(self, username, data):
        self.client.login(username=username, password='******')
        return self.client.rest_post(self.url, data)

    def test_create(self):
        content, response = self._createas('periodadm',
                                           {'short_name': 'test',
                                            'long_name': 'Test',
                                            'admins': [],
                                            'anonymous': True,
                                            'publishing_time': isoformat_relativetime(days=2),
                                            'first_deadline': isoformat_relativetime(days=3),
                                            'scale_points_percent': 100,
                                            'deadline_handling': 0,
                                            'delivery_types': 0,
                                            'parentnode': self.testhelper.duck2000_someperiod.id})
        self.assertEquals(response.status_code, 201)
        self.assertEquals(content['delivery_types'], 0)
        self.assertEquals(content['scale_points_percent'], 100)
        self.assertTrue(content['publishing_time'] != None)
        self.assertTrue(content['first_deadline'] != None)
        self.assertEquals(content['long_name'], 'Test')
        self.assertEquals(content['short_name'], 'test')
        self.assertEquals(content['anonymous'], True)
        self.assertEquals(content['parentnode'], self.testhelper.duck2000_someperiod.id)
        created = Assignment.objects.get(id=content['id'])
        self.assertEquals(created.short_name, 'test')
        self.assertEquals(created.long_name, 'Test')
        self.assertEquals(created.delivery_types, 0)
        self.assertEquals(created.anonymous, True)
        self.assertEquals(created.scale_points_percent, 100)
        self.assertEquals(created.deadline_handling, 0)
        self.assertEquals(created.parentnode.id, self.testhelper.duck2000_someperiod.id)
        admins = created.admins.all()
        self.assertEquals(len(admins), 0)

    def test_create_nobody(self):
        content, response = self._createas('nobody',
                                           {'short_name': 'test',
                                            'long_name': 'Test',
                                            'admins': [],
                                            'publishing_time': isoformat_relativetime(days=-2),
                                            'scale_points_percent': 100,
                                            'deadline_handling': 0,
                                            'delivery_types': 0,
                                            'parentnode': self.testhelper.duck2000_someperiod.id})
        self.assertEquals(response.status_code, 403)
        self.assertEquals(content['detail'], 'Permission denied')

    def test_create_admins(self):
        self.testhelper.create_user('testadmin')
        content, response = self._createas('uniadmin',
                                           {'short_name': 'test',
                                            'long_name': 'Test',
                                            'admins': [{'id': self.testhelper.testadmin.id}],
                                            'publishing_time': isoformat_relativetime(days=-2),
                                            'scale_points_percent': 100,
                                            'deadline_handling': 0,
                                            'delivery_types': 0,
                                            'parentnode': self.testhelper.duck2000.id})
        self.assertEquals(response.status_code, 201)
        created = Assignment.objects.get(id=content['id'])
        admins = created.admins.all()
        self.assertEquals(len(admins), 1)
        self.assertEquals(admins[0].username, 'testadmin')
class TestRestNodeDetails(TestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni:admin(uniadmin).inf:admin(infadmin)')
        self.testhelper.add(nodes='uni.fys')
        self.testhelper.create_superuser('super')
        self.client = RestClient()

    def _geturl(self, node_id):
        return reverse('devilry_nodeadmin-rest_node_details', kwargs={'id': node_id})

    def test_as_nobody(self):
        self.testhelper.create_user('nobody')
        self.client.login(username='******', password='******')
        content, response = self.client.rest_get(self._geturl(self.testhelper.uni_inf.id))
        self.assertEquals(response.status_code, 403)

    def test_as_wrongadmin(self):
        self.client.login(username='******', password='******')
        content, response = self.client.rest_get(self._geturl(self.testhelper.uni_fys.id))
        self.assertEquals(response.status_code, 403)

    def _test_get_as(self, username):
        self.client.login(username=username, password='******')
        content, response = self.client.rest_get(self._geturl(self.testhelper.uni_inf.id))
        self.assertEquals(response.status_code, 200)
        self.assertEquals(set(content.keys()),
                set([u'subject_count', u'short_name', u'id',
                    u'long_name', u'assignment_count', u'etag',
                    u'period_count', u'path', u'childnodes', u'subjects']))
        self.assertEquals(content['short_name'], 'inf')
        self.assertEquals(content['id'], self.testhelper.uni_inf.id)

    def test_get_as_nodeadmin(self):
        self._test_get_as('infadmin')

    def test_get_as_superuser(self):
        self._test_get_as('super')


    def test_get_path_only_admin_on_child(self):
        self.client.login(username='******', password='******')
        content, response = self.client.rest_get(self._geturl(self.testhelper.uni_inf.id))
        self.assertEquals(response.status_code, 200)
        self.assertEquals(content['path'], [
            {u'id': self.testhelper.uni_inf.id, u'short_name': u'uni.inf'}
        ])

    def _test_get_path_toplevel_admin(self, username):
        self.client.login(username=username, password='******')
        content, response = self.client.rest_get(self._geturl(self.testhelper.uni_inf.id))
        self.assertEquals(response.status_code, 200)
        self.assertEquals(content['path'], [
            {u'id': self.testhelper.uni.id, u'short_name': u'uni'},
            {u'id': self.testhelper.uni_inf.id, u'short_name': u'inf'}
        ])

    def test_get_path_toplevel_admin(self):
        self._test_get_path_toplevel_admin('uniadmin')

    def test_get_path_toplevel_superuser(self):
        self._test_get_path_toplevel_admin('super')
class TestRestPassedInPreviousPeriod(TransactionTestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['old:begins(-14):ends(6)', # 14 months ago
                                     'cur:begins(-2)'], # 2 months ago
                            assignments=['a1:admin(adm):pub(0)']) # 0 days after period begins
        self.client = RestClient()
        self.url = '/devilry_subjectadmin/rest/passedinpreviousperiod/{0}'.format(self.testhelper.sub_cur_a1.id)

    def _getas(self, username, **data):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self.url, **data)

    def _test_get_simple_as(self, username):
        self.testhelper.add_to_path('uni;sub.cur.a1.g1:candidate(student1)')
        content, response = self._getas(username)
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        item = content[0]
        self.assertEquals(item['group']['id'], self.testhelper.sub_cur_a1_g1.id)
        self.assertEquals(item['oldgroup'], None)
        self.assertEquals(item['whyignored'], 'not_in_previous')

    def test_get_simple_as_assignmentadmin(self):
        self._test_get_simple_as('adm')

    def test_get_simple_as_superuser(self):
        self.testhelper.create_superuser('super')
        self._test_get_simple_as('super')

    def test_get_as_nobody(self):
        self.testhelper.create_user('nobody')
        content, response = self._getas('nobody')
        self.assertEquals(response.status_code, 403)


    def test_with_oldfeedback(self):
        # Add a group for the student on the old period
        self.testhelper.add_to_path('uni;sub.old.a1.g1:candidate(student1):examiner(examiner1).d1:ends(1)')
        self.testhelper.create_feedbacks(
            (self.testhelper.sub_old_a1_g1, {'grade': 'approved', 'points': 1, 'is_passing_grade': True})
        )

        # Add the student to the current period
        self.testhelper.add_to_path('uni;sub.cur.a1.g1:candidate(student1)')

        content, response = self._getas('adm')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(content), 1)
        item = content[0]
        self.assertEquals(item['group']['id'], self.testhelper.sub_cur_a1_g1.id)
        self.assertEquals(item['whyignored'], None)
        self.assertNotEquals(item['oldgroup'], None)
        oldgroup = item['oldgroup']
        self.assertEqual(oldgroup['id'], self.testhelper.sub_old_a1_g1.id)
        self.assertEqual(oldgroup['assignment']['id'], self.testhelper.sub_old_a1.id)
        self.assertEqual(oldgroup['period']['id'], self.testhelper.sub_old.id)
        self.assertEqual(oldgroup['feedback_shortformat'], 'true')



    def _putas(self, username, data):
        self.client.login(username=username, password='******')
        return self.client.rest_put(self.url, data)

    def _test_putas(self, username):
        self.testhelper.add_to_path('uni;sub.cur.a1.g1:candidate(student1).d1')
        self.testhelper.add_to_path('uni;sub.cur.a1.g2:candidate(student2).d1')
        self.testhelper.add_to_path('uni;sub.cur.a1.g3:candidate(student3).d1')

        self.testhelper.add_to_path('uni;sub.old.a1.g3:candidate(student3):examiner(examiner1).d1')
        oldg3_delivery = self.testhelper.add_delivery(self.testhelper.sub_old_a1_g3)
        self.testhelper.add_feedback(oldg3_delivery,
                                     verdict=dict(grade='C', points=40,
                                                  is_passing_grade=True))

        g1 = self.testhelper.sub_cur_a1_g1
        g2 = self.testhelper.sub_cur_a1_g2
        g3 = self.testhelper.sub_cur_a1_g3
        content, response = self._putas(username,
                                        [{'id': g1.id,
                                          'newfeedback_shortformat': 'true'},
                                         {'id': g3.id,
                                          'newfeedback_shortformat': 'true'}])
        self.assertEquals(response.status_code, 200)

        g1 = self.testhelper.reload_from_db(g1)
        self.assertEquals(g1.feedback.grade, 'approved')
        self.assertEquals(g1.feedback.delivery.delivery_type, deliverytypes.ALIAS)

        g2 = self.testhelper.reload_from_db(g2)
        self.assertEquals(g2.feedback, None)

        g3 = self.testhelper.reload_from_db(g3)
        self.assertEquals(g3.feedback.grade, 'approved')
        self.assertEquals(g3.feedback.delivery.delivery_type, deliverytypes.ALIAS)
        self.assertEquals(g3.feedback.delivery.alias_delivery, oldg3_delivery)

    def test_put_as_assignmentadmin(self):
        self._test_putas('adm')

    def test_put_as_superuser(self):
        self.testhelper.create_superuser('super')
        self._test_putas('super')

    def test_put_as_nobody(self):
        self.testhelper.create_user('nobody')
        content, response = self._putas('nobody', [])
        self.assertEquals(response.status_code, 403)


    def test_put_shortformat_validationerror(self):
        self.testhelper.add_to_path('uni;sub.cur.a1.g1:candidate(student1).d1')
        g1 = self.testhelper.sub_cur_a1_g1
        content, response = self._putas('adm',
            [{'id': g1.id,
              'newfeedback_shortformat': 'invalidstuff'}])
        self.assertEquals(response.status_code, 400)
        self.assertEquals(content['errors'][0], u'Must be one of: true, false.')
Esempio n. 25
0
class TestUserInfo(TestCase):
    def setUp(self):
        self.client = RestClient()

        self.url = '/devilry_authenticateduserinfo/userinfo'
        self.testhelper = TestHelper()
        self.testhelper.add(nodes="uni:admin(nodeadm)",
                            subjects=["sub:admin(subjectadm)"],
                            periods=["p1:admin(periodadm):begins(-2):ends(6)"],
                            assignments=["a1:admin(assignmentadm)"])
        self.testhelper.create_superuser('grandma')
        self.testhelper.create_user('nobody')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:examiner(examiner1):candidate(student1)')

    def _getas(self, username):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self.url)

    def _get_and_sanitytest_as(self, username, is_superuser=False,
                               is_nodeadmin=False, is_subjectadmin=False,
                               is_periodadmin=False, is_assignmentadmin=False,
                               is_student=False, is_examiner=False):
        content, response = self._getas(username)
        self.assertEquals(response.status_code, 200)
        self.assertEquals(set(content.keys()),
                          set(['id', 'username', 'languagecode', 'email',
                               'full_name', 'is_superuser', 'is_nodeadmin',
                               'is_subjectadmin', 'is_periodadmin',
                               'is_assignmentadmin', 'is_examiner', 'is_student']))
        self.assertEquals(content['is_superuser'], is_superuser)
        self.assertEquals(content['is_nodeadmin'], is_nodeadmin)
        self.assertEquals(content['is_subjectadmin'], is_subjectadmin)
        self.assertEquals(content['is_periodadmin'], is_periodadmin)
        self.assertEquals(content['is_assignmentadmin'], is_assignmentadmin)
        self.assertEquals(content['is_student'], is_student)
        self.assertEquals(content['is_examiner'], is_examiner)
        return content

    def test_as_superuser(self):
        content = self._get_and_sanitytest_as('grandma', is_superuser=True)

    def test_as_nodeadmin(self):
        content = self._get_and_sanitytest_as('nodeadm', is_nodeadmin=True)

    def test_as_subjectadmin(self):
        content = self._get_and_sanitytest_as('subjectadm', is_subjectadmin=True)

    def test_as_periodadmin(self):
        content = self._get_and_sanitytest_as('periodadm', is_periodadmin=True)

    def test_as_assignmentadmin(self):
        content = self._get_and_sanitytest_as('assignmentadm', is_assignmentadmin=True)

    def test_as_student(self):
        content = self._get_and_sanitytest_as('student1', is_student=True)

    def test_as_examiner(self):
        content = self._get_and_sanitytest_as('examiner1', is_examiner=True)

    def test_as_nobody(self):
        nobody = self.testhelper.nobody
        nobody.devilryuserprofile.full_name = 'A true nobody'
        nobody.devilryuserprofile.languagecode = 'en_US'
        nobody.devilryuserprofile.save()

        content = self._get_and_sanitytest_as('nobody')
        self.assertEquals(content['email'], '*****@*****.**')
        self.assertEquals(content['full_name'], 'A true nobody')
        self.assertEquals(content['languagecode'], 'en_US')
        self.assertEquals(content['username'], 'nobody')
        self.assertEquals(content['id'], self.testhelper.nobody.id)
Esempio n. 26
0
class TestListGroupRest(TestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.client = RestClient()

    def _geturl(self, assignment_id):
        assignment_id = assignment_id or self.testhelper.sub_p1_a1.id
        return '/devilry_subjectadmin/rest/group/{0}/'.format(assignment_id)

    def _getas(self, username, assignment_id, **data):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self._geturl(assignment_id), **data)

    def _create_testassignments(self):
        self.testhelper.add(nodes='uni',
                       subjects=['duck1010'],
                       periods=['firstsem'],
                       assignments=['a1:admin(a1admin)', 'a2'])

    def _create_testdata(self):
        self._create_testassignments()
        for num in xrange(3):
            path = 'uni;duck1010.firstsem.a1.g{num}:candidate(student{num},extrastudent):examiner(examiner1,extraexaminer).d1'
            self.testhelper.add_to_path(path.format(**vars()))
            group = getattr(self.testhelper, 'duck1010_firstsem_a1_g{0}'.format(num))
            group.tags.create(tag="stuff")
            group.tags.create(tag="lownumber")
            delivery = self.testhelper.add_delivery(group)
            if num != 2:
                self.testhelper.add_feedback(delivery,
                                             verdict=dict(grade='A', points=100,
                                                          is_passing_grade=True))

    def test_list_permissiondenied(self):
        self.testhelper.create_user('nobody')
        self._create_testassignments()
        a1 = self.testhelper.duck1010_firstsem_a1
        content, response = self._getas('nobody', a1.id)
        self.assertEquals(response.status_code, 403)


    def _test_list_as(self, username):
        self._create_testdata()
        a1 = self.testhelper.duck1010_firstsem_a1
        content, response = self._getas(username, a1.id)
        #from pprint import pprint
        #pprint(content)

        self.assertEquals(len(content), 3)
        self.assertEquals(set(content[0].keys()),
                          set(['name', 'feedback', 'deadlines', 'id', 'etag',
                               'is_open', 'parentnode', 'candidates', 'tags',
                               'examiners', 'num_deliveries']))

        # Properties directly from group
        self.assertEquals(AssignmentGroup.objects.get(id=content[0]['id']).parentnode_id,
                          a1.id)
        self.assertEquals(content[0]['is_open'], False)
        self.assertEquals(content[0]['name'], 'g0')
        self.assertEquals(content[0]['num_deliveries'], 1)
        self.assertEquals(content[0]['parentnode'], a1.id)

        # Feedback
        feedback = content[0]['feedback']
        self.assertEquals(set(feedback.keys()),
                          set(['id', 'grade', 'is_passing_grade', 'points', 'save_timestamp']))
        self.assertEquals(feedback['grade'], 'A')
        self.assertEquals(feedback['is_passing_grade'], True)
        self.assertEquals(feedback['points'], 100)

        # NULL feedback
        self.assertEquals(content[2]['feedback'], None)

        # Canididates
        def get_usernames(users):
            return [user['user']['username'] for user in users]
        self.assertEquals(len(content[0]['candidates']), 2)
        self.assertEquals(set(get_usernames(content[0]['candidates'])),
                          set(['student0', 'extrastudent']))
        self.assertEquals(set(content[0]['candidates'][0].keys()),
                          set(['id', 'candidate_id', 'user']))
        self.assertEquals(set(content[0]['candidates'][0]['user'].keys()),
                          set(['email', 'full_name', 'id', 'username']))

        # Examiners
        self.assertEquals(len(content[0]['examiners']), 2)
        self.assertEquals(set(get_usernames(content[0]['examiners'])),
                          set(['examiner1', 'extraexaminer']))
        self.assertEquals(set(content[0]['examiners'][0].keys()),
                          set(['id', 'user']))
        self.assertEquals(set(content[0]['examiners'][0]['user'].keys()),
                          set(['email', 'full_name', 'id', 'username']))

        # Deadlines
        self.assertEquals(len(content[0]['deadlines']), 1)
        deadline = content[0]['deadlines'][0]
        self.assertEquals(set(deadline.keys()),
                          set(['id', 'deadline']))

        # Tags
        self.assertEquals(len(content[0]['tags']), 2)
        tag = content[0]['tags'][0]
        self.assertEquals(set(tag.keys()),
                          set(['id', 'tag']))


    def test_list(self):
        self._test_list_as('a1admin')

    def test_list_as_superuser(self):
        self.testhelper.create_superuser('superuser')
        self._test_list_as('superuser')
Esempio n. 27
0
class TestGroupInfoUI(StudentSeleniumTestCase):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.create_user('student1')
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['p1:begins(-3):ends(10)'],
                            assignments=['a1:pub(1):ln(Assignment One)'])
        self.fileinfo = {'ok.py': ['print ', 'meh']}

    def _browseToGroup(self, groupid):
        self.browseTo('/group/{groupid}/'.format(groupid=groupid))

    def _browseToAddDelivery(self, groupid):
        self.browseTo('/group/{groupid}/@@add-delivery'.format(groupid=groupid))

    def test_doesnotexists(self):
        self.login('student1')
        self._browseToGroup(100000)
        self.waitForCssSelector('.devilry_extjsextras_alertmessage')
        self.assertTrue('Permission denied' in self.selenium.page_source)

    def test_info(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.login('student1')
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupmetadata')

        # Header
        self.assertTrue('Assignment One' in self.selenium.page_source)
        self.assertTrue('sub.p1.a1' in self.selenium.page_source)

        # Group info
        self.assertEquals(self.selenium.find_element_by_css_selector('.groupnameblock h3').text.strip(), 'Group name')
        self.assertEquals(self.selenium.find_element_by_css_selector('.groupnameblock .groupname').text.strip(), 'g1')
        self.assertEquals(self.selenium.find_element_by_css_selector('.candidatesblock').text.strip(), '')
        self.assertEquals(self.selenium.find_element_by_css_selector('.examinersblock h3').text.strip(), 'Examiner')
        self.assertEquals(self.selenium.find_element_by_css_selector('.examinersblock small').text.strip(), 'No examiner')
        self.assertEquals(self.selenium.find_element_by_css_selector('.gradeblock h3').text.strip(), 'Grade')
        self.assertEquals(self.selenium.find_element_by_css_selector('.gradeblock small').text.strip(), 'No feedback')
        self.assertEquals(self.selenium.find_element_by_css_selector('.statusblock h3').text.strip(), 'Status')
        self.assertEquals(self.selenium.find_element_by_css_selector('.statusblock .label-success').text.strip(), 'Open')
        self.assertEquals(len(self.selenium.find_elements_by_css_selector('.deliveriesblock li')), 0)
        self.assertEquals(self.selenium.find_element_by_css_selector('.adddeliveryblock').text.strip(), '')

    def test_no_groupname(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.login('student1')
        self.testhelper.sub_p1_a1_g1.name = ''
        self.testhelper.sub_p1_a1_g1.save()
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupmetadata')
        self.assertEquals(self.selenium.find_element_by_css_selector('.groupnameblock').text.strip(), '')

    def test_no_deadlines(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.login('student1')
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_extjsextras_alertmessage')
        self.assertTrue(self.selenium.find_element_by_css_selector('.devilry_extjsextras_alertmessage').text.strip().startswith('No deadlines'))

    def test_userlists(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1,student2):examiner(examiner1,examiner2)')
        self.testhelper.student1.devilryuserprofile.full_name = 'Student One'
        self.testhelper.student1.devilryuserprofile.save()
        self.login('student1')
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupmetadata')

        self.assertEquals(self.selenium.find_element_by_css_selector('.candidatesblock h3').text.strip(), 'Students')
        candidatelinks = self.selenium.find_elements_by_css_selector('.candidatesblock li a')
        self.assertEquals(len(candidatelinks), 2)
        names = map(lambda c: c.text.strip(), candidatelinks)
        self.assertEquals(set(names), set(['Student One', 'student2']))

        self.assertEquals(self.selenium.find_element_by_css_selector('.examinersblock h3').text.strip(), 'Examiners')
        examinerlinks = self.selenium.find_elements_by_css_selector('.examinersblock li a')
        self.assertEquals(len(examinerlinks), 2)
        names = map(lambda c: c.text.strip(), examinerlinks)
        self.assertEquals(set(names), set(['examiner1', 'examiner2']))

    def test_anonymous(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1)')
        self.testhelper.sub_p1_a1.anonymous = True
        self.testhelper.sub_p1_a1.save()
        self.login('student1')
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupmetadata')
        self.assertEquals(self.selenium.find_element_by_css_selector('.examinersblock').text.strip(), '')

    def test_hard_deadline_expired(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1).d1:ends(1)')
        self.testhelper.sub_p1_a1.deadline_handling = 1 # Hard deadlines
        self.testhelper.sub_p1_a1.save()
        self.login('student1')
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupmetadata')
        self.assertEquals(self.selenium.find_element_by_css_selector('.statusblock h3').text.strip(), 'Status')
        self.assertEquals(self.selenium.find_element_by_css_selector('.statusblock .label-important').text.strip(), 'Deadline expired')
        self.assertEquals(self.selenium.find_element_by_css_selector('.adddeliveryblock').text.strip(), '')

    def test_hard_deadline_not_expired(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1).d1:ends(1)')
        self.testhelper.sub_p1_a1.deadline_handling = 1 # Hard deadlines
        self.testhelper.sub_p1_a1.save()
        deadline = self.testhelper.sub_p1_a1_g1_d1
        deadline.deadline = datetime.now() + timedelta(days=2)
        deadline.save()
        self.login('student1')
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupmetadata')
        self.assertEquals(self.selenium.find_element_by_css_selector('.statusblock h3').text.strip(), 'Status')
        self.assertEquals(self.selenium.find_element_by_css_selector('.statusblock .label-success').text.strip(), 'Open')
        self.assertEquals(self.selenium.find_element_by_css_selector('.adddeliveryblock .add_delivery_link').text.strip(), 'Add delivery')

    def _expand_deadline(self, deadline):
        clickable = self.selenium.find_element_by_css_selector('#deadlinepanel-{0} .x-panel-header'.format(deadline.id))
        clickable.click()
        self.waitForCssSelector('#deadlinepanel-{0} .x-panel-body'.format(deadline.id))
        return self.selenium.find_element_by_css_selector('#deadlinepanel-{0}'.format(deadline.id))

    def test_no_feedback(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1):examiner(examiner1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1')
        delivery = self.testhelper.add_delivery('sub.p1.a1.g1', self.fileinfo)
        self.login('student1')
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupmetadata')
        self.assertEquals(self.selenium.find_element_by_css_selector('.gradeblock small').text.strip(), 'No feedback')
        self.assertEquals(self.selenium.find_element_by_css_selector('.statusblock .label-success').text.strip(), 'Open')
        self.assertEquals(len(self.selenium.find_elements_by_css_selector('.deliveriesblock li')), 1)

        deadlinepanel = self._expand_deadline(self.testhelper.sub_p1_a1_g1_d1)
        deliverypanel = deadlinepanel.find_elements_by_css_selector('.devilry_student_groupinfo_delivery')[0]
        self.assertEquals(deliverypanel.find_element_by_css_selector('.gradeblock').text.strip(), '')
        self.assertEquals(deliverypanel.find_element_by_css_selector('.no_feedback').text.strip(), 'No feedback')

    def test_passing_grade(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1):examiner(examiner1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1')
        delivery = self.testhelper.add_delivery('sub.p1.a1.g1', self.fileinfo)
        self.testhelper.add_feedback(delivery, verdict={'grade': 'A', 'points': 10, 'is_passing_grade': True},
                                     rendered_view='Good stuff')
        self.login('student1')
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupmetadata')
        self.assertEquals(self.selenium.find_element_by_css_selector('.gradeblock .success').text.strip(), 'Passed')
        self.assertEquals(self.selenium.find_element_by_css_selector('.gradeblock small').text.strip(), '(A)')
        self.assertEquals(self.selenium.find_element_by_css_selector('.statusblock .label-warning').text.strip(), 'Closed')
        self.assertEquals(len(self.selenium.find_elements_by_css_selector('.deliveriesblock li')), 1)

        deadlinepanel = self._expand_deadline(self.testhelper.sub_p1_a1_g1_d1)
        deliverypanel = deadlinepanel.find_elements_by_css_selector('.devilry_student_groupinfo_delivery')[0]
        self.assertEquals(deliverypanel.find_element_by_css_selector('.gradeblock h4').text.strip(), 'Grade')
        self.assertEquals(deliverypanel.find_element_by_css_selector('.gradeblock .success').text.strip(), 'Passed')
        self.assertEquals(deliverypanel.find_element_by_css_selector('.gradeblock small').text.strip(), '(A)')
        self.assertEquals(deliverypanel.find_element_by_css_selector('.feedback_rendered_view').text.strip(), 'Good stuff')

    def test_failing_grade(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1):examiner(examiner1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1')
        delivery = self.testhelper.add_delivery('sub.p1.a1.g1', self.fileinfo)
        self.testhelper.add_feedback(delivery, verdict={'grade': 'F', 'points': 2, 'is_passing_grade': False},
                                     rendered_view='Bad stuff')
        self.login('student1')
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupmetadata')
        self.assertEquals(self.selenium.find_element_by_css_selector('.gradeblock .danger').text.strip(), 'Failed')
        self.assertEquals(self.selenium.find_element_by_css_selector('.gradeblock small').text.strip(), '(F)')
        self.assertEquals(self.selenium.find_element_by_css_selector('.statusblock .label-warning').text.strip(), 'Closed')
        self.assertEquals(len(self.selenium.find_elements_by_css_selector('.deliveriesblock li')), 1)

        deadlinepanel = self._expand_deadline(self.testhelper.sub_p1_a1_g1_d1)
        deliverypanel = deadlinepanel.find_elements_by_css_selector('.devilry_student_groupinfo_delivery')[0]
        self.assertEquals(deliverypanel.find_element_by_css_selector('.gradeblock h4').text.strip(), 'Grade')
        self.assertEquals(deliverypanel.find_element_by_css_selector('.gradeblock .danger').text.strip(), 'Failed')
        self.assertEquals(deliverypanel.find_element_by_css_selector('.gradeblock small').text.strip(), '(F)')
        self.assertEquals(deliverypanel.find_element_by_css_selector('.feedback_rendered_view').text.strip(), 'Bad stuff')

    def test_deliverieslist(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1):examiner(examiner1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1')
        self.testhelper.add_delivery('sub.p1.a1.g1', self.fileinfo)
        self.testhelper.add_delivery('sub.p1.a1.g1', self.fileinfo)
        self.testhelper.add_delivery('sub.p1.a1.g1', self.fileinfo)
        self.login('student1')
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupmetadata')
        self.assertEquals(len(self.selenium.find_elements_by_css_selector('.deliveriesblock li')), 3)

    def test_deadlinetext(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1):examiner(examiner1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1')
        deadline = self.testhelper.sub_p1_a1_g1_d1
        deadline.text = 'This is a test'
        deadline.save()
        self.login('student1')
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupmetadata')
        deadlinepanel = self._expand_deadline(self.testhelper.sub_p1_a1_g1_d1)
        self.assertEquals(deadlinepanel.find_element_by_css_selector('.deadlinetext h2').text.strip(),
                          'About this deadline')
        deadlinetextpara = deadlinepanel.find_element_by_css_selector('.deadlinetext p')
        self.assertEquals(deadlinetextpara.text.strip(), 'This is a test')
        self.assertEquals(deadlinetextpara.get_attribute('style').strip(), 'white-space: pre-wrap;')

    def test_no_deadlinetext(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1):examiner(examiner1)')
        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1')
        self.login('student1')
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupmetadata')
        deadlinepanel = self._expand_deadline(self.testhelper.sub_p1_a1_g1_d1)
        self.assertEquals(deadlinepanel.find_element_by_css_selector('.deadlinetext').text.strip(), '')


    def test_non_electronic(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1:candidate(student1):examiner(examiner1)')
        self.testhelper.sub_p1_a1.delivery_types = NON_ELECTRONIC
        self.testhelper.sub_p1_a1.save()

        self.testhelper.add_to_path('uni;sub.p1.a1.g1.d1')
        delivery = self.testhelper.add_delivery('sub.p1.a1.g1', self.fileinfo)
        self.testhelper.add_feedback(delivery, verdict={'grade': 'F', 'points': 2, 'is_passing_grade': False},
                                     rendered_view='Bad stuff')
        self.login('student1')
        self._browseToGroup(self.testhelper.sub_p1_a1_g1.id)
        self.waitForCssSelector('.devilry_student_groupmetadata')
        self.assertEquals(self.selenium.find_element_by_css_selector('.gradeblock .danger').text.strip(), 'Failed')
        self.assertEquals(self.selenium.find_element_by_css_selector('.gradeblock small').text.strip(), '(F)')
        self.assertEquals(self.selenium.find_element_by_css_selector('.statusblock .label-warning').text.strip(), 'Closed')
        self.assertEquals(len(self.selenium.find_elements_by_css_selector('.deliveriesblock li')), 1)

        deadlinepanel = self._expand_deadline(self.testhelper.sub_p1_a1_g1_d1)
        deliverypanel = deadlinepanel.find_elements_by_css_selector('.devilry_student_groupinfo_delivery')[0]

        for selector in ('.timeofdeliveryblock', '.deliverymadebyblock', '.fileblock'):
            self.assertEquals(len(deliverypanel.find_elements_by_css_selector(selector)), 0)

        self.assertEquals(deliverypanel.find_element_by_css_selector('.gradeblock h4').text.strip(), 'Grade')
        self.assertEquals(deliverypanel.find_element_by_css_selector('.gradeblock .danger').text.strip(), 'Failed')
        self.assertEquals(deliverypanel.find_element_by_css_selector('.gradeblock small').text.strip(), '(F)')
        self.assertEquals(deliverypanel.find_element_by_css_selector('.rendered_view').text.strip(), 'Bad stuff')
        self.assertEquals(deliverypanel.find_element_by_css_selector('.activefeedbackblock h4').text.strip(), 'Active feedback')
Esempio n. 28
0
class TestGroupManager(TestCase, GroupManagerTestMixin):
    def setUp(self):
        self.client = RestClient()
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni',
                       subjects=['sub'],
                       periods=['p1'],
                       assignments=['a1'])
        self.a1id = self.testhelper.sub_p1_a1.id
        self.testhelper.create_user('user1')
        self.testhelper.create_user('user2')
        self.testhelper.create_user('user3')

    def test_update_group(self):
        self.assertEquals(AssignmentGroup.objects.all().count(), 0)
        manager = GroupManager(self.a1id)
        self.assertEquals(manager.group.id, None)
        manager.update_group(name='Nametest', is_open=False)
        self.assertIsNotNone(manager.group.id)
        self.assertEquals(manager.group.name, 'Nametest')
        self.assertEquals(manager.group.is_open, False)
        self.assertEquals(AssignmentGroup.objects.all().count(), 1)

    def test_existinggroup(self):
        self.testhelper.add_to_path('uni;sub.p1.a1.g1')
        manager = GroupManager(self.a1id, self.testhelper.sub_p1_a1_g1.id)
        self.assertEquals(manager.group.id, self.testhelper.sub_p1_a1_g1.id)
        with self.assertRaises(AssignmentGroup.DoesNotExist):
            GroupManager(self.a1id, 10000000)
        with self.assertRaises(AssignmentGroup.DoesNotExist):
            GroupManager(10000000, self.testhelper.sub_p1_a1_g1.id)

    #
    # Examiners
    #

    def test_update_examiners_create(self):
        manager = GroupManager(self.a1id)
        manager.group.save()
        manager.update_examiners([self.create_examinerdict(username='******')])
        examiners = manager.get_group_from_db().examiners.all()
        self.assertEquals(len(examiners), 1)
        created = examiners[0]
        self.assertEquals(created.user.id, self.testhelper.user1.id)

        manager.update_examiners([self.create_examinerdict(id=created.id),
                                  self.create_examinerdict(username='******')])
        examiners = manager.get_group_from_db().examiners.all()
        self.assertEquals(len(examiners), 2)
        ids = [examiner.id for examiner in examiners]
        self.assertEquals(set(ids),
                          set([self.testhelper.user1.id, self.testhelper.user2.id]))

    def test_update_examiners_create_duplicate(self):
        manager = GroupManager(self.a1id)
        manager.group.save()
        manager.group.examiners.create(user=self.testhelper.user1)
        with self.assertRaises(ValidationError):
            manager.update_examiners([self.create_examinerdict(username='******')])

    def test_update_examiners_delete(self):
        manager = GroupManager(self.a1id)
        manager.group.save()
        manager.group.examiners.create(user=self.testhelper.user1)
        manager.group.examiners.create(user=self.testhelper.user2)
        manager.update_examiners([])
        examiners = manager.get_group_from_db().examiners.all()
        self.assertEquals(len(examiners), 0)

    def test_update_examiners_complex(self):
        manager = GroupManager(self.a1id)
        manager.group.save()
        manager.group.examiners.create(user=self.testhelper.user1)
        manager.group.examiners.create(user=self.testhelper.user2)
        manager.update_examiners([self.create_examinerdict(id=self.testhelper.user1.id), # keep user1
                                  # ... delete user2
                                  self.create_examinerdict(username='******')]) # create user3
        examiners = manager.get_group_from_db().examiners.all()
        self.assertEquals(len(examiners), 2)
        ids = [examiner.id for examiner in examiners]
        self.assertEquals(set(ids),
                          set([self.testhelper.user1.id, self.testhelper.user3.id]))


    #
    # Candidates
    #

    def test_update_candidates_create(self):
        manager = GroupManager(self.a1id)
        manager.group.save()
        manager.update_candidates([self.create_candidatedict(username='******')])
        candidates = manager.get_group_from_db().candidates.all()
        self.assertEquals(len(candidates), 1)
        created = candidates[0]
        self.assertEquals(created.student.id, self.testhelper.user1.id)
        self.assertEquals(created.candidate_id, None)

        manager.update_candidates([self.create_candidatedict(id=created.id),
                                   self.create_candidatedict(username='******')])
        candidates = manager.get_group_from_db().candidates.all()
        self.assertEquals(len(candidates), 2)
        ids = [candidate.id for candidate in candidates]
        self.assertEquals(set(ids),
                          set([self.testhelper.user1.id, self.testhelper.user2.id]))

    def test_update_candidates_create_candidate_id(self):
        manager = GroupManager(self.a1id)
        manager.group.save()
        manager.update_candidates([self.create_candidatedict(username='******',
                                                             candidate_id='secret')])
        candidates = manager.get_group_from_db().candidates.all()
        created = candidates[0]
        self.assertEquals(created.candidate_id, 'secret')

    def test_update_candidates_create_duplicate_allowed(self):
        manager = GroupManager(self.a1id)
        manager.group.save()
        manager.group.candidates.create(student=self.testhelper.user1)
        manager.update_candidates([self.create_candidatedict(username='******')]) # Does not raise exception

    def test_update_candidates_delete(self):
        manager = GroupManager(self.a1id)
        manager.group.save()
        manager.group.candidates.create(student=self.testhelper.user1)
        manager.group.candidates.create(student=self.testhelper.user2)
        manager.update_candidates([])
        candidates = manager.get_group_from_db().candidates.all()
        self.assertEquals(len(candidates), 0)

    def test_update_candidates_complex(self):
        manager = GroupManager(self.a1id)
        manager.group.save()
        manager.group.candidates.create(student=self.testhelper.user1)
        manager.group.candidates.create(student=self.testhelper.user2)
        manager.update_candidates([self.create_candidatedict(id=self.testhelper.user1.id), # keep user1
                                  # ... delete user2
                                  self.create_candidatedict(username='******')]) # create user3
        candidates = manager.get_group_from_db().candidates.all()
        self.assertEquals(len(candidates), 2)
        ids = [candidate.id for candidate in candidates]
        self.assertEquals(set(ids),
                          set([self.testhelper.user1.id, self.testhelper.user3.id]))

    #
    # Tags
    #

    def test_update_tags(self):
        manager = GroupManager(self.a1id)
        manager.group.save()
        manager.update_tags([self.create_tagdict('mytag')])
        tags = manager.get_group_from_db().tags.all()
        self.assertEquals(len(tags), 1)
        created = tags[0]
        self.assertEquals(created.tag, 'mytag')

        manager.update_tags([self.create_tagdict('tag1'),
                             self.create_tagdict('tag2')])
        tagsObjs = manager.get_group_from_db().tags.all()
        self.assertEquals(len(tagsObjs), 2)
        tags = [tagObj.tag for tagObj in tagsObjs]
        self.assertEquals(set(tags), set(['tag1', 'tag2']))
Esempio n. 29
0
class TestSearchForUsers(TestCase):
    def setUp(self):
        self.client = RestClient()
        for username, fullname in [('baldr', 'God of Beauty'),
                                   ('freyja', 'Goddess of Love'),
                                   ('freyr', 'God of Fertility'),
                                   ('kvasir', 'God of Inspiration'),
                                   ('loki', 'Trickster and god of Mischief'),
                                   ('thor', 'God of thunder and Battle'),
                                   ('odin', 'The "All Father"')]:
            user = User.objects.create(username=username,
                                       email='{0}@{1}.com'.format(fullname.lower().replace(' ', '.'),
                                                                  username))
            user.devilryuserprofile.full_name = fullname
            user.devilryuserprofile.save()

        self.testhelper = TestHelper()
        self.testhelper.add(nodes="uni:admin(uniadmin)",
                            subjects=["sub:admin(subadmin)"],
                            periods=["p1:admin(p1admin)"],
                            assignments=["a1:admin(a1admin)"])
        self.url = '/devilry_usersearch/search'


    def _listas(self, username, **data):
        self.client.login(username=username, password='******')
        return self.client.rest_get(self.url, **data)

    def _searchas(self, username, query):
        return self._listas(username, query=query)[0]

    def _test_search_as(self, username):
        content, response = self._listas(username, query='')
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(self._searchas(username, 'fre')), 2)
        self.assertEquals(len(self._searchas(username, 'fr')), 0)
        self.assertEquals(len(self._searchas(username, 'f')), 0)
        self.assertEquals(len(self._searchas(username, 'GOD')), 6)
        self.assertEquals(len(self._searchas(username, 'god')), 6)
        self.assertEquals(len(self._searchas(username, 'thor')), 1)
        self.assertEquals(len(self._searchas(username, 'tHoR')), 1)
        thor = self._searchas(username, 'tHoR')[0]
        self.assertEquals(thor,
                          {u'username': u'thor',
                           u'id': User.objects.get(username='******').id,
                           u'full_name': u'God of thunder and Battle',
                           u'languagecode': None,
                           u'email': u'*****@*****.**'})

    def test_search_nodeadmin(self):
        self._test_search_as('uniadmin')

    def test_search_subjectadmin(self):
        self._test_search_as('subadmin')

    def test_search_periodadmin(self):
        self._test_search_as('p1admin')

    def test_search_assignmentadmin(self):
        self._test_search_as('a1admin')

    def test_search_superadmin(self):
        self.testhelper.create_superuser('grandma')
        self._test_search_as('grandma')

    def test_search_nobody(self):
        self.testhelper.create_user('nobody')
        content, response = self._listas('nobody', query='')
        self.assertEquals(response.status_code, 403)

    def test_search_limit(self):
        for index in xrange(15):
            username = '******'.format(index)
            user = User.objects.create(username=username,
                                       email='{0}@example.com'.format(username))
        self.assertEquals(len(self._searchas('uniadmin', 'student')), 10)
Esempio n. 30
0
class TestCreateGroupRest(TestCase, GroupManagerTestMixin):
    def setUp(self):
        self.testhelper = TestHelper()
        self.testhelper.add(nodes='uni',
                            subjects=['sub'],
                            periods=['p1'],
                            assignments=['a1:admin(a1admin)'])
        self.client = RestClient()
        self.testhelper.create_user('candidate1')
        self.testhelper.create_user('examiner1')
        self.testhelper.create_superuser('grandma')
        self.a1id = self.testhelper.sub_p1_a1.id

    def _geturl(self, assignment_id):
        return '/devilry_subjectadmin/rest/group/{0}/'.format(assignment_id)

    def _postas(self, username, assignment_id, data={}):
        self.client.login(username=username, password='******')
        return self.client.rest_post(self._geturl(assignment_id), data)

    def test_create_minimal(self):
        data = {'name': 'g1',
                'is_open': False}
        content, response = self._postas('a1admin', self.a1id, data)
        self.assertEquals(response.status_code, 201)
        self.assertEquals(set(content.keys()),
                          set(['name', 'id', 'etag', 'is_open', 'parentnode',
                               'feedback', 'deadlines', 'candidates', 'tags',
                               'examiners', 'num_deliveries']))
        self.assertEquals(content['name'], 'g1')
        self.assertEquals(content['is_open'], False)
        self.assertEquals(content['parentnode'], self.a1id)
        self.assertEquals(content['num_deliveries'], 0)
        self.assertEquals(content['feedback'], None)
        self.assertEquals(content['deadlines'], [])
        self.assertEquals(content['candidates'], [])
        self.assertEquals(content['examiners'], [])
        self.assertEquals(content['tags'], [])

        groups = self.testhelper.sub_p1_a1.assignmentgroups.all()
        self.assertEquals(len(groups), 1)
        self.assertEquals(content['id'], groups[0].id)


    def _test_create_as(self, username):
        data = {'name': 'g1',
                'is_open': False,
                'examiners': [self.create_examinerdict(username='******')],
                'candidates': [self.create_candidatedict(username='******')],
                'tags': [self.create_tagdict('mytag')]}
        content, response = self._postas(username, self.a1id, data)
        #from pprint import pprint
        #print 'Response content:'
        #pprint(content)
        self.assertEquals(response.status_code, 201)


        self.assertEquals(content['name'], 'g1')
        self.assertEquals(content['is_open'], False)
        self.assertEquals(content['parentnode'], self.a1id)
        self.assertEquals(content['num_deliveries'], 0)

        # Feedback
        self.assertEquals(content['feedback'], None)

        # Deadlines
        self.assertEquals(content['deadlines'], [])

        # Tags
        self.assertEquals(len(content['tags']), 1)
        tag = content['tags'][0]
        self.assertEquals(tag['tag'], 'mytag')
        self.assertEquals(set(tag.keys()), set(['id', 'tag']))

        # Examiners
        self.assertEquals(len(content['examiners']), 1)
        examiner = content['examiners'][0]
        self.assertEquals(set(examiner.keys()),
                          set(['id', 'user']))
        self.assertEquals(set(examiner['user'].keys()),
                          set(['email', 'full_name', 'id', 'username']))
        self.assertEquals(examiner['user']['id'], self.testhelper.examiner1.id)
        self.assertEquals(examiner['user']['username'], 'examiner1')

        # Candidates
        self.assertEquals(len(content['candidates']), 1)
        candidate = content['candidates'][0]
        self.assertEquals(set(candidate.keys()),
                          set(['id', 'user', 'candidate_id']))
        self.assertEquals(set(candidate['user'].keys()),
                          set(['email', 'full_name', 'id', 'username']))
        self.assertEquals(candidate['user']['id'], self.testhelper.candidate1.id)
        self.assertEquals(candidate['candidate_id'], '')
        self.assertEquals(candidate['user']['username'], 'candidate1')

        # It was actually created?
        groups = self.testhelper.sub_p1_a1.assignmentgroups.all()
        self.assertEquals(len(groups), 1)
        self.assertEquals(content['id'], groups[0].id)

    def test_create_as_assignmentadmin(self):
        self._test_create_as('a1admin')

    def test_create_as_superuser(self):
        self._test_create_as('grandma')

    def test_noperm(self):
        self.testhelper.create_user('nobody')
        data = {'name': 'g1',
                'is_open': False}
        content, response = self._postas('nobody', self.a1id, data)
        self.assertEquals(response.status_code, 403)
        self.assertEquals(content, {u'detail': u'Permission denied'})

    def test_create_ro_fields(self):
        data = {'name': 'g1',
                'is_open': False,
                'id': 'should be ignored',
                'feedback': 'should be ignored',
                'num_deliveries': 'should be ignored',
                'deadlines': 'should be ignored'}
        content, response = self._postas('a1admin', self.a1id, data)
        self.assertEquals(response.status_code, 201)