SubmissionModelAdminTestCase   A
last analyzed

Complexity

Total Complexity 20

Size/Duplication

Total Lines 135
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 20
dl 0
loc 135
rs 10
c 0
b 0
f 0

13 Methods

Rating   Name   Duplication   Size   Complexity  
A test_submission_backend() 0 5 2
A test_course_backend() 0 8 3
A test_assignment_backend() 0 6 1
A test_course_list_from_grading_scheme() 0 4 2
A test_state_filter() 0 12 3
A test_assignment_filter() 0 9 1
A test_set_full_pending_all() 0 6 1
A test_course_filter() 0 7 1
A test_set_full_pending_none_matching() 0 7 1
A test_grading_file_indicator() 0 8 1
A test_set_initial_state() 0 5 1
A setUp() 0 22 1
A test_close_and_notify() 0 18 2
1
'''
2
    Test cases focusing on the model admin extensions.
3
'''
4
5
from .helpers.assignment import *
6
from .helpers.submission import *
7
from .helpers.course import create_course
8
from .helpers.user import create_user, admin_dict
9
from .cases import SubmitTutorTestCase
10
11
from opensubmit.admin.course import CourseAdmin
12
from opensubmit.models import Assignment, Course
13
from opensubmit.models import SubmissionFile, Submission
14
from opensubmit.models import GradingScheme
15
16
from django.contrib.admin.sites import AdminSite
17
18
19
class ModelAdminTestCase(SubmitTutorTestCase):
20
21
    def test_submission_file_backend(self):
22
        from opensubmit.admin.submissionfile import SubmissionFileAdmin
23
        subfileadm = SubmissionFileAdmin(SubmissionFile, AdminSite())
24
        files_shown = subfileadm.get_queryset(self.request).count()
25
        self.assertEqual(0, files_shown)
26
27
    def test_grading_scheme_admin_rendering(self):
28
        from opensubmit.admin.gradingscheme import GradingSchemeAdmin
29
        gsadmin = GradingSchemeAdmin(GradingScheme, AdminSite())
30
        assert('GradingSchemeForm' in str(gsadmin.get_form(self.request)))
31
32
33
class SubmissionModelAdminTestCase(SubmitTutorTestCase):
34
    '''
35
        Test submission model admin functions, which needs more setUp
36
        than the other cases.
37
    '''
38
39
    def setUp(self):
40
        from opensubmit.admin.submission import SubmissionAdmin
41
        super(SubmissionModelAdminTestCase, self).setUp()
42
        # Tutor is already logged in, we need an additional admin
43
        self.admin = create_user(admin_dict)
44
        # Prepare assignments
45
        self.course = create_course(self.admin, self.user)
46
        self.grading_scheme = create_pass_fail_grading()
47
        self.assign1 = create_open_assignment(
48
            self.course, self.grading_scheme)
49
        self.assign2 = create_soft_passed_assignment(
50
            self.course, self.grading_scheme)
51
        self.assign3 = create_validated_assignment_with_archive(
52
            self.course, self.grading_scheme)
53
        self.all_assignments = [self.assign1, self.assign2, self.assign3]
54
        # Prepare submissions
55
        self.sub1 = create_submission(self.user, self.assign1)
56
        self.sub2 = create_submission(self.user, self.assign2)
57
        self.sub3 = create_validated_submission(self.user, self.assign3)
58
        self.all_submissions = [self.sub1, self.sub2, self.sub3]
59
60
        self.submadm = SubmissionAdmin(Submission, AdminSite())
61
62
    def test_submission_backend(self):
63
        submissions = self.submadm.get_queryset(self.request)
64
        for sub in submissions:
65
            self.assertIn(sub, self.all_submissions)
66
        self.assertEqual(len(submissions), len(self.all_submissions))
67
68
    def test_course_backend(self):
69
        from opensubmit.admin.course import assignments as course_assignments
70
        courseadm = CourseAdmin(Course, AdminSite())
71
        num_courses = courseadm.get_queryset(self.request).count()
72
        self.assertEqual(num_courses, 1)
73
        ass_str_list = course_assignments(self.course)
74
        for ass in self.all_assignments:
75
            assert(ass.title in ass_str_list)
76
77
    def test_assignment_backend(self):
78
        from opensubmit.admin.assignment import AssignmentAdmin
79
        assadm = AssignmentAdmin(Assignment, AdminSite())
80
        assignments_shown = assadm.get_queryset(self.request).count()
81
        # should get all of them
82
        self.assertEqual(len(self.all_assignments), assignments_shown)
83
84
    def test_course_list_from_grading_scheme(self):
85
        from opensubmit.admin.gradingscheme import courses
86
        course_list = courses(self.grading_scheme)
87
        assert(self.course.title in course_list)
88
89
    def test_close_and_notify(self):
90
        from django.core import mail
91
        # Everything in status 'SUBMITTED', so no mail should be sent
92
        self.submadm.closeAndNotifyAction(
93
            self.request, Submission.objects.all())
94
        self.assertEqual(0, len(mail.outbox))
95
        # One mail should be sent
96
        self.sub1.state = Submission.GRADED
97
        self.sub1.save()
98
        self.sub2.state = Submission.GRADED
99
        self.sub2.save()
100
        self.submadm.closeAndNotifyAction(
101
            self.request, Submission.objects.all())
102
        self.assertEqual(2, len(mail.outbox))
103
        for email in mail.outbox:
104
            self.assertIn("Grading", email.subject)
105
            self.assertIn("grading", email.body)
106
            self.assertIn("localhost", email.body)
107
108
    def test_set_full_pending_all(self):
109
        # Only one of the submission assignments has validation configured
110
        self.submadm.setFullPendingStateAction(
111
            self.request, Submission.objects.all())
112
        self.assertEqual(1, Submission.objects.filter(
113
            state=Submission.TEST_FULL_PENDING).count())
114
115
    def test_set_full_pending_none_matching(self):
116
        # Only one of the submission assignments has validation configured
117
        self.submadm.setFullPendingStateAction(
118
            self.request, Submission.objects.filter(
119
                state=Submission.SUBMITTED))
120
        self.assertEqual(0, Submission.objects.filter(
121
            state=Submission.TEST_FULL_PENDING).count())
122
123
    def test_set_initial_state(self):
124
        self.submadm.setInitialStateAction(
125
            self.request, Submission.objects.all())
126
        self.assertEqual(2, Submission.objects.filter(
127
            state=Submission.SUBMITTED).count())
128
129
    def test_grading_file_indicator(self):
130
        from django.core.files import File as DjangoFile
131
        from opensubmit.admin.submission import grading_file
132
        self.assertEqual(False, grading_file(self.sub1))
133
        self.sub1.grading_file = DjangoFile(
134
            open(__file__), str("grading_file.txt"))
135
        self.sub1.save()
136
        self.assertEqual(True, grading_file(self.sub1))
137
138
    def test_state_filter(self):
139
        from opensubmit.admin.submission import SubmissionStateFilter
140
        submfilter = SubmissionStateFilter(
141
            self.request, {'statefilter': 'tobegraded'}, Submission, None)
142
        for sub in submfilter.queryset(self.request, Submission.objects.all()):
143
            assert(sub in self.all_submissions)
144
        graded_count = SubmissionStateFilter(
145
            self.request, {'statefilter': 'graded'},
146
            Submission,
147
            None).queryset(
148
            self.request, Submission.objects.all()).count()
149
        self.assertEqual(graded_count, 0)
150
151
    def test_assignment_filter(self):
152
        from opensubmit.admin.submission import SubmissionAssignmentFilter
153
        submfilter = SubmissionAssignmentFilter(
154
            self.request, {'assignmentfilter': self.sub1.assignment.pk},
155
            Submission, None)
156
        sublist = submfilter.queryset(
157
            self.request, Submission.objects.all()).values_list(
158
            'pk', flat=True)
159
        self.assertSequenceEqual(sublist, [self.sub1.pk])
160
161
    def test_course_filter(self):
162
        from opensubmit.admin.submission import SubmissionCourseFilter
163
        submfilter = SubmissionCourseFilter(
164
            self.request, {'coursefilter': self.course.pk}, Submission, None)
165
        subcount = submfilter.queryset(
166
            self.request, Submission.objects.all()).count()
167
        self.assertEqual(subcount, len(self.all_submissions))
168