Ir a la última revisión | Autoría | Comparar con el anterior | 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/>.namespace workshopallocation_scheduled;/*** Test for the scheduled allocator.** @package workshopallocation_scheduled* @copyright 2020 Jaume I University <https://www.uji.es/>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/class scheduled_allocator_test extends \advanced_testcase {/** @var \stdClass $course The course where the tests will be run */private $course;/** @var \workshop $workshop The workshop where the tests will be run */private $workshop;/** @var \stdClass $workshopcm The workshop course module instance */private $workshopcm;/** @var \stdClass[] $students An array of student enrolled in $course */private $students;/*** Tests that student submissions get automatically alocated after the submission deadline and when the workshop* "Switch to the next phase after the submissions deadline" checkbox is active.*/public function test_that_allocator_in_executed_on_submission_end_when_phaseswitchassessment_is_active(): void {global $DB;$this->resetAfterTest();$this->setup_test_course_and_workshop();$this->activate_switch_to_the_next_phase_after_submission_deadline();$this->set_the_submission_deadline_in_the_past();$this->activate_the_scheduled_allocator();$workshopgenerator = $this->getDataGenerator()->get_plugin_generator('mod_workshop');\core\cron::setup_user();// Let the students add submissions.$this->workshop->switch_phase(\workshop::PHASE_SUBMISSION);// Create some submissions.foreach ($this->students as $student) {$workshopgenerator->create_submission($this->workshop->id, $student->id);}// No allocations yet.$this->assertEmpty($this->workshop->get_allocations());/* Execute the tasks that will do the transition and allocation thing.* We expect the workshop cron to do the whole work: change the phase and* allocate the submissions.*/$this->execute_workshop_cron_task();$workshopdb = $DB->get_record('workshop', ['id' => $this->workshop->id]);$workshop = new \workshop($workshopdb, $this->workshopcm, $this->course);$this->assertEquals(\workshop::PHASE_ASSESSMENT, $workshop->phase);$this->assertNotEmpty($workshop->get_allocations());}/*** No allocations are performed if the allocator is not enabled.*/public function test_that_allocator_is_not_executed_when_its_not_active(): void {global $DB;$this->resetAfterTest();$this->setup_test_course_and_workshop();$this->activate_switch_to_the_next_phase_after_submission_deadline();$this->set_the_submission_deadline_in_the_past();$workshopgenerator = $this->getDataGenerator()->get_plugin_generator('mod_workshop');\core\cron::setup_user();// Let the students add submissions.$this->workshop->switch_phase(\workshop::PHASE_SUBMISSION);// Create some submissions.foreach ($this->students as $student) {$workshopgenerator->create_submission($this->workshop->id, $student->id);}// No allocations yet.$this->assertEmpty($this->workshop->get_allocations());// Transition to the assessment phase.$this->execute_workshop_cron_task();$workshopdb = $DB->get_record('workshop', ['id' => $this->workshop->id]);$workshop = new \workshop($workshopdb, $this->workshopcm, $this->course);// No allocations too.$this->assertEquals(\workshop::PHASE_ASSESSMENT, $workshop->phase);$this->assertEmpty($workshop->get_allocations());}/*** Activates and configures the scheduled allocator for the workshop.*/private function activate_the_scheduled_allocator(): void {$settings = \workshop_random_allocator_setting::instance_from_object((object)['numofreviews' => count($this->students),'numper' => 1,'removecurrentuser' => true,'excludesamegroup' => false,'assesswosubmission' => true,'addselfassessment' => false]);$allocator = new \workshop_scheduled_allocator($this->workshop);$storesettingsmethod = new \ReflectionMethod('workshop_scheduled_allocator', 'store_settings');$storesettingsmethod->invoke($allocator, true, true, $settings, new \workshop_allocation_result($allocator));}/*** Creates a minimum common setup to execute tests:*/protected function setup_test_course_and_workshop(): void {$this->setAdminUser();$datagenerator = $this->getDataGenerator();$this->course = $datagenerator->create_course();$this->students = [];for ($i = 0; $i < 10; $i++) {$this->students[] = $datagenerator->create_and_enrol($this->course);}$workshopdb = $datagenerator->create_module('workshop', ['course' => $this->course,'name' => 'Test Workshop',]);$this->workshopcm = get_coursemodule_from_instance('workshop', $workshopdb->id, $this->course->id, false, MUST_EXIST);$this->workshop = new \workshop($workshopdb, $this->workshopcm, $this->course);}/*** Executes the workshop cron task.*/protected function execute_workshop_cron_task(): void {ob_start();$cron = new \mod_workshop\task\cron_task();$cron->execute();ob_end_clean();}/*** Executes the scheduled allocator cron task.*/protected function execute_allocator_cron_task(): void {ob_start();$cron = new \workshopallocation_scheduled\task\cron_task();$cron->execute();ob_end_clean();}/*** Activates the "Switch to the next phase after the submissions deadline" flag in the workshop.*/protected function activate_switch_to_the_next_phase_after_submission_deadline(): void {global $DB;$DB->set_field('workshop', 'phaseswitchassessment', 1, ['id' => $this->workshop->id]);}/*** Sets the submission deadline in a past time.*/protected function set_the_submission_deadline_in_the_past(): void {global $DB;$DB->set_field('workshop', 'submissionend', time() - 1, ['id' => $this->workshop->id]);}}