diff options
Diffstat (limited to 'tests/Modules/RebootControl/SchedulerTest.php')
| -rw-r--r-- | tests/Modules/RebootControl/SchedulerTest.php | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/tests/Modules/RebootControl/SchedulerTest.php b/tests/Modules/RebootControl/SchedulerTest.php new file mode 100644 index 00000000..af9cadf3 --- /dev/null +++ b/tests/Modules/RebootControl/SchedulerTest.php @@ -0,0 +1,71 @@ +<?php + +use PHPUnit\Framework\TestCase; + +/** + * Tests for modules-available/rebootcontrol/inc/scheduler.inc.php + * Uses SQLite-backed DB and real Location + OpeningTimes. + * + */ +class SchedulerTest extends TestCase +{ + protected function setUp(): void + { + Database::resetSchema(); + Render::reset(); + Message::reset(); + User::reset(); + $_GET = $_POST = $_REQUEST = []; + // Use real Location and OpeningTimes + $GLOBALS['__TEST_USE_REAL_CLASSES'] = ['Location']; + require_once __DIR__ . '/../../../modules-available/locations/inc/location.inc.php'; + require_once __DIR__ . '/../../../modules-available/locations/inc/openingtimes.inc.php'; + require_once __DIR__ . '/../../../modules-available/rebootcontrol/inc/scheduler.inc.php'; + // Ensure campus (1) has opening times already from seed; adjust to predictable short window for test stability + $today = date('l'); + $now = time(); + $open = date('H:i', $now + 3600); // opens in 1h + $close = date('H:i', $now + 7200); // closes in 2h + $json = json_encode([[ 'days' => [$today], 'openingtime' => $open, 'closingtime' => $close ]]); + Database::exec('UPDATE location SET openingtime = :ot WHERE locationid = 1', ['ot' => $json]); + } + + public function testSetLocationOptionsCreatesOrDeletesSchedule(): void + { + // Initially, no schedule rows + $row0 = Database::queryFirst('SELECT COUNT(*) AS c FROM reboot_scheduler'); + $this->assertSame(0, (int)$row0['c']); + + // Enable WOL with small offset -> creates a schedule with next execution in future + Scheduler::setLocationOptions(1, ['wol' => true, 'sd' => false, 'wol-offset' => 5, 'sd-offset' => 0, 'ra-mode' => Scheduler::RA_ALWAYS]); + $row = Database::queryFirst('SELECT * FROM reboot_scheduler WHERE locationid = 1'); + $this->assertNotFalse($row); + $this->assertSame('WOL', $row['action']); + $this->assertGreaterThan(time(), (int)$row['nextexecution']); + $opts = json_decode($row['options'], true); + $this->assertIsArray($opts); + $this->assertTrue($opts['wol']); + + // Disable all (and RA_ALWAYS) -> deletes schedule + Scheduler::setLocationOptions(1, ['wol' => false, 'sd' => false, 'wol-offset' => 0, 'sd-offset' => 0, 'ra-mode' => Scheduler::RA_ALWAYS]); + $row2 = Database::queryFirst('SELECT * FROM reboot_scheduler WHERE locationid = 1'); + $this->assertFalse($row2); + } + + public function testUpdateScheduleRecursiveUpdatesChildrenWithoutOwnTimes(): void + { + // Give child (2) no opening times and write options + Database::exec('UPDATE location SET openingtime = NULL WHERE locationid = 2'); + // Assign options to child 2 + Scheduler::setLocationOptions(2, ['wol' => true, 'sd' => false, 'wol-offset' => 0, 'sd-offset' => 0, 'ra-mode' => Scheduler::RA_ALWAYS]); + // Now modify parent (1) opening time again -> should update child's schedule + $today = date('l'); + $json = json_encode([[ 'days' => [$today], 'openingtime' => '23:59', 'closingtime' => '23:59' ]]); + Database::exec('UPDATE location SET openingtime = :ot WHERE locationid = 1', ['ot' => $json]); + // Trigger recalculation by setting location options on parent (even if unchanged) + Scheduler::setLocationOptions(1, ['wol' => true, 'sd' => false, 'wol-offset' => 0, 'sd-offset' => 0, 'ra-mode' => Scheduler::RA_ALWAYS]); + $child = Database::queryFirst('SELECT * FROM reboot_scheduler WHERE locationid = 2'); + $this->assertNotFalse($child); + $this->assertGreaterThanOrEqual(0, (int)$child['nextexecution']); + } +} |
