Commit 43ba649b by E. Kolpakov

Fixed showing feedback for all MRQ options on page reload and marking answer…

Fixed showing feedback for all MRQ options on page reload and marking answer blocks as incomplete on first load (+tests)
parent 742c2238
...@@ -190,7 +190,7 @@ class AnswerBlock(AnswerMixin, StepMixin, StudioEditableXBlockMixin, XBlock): ...@@ -190,7 +190,7 @@ class AnswerBlock(AnswerMixin, StepMixin, StudioEditableXBlockMixin, XBlock):
} }
def get_last_result(self): def get_last_result(self):
return self.get_results(None) return self.get_results(None) if self.student_input else {}
def submit(self, submission): def submit(self, submission):
""" """
......
...@@ -81,16 +81,19 @@ class MRQBlock(QuestionnaireAbstractBlock): ...@@ -81,16 +81,19 @@ class MRQBlock(QuestionnaireAbstractBlock):
return self._(u"Ignored") return self._(u"Ignored")
return self._(u"Not Acceptable") return self._(u"Not Acceptable")
def get_results(self, previous_result): def get_results(self, previous_result, only_selected=False):
""" """
Get the results a student has already submitted. Get the results a student has already submitted.
""" """
result = self.calculate_results(previous_result['submissions']) result = self.calculate_results(previous_result['submissions'], only_selected)
result['completed'] = True result['completed'] = True
return result return result
def get_last_result(self): def get_last_result(self):
return self.get_results({'submissions': self.student_choices}) if self.student_choices else {} if self.student_choices:
return self.get_results({'submissions': self.student_choices}, only_selected=True)
else:
return {}
def submit(self, submissions): def submit(self, submissions):
log.debug(u'Received MRQ submissions: "%s"', submissions) log.debug(u'Received MRQ submissions: "%s"', submissions)
...@@ -101,13 +104,17 @@ class MRQBlock(QuestionnaireAbstractBlock): ...@@ -101,13 +104,17 @@ class MRQBlock(QuestionnaireAbstractBlock):
log.debug(u'MRQ submissions result: %s', result) log.debug(u'MRQ submissions result: %s', result)
return result return result
def calculate_results(self, submissions): def calculate_results(self, submissions, only_selected=False):
score = 0 score = 0
results = [] results = []
for choice in self.custom_choices: for choice in self.custom_choices:
choice_completed = True choice_completed = True
choice_tips_html = [] choice_tips_html = []
choice_selected = choice.value in submissions choice_selected = choice.value in submissions
if not choice_selected and only_selected:
continue
if choice.value in self.required_choices: if choice.value in self.required_choices:
if not choice_selected: if not choice_selected:
choice_completed = False choice_completed = False
......
...@@ -31,13 +31,14 @@ function AnswerBlock(runtime, element) { ...@@ -31,13 +31,14 @@ function AnswerBlock(runtime, element) {
// Display of checkmark would be redundant. // Display of checkmark would be redundant.
return return
} }
if (result.status) {
if (result.status === "correct") { if (result.status === "correct") {
checkmark.addClass('checkmark-correct icon-ok fa-check'); checkmark.addClass('checkmark-correct icon-ok fa-check');
} }
else { else {
checkmark.addClass('checkmark-incorrect icon-exclamation fa-exclamation'); checkmark.addClass('checkmark-incorrect icon-exclamation fa-exclamation');
} }
}
}, },
clearResult: function() { clearResult: function() {
......
...@@ -93,19 +93,15 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -93,19 +93,15 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
return answer, mcq, mrq, rating return answer, mcq, mrq, rating
def _assert_feedback_hidden(self, questionnaire, choice_index): def _assert_checkmark(self, checkmark, shown=True, checkmark_class=None):
choice = self._get_choice(questionnaire, choice_index) choice_result_classes = checkmark.get_attribute('class').split()
choice_result = choice.find_element_by_css_selector('.choice-result') if shown:
feedback_popup = choice.find_element_by_css_selector(".choice-tips") self.assertTrue(checkmark.is_displayed())
self.assertIn(checkmark_class, choice_result_classes)
choice_result_classes = choice_result.get_attribute('class').split() else:
self.assertFalse(checkmark.is_displayed())
self.assertTrue(choice_result.is_displayed())
self.assertFalse(feedback_popup.is_displayed()) def _assert_feedback_showed(self, questionnaire, choice_index, expected_text,
self.assertNotIn('checkmark-correct', choice_result_classes)
self.assertNotIn('checkmark-incorrect', choice_result_classes)
def _assert_feedback_visible(self, questionnaire, choice_index, expected_text,
click_choice_result=False, success=True): click_choice_result=False, success=True):
""" """
Asserts that feedback for given element contains particular text Asserts that feedback for given element contains particular text
...@@ -118,11 +114,21 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -118,11 +114,21 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
choice_result.click() choice_result.click()
feedback_popup = choice.find_element_by_css_selector(".choice-tips") feedback_popup = choice.find_element_by_css_selector(".choice-tips")
self.assertTrue(choice_result.is_displayed()) checkmark_class = 'checkmark-correct' if success else 'checkmark-incorrect'
self._assert_checkmark(choice_result, shown=True, checkmark_class=checkmark_class)
self.assertTrue(feedback_popup.is_displayed()) self.assertTrue(feedback_popup.is_displayed())
self.assertEqual(feedback_popup.text, expected_text) self.assertEqual(feedback_popup.text, expected_text)
def _assert_feedback_hidden(self, questionnaire, choice_index):
choice = self._get_choice(questionnaire, choice_index)
choice_result = choice.find_element_by_css_selector('.choice-result')
feedback_popup = choice.find_element_by_css_selector(".choice-tips")
choice_result_classes = choice_result.get_attribute('class').split() choice_result_classes = choice_result.get_attribute('class').split()
self.assertIn('checkmark-correct' if success else 'checkmark-incorrect', choice_result_classes)
self.assertTrue(choice_result.is_displayed())
self.assertFalse(feedback_popup.is_displayed())
self.assertNotIn('checkmark-correct', choice_result_classes)
self.assertNotIn('checkmark-incorrect', choice_result_classes)
def _standard_filling(self, answer, mcq, mrq, rating): def _standard_filling(self, answer, mcq, mrq, rating):
answer.send_keys('This is the answer') answer.send_keys('This is the answer')
...@@ -140,28 +146,34 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -140,28 +146,34 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
if checkbox.is_selected(): if checkbox.is_selected():
checkbox.click() checkbox.click()
def _standard_checks(self, answer, mcq, mrq, rating, messages): def _standard_checks(self, answer, mcq, mrq, rating, messages, only_selected=False):
self.assertEqual(answer.get_attribute('value'), 'This is the answer') self.assertEqual(answer.get_attribute('value'), 'This is the answer')
self._assert_feedback_visible(mcq, 0, "Great!") self._assert_feedback_showed(mcq, 0, "Great!")
self._assert_feedback_visible( self._assert_feedback_showed(
mrq, 0, "This is something everyone has to like about this MRQ", mrq, 0, "This is something everyone has to like about this MRQ",
click_choice_result=True click_choice_result=True
) )
self._assert_feedback_visible( if not only_selected:
self._assert_feedback_showed(
mrq, 1, "This is something everyone has to like about beauty", mrq, 1, "This is something everyone has to like about beauty",
click_choice_result=True, success=False click_choice_result=True, success=False
) )
self._assert_feedback_visible(mrq, 2, "This MRQ is indeed very graceful", click_choice_result=True) else:
self._assert_feedback_visible(mrq, 3, "Nah, there aren't any!", click_choice_result=True, success=False) self._assert_feedback_hidden(mrq, 1)
self._assert_feedback_visible(rating, 3, "I love good grades.", click_choice_result=True) self._assert_feedback_showed(mrq, 2, "This MRQ is indeed very graceful", click_choice_result=True)
self._assert_feedback_showed(mrq, 3, "Nah, there aren't any!", click_choice_result=True, success=False)
self._assert_feedback_showed(rating, 3, "I love good grades.", click_choice_result=True)
self.assertTrue(messages.is_displayed()) self.assertTrue(messages.is_displayed())
self.assertEqual(messages.text, "FEEDBACK\nNot done yet") self.assertEqual(messages.text, "FEEDBACK\nNot done yet")
def test_feedbacks_and_messages_is_not_shown_on_first_load(self): def test_feedbacks_and_messages_is_not_shown_on_first_load(self):
mentoring = self.load_scenario("feedback_persistence.xml") mentoring = self.load_scenario("feedback_persistence.xml")
_, mcq, mrq, rating = self._get_controls(mentoring) answer, mcq, mrq, rating = self._get_controls(mentoring)
messages = self._get_messages_element(mentoring) messages = self._get_messages_element(mentoring)
answer_checkmark = answer.find_element_by_xpath("parent::*").find_element_by_css_selector(".answer-checkmark")
self._assert_checkmark(answer_checkmark, shown=False)
for i in range(3): for i in range(3):
self._assert_feedback_hidden(mcq, i) self._assert_feedback_hidden(mcq, i)
for i in range(4): for i in range(4):
...@@ -183,7 +195,7 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -183,7 +195,7 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
mentoring = self.go_to_view("student_view") mentoring = self.go_to_view("student_view")
answer, mcq, mrq, rating = self._get_controls(mentoring) answer, mcq, mrq, rating = self._get_controls(mentoring)
messages = self._get_messages_element(mentoring) messages = self._get_messages_element(mentoring)
self._standard_checks(answer, mcq, mrq, rating, messages) self._standard_checks(answer, mcq, mrq, rating, messages, only_selected=True)
def test_given_perfect_score_in_past_loads_current_result(self): def test_given_perfect_score_in_past_loads_current_result(self):
mentoring = self.load_scenario("feedback_persistence.xml") mentoring = self.load_scenario("feedback_persistence.xml")
...@@ -201,18 +213,18 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -201,18 +213,18 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
# precondition - verifying 100% score achieved # precondition - verifying 100% score achieved
self.assertEqual(answer.get_attribute('value'), 'This is the answer') self.assertEqual(answer.get_attribute('value'), 'This is the answer')
self._assert_feedback_visible(mcq, 0, "Great!") self._assert_feedback_showed(mcq, 0, "Great!")
self._assert_feedback_visible( self._assert_feedback_showed(
mrq, 0, "This is something everyone has to like about this MRQ", mrq, 0, "This is something everyone has to like about this MRQ",
click_choice_result=True click_choice_result=True
) )
self._assert_feedback_visible( self._assert_feedback_showed(
mrq, 1, "This is something everyone has to like about beauty", mrq, 1, "This is something everyone has to like about beauty",
click_choice_result=True click_choice_result=True
) )
self._assert_feedback_visible(mrq, 2, "This MRQ is indeed very graceful", click_choice_result=True) self._assert_feedback_showed(mrq, 2, "This MRQ is indeed very graceful", click_choice_result=True)
self._assert_feedback_visible(mrq, 3, "Nah, there aren't any!", click_choice_result=True) self._assert_feedback_showed(mrq, 3, "Nah, there aren't any!", click_choice_result=True)
self._assert_feedback_visible(rating, 3, "I love good grades.", click_choice_result=True) self._assert_feedback_showed(rating, 3, "I love good grades.", click_choice_result=True)
self.assertTrue(messages.is_displayed()) self.assertTrue(messages.is_displayed())
self.assertEqual(messages.text, "FEEDBACK\nAll Good") self.assertEqual(messages.text, "FEEDBACK\nAll Good")
...@@ -225,4 +237,4 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -225,4 +237,4 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
mentoring = self.go_to_view("student_view") mentoring = self.go_to_view("student_view")
answer, mcq, mrq, rating = self._get_controls(mentoring) answer, mcq, mrq, rating = self._get_controls(mentoring)
messages = self._get_messages_element(mentoring) messages = self._get_messages_element(mentoring)
self._standard_checks(answer, mcq, mrq, rating, messages) self._standard_checks(answer, mcq, mrq, rating, messages, only_selected=True)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment