From 4a66ff3c48c8388cdc164e7ba3ef26b2f4c5ec75 Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+github@gmail.com>
Date: Fri, 15 Jul 2022 10:22:26 +0200
Subject: [PATCH] fix fallout from 769675071b44cff1f699396270b378d189ada866 and
 provide test for variable assignments in StudipController, re #1328

---
 app/controllers/calendar/single.php           |  1 +
 .../studip_controller_properties_trait.php    |  8 +++--
 .../unit/lib/classes/StudipControllerTest.php | 36 +++++++++++++++++++
 3 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/app/controllers/calendar/single.php b/app/controllers/calendar/single.php
index e2ea4c7e9d2..6cfc133dc27 100644
--- a/app/controllers/calendar/single.php
+++ b/app/controllers/calendar/single.php
@@ -98,6 +98,7 @@ class Calendar_SingleController extends Calendar_CalendarController
         $timestamp = mktime(12, 0, 0, date('n', $this->atime), date('j', $this->atime), date('Y', $this->atime));
         $monday = $timestamp - 86400 * (strftime('%u', $timestamp) - 1);
         $day_count = $this->settings['type_week'] == 'SHORT' ? 5 : 7;
+        $this->calendars = [];
         for ($i = 0; $i < $day_count; $i++) {
             $this->calendars[$i] =
                 SingleCalendar::getDayCalendar(
diff --git a/app/controllers/studip_controller_properties_trait.php b/app/controllers/studip_controller_properties_trait.php
index 4246da05f98..fb3b68d57d6 100644
--- a/app/controllers/studip_controller_properties_trait.php
+++ b/app/controllers/studip_controller_properties_trait.php
@@ -42,9 +42,13 @@ trait StudipControllerPropertiesTrait
      * @param string $offset
      * @return mixed
      */
-    public function __get(string $offset)
+    public function &__get(string $offset)
     {
-        return $this->_template_variables[$offset] ?? null;
+        $result = null;
+        if (isset($this->_template_variables[$offset])) {
+            $result = &$this->_template_variables[$offset];
+        }
+        return $result;
     }
 
     /**
diff --git a/tests/unit/lib/classes/StudipControllerTest.php b/tests/unit/lib/classes/StudipControllerTest.php
index 532116677ae..2b25bc4435f 100644
--- a/tests/unit/lib/classes/StudipControllerTest.php
+++ b/tests/unit/lib/classes/StudipControllerTest.php
@@ -182,6 +182,42 @@ final class StudipControllerTest extends Codeception\Test\Unit
         $this->getController()->relocate(...$args);
     }
 
+    public function testVariableAssignment(): void
+    {
+        $controller = $this->getController();
+
+        // Set and test assignments
+        $controller->foo = 'bar';
+        $this->assertEquals('bar', $controller->foo);
+
+        $controller->bar = 42;
+        $this->assertEquals(42, $controller->bar);
+
+        $controller->baz = [];
+        $controller->baz[] = 23;
+        $this->assertEquals([23], $controller->baz);
+
+        // Test fetching all variables
+        $variables = $controller->get_assigned_variables();
+
+        $this->assertIsArray($variables);
+
+        // - Implicit variables
+        $this->assertArrayHasKey('controller', $variables);
+        $this->assertArrayHasKey('current_action', $variables);
+
+        // - Explicit variables
+        $this->assertArrayHasKey('foo', $variables);
+        $this->assertEquals('bar', $variables['foo']);
+
+        $this->assertArrayHasKey('bar', $variables);
+        $this->assertEquals(42, $variables['bar']);
+
+        $this->assertArrayHasKey('baz', $variables);
+        $this->assertCount(1, $variables['baz']);
+        $this->assertEquals([23], $variables['baz']);
+    }
+
     /**
      * Returns a relative url for Stud.IP if given url matches.
      */
-- 
GitLab