MDL-56233 forms library: Fixed form identifier when mocking a form.

If the plugin is using namespaces instead of frankenstyle class name,
get_called_class() will return 'type\name' instead of 'type_name'.

Added code to replace backslashes to underscores and fix that issue.
This commit is contained in:
Daniel Thee Roperto 2016-10-03 18:23:06 +11:00
parent b182239f21
commit 518eb19337
3 changed files with 67 additions and 0 deletions

View File

@ -1362,6 +1362,7 @@ abstract class moodleform {
$_FILES = $simulatedsubmittedfiles;
if ($formidentifier === null) {
$formidentifier = get_called_class();
$formidentifier = str_replace('\\', '_', $formidentifier); // See MDL-56233 for more information.
}
$simulatedsubmitteddata['_qf__'.$formidentifier] = 1;
$simulatedsubmitteddata['sesskey'] = sesskey();

49
lib/tests/fixtures/namespaced_form.php vendored Normal file
View File

@ -0,0 +1,49 @@
<?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/>.
/**
* A form inside a namespace to be used by unit tests.
*
* See issue MDL-56233
*
* @package core
* @author Daniel Thee Roperto <daniel.roperto@catalyst-au.net>
* @copyright 2016 Catalyst IT
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace local_unittests\namespaced_form;
defined('MOODLE_INTERNAL') || die();
/**
* exampleform class.
*
* @package core
* @author Daniel Thee Roperto <daniel.roperto@catalyst-au.net>
* @copyright 2016 Catalyst IT
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class exampleform extends \moodleform {
/**
* Create a simple form definition.
*/
public function definition() {
$mform = $this->_form;
$mform->addElement('text', 'title', 'title_value');
$mform->setType('title', PARAM_TEXT);
}
}

View File

@ -629,6 +629,23 @@ class core_formslib_testcase extends advanced_testcase {
$this->assertFalse($form->is_validated());
$this->assertNull($form->get_data());
}
/**
* MDL-56233 - Tests mocking a form inside a namespace.
*/
public function test_mock_submit() {
require_once(__DIR__.'/fixtures/namespaced_form.php');
\local_unittests\namespaced_form\exampleform::mock_submit(['title' => 'Mocked Value']);
$form = new \local_unittests\namespaced_form\exampleform();
// Here is the problem, this is the expected hidden field name.
$expected = '_qf__local_unittests_namespaced_form_exampleform';
self::assertArrayHasKey($expected, $_POST);
// This should work now, before it would fail.
self::assertTrue($form->is_submitted());
self::assertSame('Mocked Value', $form->get_data()->title);
}
}