89 lines
2.9 KiB
Python
89 lines
2.9 KiB
Python
"""
|
|
Utilities for grades related tests
|
|
"""
|
|
|
|
|
|
from contextlib import contextmanager
|
|
from datetime import datetime
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
import pytz
|
|
|
|
from lms.djangoapps.courseware.model_data import FieldDataCache
|
|
from lms.djangoapps.courseware.block_render import get_block
|
|
from xmodule.graders import ProblemScore # lint-amnesty, pylint: disable=wrong-import-order
|
|
|
|
|
|
@contextmanager
|
|
def mock_passing_grade(letter_grade='Pass', percent=0.75, last_updated=None):
|
|
"""
|
|
Mock the grading function to always return a passing grade.
|
|
"""
|
|
passing_grade_fields = dict(
|
|
letter_grade=letter_grade,
|
|
percent=percent,
|
|
passed=letter_grade is not None,
|
|
attempted=True,
|
|
last_updated=last_updated,
|
|
)
|
|
with patch('lms.djangoapps.grades.course_grade_factory.CourseGradeFactory.read') as mock_grade_read:
|
|
mock_grade_read.return_value = MagicMock(**passing_grade_fields)
|
|
with patch('lms.djangoapps.grades.course_grade.CourseGrade.update') as mock_grade_update:
|
|
mock_grade_update.return_value = MagicMock(**passing_grade_fields)
|
|
yield
|
|
|
|
|
|
@contextmanager
|
|
def mock_get_score(earned=0, possible=1, first_attempted=datetime(2000, 1, 1, 0, 0, 0, tzinfo=pytz.UTC)):
|
|
"""
|
|
Mocks the get_score function to return a valid grade.
|
|
"""
|
|
with patch('lms.djangoapps.grades.subsection_grade.get_score') as mock_score:
|
|
mock_score.return_value = ProblemScore(
|
|
raw_earned=earned,
|
|
raw_possible=possible,
|
|
weighted_earned=earned,
|
|
weighted_possible=possible,
|
|
weight=1,
|
|
graded=True,
|
|
first_attempted=first_attempted
|
|
)
|
|
yield mock_score
|
|
|
|
|
|
@contextmanager
|
|
def mock_get_submissions_score(earned=0, possible=1, first_attempted=datetime(2000, 1, 1, 0, 0, 0, tzinfo=pytz.UTC)):
|
|
"""
|
|
Mocks the _get_submissions_score function to return the specified values
|
|
"""
|
|
with patch('lms.djangoapps.grades.scores._get_score_from_submissions') as mock_score:
|
|
mock_score.return_value = (earned, possible, earned, possible, first_attempted)
|
|
yield mock_score
|
|
|
|
|
|
def answer_problem(course, request, problem, score=1, max_value=1):
|
|
"""
|
|
Records a correct answer for the given problem.
|
|
|
|
Arguments:
|
|
course (Course): Course object, the course the required problem is in
|
|
request (Request): request Object
|
|
problem (xblock): xblock object, the problem to be answered
|
|
"""
|
|
|
|
user = request.user
|
|
grade_dict = {'value': score, 'max_value': max_value, 'user_id': user.id}
|
|
field_data_cache = FieldDataCache.cache_for_block_descendents(
|
|
course.id,
|
|
user,
|
|
course,
|
|
depth=2
|
|
)
|
|
block = get_block(
|
|
user,
|
|
request,
|
|
problem.scope_ids.usage_id,
|
|
field_data_cache,
|
|
)
|
|
block.runtime.publish(problem, 'grade', grade_dict)
|