]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-16483 $CFG->unittestprefix not required anymore to run unit tests that do not...
authorskodak <skodak>
Sat, 10 Jan 2009 16:06:53 +0000 (16:06 +0000)
committerskodak <skodak>
Sat, 10 Jan 2009 16:06:53 +0000 (16:06 +0000)
admin/report/unittest/index.php
config-dist.php
lib/simpletestlib.php
lib/simpletestlib/readme_moodle.txt
lib/simpletestlib/test_case.php

index 5aae637eff8e57abe7658b24a37c2ba757f5724e..c4ce889276e25c721ab148da6dd48dc113b0ba91 100644 (file)
@@ -16,23 +16,21 @@ require_once($CFG->libdir.'/simpletestlib.php');
 require_once('ex_simple_test.php');
 require_once('ex_reporter.php');
 
-// CGI arguments
-$path = optional_param('path', null, PARAM_PATH);
-$showpasses = optional_param('showpasses', false, PARAM_BOOL);
-$showsearch = optional_param('showsearch', false, PARAM_BOOL);
-$addconfigprefix = optional_param('addconfigprefix', false, PARAM_RAW);
-$setuptesttables = optional_param('setuptesttables', false, PARAM_BOOL);
-$upgradetesttables = optional_param('upgradetesttables', false, PARAM_BOOL);
+// page parameters
+$path                    = optional_param('path', null, PARAM_PATH);
+$showpasses              = optional_param('showpasses', false, PARAM_BOOL);
+$showsearch              = optional_param('showsearch', false, PARAM_BOOL);
+$setuptesttables         = optional_param('setuptesttables', false, PARAM_BOOL);
+$upgradetesttables       = optional_param('upgradetesttables', false, PARAM_BOOL);
 $continuesetuptesttables = optional_param('continuesetuptesttables', false, PARAM_BOOL);
-$droptesttables = optional_param('droptesttables', false, PARAM_BOOL);
-$testtablesok = optional_param('testtablesok', false, PARAM_BOOL);
+$droptesttables          = optional_param('droptesttables', false, PARAM_BOOL);
+$testtablesok            = optional_param('testtablesok', false, PARAM_BOOL);
 
 if ($setuptesttables || $continuesetuptesttables || $upgradetesttables) {
     // Make sure this option is off during upgrade. It is not very helpful, and can break things.
     $CFG->xmlstrictheaders = false;
 }
-admin_externalpage_setup('reportsimpletest', '', array('showpasses' => $showpasses,
-        'showsearch' => $showsearch));
+admin_externalpage_setup('reportsimpletest', '', array('showpasses'=>$showpasses, 'showsearch'=>$showsearch));
 admin_externalpage_print_header();
 
 $langfile = 'simpletest';
@@ -48,149 +46,97 @@ if ($testtablesok) {
     print_heading(get_string('testtablesok', 'simpletest'));
 }
 
-$baseurl = "$CFG->wwwroot/$CFG->admin/report/unittest/index.php";
-
-// Add unittest prefix to config.php if needed
-if ($addconfigprefix && !isset($CFG->unittestprefix)) {
-    // Open config file, search for $CFG->prefix and append a new line under it
-    if ($handle = @fopen($CFG->dirroot.'/config.php', 'r+')) {
-
-        $new_file = '';
-
-        while (!feof($handle)) {
-            $line = fgets($handle, 4096);
-            $prefix_line = null;
-
-            if (preg_match('/CFG\-\>prefix/', $line, $matches)) {
-                $prefix_line = "\$CFG->unittestprefix = '$addconfigprefix';\n";
-            }
-
-            $new_file .= $line;
-            $new_file .= $prefix_line;
+if (!empty($CFG->unittestprefix)) {
+    // Temporarily override $DB and $CFG for a fresh install on the unit test prefix
+    $real_version = $CFG->version;
+
+    $real_db = $DB;
+    $real_cfg = $CFG;
+    $CFG = new stdClass();
+    $CFG->dbhost              = $real_cfg->dbhost;
+    $CFG->dbtype              = $real_cfg->dbtype;
+    $CFG->dblibrary           = $real_cfg->dblibrary;
+    $CFG->dbuser              = $real_cfg->dbuser;
+    $CFG->dbpass              = $real_cfg->dbpass;
+    $CFG->dbname              = $real_cfg->dbname;
+    $CFG->unittestprefix      = $real_cfg->unittestprefix;
+    $CFG->wwwroot             = $real_cfg->wwwroot;
+    $CFG->dirroot             = $real_cfg->dirroot;
+    $CFG->libdir              = $real_cfg->libdir;
+    $CFG->dataroot            = $real_cfg->dataroot;
+    $CFG->admin               = $real_cfg->admin;
+    $CFG->release             = $real_cfg->release;
+    $CFG->version             = $real_cfg->version;
+    $CFG->config_php_settings = $real_cfg->config_php_settings;
+    $CFG->frametarget         = $real_cfg->frametarget;
+    $CFG->framename           = $real_cfg->framename;
+    $CFG->footer              = $real_cfg->footer;
+    $CFG->debug               = $real_cfg->debug;
+
+    $DB = moodle_database::get_driver_instance($CFG->dbtype, $CFG->dblibrary);
+    $DB->connect($CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->unittestprefix);
+
+    if ($DB->get_manager()->table_exists(new xmldb_table('config')) && $config = $DB->get_records('config')) {
+        foreach ($config as $conf) {
+            $CFG->{$conf->name} = $conf->value;
         }
-
-        fclose($handle);
-        $handle = fopen($CFG->dirroot.'/config.php', 'w');
-        fwrite($handle, $new_file);
-        fclose($handle);
-        $CFG->unittestprefix = $addconfigprefix;
-    } else {
-        notify(get_string('confignonwritable', 'simpletest'));
-        die();
+        $testtablesok = true;
     }
-}
 
-if (empty($CFG->unittestprefix)) {
-    // TODO replace error with proper admin dialog
-
-    print_box_start('generalbox', 'notice');
-    if (is_writable($CFG->dirroot.'/config.php')) {
-        echo '<p>'.get_string("prefixnotset", 'simpletest').'</p>';
-        echo '<form method="post" action="'.$baseurl.'">
-                <table class="generaltable">
-                    <tr>
-                        <th class="header"><label for="prefix">'.get_string('prefix', 'simpletest').'</label></th>
-                        <td class="cell"><input type="text" size="5" name="addconfigprefix" id="prefix" value="tst_" /></td>
-                        <td class="cell"><input type="submit" value="'.get_string('addconfigprefix', 'simpletest').'" /></td>
-                    </tr>
-                </table>
-              </form>';
-    } else {
-        notify(get_string('confignonwritable', 'simpletest'));
-    }
-    print_box_end();
-
-    admin_externalpage_print_footer();
-    exit();
-}
+    $test_tables = $DB->get_tables();
 
-// Temporarily override $DB and $CFG for a fresh install on the unit test prefix
-$real_version = $CFG->version;
-
-$real_db = clone($DB);
-$real_cfg = clone($CFG);
-$CFG = new stdClass();
-$CFG->dbhost              = $real_cfg->dbhost;
-$CFG->dbtype              = $real_cfg->dbtype;
-$CFG->dblibrary           = $real_cfg->dblibrary;
-$CFG->dbuser              = $real_cfg->dbuser;
-$CFG->dbpass              = $real_cfg->dbpass;
-$CFG->dbname              = $real_cfg->dbname;
-$CFG->unittestprefix      = $real_cfg->unittestprefix;
-$CFG->wwwroot             = $real_cfg->wwwroot;
-$CFG->dirroot             = $real_cfg->dirroot;
-$CFG->libdir              = $real_cfg->libdir;
-$CFG->dataroot            = $real_cfg->dataroot;
-$CFG->admin               = $real_cfg->admin;
-$CFG->release             = $real_cfg->release;
-$CFG->version             = $real_cfg->version;
-$CFG->config_php_settings = $real_cfg->config_php_settings;
-$CFG->frametarget         = $real_cfg->frametarget;
-$CFG->framename           = $real_cfg->framename;
-$CFG->footer              = $real_cfg->footer;
-$CFG->debug               = $real_cfg->debug;
-
-$DB = moodle_database::get_driver_instance($CFG->dbtype, $CFG->dblibrary);
-$DB->connect($CFG->dbhost, $CFG->dbuser, $CFG->dbpass, $CFG->dbname, $CFG->unittestprefix);
-
-if ($DB->get_manager()->table_exists(new xmldb_table('config')) && $config = $DB->get_records('config')) {
-    foreach ($config as $conf) {
-        $CFG->{$conf->name} = $conf->value;
+    // Test DB upgrade
+    if (!$upgradetesttables && $real_version != $CFG->version) {
+        notice_yesno(get_string('testtablesneedupgrade', 'simpletest'), $FULLSCRIPT . '?upgradetesttables=1', $FULLSCRIPT);
+        $DB->dispose();
+        $DB = $real_db;
+        admin_externalpage_print_footer();
+        exit();
     }
-    $testtablesok = true;
-}
 
-$test_tables = $DB->get_tables();
+    // Build/upgrade test tables if requested and needed
+    if ($setuptesttables || $continuesetuptesttables || $upgradetesttables) {
 
-// Test DB upgrade
-if (!$upgradetesttables && $real_version != $CFG->version) {
-    notice_yesno(get_string('testtablesneedupgrade', 'simpletest'), $baseurl . '?upgradetesttables=1', $baseurl);
-    $DB->dispose();
-    $DB = $real_db;
-    admin_externalpage_print_footer();
-    exit();
-}
+        $version = null;
+        $release = null;
+        include("$CFG->dirroot/version.php");       // defines $version and $release
 
-// Build/upgrade test tables if requested and needed
-if ($setuptesttables || $continuesetuptesttables || $upgradetesttables) {
+        if (!$continuesetuptesttables && !$upgradetesttables) {
+            // Drop all tables first if they exist
+            $manager = $DB->get_manager();
+            foreach ($test_tables as $table) {
+                $xmldbtable = new xmldb_table($table);
+                $manager->drop_table($xmldbtable);
+            }
+        }
 
-    $version = null;
-    $release = null;
-    include("$CFG->dirroot/version.php");       // defines $version and $release
+        upgrade_db($version, $release, true);
+    }
 
-    if (!$continuesetuptesttables && !$upgradetesttables) {
-        // Drop all tables first if they exist
+    if ($droptesttables) {
         $manager = $DB->get_manager();
         foreach ($test_tables as $table) {
             $xmldbtable = new xmldb_table($table);
             $manager->drop_table($xmldbtable);
         }
+        $test_tables = $DB->get_tables();
+        $testtablesok = false;
     }
 
-    upgrade_db($version, $release, true);
-}
-
-if ($droptesttables) {
-    $manager = $DB->get_manager();
-    foreach ($test_tables as $table) {
-        $xmldbtable = new xmldb_table($table);
-        $manager->drop_table($xmldbtable);
+    if (empty($test_tables['config'])) {
+        // TODO replace error with proper admin dialog
+        notice_yesno(get_string('tablesnotsetup', 'simpletest'), $FULLSCRIPT . '?setuptesttables=1', $FULLSCRIPT);
+        $DB = $real_db;
+        admin_externalpage_print_footer();
+        exit();
     }
-    $test_tables = $DB->get_tables();
-    $testtablesok = false;
-}
 
-if (empty($test_tables['config'])) {
-    // TODO replace error with proper admin dialog
-    notice_yesno(get_string('tablesnotsetup', 'simpletest'), $baseurl . '?setuptesttables=1', $baseurl);
+    $DB->dispose();
     $DB = $real_db;
-    admin_externalpage_print_footer();
-    exit();
-}
+    $CFG = $real_cfg;
 
-$DB->dispose();
-$DB = $real_db;
-$CFG = $real_cfg;
+    // end of ugly hack
+}
 
 if (!is_null($path)) {
     // Create the group of tests.
@@ -261,7 +207,12 @@ echo '</form>';
 print_box_end();
 
 print_box_start('generalbox boxwidthwide boxaligncenter');
-if ($testtablesok) {
+if (empty($CFG->unittestprefix)) {
+    print_heading(get_string('testdboperations', 'simpletest'));
+    // TODO: localise
+    echo '<p>Please add $CFG->unittestprefix="tst_"; or some other unique test table prefix if you want to execute all tests';
+    
+} else {
     print_heading(get_string('testdboperations', 'simpletest'));
     echo '<p>'.get_string('unittestprefixsetting', 'simpletest', $CFG).'</p>';
     echo '<form style="display:inline" method="get" action="index.php">';
index f88a2b8ede9656a3578f65ceb7d55f34ead34f47..4f80db927a6d4a775c481f5e515cf80f90ffe19c 100644 (file)
@@ -54,7 +54,6 @@ $CFG->dbname    = 'moodle';      // database name, eg moodle
 $CFG->dbuser    = 'username';    // your database username
 $CFG->dbpass    = 'password';    // your database password
 $CFG->prefix    = 'mdl_';        // Prefix to use for all table names
-// $CFG->unittest_prefix = 'tst_'; // Prefix used for unit test tables. Needs to be un-commented for test tables installation to proceed
 
 $CFG->dbpersist = false;         // Should database connections be reused?
                  // "false" is the most stable setting
@@ -287,18 +286,6 @@ $CFG->admin = 'admin';
 //
 // NOTE: if you are using custompix in your theme, see /fixpix.php.
 //
-// special magic evil developer only wanting to edit the xmldb files manually
-// AND don't use the XMLDBEditor nor the prev/next stuff at all (Mahara and others)
-// Uncomment these if you're lazy like Penny
-// $CFG->xmldbdisablecommentchecking = true;
-// $CFG->xmldbdisablenextprevchecking = true;
-//
-// special magig evil developer only wanting to edit xmldb files manually
-// AND allowing the XMLDBEditor to recostruct the prev/next elements every
-// time one file is loaded and saved (Moodle).
-// Uncomment this if you're lazy like Petr
-// $CFG->xmldbreconstructprevnext = true;
-//
 // Set the priority of themes from highest to lowest. This is useful (for
 // example) in sites where the user theme should override all other theme
 // settings for accessibility reasons. You can also disable types of themes
@@ -310,7 +297,28 @@ $CFG->admin = 'admin';
 // When working with production data on test servers, no emails should ever be send to real users
 // $CFG->noemailever = true;
 //
+
+//=========================================================================
+// 8. SETTINGS FOR DEVELOPMENT SERVERS - not intended for production use!!!
+//=========================================================================
 //
+// Specify prefix for fake unit test tables. If not specified only tests
+// taht do not need fake tables will be executed.
+// $CFG->unittestprefix = 'tst_';
+//
+// special magic evil developer only wanting to edit the xmldb files manually
+// AND don't use the XMLDBEditor nor the prev/next stuff at all (Mahara and others)
+// Uncomment these if you're lazy like Penny
+// $CFG->xmldbdisablecommentchecking = true;
+// $CFG->xmldbdisablenextprevchecking = true;
+//
+// special magig evil developer only wanting to edit xmldb files manually
+// AND allowing the XMLDBEditor to recostruct the prev/next elements every
+// time one file is loaded and saved (Moodle).
+// Uncomment this if you're lazy like Petr
+// $CFG->xmldbreconstructprevnext = true;
+//
+
 //=========================================================================
 // ALL DONE!  To continue installation, visit your main page with a browser
 //=========================================================================
index 263d2df73a3e60b6a5d362068abafdd2fceb0df2..2d20163edf99178cad8b9a29ed266aae21ed33d2 100644 (file)
@@ -163,9 +163,15 @@ class FakeDBUnitTestCase extends UnitTestCase {
      * @throws moodle_exception if CSV file cannot be created
      */
     public function __construct($label = false) {
+        global $DB, $CFG;
+
+        if (empty($CFG->unittestprefix)) {
+            return;
+        }
+
         parent::UnitTestCase($label);
         // MDL-16483 Get PKs and save data to text file
-        global $DB, $CFG;
+
         $this->pkfile = $CFG->dataroot.'/testtablespks.csv';
         $this->cfg = $CFG;
 
@@ -203,6 +209,10 @@ class FakeDBUnitTestCase extends UnitTestCase {
     private function truncate_test_tables($tabledata) {
         global $CFG, $DB;
 
+        if (empty($CFG->unittestprefix)) {
+            return;
+        }
+
         $tables = $DB->get_tables();
 
         foreach ($tables as $table) {
@@ -220,6 +230,12 @@ class FakeDBUnitTestCase extends UnitTestCase {
      * @throws moodle_exception if file doesn't exist
      */
     public function get_table_data($filename) {
+        global $CFG;
+
+        if (empty($CFG->unittestprefix)) {
+            return;
+        }
+
         if (file_exists($this->pkfile)) {
             $handle = fopen($this->pkfile, 'r');
             $tabledata = array();
@@ -243,8 +259,13 @@ class FakeDBUnitTestCase extends UnitTestCase {
      * TODO Improve detection of incorrectly built DB test tables (e.g. detect version discrepancy and offer to upgrade/rebuild)
      */
     public function setUp() {
+        global $DB, $CFG;
+
+        if (empty($CFG->unittestprefix)) {
+            return;
+        }
+
         parent::setUp();
-        global $DB;
         $this->DB =& $DB;
         ob_start();
     }
@@ -253,7 +274,12 @@ class FakeDBUnitTestCase extends UnitTestCase {
      * Method called after each test method. Doesn't do anything extraordinary except restore the global $DB to the real one.
      */
     public function tearDown() {
-        global $DB;
+        global $DB, $CFG;
+
+        if (empty($CFG->unittestprefix)) {
+            return;
+        }
+
         if (empty($DB)) {
             $DB = $this->DB;
         }
@@ -273,6 +299,10 @@ class FakeDBUnitTestCase extends UnitTestCase {
     public function __destruct() {
         global $CFG, $DB;
 
+        if (empty($CFG->unittestprefix)) {
+            return;
+        }
+
         $CFG = $this->cfg;
         $this->tearDown();
         UnitTestDB::restore();
@@ -295,7 +325,12 @@ class FakeDBUnitTestCase extends UnitTestCase {
      * @return array $objects corresponding to $data.
      */
     public function load_test_data($table, array $cols, array $data) {
-        global $DB;
+        global $CFG, $DB;
+
+        if (empty($CFG->unittestprefix)) {
+            return;
+        }
+
         $results = array();
         foreach ($data as $rowid => $row) {
             $obj = new stdClass;
@@ -318,7 +353,12 @@ class FakeDBUnitTestCase extends UnitTestCase {
      * @param array $rows the rows to delete. Actually, only $rows[$key]->id is used.
      */
     public function delete_test_data($table, array $rows) {
-        global $DB;
+        global $CFG, $DB;
+
+        if (empty($CFG->unittestprefix)) {
+            return;
+        }
+
         $ids = array();
         foreach ($rows as $row) {
             $ids[] = $row->id;
index 516dd0f2dd709a2a739411b3815115fd9d8d5709..e6f8e86e7ae64d9aac5d72bfd1316d9839529917 100644 (file)
@@ -8,6 +8,7 @@ Changes:
  * Bug fix in simpletest.php and test_case.php. Marked with //moodlefix begins,
    //moodlefix ends comments. This has been reported back to the simpletest mailing
    list. Hopefully will be included in a future release.
+ * modified run() in test_case.php - skipping tests that need fake db if prefix not set
 
 skodak, Tim
 
index 48aee9621bbda677f50926febde53b6b2ac11f25..3c97b163f46b597de3e67ab14ec542f28fb87d6a 100644 (file)
@@ -596,6 +596,16 @@ class TestSuite {
             if (is_string($this->_test_cases[$i])) {
                 $class = $this->_test_cases[$i];
                 $test = &new $class();
+                // moodle hack start
+                global $CFG;
+                if (empty($CFG->unittestprefix)) {
+                    if ($test instanceof FakeDBUnitTestCase) {
+                        // do not execute this test because test tables not present!
+                        unset($test);
+                        continue;
+                    }
+                }
+                // moodle hack end
                 $test->run($reporter);
                 unset($test);
             } else {