clear_student_state(), a method defined by ORA, requires information about the user making the request. Since this xblock is not bound, we must provide that information explicitly.
140 lines
4.2 KiB
Python
140 lines
4.2 KiB
Python
"""
|
|
Tests for the InstructorService
|
|
"""
|
|
|
|
import json
|
|
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
|
|
from xmodule.modulestore.tests.factories import CourseFactory
|
|
from courseware.models import StudentModule
|
|
from instructor.access import allow_access
|
|
from instructor.services import InstructorService
|
|
from instructor.tests.test_tools import msk_from_problem_urlname
|
|
from nose.plugins.attrib import attr
|
|
|
|
from student.models import CourseEnrollment
|
|
from student.tests.factories import UserFactory
|
|
|
|
|
|
@attr('shard_1')
|
|
class InstructorServiceTests(SharedModuleStoreTestCase):
|
|
"""
|
|
Tests for the InstructorService
|
|
"""
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(InstructorServiceTests, cls).setUpClass()
|
|
cls.course = CourseFactory.create()
|
|
cls.problem_location = msk_from_problem_urlname(
|
|
cls.course.id,
|
|
'robot-some-problem-urlname'
|
|
)
|
|
cls.other_problem_location = msk_from_problem_urlname(
|
|
cls.course.id,
|
|
'robot-some-other_problem-urlname'
|
|
)
|
|
cls.problem_urlname = unicode(cls.problem_location)
|
|
cls.other_problem_urlname = unicode(cls.other_problem_location)
|
|
|
|
def setUp(self):
|
|
super(InstructorServiceTests, self).setUp()
|
|
|
|
self.student = UserFactory()
|
|
CourseEnrollment.enroll(self.student, self.course.id)
|
|
|
|
self.service = InstructorService()
|
|
self.module_to_reset = StudentModule.objects.create(
|
|
student=self.student,
|
|
course_id=self.course.id,
|
|
module_state_key=self.problem_location,
|
|
state=json.dumps({'attempts': 2}),
|
|
)
|
|
|
|
def test_reset_student_attempts_delete(self):
|
|
"""
|
|
Test delete student state.
|
|
"""
|
|
|
|
# make sure the attempt is there
|
|
self.assertEqual(
|
|
StudentModule.objects.filter(
|
|
student=self.module_to_reset.student,
|
|
course_id=self.course.id,
|
|
module_state_key=self.module_to_reset.module_state_key,
|
|
).count(),
|
|
1
|
|
)
|
|
|
|
self.service.delete_student_attempt(
|
|
self.student.username,
|
|
unicode(self.course.id),
|
|
self.problem_urlname,
|
|
requesting_user=self.student,
|
|
)
|
|
|
|
# make sure the module has been deleted
|
|
self.assertEqual(
|
|
StudentModule.objects.filter(
|
|
student=self.module_to_reset.student,
|
|
course_id=self.course.id,
|
|
module_state_key=self.module_to_reset.module_state_key,
|
|
).count(),
|
|
0
|
|
)
|
|
|
|
def test_reset_bad_content_id(self):
|
|
"""
|
|
Negative test of trying to reset attempts with bad content_id
|
|
"""
|
|
|
|
result = self.service.delete_student_attempt(
|
|
self.student.username,
|
|
unicode(self.course.id),
|
|
'foo/bar/baz',
|
|
requesting_user=self.student,
|
|
)
|
|
self.assertIsNone(result)
|
|
|
|
def test_reset_bad_user(self):
|
|
"""
|
|
Negative test of trying to reset attempts with bad user identifier
|
|
"""
|
|
|
|
result = self.service.delete_student_attempt(
|
|
'bad_student',
|
|
unicode(self.course.id),
|
|
'foo/bar/baz',
|
|
requesting_user=self.student,
|
|
)
|
|
self.assertIsNone(result)
|
|
|
|
def test_reset_non_existing_attempt(self):
|
|
"""
|
|
Negative test of trying to reset attempts with bad user identifier
|
|
"""
|
|
|
|
result = self.service.delete_student_attempt(
|
|
self.student.username,
|
|
unicode(self.course.id),
|
|
self.other_problem_urlname,
|
|
requesting_user=self.student,
|
|
)
|
|
self.assertIsNone(result)
|
|
|
|
def test_is_user_staff(self):
|
|
"""
|
|
Test to assert that the usrr is staff or not
|
|
"""
|
|
result = self.service.is_course_staff(
|
|
self.student,
|
|
unicode(self.course.id)
|
|
)
|
|
self.assertFalse(result)
|
|
|
|
# allow staff access to the student
|
|
allow_access(self.course, self.student, 'staff')
|
|
result = self.service.is_course_staff(
|
|
self.student,
|
|
unicode(self.course.id)
|
|
)
|
|
self.assertTrue(result)
|