Permalink
Browse files

MDL-39723 prevent update_courses() bad habits.

All the external functions end calling require_login() that is
always in charge of setting the $COURSE global. This is not a
problem, but in the case of core_course_external::update_courses()
testing, where we are, in the same "request", both setting and getting
the $COURSE information and it's clearly outdated, so the test fails.

Alternative solution would be to modify the external function to ensure
that, after updating a course, $COURSE is also updated with the changes
but it does not seem to be necessary for "normal" usage (both UI/WS POVs).
  • Loading branch information...
1 parent 8c8b3eb commit 36e5df06b36013b1a982de921b75a94f8d20bdf6 @stronk7 stronk7 committed Jun 4, 2013
Showing with 10 additions and 1 deletion.
  1. +10 −1 course/tests/externallib_test.php
@@ -671,7 +671,15 @@ public function test_duplicate_course() {
* Test update_courses
*/
public function test_update_courses() {
- global $DB, $CFG, $USER;
+ global $DB, $CFG, $USER, $COURSE;
+
+ // Get current $COURSE to be able to restore it later (defaults to $SITE). We need this
+ // trick because we are both updating and getting (for testing) course information
+ // in the same request and core_course_external::update_courses()
+ // is overwriting $COURSE all over the time with OLD values, so later
+ // use of get_course() fetches those OLD values instead of the updated ones.
+ // See MDL-39723 for more info.
+ $origcourse = clone($COURSE);
$this->resetAfterTest(true);
@@ -724,6 +732,7 @@ public function test_update_courses() {
$courses = array($course1, $course2);
$updatedcoursewarnings = core_course_external::update_courses($courses);
+ $COURSE = $origcourse; // Restore $COURSE. Instead of using the OLD one set by the previous line.
// Check that right number of courses were created.
$this->assertEquals(0, count($updatedcoursewarnings['warnings']));

0 comments on commit 36e5df0

Please sign in to comment.