forked from moodle/moodle
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'MDL-68944-master' of https://github.com/juancs/moodle
- Loading branch information
Showing
8 changed files
with
481 additions
and
50 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
200 changes: 200 additions & 0 deletions
200
mod/workshop/allocation/scheduled/tests/scheduled_allocator_test.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,200 @@ | ||
<?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'); | ||
|
||
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'); | ||
|
||
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->setAccessible(true); | ||
$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]); | ||
} | ||
} |
Oops, something went wrong.