Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.3.x will end 7 October 2024 (12 months).
  • Bug fixes for security issues in 4.3.x will end 21 April 2025 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.2.x is supported too.

Differences Between: [Versions 311 and 403] [Versions 400 and 403] [Versions 401 and 403]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * Auth email external functions tests.
  19   *
  20   * @package    auth_email
  21   * @category   external
  22   * @copyright  2016 Juan Leyva
  23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  24   * @since      Moodle 3.2
  25   */
  26  
  27  namespace auth_email\external;
  28  
  29  use auth_email_external;
  30  use externallib_advanced_testcase;
  31  
  32  defined('MOODLE_INTERNAL') || die();
  33  
  34  global $CFG;
  35  
  36  require_once($CFG->dirroot . '/webservice/tests/helpers.php');
  37  
  38  /**
  39   * External auth email API tests.
  40   *
  41   * @package     auth_email
  42   * @copyright   2016 Juan Leyva
  43   * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  44   * @since       Moodle 3.2
  45   */
  46  class external_test extends externallib_advanced_testcase {
  47  
  48      /** @var int custom profile field1 ID. */
  49      protected $field1;
  50  
  51      /** @var int custom profile field2 ID. */
  52      protected $field2;
  53  
  54      /**
  55       * Set up for every test
  56       */
  57      public function setUp(): void {
  58          global $CFG;
  59  
  60          $this->resetAfterTest(true);
  61          $CFG->registerauth = 'email';
  62  
  63          $this->field1 = $this->getDataGenerator()->create_custom_profile_field(array(
  64                  'shortname' => 'frogname', 'name' => 'Name of frog',
  65                  'datatype' => 'text', 'signup' => 1, 'visible' => 1, 'required' => 1, 'sortorder' => 1))->id;
  66          $this->field2 = $this->getDataGenerator()->create_custom_profile_field(array(
  67                  'shortname' => 'sometext', 'name' => 'Some text in textarea',
  68                  'datatype' => 'textarea', 'signup' => 1, 'visible' => 1, 'required' => 1, 'sortorder' => 2))->id;
  69      }
  70  
  71      public function test_get_signup_settings() {
  72          global $CFG;
  73  
  74          $CFG->defaultcity = 'Bcn';
  75          $CFG->country = 'ES';
  76          $CFG->sitepolicy = 'https://moodle.org';
  77  
  78          $result = auth_email_external::get_signup_settings();
  79          $result = \core_external\external_api::clean_returnvalue(auth_email_external::get_signup_settings_returns(), $result);
  80  
  81          // Check expected data.
  82          $this->assertEquals(array('firstname', 'lastname'), $result['namefields']);
  83          $this->assertEquals($CFG->defaultcity, $result['defaultcity']);
  84          $this->assertEquals($CFG->country, $result['country']);
  85          $this->assertEquals($CFG->sitepolicy, $result['sitepolicy']);
  86          $this->assertEquals(print_password_policy(), $result['passwordpolicy']);
  87          $this->assertNotContains('recaptchachallengehash', $result);
  88          $this->assertNotContains('recaptchachallengeimage', $result);
  89  
  90          // Whip up a array with named entries to easily check against.
  91          $namedarray = array();
  92          foreach ($result['profilefields'] as $key => $value) {
  93              $namedarray[$value['shortname']] = array(
  94                  'datatype' => $value['datatype']
  95              );
  96          }
  97  
  98          // Just check if we have the fields from this test. If a plugin adds fields we'll let it slide.
  99          $this->assertArrayHasKey('frogname', $namedarray);
 100          $this->assertArrayHasKey('sometext', $namedarray);
 101  
 102          $this->assertEquals('text', $namedarray['frogname']['datatype']);
 103          $this->assertEquals('textarea', $namedarray['sometext']['datatype']);
 104      }
 105  
 106      /**
 107       * Test get_signup_settings with mathjax in a profile field.
 108       */
 109      public function test_get_signup_settings_with_mathjax_in_profile_fields() {
 110          // Enable MathJax filter in content and headings.
 111          $this->configure_filters([
 112              ['name' => 'mathjaxloader', 'state' => TEXTFILTER_ON, 'move' => -1, 'applytostrings' => true],
 113          ]);
 114  
 115          // Create category with MathJax and a new field with MathJax.
 116          $categoryname = 'Cat $$(a+b)=2$$';
 117          $fieldname = 'Some text $$(a+b)=2$$';
 118          $categoryid = $this->getDataGenerator()->create_custom_profile_field_category(['name' => $categoryname])->id;
 119          $this->getDataGenerator()->create_custom_profile_field(array(
 120                  'shortname' => 'mathjaxname', 'name' => $fieldname, 'categoryid' => $categoryid,
 121                  'datatype' => 'textarea', 'signup' => 1, 'visible' => 1, 'required' => 1, 'sortorder' => 2));
 122  
 123          $result = auth_email_external::get_signup_settings();
 124          $result = \core_external\external_api::clean_returnvalue(auth_email_external::get_signup_settings_returns(), $result);
 125  
 126          // Format the original data.
 127          $sitecontext = \context_system::instance();
 128          $categoryname = \core_external\util::format_string($categoryname, $sitecontext->id);
 129          $fieldname = \core_external\util::format_string($fieldname, $sitecontext->id);
 130  
 131          // Whip up a array with named entries to easily check against.
 132          $namedarray = array();
 133          foreach ($result['profilefields'] as $key => $value) {
 134              $namedarray[$value['shortname']] = $value;
 135          }
 136  
 137          // Check the new profile field.
 138          $this->assertArrayHasKey('mathjaxname', $namedarray);
 139          $this->assertStringContainsString('<span class="filter_mathjaxloader_equation">',
 140                  $namedarray['mathjaxname']['categoryname']);
 141          $this->assertStringContainsString('<span class="filter_mathjaxloader_equation">',
 142                  $namedarray['mathjaxname']['name']);
 143          $this->assertEquals($categoryname, $namedarray['mathjaxname']['categoryname']);
 144          $this->assertEquals($fieldname, $namedarray['mathjaxname']['name']);
 145      }
 146  
 147      public function test_signup_user() {
 148          global $DB;
 149  
 150          $username = 'pepe';
 151          $password = 'abcdefAª.ªª!!3';
 152          $firstname = 'Pepe';
 153          $lastname = 'Pérez';
 154          $email = 'myemail@no.zbc';
 155          $city = 'Bcn';
 156          $country = 'ES';
 157          $customprofilefields = array(
 158              array(
 159                  'type' => 'text',
 160                  'name' => 'profile_field_frogname',
 161                  'value' => 'random text',
 162              ),
 163              array(
 164                  'type' => 'textarea',
 165                  'name' => 'profile_field_sometext',
 166                  'value' => json_encode(
 167                      array(
 168                          'text' => 'blah blah',
 169                          'format' => FORMAT_HTML
 170                      )
 171                  ),
 172              )
 173          );
 174  
 175          // Create new user.
 176          $result = auth_email_external::signup_user($username, $password, $firstname, $lastname, $email, $city,  $country,
 177                                                      '', '', $customprofilefields);
 178          $result = \core_external\external_api::clean_returnvalue(auth_email_external::signup_user_returns(), $result);
 179          $this->assertTrue($result['success']);
 180          $this->assertEmpty($result['warnings']);
 181          $user = $DB->get_record('user', array('username' => $username));
 182          $this->assertEquals($firstname, $user->firstname);
 183          $this->assertEquals($lastname, $user->lastname);
 184          $this->assertEquals($email, $user->email);
 185          $this->assertEquals($city, $user->city);
 186          $this->assertEquals($country, $user->country);
 187          $this->assertEquals(0, $user->confirmed);
 188          $this->assertEquals(current_language(), $user->lang);
 189          $this->assertEquals('email', $user->auth);
 190          $infofield = $DB->get_record('user_info_data', array('userid' => $user->id, 'fieldid' => $this->field1));
 191          $this->assertEquals($customprofilefields[0]['value'], $infofield->data);
 192          $infofield = $DB->get_record('user_info_data', array('userid' => $user->id, 'fieldid' => $this->field2));
 193          $this->assertEquals(json_decode($customprofilefields[1]['value'])->text, $infofield->data);
 194  
 195          // Try to create a user with the same username, email and password. We ommit also the profile fields.
 196          $password = 'abc';
 197          $result = auth_email_external::signup_user($username, $password, $firstname, $lastname, $email, $city,  $country,
 198                                                      '', '', $customprofilefields);
 199          $result = \core_external\external_api::clean_returnvalue(auth_email_external::signup_user_returns(), $result);
 200          $this->assertFalse($result['success']);
 201          $this->assertCount(3, $result['warnings']);
 202          $expectederrors = array('username', 'email', 'password');
 203          $finalerrors = [];
 204          foreach ($result['warnings'] as $warning) {
 205              $finalerrors[] = $warning['item'];
 206          }
 207          $this->assertEquals($expectederrors, $finalerrors);
 208  
 209          // Do not pass the required profile fields.
 210          $this->expectException('invalid_parameter_exception');
 211          $result = auth_email_external::signup_user($username, $password, $firstname, $lastname, $email, $city,  $country);
 212      }
 213  }