Commit da68b616 by Matjaz Gregoric Committed by GitHub

Merge pull request #140 from open-craft/mtyaka/completion-submit-tweaks

Do not show completion checkmark when hide_feedback is enabled
parents e620ce76 01b33b96
...@@ -16,11 +16,13 @@ function CompletionBlock(runtime, element) { ...@@ -16,11 +16,13 @@ function CompletionBlock(runtime, element) {
return $completion.is(':checked'); return $completion.is(':checked');
}, },
handleSubmit: function(result) { handleSubmit: function(result, options) {
if (typeof result.submission !== 'undefined') { if (typeof result.submission !== 'undefined') {
this.updateCompletion(result); this.updateCompletion(result);
if (!options.hide_results) {
$('.submit-result', element).css('visibility', 'visible'); $('.submit-result', element).css('visibility', 'visible');
} }
}
}, },
handleReview: function(result) { handleReview: function(result) {
......
...@@ -86,6 +86,9 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -86,6 +86,9 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
def _get_answer_checkmark(self, answer): def _get_answer_checkmark(self, answer):
return answer.find_element_by_xpath("ancestor::node()[3]").find_element_by_css_selector(".answer-checkmark") return answer.find_element_by_xpath("ancestor::node()[3]").find_element_by_css_selector(".answer-checkmark")
def _get_completion_checkmark(self, completion):
return completion.find_element_by_xpath("ancestor::node()[4]").find_element_by_css_selector(".submit-result")
def _get_messages_element(self, mentoring): def _get_messages_element(self, mentoring):
return mentoring.find_element_by_css_selector('.messages') return mentoring.find_element_by_css_selector('.messages')
...@@ -97,14 +100,23 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -97,14 +100,23 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
mcq = self._get_xblock(mentoring, "feedback_mcq_2") mcq = self._get_xblock(mentoring, "feedback_mcq_2")
mrq = self._get_xblock(mentoring, "feedback_mrq_3") mrq = self._get_xblock(mentoring, "feedback_mrq_3")
rating = self._get_xblock(mentoring, "feedback_rating_4") rating = self._get_xblock(mentoring, "feedback_rating_4")
completion = self._get_xblock(mentoring, "completion_1").find_element_by_css_selector('.pb-completion-value')
return answer, mcq, mrq, rating return answer, mcq, mrq, rating, completion
def _assert_answer(self, answer, results_shown=True): def _assert_answer(self, answer, results_shown=True):
self.assertEqual(answer.get_attribute('value'), 'This is the answer') self.assertEqual(answer.get_attribute('value'), 'This is the answer')
answer_checkmark = self._get_answer_checkmark(answer) answer_checkmark = self._get_answer_checkmark(answer)
self._assert_checkmark(answer_checkmark, shown=results_shown) self._assert_checkmark(answer_checkmark, shown=results_shown)
def _assert_completion(self, completion, results_shown=True):
self.assertTrue(completion.is_selected())
completion_checkmark = self._get_completion_checkmark(completion)
if results_shown:
self.assertTrue(completion_checkmark.is_displayed())
else:
self.assertFalse(completion_checkmark.is_displayed())
def _assert_checkmark(self, checkmark, correct=True, shown=True): def _assert_checkmark(self, checkmark, correct=True, shown=True):
result_classes = checkmark.get_attribute('class').split() result_classes = checkmark.get_attribute('class').split()
result_label = checkmark.get_attribute('aria-label').strip() result_label = checkmark.get_attribute('aria-label').strip()
...@@ -198,7 +210,7 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -198,7 +210,7 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
self.assertFalse(messages.is_displayed()) self.assertFalse(messages.is_displayed())
self.assertEqual(messages.text, "") self.assertEqual(messages.text, "")
def _standard_filling(self, answer, mcq, mrq, rating): def _standard_filling(self, answer, mcq, mrq, rating, completion):
# Long answer # Long answer
answer.send_keys('This is the answer') answer.send_keys('This is the answer')
# MCQ # MCQ
...@@ -212,15 +224,18 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -212,15 +224,18 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
self.click_choice(mrq, "Its bugs") self.click_choice(mrq, "Its bugs")
# Rating # Rating
self.click_choice(rating, "4") self.click_choice(rating, "4")
# Completion - tick the checkbox
completion.click()
# mcq and rating can't be reset easily, but it's not required; listing them here to keep method signature similar # mcq and rating can't be reset easily, but it's not required; listing them here to keep method signature similar
def _clear_filling(self, answer, mcq, mrq, rating): # pylint: disable=unused-argument def _clear_filling(self, answer, mcq, mrq, rating, completion): # pylint: disable=unused-argument
answer.clear() answer.clear()
completion.click()
for checkbox in mrq.find_elements_by_css_selector('.choice input'): for checkbox in mrq.find_elements_by_css_selector('.choice input'):
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, completion, messages):
self.wait_until_visible(messages) self.wait_until_visible(messages)
# Long answer: Previous answer and results visible # Long answer: Previous answer and results visible
...@@ -231,10 +246,12 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -231,10 +246,12 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
self._assert_mrq(mrq) self._assert_mrq(mrq)
# Rating: Previous answer and results visible # Rating: Previous answer and results visible
self._assert_rating(rating) self._assert_rating(rating)
# Completion: Previous answer and results visible
self._assert_completion(completion)
# Messages visible # Messages visible
self._assert_messages(messages) self._assert_messages(messages)
def _mcq_hide_previous_answer_checks(self, answer, mcq, mrq, rating, messages): def _mcq_hide_previous_answer_checks(self, answer, mcq, mrq, rating, completion, messages):
self.wait_until_visible(messages) self.wait_until_visible(messages)
# Long answer: Previous answer and results visible # Long answer: Previous answer and results visible
...@@ -245,10 +262,12 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -245,10 +262,12 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
self._assert_mrq(mrq, previous_answer_shown=False) self._assert_mrq(mrq, previous_answer_shown=False)
# Rating: Previous answer and results hidden # Rating: Previous answer and results hidden
self._assert_rating(rating, previous_answer_shown=False) self._assert_rating(rating, previous_answer_shown=False)
# Completion: Previous answer and results visible
self._assert_completion(completion)
# Messages visible # Messages visible
self._assert_messages(messages) self._assert_messages(messages)
def _hide_feedback_checks(self, answer, mcq, mrq, rating, messages): def _hide_feedback_checks(self, answer, mcq, mrq, rating, completion, messages):
# Long answer: Previous answer visible and results hidden # Long answer: Previous answer visible and results hidden
self._assert_answer(answer, results_shown=False) self._assert_answer(answer, results_shown=False)
# MCQ: Previous answer and results visible # MCQ: Previous answer and results visible
...@@ -257,10 +276,12 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -257,10 +276,12 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
self._assert_mrq(mrq) self._assert_mrq(mrq)
# Rating: Previous answer and results visible # Rating: Previous answer and results visible
self._assert_rating(rating) self._assert_rating(rating)
# Completion: Previous answer visible and results hidden
self._assert_completion(completion, results_shown=False)
# Messages hidden # Messages hidden
self._assert_messages(messages, shown=False) self._assert_messages(messages, shown=False)
def _mcq_hide_previous_answer_hide_feedback_checks(self, answer, mcq, mrq, rating, messages): def _mcq_hide_previous_answer_hide_feedback_checks(self, answer, mcq, mrq, rating, completion, messages):
# Long answer: Previous answer visible and results hidden # Long answer: Previous answer visible and results hidden
self._assert_answer(answer, results_shown=False) self._assert_answer(answer, results_shown=False)
# MCQ: Previous answer and results hidden # MCQ: Previous answer and results hidden
...@@ -269,6 +290,8 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -269,6 +290,8 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
self._assert_mrq(mrq, previous_answer_shown=False) self._assert_mrq(mrq, previous_answer_shown=False)
# Rating: Previous answer and feedback hidden # Rating: Previous answer and feedback hidden
self._assert_rating(rating, previous_answer_shown=False) self._assert_rating(rating, previous_answer_shown=False)
# Completion: Previous answer visible and results hidden
self._assert_completion(completion, results_shown=False)
# Messages hidden # Messages hidden
self._assert_messages(messages, shown=False) self._assert_messages(messages, shown=False)
...@@ -289,7 +312,7 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -289,7 +312,7 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
def test_feedback_and_messages_not_shown_on_first_load(self): def test_feedback_and_messages_not_shown_on_first_load(self):
mentoring = self.load_scenario("feedback_persistence.xml") mentoring = self.load_scenario("feedback_persistence.xml")
answer, mcq, mrq, rating = self._get_controls(mentoring) answer, mcq, mrq, rating, completion = self._get_controls(mentoring)
messages = self._get_messages_element(mentoring) messages = self._get_messages_element(mentoring)
submit = self._get_submit(mentoring) submit = self._get_submit(mentoring)
...@@ -301,6 +324,8 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -301,6 +324,8 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
self._assert_feedback_hidden(mrq, i) self._assert_feedback_hidden(mrq, i)
for i in range(5): for i in range(5):
self._assert_feedback_hidden(rating, i) self._assert_feedback_hidden(rating, i)
completion_checkmark = self._get_completion_checkmark(completion)
self.assertFalse(completion_checkmark.is_displayed())
self.assertFalse(messages.is_displayed()) self.assertFalse(messages.is_displayed())
self.assertFalse(submit.is_enabled()) self.assertFalse(submit.is_enabled())
...@@ -336,21 +361,21 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -336,21 +361,21 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
with mock.patch("problem_builder.mentoring.MentoringBlock.get_options") as patched_options: with mock.patch("problem_builder.mentoring.MentoringBlock.get_options") as patched_options:
patched_options.return_value = options patched_options.return_value = options
mentoring = self.load_scenario("feedback_persistence.xml") mentoring = self.load_scenario("feedback_persistence.xml")
answer, mcq, mrq, rating = self._get_controls(mentoring) answer, mcq, mrq, rating, completion = self._get_controls(mentoring)
messages = self._get_messages_element(mentoring) messages = self._get_messages_element(mentoring)
self._standard_filling(answer, mcq, mrq, rating) self._standard_filling(answer, mcq, mrq, rating, completion)
self.click_submit(mentoring) self.click_submit(mentoring)
self._standard_checks(answer, mcq, mrq, rating, messages) self._standard_checks(answer, mcq, mrq, rating, completion, messages)
# Now reload the page... # Now reload the page...
mentoring = self.reload_student_view() mentoring = self.reload_student_view()
answer, mcq, mrq, rating = self._get_controls(mentoring) answer, mcq, mrq, rating, completion = self._get_controls(mentoring)
messages = self._get_messages_element(mentoring) messages = self._get_messages_element(mentoring)
submit = self._get_submit(mentoring) submit = self._get_submit(mentoring)
# ... and see if previous answers, results, feedback are shown/hidden correctly # ... and see if previous answers, results, feedback are shown/hidden correctly
getattr(self, after_reload_checks)(answer, mcq, mrq, rating, messages) getattr(self, after_reload_checks)(answer, mcq, mrq, rating, completion, messages)
# After reloading, submit is enabled only when: # After reloading, submit is enabled only when:
# - feedback is hidden; and # - feedback is hidden; and
...@@ -370,7 +395,7 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -370,7 +395,7 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
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")
answer, mcq, mrq, rating = self._get_controls(mentoring) answer, mcq, mrq, rating, completion = self._get_controls(mentoring)
messages = self._get_messages_element(mentoring) messages = self._get_messages_element(mentoring)
answer.send_keys('This is the answer') answer.send_keys('This is the answer')
...@@ -380,6 +405,7 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -380,6 +405,7 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
self.click_choice(mrq, "Its gracefulness") self.click_choice(mrq, "Its gracefulness")
self.click_choice(mrq, "Its beauty") self.click_choice(mrq, "Its beauty")
self.click_choice(rating, "4") self.click_choice(rating, "4")
completion.click()
self.click_submit(mentoring) self.click_submit(mentoring)
# precondition - verifying 100% score achieved # precondition - verifying 100% score achieved
...@@ -396,23 +422,24 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -396,23 +422,24 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
self._assert_feedback_shown(mrq, 2, "This MRQ is indeed very graceful", click_choice_result=True) self._assert_feedback_shown(mrq, 2, "This MRQ is indeed very graceful", click_choice_result=True)
self._assert_feedback_shown(mrq, 3, "Nah, there aren't any!", click_choice_result=True) self._assert_feedback_shown(mrq, 3, "Nah, there aren't any!", click_choice_result=True)
self._assert_feedback_shown(rating, 3, "I love good grades.", click_choice_result=True) self._assert_feedback_shown(rating, 3, "I love good grades.", click_choice_result=True)
self.assertTrue(completion.is_selected())
self.assertTrue(messages.is_displayed()) self.assertTrue(messages.is_displayed())
self.assertEqual(messages.text, "FEEDBACK\nAll Good") self.assertEqual(messages.text, "FEEDBACK\nAll Good")
self._clear_filling(answer, mcq, mrq, rating) self._clear_filling(answer, mcq, mrq, rating, completion)
self._standard_filling(answer, mcq, mrq, rating) self._standard_filling(answer, mcq, mrq, rating, completion)
self.click_submit(mentoring) self.click_submit(mentoring)
self._standard_checks(answer, mcq, mrq, rating, messages) self._standard_checks(answer, mcq, mrq, rating, completion, messages)
# now, reload the page and make sure LATEST submission is loaded and feedback is shown # now, reload the page and make sure LATEST submission is loaded and feedback is shown
mentoring = self.reload_student_view() mentoring = self.reload_student_view()
answer, mcq, mrq, rating = self._get_controls(mentoring) answer, mcq, mrq, rating, completion = 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, completion, messages)
def test_partial_mrq_is_not_completed(self): def test_partial_mrq_is_not_completed(self):
mentoring = self.load_scenario("feedback_persistence.xml") mentoring = self.load_scenario("feedback_persistence.xml")
answer, mcq, mrq, rating = self._get_controls(mentoring) answer, mcq, mrq, rating, completion = self._get_controls(mentoring)
messages = self._get_messages_element(mentoring) messages = self._get_messages_element(mentoring)
answer.send_keys('This is the answer') answer.send_keys('This is the answer')
...@@ -421,9 +448,10 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -421,9 +448,10 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
self.click_choice(mrq, "Its elegance") self.click_choice(mrq, "Its elegance")
self.click_choice(mrq, "Its gracefulness") self.click_choice(mrq, "Its gracefulness")
self.click_choice(rating, "4") self.click_choice(rating, "4")
completion.click()
self.click_submit(mentoring) self.click_submit(mentoring)
def assert_state(answer, mcq, mrq, rating, messages): def assert_state(answer, mcq, mrq, rating, completion, messages):
self.wait_until_visible(messages) self.wait_until_visible(messages)
self.assertEqual(answer.get_attribute('value'), 'This is the answer') self.assertEqual(answer.get_attribute('value'), 'This is the answer')
self._assert_feedback_shown(mcq, 0, "Great!", click_choice_result=True) self._assert_feedback_shown(mcq, 0, "Great!", click_choice_result=True)
...@@ -438,16 +466,17 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest): ...@@ -438,16 +466,17 @@ class ProblemBuilderQuestionnaireBlockTest(ProblemBuilderBaseTest):
self._assert_feedback_shown(mrq, 2, "This MRQ is indeed very graceful", click_choice_result=True) self._assert_feedback_shown(mrq, 2, "This MRQ is indeed very graceful", click_choice_result=True)
self._assert_feedback_shown(mrq, 3, "Nah, there aren't any!", click_choice_result=True) self._assert_feedback_shown(mrq, 3, "Nah, there aren't any!", click_choice_result=True)
self._assert_feedback_shown(rating, 3, "I love good grades.", click_choice_result=True) self._assert_feedback_shown(rating, 3, "I love good grades.", click_choice_result=True)
self.assertTrue(completion.is_selected())
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")
assert_state(answer, mcq, mrq, rating, messages) assert_state(answer, mcq, mrq, rating, completion, messages)
# now, reload the page and make sure the same result is shown # now, reload the page and make sure the same result is shown
mentoring = self.reload_student_view() mentoring = self.reload_student_view()
answer, mcq, mrq, rating = self._get_controls(mentoring) answer, mcq, mrq, rating, completion = self._get_controls(mentoring)
messages = self._get_messages_element(mentoring) messages = self._get_messages_element(mentoring)
assert_state(answer, mcq, mrq, rating, messages) assert_state(answer, mcq, mrq, rating, completion, messages)
@ddt.unpack @ddt.unpack
@ddt.data( @ddt.data(
......
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
<pb-tip values='["notwant"]'>Your loss!</pb-tip> <pb-tip values='["notwant"]'>Your loss!</pb-tip>
</pb-rating> </pb-rating>
<pb-completion name="completion_1" question="Did you attend the meeting?" answer="Yes, I did." />
<pb-message type="completed">All Good</pb-message> <pb-message type="completed">All Good</pb-message>
<pb-message type="incomplete">Not done yet</pb-message> <pb-message type="incomplete">Not done yet</pb-message>
</problem-builder> </problem-builder>
......
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