/** * Reset user submitted questions * * This function resets the quiz data for a user that has been submitted fro grading already. It is different to * the save_user_answers as currently the saved and submitted answers are stored differently. * * @since 1.7.4 * @access public * * @return bool $reset_success * @param int $user_id * @param int $lesson_id */ public function reset_user_lesson_data($lesson_id, $user_id = 0) { //make sure the parameters are valid if (empty($lesson_id) || empty($user_id) || 'lesson' != get_post_type($lesson_id) || !get_userdata($user_id)) { return false; } //get the users lesson status to make $user_lesson_status = Sensei_Utils::user_lesson_status($lesson_id, $user_id); if (!isset($user_lesson_status->comment_ID)) { // this user is not taking this lesson so this process is not needed return false; } //get the lesson quiz and course $quiz_id = Sensei()->lesson->lesson_quizzes($lesson_id); $course_id = Sensei()->lesson->get_course_id($lesson_id); // reset the transients $answers_transient_key = 'sensei_answers_' . $user_id . '_' . $lesson_id; $grades_transient_key = 'quiz_grades_' . $user_id . '_' . $lesson_id; $answers_feedback_transient_key = 'sensei_answers_feedback_' . $user_id . '_' . $lesson_id; delete_transient($answers_transient_key); delete_transient($grades_transient_key); delete_transient($answers_feedback_transient_key); // reset the quiz answers and feedback notes $deleted_answers = Sensei_Utils::delete_user_data('quiz_answers', $lesson_id, $user_id); $deleted_grades = Sensei_Utils::delete_user_data('quiz_grades', $lesson_id, $user_id); $deleted_user_feedback = Sensei_Utils::delete_user_data('quiz_answers_feedback', $lesson_id, $user_id); // Delete quiz answers, this auto deletes the corresponding meta data, such as the question/answer grade Sensei_Utils::sensei_delete_quiz_answers($quiz_id, $user_id); Sensei_Utils::update_lesson_status($user_id, $lesson_id, 'in-progress', array('questions_asked' => '', 'grade' => '')); // Update course completion Sensei_Utils::update_course_status($user_id, $course_id); // Run any action on quiz/lesson reset (previously this didn't occur on resetting a quiz, see resetting a lesson in sensei_complete_lesson() do_action('sensei_user_lesson_reset', $user_id, $lesson_id); Sensei()->frontend->messages = '<div class="sensei-message note">' . __('Quiz Reset Successfully.', 'woothemes-sensei') . '</div>'; return $deleted_answers && $deleted_grades; }
/** * This test Sensei()->quiz->get_user_question_feedback */ public function testGetUserQuestionFeedback() { // does this function add_user_data exist? $this->assertTrue(method_exists(Sensei()->quiz, 'get_user_question_feedback'), 'The utils class function `get_user_question_feedback` does not exist '); // does it return false for invalid data $invalid_data_message = 'This get_user_question_feedback function does not check false data correctly'; $this->assertFalse(Sensei()->quiz->get_user_question_feedback('', '', ''), $invalid_data_message); $this->assertFalse(Sensei()->quiz->get_user_question_feedback(' ', ' ', ' '), $invalid_data_message); $this->assertFalse(Sensei()->quiz->get_user_question_feedback(-2, -3, -1), $invalid_data_message); $this->assertFalse(Sensei()->quiz->get_user_question_feedback(3000, 5000, 5000), $invalid_data_message); // setup the next assertion $test_user_id = wp_create_user('studentQuestionFeedback', 'studentQuestionFeedback', '*****@*****.**'); $test_lesson_id = $this->factory->get_random_lesson_id(); $test_quiz_id = Sensei()->lesson->lesson_quizzes($test_lesson_id); $test_user_answers_feedback = $this->factory->generate_user_answers_feedback($test_quiz_id); Sensei_Utils::sensei_start_lesson($test_lesson_id, $test_user_id); Sensei()->quiz->save_user_answers_feedback($test_user_answers_feedback, $test_lesson_id, $test_user_id); $test_question_id = array_rand($test_user_answers_feedback); $retrieved_grade = Sensei()->quiz->get_user_question_feedback($test_lesson_id, $test_question_id, $test_user_id); //test if the the question grade can be retrieved $this->assertEquals($test_user_answers_feedback[$test_question_id], $retrieved_grade, 'The feedback retrieved is not equal to the one that was set for this question ID'); //setup the next assertion for backwards compatibility. $transient_key = 'sensei_answers_feedback_' . $test_user_id . '_' . $test_lesson_id; delete_transient($transient_key); Sensei_Utils::delete_user_data('quiz_answers_feedback', $test_lesson_id, $test_user_id); $random_question_id = array_rand($test_user_answers_feedback); $old_data_args = array('post_id' => $random_question_id, 'user_id' => $test_user_id, 'type' => 'sensei_user_answer', 'data' => 'test answer feedback'); $old_data_activity_id = Sensei_Utils::sensei_log_activity($old_data_args); update_comment_meta($old_data_activity_id, 'answer_note', base64_encode('Sensei sample feedback')); $retrieved_feedback = Sensei()->quiz->get_user_question_feedback($test_lesson_id, $random_question_id, $test_user_id); // Does the fall back to 1.7.3 data work? $this->assertEquals('Sensei sample feedback', $retrieved_feedback, 'The get user feedback does not fall back the old data'); }