SubmissionModel   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 106
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 18
dl 0
loc 106
rs 10
c 0
b 0
f 0

11 Methods

Rating   Name   Duplication   Size   Complexity  
A test_can_create_submission_without_grading() 0 4 1
A test_info_file_creation() 0 11 2
A test_cannot_double_submit() 0 5 2
A test_cannot_modify_submission_after_deadline() 0 4 1
A test_can_create_submission() 0 7 1
A test_cannot_create_submission_before_publishing() 0 4 1
A test_can_modify_submission() 0 10 1
B test_can_or_cannot_reupload_submissions() 0 34 4
A test_admin_teacher_tutor_always_can_create_submission() 0 7 3
A test_cannot_create_submission_after_deadline() 0 4 1
A test_can_create_submission_only_soft_passed() 0 4 1
1
'''
2
    Tets cases focusing on the Submission model class methods.
3
'''
4
5
from opensubmit.tests.cases import SubmitStudentScenarioTestCase
6
from opensubmit.models import Submission
7
8
import os
9
import logging
10
11
logger = logging.getLogger('opensubmitexec')
12
13
14
class SubmissionModel(SubmitStudentScenarioTestCase):
15
16
    def test_info_file_creation(self):
17
        self.create_submissions()
18
        sub = self.hard_deadline_passed_assignment_sub
19
        # Info file is opened in write-only mode,
20
        # so we need the explicit re-opening and deletion here
21
        info_file = sub.info_file(delete=False)
22
        info_file.close()
23
        with open(info_file.name, 'rt', encoding='utf-8') as tmpfile:
24
            content = tmpfile.read()
25
        os.remove(info_file.name)
26
        self.assertIn(sub.submitter.get_full_name(), content)
27
28
    def test_can_create_submission(self):
29
        self.assertEqual(
30
            self.open_assignment.can_create_submission(
31
                self.user), True)
32
        self.assertEqual(
33
            self.soft_deadline_passed_assignment.can_create_submission(
34
                self.user), True)
35
36
    def test_cannot_create_submission_after_deadline(self):
37
        self.assertEqual(
38
            self.hard_deadline_passed_assignment.can_create_submission(
39
                self.user), False)
40
41
    def test_can_create_submission_only_soft_passed(self):
42
        self.assertEqual(
43
            self.no_hard_assignment.can_create_submission(
44
                self.user), True)
45
46
    def test_can_create_submission_without_grading(self):
47
        self.assertEqual(
48
            self.no_grading_assignment.can_create_submission(
49
                self.user), True)
50
51
    def test_cannot_create_submission_before_publishing(self):
52
        self.assertEqual(
53
            self.unpublished_assignment.can_create_submission(
54
                self.user), False)
55
56
    def test_admin_teacher_tutor_always_can_create_submission(self):
57
        for user in (self.admin, self.teacher, self.tutor, ):
58
            for ass in self.all_assignments:
59
                msg = "User {0} cannot create submission for assignment {1}".format(user, ass)
60
                self.assertEqual(ass.can_create_submission(user),
61
                                 True,
62
                                 msg=msg)
63
64
    def test_cannot_double_submit(self):
65
        self.create_submissions()
66
        for sub in self.submissions:
67
            self.assertEqual(sub.assignment.can_create_submission(
68
                self.user), False)
69
70
    def test_can_modify_submission(self):
71
        self.create_submissions()
72
        self.assertEqual(self.open_assignment_sub.can_modify(
73
            self.user), True)
74
        self.assertEqual(self.soft_deadline_passed_assignment_sub.can_modify(
75
            self.user), True)
76
        self.assertEqual(self.no_grading_assignment_sub.can_modify(
77
            self.user), True)
78
        self.assertEqual(self.no_hard_assignment_sub.can_modify(
79
            self.user), True)
80
81
    def test_cannot_modify_submission_after_deadline(self):
82
        self.create_submissions()
83
        self.assertEqual(self.hard_deadline_passed_assignment_sub.can_modify(
84
            self.user), False)
85
86
    def test_can_or_cannot_reupload_submissions(self):
87
        self.create_submissions()
88
        for state, desc in Submission.STATES:
89
            for submission in self.submissions:
90
                submission.state = state
91
                submission.save()
92
93
            # Submissions should only be allowed to be re-uploaded if:
94
            # 1. The code has already been uploaded and executed and
95
            # 2. the execution has failed, and
96
            # 3. the hard deadline has not passed.
97
            if state in (
98
                Submission.TEST_VALIDITY_FAILED,
99
                Submission.TEST_FULL_FAILED,
100
            ):
101
                self.assertEqual(
102
                    self.open_assignment_sub.can_reupload(
103
                        self.user), True)
104
                self.assertEqual(
105
                    self.soft_deadline_passed_assignment_sub.can_reupload(
106
                        self.user), True)
107
                self.assertEqual(
108
                    self.hard_deadline_passed_assignment_sub.can_reupload(
109
                        self.user), False)
110
            else:
111
                self.assertEqual(
112
                    self.open_assignment_sub.can_reupload(
113
                        self.user), False)
114
                self.assertEqual(
115
                    self.soft_deadline_passed_assignment_sub.can_reupload(
116
                        self.user), False)
117
                self.assertEqual(
118
                    self.hard_deadline_passed_assignment_sub.can_reupload(
119
                        self.user), False)
120