MDL-66489 enrol: Send all form data to WS and do all busines logic there

It is discouraged to use JS Date functions. We should pass all raw data to PHP.
This commit is contained in:
Shamim Rezaie 2019-08-28 00:51:47 +10:00
parent 310d6901f9
commit 2d4ce64dde
8 changed files with 247 additions and 45 deletions

View file

@ -958,6 +958,155 @@ class core_enrol_externallib_testcase extends externallib_advanced_testcase {
$this->assertEquals(ENROL_USER_SUSPENDED, $ue->status);
}
/**
* dataProvider for test_submit_user_enrolment_form().
*/
public function submit_user_enrolment_form_provider() {
$now = new DateTime();
$nextmonth = clone($now);
$nextmonth->add(new DateInterval('P1M'));
return [
'Invalid data' => [
'customdata' => [
'status' => ENROL_USER_ACTIVE,
'timestart' => [
'day' => $now->format('j'),
'month' => $now->format('n'),
'year' => $now->format('Y'),
'hour' => $now->format('G'),
'minute' => 0,
'enabled' => 1,
],
'timeend' => [
'day' => $now->format('j'),
'month' => $now->format('n'),
'year' => $now->format('Y'),
'hour' => $now->format('G'),
'minute' => 0,
'enabled' => 1,
],
],
'expectedresult' => false,
'validationerror' => true,
],
'Valid data' => [
'customdata' => [
'status' => ENROL_USER_ACTIVE,
'timestart' => [
'day' => $now->format('j'),
'month' => $now->format('n'),
'year' => $now->format('Y'),
'hour' => $now->format('G'),
'minute' => 0,
'enabled' => 1,
],
'timeend' => [
'day' => $nextmonth->format('j'),
'month' => $nextmonth->format('n'),
'year' => $nextmonth->format('Y'),
'hour' => $nextmonth->format('G'),
'minute' => 0,
'enabled' => 1,
],
],
'expectedresult' => true,
'validationerror' => false
],
'Suspend user' => [
'customdata' => [
'status' => ENROL_USER_SUSPENDED,
],
'expectedresult' => true,
'validationerror' => false
],
];
}
/**
* @param array $customdata The data we are providing to the webservice.
* @param bool $expectedresult The result we are expecting to receive from the webservice.
* @param bool $validationerror The validationerror we are expecting to receive from the webservice.
* @dataProvider submit_user_enrolment_form_provider
*/
public function test_submit_user_enrolment_form($customdata, $expectedresult, $validationerror) {
global $CFG, $DB;
$this->resetAfterTest(true);
$datagen = $this->getDataGenerator();
/** @var enrol_manual_plugin $manualplugin */
$manualplugin = enrol_get_plugin('manual');
$studentroleid = $DB->get_field('role', 'id', ['shortname' => 'student'], MUST_EXIST);
$teacherroleid = $DB->get_field('role', 'id', ['shortname' => 'editingteacher'], MUST_EXIST);
$course = $datagen->create_course();
$user = $datagen->create_user();
$teacher = $datagen->create_user();
$instanceid = null;
$instances = enrol_get_instances($course->id, true);
foreach ($instances as $inst) {
if ($inst->enrol == 'manual') {
$instanceid = (int)$inst->id;
break;
}
}
if (empty($instanceid)) {
$instanceid = $manualplugin->add_default_instance($course);
if (empty($instanceid)) {
$instanceid = $manualplugin->add_instance($course);
}
}
$this->assertNotNull($instanceid);
$instance = $DB->get_record('enrol', ['id' => $instanceid], '*', MUST_EXIST);
$manualplugin->enrol_user($instance, $user->id, $studentroleid, 0, 0, ENROL_USER_ACTIVE);
$manualplugin->enrol_user($instance, $teacher->id, $teacherroleid, 0, 0, ENROL_USER_ACTIVE);
$ueid = (int) $DB->get_field(
'user_enrolments',
'id',
['enrolid' => $instance->id, 'userid' => $user->id],
MUST_EXIST
);
// Login as teacher.
$teacher->ignoresesskey = true;
$this->setUser($teacher);
$formdata = [
'ue' => $ueid,
'ifilter' => 0,
'status' => null,
'timestart' => null,
'duration' => null,
'timeend' => null,
];
$formdata = array_merge($formdata, $customdata);
require_once("$CFG->dirroot/enrol/editenrolment_form.php");
$formdata = enrol_user_enrolment_form::mock_generate_submit_keys($formdata);
$querystring = http_build_query($formdata, '', '&');
$result = external_api::clean_returnvalue(
core_enrol_external::submit_user_enrolment_form_returns(),
core_enrol_external::submit_user_enrolment_form($querystring)
);
$this->assertEquals(
['result' => $expectedresult, 'validationerror' => $validationerror],
$result,
'', 0.0, 10, true);
if ($result['result']) {
$ue = $DB->get_record('user_enrolments', ['id' => $ueid], '*', MUST_EXIST);
$this->assertEquals($formdata['status'], $ue->status);
}
}
/**
* Test for core_enrol_external::unenrol_user_enrolment().
*/