MDL-77781 core_completion: Completion view must be deleted too

When resetting a course, completion view entries should also be
deleted

Co-authored-by: Georg Moser <georg@moser.link>
This commit is contained in:
Laurent David 2023-04-20 07:28:54 +02:00 committed by Sara Arjona
parent d1c24b02ab
commit 9117af48ac
2 changed files with 46 additions and 1 deletions

View File

@ -928,7 +928,9 @@ class completion_info {
$DB->delete_records_select('course_modules_completion',
'coursemoduleid IN (SELECT id FROM {course_modules} WHERE course=?)',
array($this->course_id));
$DB->delete_records_select('course_modules_viewed',
'coursemoduleid IN (SELECT id FROM {course_modules} WHERE course=?)',
[$this->course_id]);
// Wipe course completion data too.
$this->delete_course_completion_data();
}

View File

@ -1997,6 +1997,49 @@ class completionlib_test extends advanced_testcase {
$this->assertEquals(1, count($completions));
$this->assertEquals(reset($completions)->id, $completionid);
}
/**
* Test that data is cleaned when we reset a course completion data
*
* @covers ::delete_all_completion_data
*/
public function test_course_reset_completion() {
global $DB;
$this->setup_data();
$page = $this->getDataGenerator()->create_module('page', [
'course' => $this->course->id,
'completion' => COMPLETION_ENABLED,
'completionview' => COMPLETION_VIEW_REQUIRED,
]);
$cm = cm_info::create(get_coursemodule_from_instance('page', $page->id));
$completion = new completion_info($this->course);
$completion->set_module_viewed($cm, $this->user->id);
// Sanity test.
$this->assertTrue($DB->record_exists_select('course_modules_completion',
'coursemoduleid IN (SELECT id FROM {course_modules} WHERE course=:course)',
['course' => $this->course->id]
));
$this->assertTrue($DB->record_exists_select('course_modules_viewed',
'coursemoduleid IN (SELECT id FROM {course_modules} WHERE course=:course)',
['course' => $this->course->id]
));
// Deleting the prerequisite course should remove the completion criteria.
$resetdata = new \stdClass();
$resetdata->id = $this->course->id;
$resetdata->reset_completion = true;
reset_course_userdata($resetdata);
$this->assertFalse($DB->record_exists_select('course_modules_completion',
'coursemoduleid IN (SELECT id FROM {course_modules} WHERE course=:course)',
['course' => $this->course->id]
));
$this->assertFalse($DB->record_exists_select('course_modules_viewed',
'coursemoduleid IN (SELECT id FROM {course_modules} WHERE course=:course)',
['course' => $this->course->id]
));
}
}
class core_completionlib_fake_recordset implements Iterator {