[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/lib/tests/ -> component_test.php (source)

   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   * core_component related tests.
  19   *
  20   * @package    core
  21   * @category   phpunit
  22   * @copyright  2013 Petr Skoda {@link http://skodak.org}
  23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  24   */
  25  
  26  defined('MOODLE_INTERNAL') || die();
  27  
  28  
  29  /**
  30   * Class core_component_testcase.
  31   */
  32  class core_component_testcase extends advanced_testcase {
  33  
  34      // To be changed if number of subsystems increases/decreases,
  35      // this is defined here to annoy devs that try to add more without any thinking,
  36      // always verify that it does not collide with any existing add-on modules and subplugins!!!
  37      const SUBSYSTEMCOUNT = 65;
  38  
  39      public function test_get_core_subsystems() {
  40          global $CFG;
  41  
  42          $subsystems = core_component::get_core_subsystems();
  43  
  44          $this->assertCount(self::SUBSYSTEMCOUNT, $subsystems, 'Oh, somebody added or removed a core subsystem, think twice before doing that!');
  45  
  46          // Make sure all paths are full/null, exist and are inside dirroot.
  47          foreach ($subsystems as $subsystem => $fulldir) {
  48              $this->assertFalse(strpos($subsystem, '_'), 'Core subsystems must be one work without underscores');
  49              if ($fulldir === null) {
  50                  if ($subsystem === 'filepicker' or $subsystem === 'help') {
  51                      // Arrgghh, let's not introduce more subsystems for no real reason...
  52                  } else {
  53                      // Lang strings.
  54                      $this->assertFileExists("$CFG->dirroot/lang/en/$subsystem.php", 'Core subsystems without fulldir are usually used for lang strings.');
  55                  }
  56                  continue;
  57              }
  58              $this->assertFileExists($fulldir);
  59              // Check that base uses realpath() separators and "/" in the subdirs.
  60              $this->assertStringStartsWith($CFG->dirroot.'/', $fulldir);
  61              $reldir = substr($fulldir, strlen($CFG->dirroot)+1);
  62              $this->assertFalse(strpos($reldir, '\\'));
  63          }
  64  
  65          // Make sure all core language files are also subsystems!
  66          $items = new DirectoryIterator("$CFG->dirroot/lang/en");
  67          foreach ($items as $item) {
  68              if ($item->isDot() or $item->isDir()) {
  69                  continue;
  70              }
  71              $file = $item->getFilename();
  72              if ($file === 'moodle.php') {
  73                  // Do not add new lang strings unless really necessary!!!
  74                  continue;
  75              }
  76  
  77              if (substr($file, -4) !== '.php') {
  78                  continue;
  79              }
  80              $file = substr($file, 0, strlen($file)-4);
  81              $this->assertArrayHasKey($file, $subsystems, 'All core lang files should be subsystems, think twice before adding anything!');
  82          }
  83          unset($item);
  84          unset($items);
  85  
  86      }
  87  
  88      public function test_deprecated_get_core_subsystems() {
  89          global $CFG;
  90  
  91          $subsystems = core_component::get_core_subsystems();
  92  
  93          $this->assertSame($subsystems, get_core_subsystems(true));
  94  
  95          $realsubsystems = get_core_subsystems();
  96          $this->assertDebuggingCalled();
  97          $this->assertSame($realsubsystems, get_core_subsystems(false));
  98          $this->assertDebuggingCalled();
  99  
 100          $this->assertEquals(count($subsystems), count($realsubsystems));
 101  
 102          foreach ($subsystems as $subsystem => $fulldir) {
 103              $this->assertArrayHasKey($subsystem, $realsubsystems);
 104              if ($fulldir === null) {
 105                  $this->assertNull($realsubsystems[$subsystem]);
 106                  continue;
 107              }
 108              $this->assertSame($fulldir, $CFG->dirroot.'/'.$realsubsystems[$subsystem]);
 109          }
 110      }
 111  
 112      public function test_get_plugin_types() {
 113          global $CFG;
 114  
 115          $this->assertTrue(empty($CFG->themedir), 'Non-empty $CFG->themedir is not covered by any tests yet, you need to disable it.');
 116  
 117          $plugintypes = core_component::get_plugin_types();
 118  
 119          foreach ($plugintypes as $plugintype => $fulldir) {
 120              $this->assertStringStartsWith("$CFG->dirroot/", $fulldir);
 121          }
 122      }
 123  
 124      public function test_deprecated_get_plugin_types() {
 125          global $CFG;
 126  
 127          $plugintypes = core_component::get_plugin_types();
 128  
 129          $this->assertSame($plugintypes, get_plugin_types());
 130          $this->assertSame($plugintypes, get_plugin_types(true));
 131  
 132          $realplugintypes = get_plugin_types(false);
 133          $this->assertDebuggingCalled();
 134  
 135          foreach ($plugintypes as $plugintype => $fulldir) {
 136              $this->assertSame($fulldir, $CFG->dirroot.'/'.$realplugintypes[$plugintype]);
 137          }
 138      }
 139  
 140      public function test_get_plugin_list() {
 141          global $CFG;
 142  
 143          $plugintypes = core_component::get_plugin_types();
 144  
 145          foreach ($plugintypes as $plugintype => $fulldir) {
 146              $plugins = core_component::get_plugin_list($plugintype);
 147              foreach ($plugins as $pluginname => $plugindir) {
 148                  $this->assertStringStartsWith("$CFG->dirroot/", $plugindir);
 149              }
 150              if ($plugintype !== 'auth') {
 151                  // Let's crosscheck it with independent implementation (auth/db is an exception).
 152                  $reldir = substr($fulldir, strlen($CFG->dirroot)+1);
 153                  $dirs = get_list_of_plugins($reldir);
 154                  $dirs = array_values($dirs);
 155                  $this->assertDebuggingCalled();
 156                  $this->assertSame($dirs, array_keys($plugins));
 157              }
 158          }
 159      }
 160  
 161      public function test_deprecated_get_plugin_list() {
 162          $plugintypes = core_component::get_plugin_types();
 163  
 164          foreach ($plugintypes as $plugintype => $fulldir) {
 165              $plugins = core_component::get_plugin_list($plugintype);
 166              $this->assertSame($plugins, get_plugin_list($plugintype));
 167          }
 168      }
 169  
 170      public function test_get_plugin_directory() {
 171          $plugintypes = core_component::get_plugin_types();
 172  
 173          foreach ($plugintypes as $plugintype => $fulldir) {
 174              $plugins = core_component::get_plugin_list($plugintype);
 175              foreach ($plugins as $pluginname => $plugindir) {
 176                  $this->assertSame($plugindir, core_component::get_plugin_directory($plugintype, $pluginname));
 177              }
 178          }
 179      }
 180  
 181      public function test_deprecated_get_plugin_directory() {
 182          $plugintypes = core_component::get_plugin_types();
 183  
 184          foreach ($plugintypes as $plugintype => $fulldir) {
 185              $plugins = core_component::get_plugin_list($plugintype);
 186              foreach ($plugins as $pluginname => $plugindir) {
 187                  $this->assertSame(core_component::get_plugin_directory($plugintype, $pluginname), get_plugin_directory($plugintype, $pluginname));
 188              }
 189          }
 190      }
 191  
 192      public function test_get_subsystem_directory() {
 193          $subsystems = core_component::get_core_subsystems();
 194          foreach ($subsystems as $subsystem => $fulldir) {
 195              $this->assertSame($fulldir, core_component::get_subsystem_directory($subsystem));
 196          }
 197      }
 198  
 199      public function test_is_valid_plugin_name() {
 200          $this->assertTrue(core_component::is_valid_plugin_name('mod', 'example1'));
 201          $this->assertTrue(core_component::is_valid_plugin_name('mod', 'feedback360'));
 202          $this->assertFalse(core_component::is_valid_plugin_name('mod', 'feedback_360'));
 203          $this->assertFalse(core_component::is_valid_plugin_name('mod', '2feedback'));
 204          $this->assertFalse(core_component::is_valid_plugin_name('mod', '1example'));
 205          $this->assertFalse(core_component::is_valid_plugin_name('mod', 'example.xx'));
 206          $this->assertFalse(core_component::is_valid_plugin_name('mod', '.example'));
 207          $this->assertFalse(core_component::is_valid_plugin_name('mod', '_example'));
 208          $this->assertFalse(core_component::is_valid_plugin_name('mod', 'example_'));
 209          $this->assertFalse(core_component::is_valid_plugin_name('mod', 'example_x1'));
 210          $this->assertFalse(core_component::is_valid_plugin_name('mod', 'example-x1'));
 211          $this->assertFalse(core_component::is_valid_plugin_name('mod', 'role'));
 212  
 213          $this->assertTrue(core_component::is_valid_plugin_name('tool', 'example1'));
 214          $this->assertTrue(core_component::is_valid_plugin_name('tool', 'example_x1'));
 215          $this->assertTrue(core_component::is_valid_plugin_name('tool', 'example_x1_xxx'));
 216          $this->assertTrue(core_component::is_valid_plugin_name('tool', 'feedback360'));
 217          $this->assertTrue(core_component::is_valid_plugin_name('tool', 'feed_back360'));
 218          $this->assertTrue(core_component::is_valid_plugin_name('tool', 'role'));
 219          $this->assertFalse(core_component::is_valid_plugin_name('tool', '1example'));
 220          $this->assertFalse(core_component::is_valid_plugin_name('tool', 'example.xx'));
 221          $this->assertFalse(core_component::is_valid_plugin_name('tool', 'example-xx'));
 222          $this->assertFalse(core_component::is_valid_plugin_name('tool', '.example'));
 223          $this->assertFalse(core_component::is_valid_plugin_name('tool', '_example'));
 224          $this->assertFalse(core_component::is_valid_plugin_name('tool', 'example_'));
 225          $this->assertFalse(core_component::is_valid_plugin_name('tool', 'example__x1'));
 226      }
 227  
 228      public function test_normalize_componentname() {
 229          // Moodle core.
 230          $this->assertSame('core', core_component::normalize_componentname('core'));
 231          $this->assertSame('core', core_component::normalize_componentname('moodle'));
 232          $this->assertSame('core', core_component::normalize_componentname(''));
 233  
 234          // Moodle core subsystems.
 235          $this->assertSame('core_admin', core_component::normalize_componentname('admin'));
 236          $this->assertSame('core_admin', core_component::normalize_componentname('core_admin'));
 237          $this->assertSame('core_admin', core_component::normalize_componentname('moodle_admin'));
 238  
 239          // Activity modules and their subplugins.
 240          $this->assertSame('mod_workshop', core_component::normalize_componentname('workshop'));
 241          $this->assertSame('mod_workshop', core_component::normalize_componentname('mod_workshop'));
 242          $this->assertSame('workshopform_accumulative', core_component::normalize_componentname('workshopform_accumulative'));
 243          $this->assertSame('mod_quiz', core_component::normalize_componentname('quiz'));
 244          $this->assertSame('quiz_grading', core_component::normalize_componentname('quiz_grading'));
 245          $this->assertSame('mod_data', core_component::normalize_componentname('data'));
 246          $this->assertSame('datafield_checkbox', core_component::normalize_componentname('datafield_checkbox'));
 247  
 248          // Other plugin types.
 249          $this->assertSame('auth_mnet', core_component::normalize_componentname('auth_mnet'));
 250          $this->assertSame('enrol_self', core_component::normalize_componentname('enrol_self'));
 251          $this->assertSame('block_html', core_component::normalize_componentname('block_html'));
 252          $this->assertSame('block_mnet_hosts', core_component::normalize_componentname('block_mnet_hosts'));
 253          $this->assertSame('local_amos', core_component::normalize_componentname('local_amos'));
 254          $this->assertSame('local_admin', core_component::normalize_componentname('local_admin'));
 255  
 256          // Unknown words without underscore are supposed to be activity modules.
 257          $this->assertSame('mod_whoonearthwouldcomewithsuchastupidnameofcomponent',
 258              core_component::normalize_componentname('whoonearthwouldcomewithsuchastupidnameofcomponent'));
 259          // Module names can not contain underscores, this must be a subplugin.
 260          $this->assertSame('whoonearth_wouldcomewithsuchastupidnameofcomponent',
 261              core_component::normalize_componentname('whoonearth_wouldcomewithsuchastupidnameofcomponent'));
 262          $this->assertSame('whoonearth_would_come_withsuchastupidnameofcomponent',
 263              core_component::normalize_componentname('whoonearth_would_come_withsuchastupidnameofcomponent'));
 264      }
 265  
 266      public function test_normalize_component() {
 267          // Moodle core.
 268          $this->assertSame(array('core', null), core_component::normalize_component('core'));
 269          $this->assertSame(array('core', null), core_component::normalize_component('moodle'));
 270          $this->assertSame(array('core', null), core_component::normalize_component(''));
 271  
 272          // Moodle core subsystems.
 273          $this->assertSame(array('core', 'admin'), core_component::normalize_component('admin'));
 274          $this->assertSame(array('core', 'admin'), core_component::normalize_component('core_admin'));
 275          $this->assertSame(array('core', 'admin'), core_component::normalize_component('moodle_admin'));
 276  
 277          // Activity modules and their subplugins.
 278          $this->assertSame(array('mod', 'workshop'), core_component::normalize_component('workshop'));
 279          $this->assertSame(array('mod', 'workshop'), core_component::normalize_component('mod_workshop'));
 280          $this->assertSame(array('workshopform', 'accumulative'), core_component::normalize_component('workshopform_accumulative'));
 281          $this->assertSame(array('mod', 'quiz'), core_component::normalize_component('quiz'));
 282          $this->assertSame(array('quiz', 'grading'), core_component::normalize_component('quiz_grading'));
 283          $this->assertSame(array('mod', 'data'), core_component::normalize_component('data'));
 284          $this->assertSame(array('datafield', 'checkbox'), core_component::normalize_component('datafield_checkbox'));
 285  
 286          // Other plugin types.
 287          $this->assertSame(array('auth', 'mnet'), core_component::normalize_component('auth_mnet'));
 288          $this->assertSame(array('enrol', 'self'), core_component::normalize_component('enrol_self'));
 289          $this->assertSame(array('block', 'html'), core_component::normalize_component('block_html'));
 290          $this->assertSame(array('block', 'mnet_hosts'), core_component::normalize_component('block_mnet_hosts'));
 291          $this->assertSame(array('local', 'amos'), core_component::normalize_component('local_amos'));
 292          $this->assertSame(array('local', 'admin'), core_component::normalize_component('local_admin'));
 293  
 294          // Unknown words without underscore are supposed to be activity modules.
 295          $this->assertSame(array('mod', 'whoonearthwouldcomewithsuchastupidnameofcomponent'),
 296              core_component::normalize_component('whoonearthwouldcomewithsuchastupidnameofcomponent'));
 297          // Module names can not contain underscores, this must be a subplugin.
 298          $this->assertSame(array('whoonearth', 'wouldcomewithsuchastupidnameofcomponent'),
 299              core_component::normalize_component('whoonearth_wouldcomewithsuchastupidnameofcomponent'));
 300          $this->assertSame(array('whoonearth', 'would_come_withsuchastupidnameofcomponent'),
 301              core_component::normalize_component('whoonearth_would_come_withsuchastupidnameofcomponent'));
 302      }
 303  
 304      public function test_deprecated_normalize_component() {
 305          // Moodle core.
 306          $this->assertSame(array('core', null), normalize_component('core'));
 307          $this->assertSame(array('core', null), normalize_component(''));
 308          $this->assertSame(array('core', null), normalize_component('moodle'));
 309  
 310          // Moodle core subsystems.
 311          $this->assertSame(array('core', 'admin'), normalize_component('admin'));
 312          $this->assertSame(array('core', 'admin'), normalize_component('core_admin'));
 313          $this->assertSame(array('core', 'admin'), normalize_component('moodle_admin'));
 314  
 315          // Activity modules and their subplugins.
 316          $this->assertSame(array('mod', 'workshop'), normalize_component('workshop'));
 317          $this->assertSame(array('mod', 'workshop'), normalize_component('mod_workshop'));
 318          $this->assertSame(array('workshopform', 'accumulative'), normalize_component('workshopform_accumulative'));
 319          $this->assertSame(array('mod', 'quiz'), normalize_component('quiz'));
 320          $this->assertSame(array('quiz', 'grading'), normalize_component('quiz_grading'));
 321          $this->assertSame(array('mod', 'data'), normalize_component('data'));
 322          $this->assertSame(array('datafield', 'checkbox'), normalize_component('datafield_checkbox'));
 323  
 324          // Other plugin types.
 325          $this->assertSame(array('auth', 'mnet'), normalize_component('auth_mnet'));
 326          $this->assertSame(array('enrol', 'self'), normalize_component('enrol_self'));
 327          $this->assertSame(array('block', 'html'), normalize_component('block_html'));
 328          $this->assertSame(array('block', 'mnet_hosts'), normalize_component('block_mnet_hosts'));
 329          $this->assertSame(array('local', 'amos'), normalize_component('local_amos'));
 330          $this->assertSame(array('local', 'admin'), normalize_component('local_admin'));
 331  
 332          // Unknown words without underscore are supposed to be activity modules.
 333          $this->assertSame(array('mod', 'whoonearthwouldcomewithsuchastupidnameofcomponent'),
 334              normalize_component('whoonearthwouldcomewithsuchastupidnameofcomponent'));
 335          // Module names can not contain underscores, this must be a subplugin.
 336          $this->assertSame(array('whoonearth', 'wouldcomewithsuchastupidnameofcomponent'),
 337              normalize_component('whoonearth_wouldcomewithsuchastupidnameofcomponent'));
 338          $this->assertSame(array('whoonearth', 'would_come_withsuchastupidnameofcomponent'),
 339              normalize_component('whoonearth_would_come_withsuchastupidnameofcomponent'));
 340      }
 341  
 342      public function test_get_component_directory() {
 343          $plugintypes = core_component::get_plugin_types();
 344          foreach ($plugintypes as $plugintype => $fulldir) {
 345              $plugins = core_component::get_plugin_list($plugintype);
 346              foreach ($plugins as $pluginname => $plugindir) {
 347                  $this->assertSame($plugindir, core_component::get_component_directory(($plugintype.'_'.$pluginname)));
 348              }
 349          }
 350  
 351          $subsystems = core_component::get_core_subsystems();
 352          foreach ($subsystems as $subsystem => $fulldir) {
 353              $this->assertSame($fulldir, core_component::get_component_directory(('core_'.$subsystem)));
 354          }
 355      }
 356  
 357      public function test_deprecated_get_component_directory() {
 358          $plugintypes = core_component::get_plugin_types();
 359          foreach ($plugintypes as $plugintype => $fulldir) {
 360              $plugins = core_component::get_plugin_list($plugintype);
 361              foreach ($plugins as $pluginname => $plugindir) {
 362                  $this->assertSame($plugindir, get_component_directory(($plugintype.'_'.$pluginname)));
 363              }
 364          }
 365  
 366          $subsystems = core_component::get_core_subsystems();
 367          foreach ($subsystems as $subsystem => $fulldir) {
 368              $this->assertSame($fulldir, get_component_directory(('core_'.$subsystem)));
 369          }
 370      }
 371  
 372      public function test_get_subtype_parent() {
 373          global $CFG;
 374  
 375          $this->assertNull(core_component::get_subtype_parent('mod'));
 376  
 377          // Any plugin with more subtypes is ok here.
 378          $this->assertFileExists("$CFG->dirroot/mod/assign/db/subplugins.php");
 379          $this->assertSame('mod_assign', core_component::get_subtype_parent('assignsubmission'));
 380          $this->assertSame('mod_assign', core_component::get_subtype_parent('assignfeedback'));
 381          $this->assertNull(core_component::get_subtype_parent('assignxxxxx'));
 382      }
 383  
 384      public function test_get_subplugins() {
 385          global $CFG;
 386  
 387          // Any plugin with more subtypes is ok here.
 388          $this->assertFileExists("$CFG->dirroot/mod/assign/db/subplugins.php");
 389  
 390          $subplugins = core_component::get_subplugins('mod_assign');
 391          $this->assertSame(array('assignsubmission', 'assignfeedback'), array_keys($subplugins));
 392  
 393          $subs = core_component::get_plugin_list('assignsubmission');
 394          $feeds = core_component::get_plugin_list('assignfeedback');
 395  
 396          $this->assertSame(array_keys($subs), $subplugins['assignsubmission']);
 397          $this->assertSame(array_keys($feeds), $subplugins['assignfeedback']);
 398  
 399          // Any plugin without subtypes is ok here.
 400          $this->assertFileExists("$CFG->dirroot/mod/choice");
 401          $this->assertFileNotExists("$CFG->dirroot/mod/choice/db/subplugins.php");
 402  
 403          $this->assertNull(core_component::get_subplugins('mod_choice'));
 404  
 405          $this->assertNull(core_component::get_subplugins('xxxx_yyyy'));
 406      }
 407  
 408      public function test_get_plugin_types_with_subplugins() {
 409          global $CFG;
 410  
 411          $types = core_component::get_plugin_types_with_subplugins();
 412  
 413          // Hardcode it here to detect if anybody hacks the code to include more subplugin types.
 414          $expected = array(
 415              'mod' => "$CFG->dirroot/mod",
 416              'editor' => "$CFG->dirroot/lib/editor",
 417              'tool' => "$CFG->dirroot/$CFG->admin/tool",
 418              'local' => "$CFG->dirroot/local",
 419          );
 420  
 421          $this->assertSame($expected, $types);
 422  
 423      }
 424  
 425      public function test_get_plugin_list_with_file() {
 426          $this->resetAfterTest(true);
 427  
 428          // No extra reset here because core_component reset automatically.
 429  
 430          $expected = array();
 431          $reports = core_component::get_plugin_list('report');
 432          foreach ($reports as $name => $fulldir) {
 433              if (file_exists("$fulldir/lib.php")) {
 434                  $expected[] = $name;
 435              }
 436          }
 437  
 438          // Test cold.
 439          $list = core_component::get_plugin_list_with_file('report', 'lib.php', false);
 440          $this->assertEquals($expected, array_keys($list));
 441  
 442          // Test hot.
 443          $list = core_component::get_plugin_list_with_file('report', 'lib.php', false);
 444          $this->assertEquals($expected, array_keys($list));
 445  
 446          // Test with include.
 447          $list = core_component::get_plugin_list_with_file('report', 'lib.php', true);
 448          $this->assertEquals($expected, array_keys($list));
 449  
 450          // Test missing.
 451          $list = core_component::get_plugin_list_with_file('report', 'idontexist.php', true);
 452          $this->assertEquals(array(), array_keys($list));
 453      }
 454  
 455      public function test_get_component_classes_int_namespace() {
 456  
 457          // Unexisting.
 458          $this->assertCount(0, core_component::get_component_classes_in_namespace('core_unexistingcomponent', 'something'));
 459          $this->assertCount(0, core_component::get_component_classes_in_namespace('auth_cas', 'something'));
 460  
 461          // Prefix with backslash if it doesn\'t come prefixed.
 462          $this->assertCount(1, core_component::get_component_classes_in_namespace('auth_cas', 'task'));
 463          $this->assertCount(1, core_component::get_component_classes_in_namespace('auth_cas', '\\task'));
 464  
 465          // Core as a component works.
 466          $this->assertCount(7, core_component::get_component_classes_in_namespace('core', 'update'));
 467  
 468          // Multiple levels.
 469          $this->assertCount(5, core_component::get_component_classes_in_namespace('core_user', '\\output\\myprofile\\'));
 470          $this->assertCount(5, core_component::get_component_classes_in_namespace('core_user', '\\output\\myprofile'));
 471      }
 472  }


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1