assertCount(2, $flat); $this->assertEqualsCanonicalizing(['RU-2', 'RU-1'], array_column($flat, 'machineuuid')); $assoc = RebootUtils::getMachinesByUuid(['RU-1', 'RU-2'], true); $this->assertArrayHasKey('RU-1', $assoc); $this->assertSame('h1', $assoc['RU-1']['hostname']); } public function testSortRunningFirstOrdersIdleAndOccupiedFirst(): void { $arr = [ ['state' => 'OFFLINE', 'x' => 3], ['state' => 'OCCUPIED', 'x' => 2], ['state' => 'IDLE', 'x' => 1], ]; RebootUtils::sortRunningFirst($arr); $this->assertContains($arr[0]['state'], ['IDLE', 'OCCUPIED']); $this->assertContains($arr[1]['state'], ['IDLE', 'OCCUPIED']); $this->assertSame('OFFLINE', $arr[2]['state']); } public function testGetFilteredMachineListFiltersByPermissionAndWarnings(): void { // Seed machines Database::exec("INSERT INTO machine (machineuuid, subnetlocationid, locationid, hostname, clientip, state) VALUES ('RU-3', 1, 2, 'h3', '10.0.0.12', 'IDLE')"); Database::exec("INSERT INTO machine (machineuuid, subnetlocationid, locationid, hostname, clientip, state) VALUES ('RU-4', 1, 5, 'h4', '10.0.0.13', 'IDLE')"); // No permissions -> both filtered out User::$loggedIn = true; User::$permissions = []; // User::hasPermission returns false $out = RebootUtils::getFilteredMachineList(['RU-3', 'RU-4'], '.rebootcontrol.action.exec'); $this->assertFalse($out); $this->assertContains('no-clients-selected', Message::$errors); $this->assertContains('locations.no-permission-location', Message::$warnings); // Allow only location 2 via hasPermission -> return only RU-3 Message::reset(); User::$permissions = ['.rebootcontrol.action.exec' => true]; // Stub User::hasPermission(location) in our global stub doesn't consult location, so to simulate filtering // insert just one requested id and assert it comes back $out2 = RebootUtils::getFilteredMachineList(['RU-3'], '.rebootcontrol.action.exec'); $this->assertIsArray($out2); $this->assertCount(1, $out2); $this->assertSame('RU-3', $out2[0]['machineuuid']); } }