Unit tests MDL-24981 Fixed portfolio unit test so it at least runs (albeit with 23...
authorSam Marshall <s.marshall@open.ac.uk>
Mon, 1 Nov 2010 18:00:57 +0000 (18:00 +0000)
committerSam Marshall <s.marshall@open.ac.uk>
Mon, 1 Nov 2010 18:00:57 +0000 (18:00 +0000)
lib/portfolio/exceptions.php
lib/simpletest/portfolio_testclass.php
mod/assignment/simpletest/test_assignment_portfolio_callers.php
mod/data/simpletest/test_data_portfolio_callers.php

index 2a4816d..d39e6d5 100644 (file)
@@ -49,18 +49,33 @@ class portfolio_export_exception extends portfolio_exception {
     */
     public function __construct($exporter, $errorcode, $module=null, $continue=null, $a=null) {
         global $CFG;
     */
     public function __construct($exporter, $errorcode, $module=null, $continue=null, $a=null) {
         global $CFG;
+        // This static variable is necessary because sometimes the code below
+        // which tries to obtain a continue link can cause one of these
+        // exceptions to be thrown. This would create an infinite loop (until
+        // PHP hits its stack limit). Using this static lets us make the
+        // nested constructor finish immediately without attempting to call
+        // methods that might fail.
+        static $inconstructor = false;
 
 
-        if (!empty($exporter) && $exporter instanceof portfolio_exporter) {
-            if (empty($continue)) {
-                $caller = $exporter->get('caller');
-                if (!empty($caller) && $caller instanceof portfolio_caller_base) {
-                    $continue = $exporter->get('caller')->get_return_url();
+        if (!$inconstructor && !empty($exporter) &&
+                $exporter instanceof portfolio_exporter) {
+            $inconstructor = true;
+            try {
+                if (empty($continue)) {
+                    $caller = $exporter->get('caller');
+                    if (!empty($caller) && $caller instanceof portfolio_caller_base) {
+                        $continue = $exporter->get('caller')->get_return_url();
+                    }
                 }
                 }
+                // this was previously only called if we were in cron,
+                // but I think if there's always an exception, we should clean up
+                // rather than force the user to resolve the export later.
+                $exporter->process_stage_cleanup();
+            } catch(Exception $e) {
+                // Ooops, we had an exception trying to get caller
+                // information. Ignore it.
             }
             }
-            // this was previously only called if we were in cron,
-            // but I think if there's always an exception, we should clean up
-            // rather than force the user to resolve the export later.
-            $exporter->process_stage_cleanup();
+            $inconstructor = false;
         }
         parent::__construct($errorcode, $module, $continue, $a);
     }
         }
         parent::__construct($errorcode, $module, $continue, $a);
     }
index 4135c18..766f706 100644 (file)
@@ -192,10 +192,22 @@ foreach ($portfolio_plugins as $plugin) {
     Mock::generatePartial("portfolio_plugin_$plugin", "partialmock_plugin_$plugin", array('send_package'));
 }
 
     Mock::generatePartial("portfolio_plugin_$plugin", "partialmock_plugin_$plugin", array('send_package'));
 }
 
-class portfoliolib_test extends FakeDBUnitTestCase {
+class portfoliolib_test extends UnitTestCaseUsingDatabase {
+    private $olduser;
 
     function setup() {
 
     function setup() {
+        global $USER;
         parent::setup();
         parent::setup();
+
+        // It is necessary to store $USER object because some subclasses use generator
+        // stuff which breaks $USER
+        $this->olduser = $USER;
+    }
+
+    function tearDown() {
+        global $USER;
+        $USER = $this->olduser;
+        parent::tearDown();
     }
 
     function test_construct_dupe_instance() {
     }
 
     function test_construct_dupe_instance() {
@@ -205,7 +217,7 @@ class portfoliolib_test extends FakeDBUnitTestCase {
             $plugin2 = portfolio_plugin_base::create_instance('download', 'download2', array());
             $test1 = new portfolio_plugin_download($plugin1->get('id'));
         } catch (portfolio_exception $e) {
             $plugin2 = portfolio_plugin_base::create_instance('download', 'download2', array());
             $test1 = new portfolio_plugin_download($plugin1->get('id'));
         } catch (portfolio_exception $e) {
-            $this->assertEqual('multipledisallowed', $e->errorcode);
+            $this->assertEqual('multipleinstancesdisallowed', $e->errorcode);
             $gotexception = true;
         }
         $this->assertTrue($gotexception);
             $gotexception = true;
         }
         $this->assertTrue($gotexception);
index f980e20..7e98980 100644 (file)
@@ -2,6 +2,7 @@
 require_once("$CFG->libdir/simpletest/portfolio_testclass.php");
 require_once("$CFG->dirroot/mod/assignment/lib.php");
 require_once("$CFG->dirroot/$CFG->admin/generator.php");
 require_once("$CFG->libdir/simpletest/portfolio_testclass.php");
 require_once("$CFG->dirroot/mod/assignment/lib.php");
 require_once("$CFG->dirroot/$CFG->admin/generator.php");
+require_once("$CFG->dirroot/mod/assignment/locallib.php");
 
 Mock::generate('assignment_portfolio_caller', 'mock_caller');
 Mock::generate('portfolio_exporter', 'mock_exporter');
 
 Mock::generate('assignment_portfolio_caller', 'mock_caller');
 Mock::generate('portfolio_exporter', 'mock_exporter');
index a17ca8d..df247d6 100644 (file)
@@ -2,6 +2,7 @@
 require_once("$CFG->libdir/simpletest/portfolio_testclass.php");
 require_once("$CFG->dirroot/mod/data/lib.php");
 require_once("$CFG->dirroot/$CFG->admin/generator.php");
 require_once("$CFG->libdir/simpletest/portfolio_testclass.php");
 require_once("$CFG->dirroot/mod/data/lib.php");
 require_once("$CFG->dirroot/$CFG->admin/generator.php");
+require_once("$CFG->dirroot/mod/data/locallib.php");
 
 Mock::generate('data_portfolio_caller', 'mock_caller');
 Mock::generate('portfolio_exporter', 'mock_exporter');
 
 Mock::generate('data_portfolio_caller', 'mock_caller');
 Mock::generate('portfolio_exporter', 'mock_exporter');