AutorÃa | Ultima modificación | Ver Log |
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Workshop activity-related unit tests for Completion Progress block.
*
* @package block_completion_progress
* @copyright 2020 Jonathon Fowler <fowlerj@usq.edu.au>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace block_completion_progress;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot.'/mod/workshop/locallib.php');
require_once($CFG->dirroot.'/mod/workshop/tests/fixtures/testable.php');
use block_completion_progress\completion_progress;
use block_completion_progress\defaults;
/**
* Workshop activity-related unit tests for Completion Progress block.
*
* @package block_completion_progress
* @copyright 2020 Jonathon Fowler <fowlerj@usq.edu.au>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class workshop_completion_test extends \block_completion_progress\tests\completion_testcase {
/**
* Test completion determination in a Workshop activity with pass/fail enabled.
* @covers \block_completion_progress\completion_progress
*/
public function test_workshop_passfail() {
$this->setAdminUser();
$generator = $this->getDataGenerator();
$instance = $generator->create_module('workshop', [
'course' => $this->course->id,
'grade' => 80,
'gradinggrade' => 20,
'completion' => COMPLETION_TRACKING_AUTOMATIC,
'completionusegrade' => 1, // The student must receive a grade to complete.
'completionexpected' => time() - DAYSECS,
]);
$cm = get_coursemodule_from_id('workshop', $instance->cmid);
// Set the passing grades for submission and assessment.
$item = \grade_item::fetch(['courseid' => $this->course->id, 'itemtype' => 'mod',
'itemmodule' => 'workshop', 'iteminstance' => $instance->id, 'itemnumber' => 0,
'outcomeid' => null]);
$item->gradepass = 40;
$item->update();
$workshop = new \testable_workshop($instance, $cm, $this->course);
// Student 1 submits to the activity and gets graded correct.
$student1 = $generator->create_and_enrol($this->course, 'student');
$this->assert_progress_completion($student1, $cm, COMPLETION_INCOMPLETE);
$submission1 = $this->submit_for_student($student1, $workshop);
$this->assert_progress_completion($student1, $cm, 'submitted');
$this->grade_submission($submission1, $workshop, 75); // Pass.
$this->assert_progress_completion($student1, $cm, 'submitted');
$workshop->switch_phase(\testable_workshop::PHASE_CLOSED);
$this->assert_progress_completion($student1, $cm, COMPLETION_COMPLETE_PASS);
// Student 2 submits to the activity and gets graded incorrect.
$student2 = $generator->create_and_enrol($this->course, 'student');
$this->assert_progress_completion($student2, $cm, COMPLETION_INCOMPLETE);
$submission2 = $this->submit_for_student($student2, $workshop);
$this->assert_progress_completion($student2, $cm, 'submitted');
$this->grade_submission($submission2, $workshop, 25); // Fail.
$this->assert_progress_completion($student2, $cm, 'submitted');
$workshop->switch_phase(\testable_workshop::PHASE_CLOSED);
$this->assert_progress_completion($student2, $cm, COMPLETION_COMPLETE_FAIL);
}
/**
* Test completion determination in an Workshop activity with basic completion.
* @covers \block_completion_progress\completion_progress
*/
public function test_workshop_basic() {
$this->setAdminUser();
$generator = $this->getDataGenerator();
$instance = $generator->create_module('workshop', [
'course' => $this->course->id,
'grade' => 80,
'gradinggrade' => 20,
'completion' => COMPLETION_TRACKING_AUTOMATIC,
'completionusegrade' => 1, // The student must receive a grade to complete.
'completionexpected' => time() - DAYSECS,
]);
$cm = get_coursemodule_from_id('workshop', $instance->cmid);
$workshop = new \testable_workshop($instance, $cm, $this->course);
// Student 1 submits to the activity and gets graded correctly.
$student1 = $generator->create_and_enrol($this->course, 'student');
$this->assert_progress_completion($student1, $cm, COMPLETION_INCOMPLETE);
$submission1 = $this->submit_for_student($student1, $workshop);
$this->assert_progress_completion($student1, $cm, 'submitted');
$this->grade_submission($submission1, $workshop, 75); // Pass.
$this->assert_progress_completion($student1, $cm, 'submitted');
$workshop->switch_phase(\testable_workshop::PHASE_CLOSED);
$this->assert_progress_completion($student1, $cm, COMPLETION_COMPLETE);
// Student 2 submits to the activity and gets graded incorrectly.
$student2 = $generator->create_and_enrol($this->course, 'student');
$this->assert_progress_completion($student2, $cm, COMPLETION_INCOMPLETE);
$submission2 = $this->submit_for_student($student2, $workshop);
$this->assert_progress_completion($student2, $cm, 'submitted');
$this->grade_submission($submission2, $workshop, 25); // Fail.
$this->assert_progress_completion($student2, $cm, 'submitted');
$workshop->switch_phase(\testable_workshop::PHASE_CLOSED);
$this->assert_progress_completion($student2, $cm, COMPLETION_COMPLETE);
}
/**
* Make a submission for a student.
*
* @param object $student
* @param object $workshop
* @return object
*/
protected function submit_for_student($student, $workshop) {
global $DB;
$generator = $this->getDataGenerator()->get_plugin_generator('mod_workshop');
$id = $generator->create_submission($workshop->id, $student->id, array(
'title' => 'Submission',
));
return $DB->get_record('workshop_submissions', ['id' => $id]);
}
/**
* Award a grade to a submission.
*
* @param object $submission
* @param object $workshop
* @param integer $grade
* @return object
*/
protected function grade_submission($submission, $workshop, $grade) {
$workshop->aggregate_submission_grades_process([
(object)['submissionid' => $submission->id, 'submissiongrade' => null,
'weight' => 1, 'grade' => $grade],
]);
}
}