Skip to content

Commit 60e1ffa

Browse files
committed
Added a test for the controller and cleaned up the controller
1 parent 7a81c61 commit 60e1ffa

File tree

9 files changed

+188
-23
lines changed

9 files changed

+188
-23
lines changed

app/Contracts/Repository/NodeRepositoryInterface.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ interface NodeRepositoryInterface extends RepositoryInterface, SearchableInterfa
2121
*/
2222
public function getUsageStats(Node $node): array;
2323

24+
/**
25+
* Return the usage stats for a single node.
26+
*
27+
* @param \Pterodactyl\Models\Node $node
28+
* @return array
29+
*/
30+
public function getUsageStatsRaw(Node $node): array;
31+
2432
/**
2533
* Return all available nodes with a searchable interface.
2634
*

app/Contracts/Repository/ServerRepositoryInterface.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,11 @@ public function getServersForPowerActionCount(array $servers = [], array $nodes
145145
* @return bool
146146
*/
147147
public function isUniqueUuidCombo(string $uuid, string $short): bool;
148+
149+
/**
150+
* Get the amount of servers that are suspended
151+
*
152+
* @return int
153+
*/
154+
public function getSuspendedServersCount(): int;
148155
}

app/Http/Controllers/Admin/StatisticsController.php

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,16 @@
1111
use Pterodactyl\Contracts\Repository\ServerRepositoryInterface;
1212
use Pterodactyl\Contracts\Repository\UserRepositoryInterface;
1313
use Pterodactyl\Http\Controllers\Controller;
14-
use Pterodactyl\Services\DaemonKeys\DaemonKeyProviderService;
15-
use Pterodactyl\Traits\Controllers\JavascriptStatisticsInjection;
14+
use Pterodactyl\Traits\Controllers\PlainJavascriptInjection;
1615

1716
class StatisticsController extends Controller
1817
{
19-
use JavascriptStatisticsInjection;
18+
use PlainJavascriptInjection;
2019

2120
private $allocationRepository;
2221

2322
private $databaseRepository;
2423

25-
private $keyProviderService;
26-
2724
private $eggRepository;
2825

2926
private $nodeRepository;
@@ -35,7 +32,6 @@ class StatisticsController extends Controller
3532
function __construct(
3633
AllocationRepositoryInterface $allocationRepository,
3734
DatabaseRepositoryInterface $databaseRepository,
38-
DaemonKeyProviderService $keyProviderService,
3935
EggRepositoryInterface $eggRepository,
4036
NodeRepositoryInterface $nodeRepository,
4137
ServerRepositoryInterface $serverRepository,
@@ -44,28 +40,33 @@ function __construct(
4440
{
4541
$this->allocationRepository = $allocationRepository;
4642
$this->databaseRepository = $databaseRepository;
47-
$this->keyProviderService = $keyProviderService;
4843
$this->eggRepository = $eggRepository;
4944
$this->nodeRepository = $nodeRepository;
5045
$this->serverRepository = $serverRepository;
5146
$this->userRepository = $userRepository;
5247
}
5348

54-
public function index(Request $request)
49+
public function index()
5550
{
5651
$servers = $this->serverRepository->all();
57-
$serversCount = count($servers);
5852
$nodes = $this->nodeRepository->all();
59-
$nodesCount = count($nodes);
6053
$usersCount = $this->userRepository->count();
6154
$eggsCount = $this->eggRepository->count();
6255
$databasesCount = $this->databaseRepository->count();
63-
$totalServerRam = DB::table('servers')->sum('memory');
64-
$totalNodeRam = DB::table('nodes')->sum('memory');
65-
$totalServerDisk = DB::table('servers')->sum('disk');
66-
$totalNodeDisk = DB::table('nodes')->sum('disk');
6756
$totalAllocations = $this->allocationRepository->count();
68-
$suspendedServersCount = $this->serverRepository->getBuilder()->where('suspended', true)->count();
57+
$suspendedServersCount = $this->serverRepository->getSuspendedServersCount();
58+
59+
$totalServerRam = 0;
60+
$totalNodeRam = 0;
61+
$totalServerDisk = 0;
62+
$totalNodeDisk = 0;
63+
foreach ($nodes as $node) {
64+
$stats = $this->nodeRepository->getUsageStatsRaw($node);
65+
$totalServerRam += $stats['memory']['value'];
66+
$totalNodeRam += $stats['memory']['max'];
67+
$totalServerDisk += $stats['disk']['value'];
68+
$totalNodeDisk += $stats['disk']['max'];
69+
}
6970

7071
$tokens = [];
7172
foreach ($nodes as $node) {
@@ -74,7 +75,6 @@ public function index(Request $request)
7475

7576
$this->injectJavascript([
7677
'servers' => $servers,
77-
'serverCount' => $serversCount,
7878
'suspendedServers' => $suspendedServersCount,
7979
'totalServerRam' => $totalServerRam,
8080
'totalNodeRam' => $totalNodeRam,
@@ -83,10 +83,10 @@ public function index(Request $request)
8383
'nodes' => $nodes,
8484
'tokens' => $tokens,
8585
]);
86-
86+
8787
return view('admin.statistics', [
88-
'serversCount' => $serversCount,
89-
'nodesCount' => $nodesCount,
88+
'servers' => $servers,
89+
'nodes' => $nodes,
9090
'usersCount' => $usersCount,
9191
'eggsCount' => $eggsCount,
9292
'totalServerRam' => $totalServerRam,

app/Repositories/Eloquent/NodeRepository.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,33 @@ public function getUsageStats(Node $node): array
5656
})->toArray();
5757
}
5858

59+
/**
60+
* Return the usage stats for a single node.
61+
*
62+
* @param \Pterodactyl\Models\Node $node
63+
* @return array
64+
*/
65+
public function getUsageStatsRaw(Node $node): array
66+
{
67+
$stats = $this->getBuilder()->select(
68+
$this->getBuilder()->raw('IFNULL(SUM(servers.memory), 0) as sum_memory, IFNULL(SUM(servers.disk), 0) as sum_disk')
69+
)->join('servers', 'servers.node_id', '=', 'nodes.id')->where('node_id', $node->id)->first();
70+
71+
return collect(['disk' => $stats->sum_disk, 'memory' => $stats->sum_memory])->mapWithKeys(function ($value, $key) use ($node) {
72+
$maxUsage = $node->{$key};
73+
if ($node->{$key . '_overallocate'} > 0) {
74+
$maxUsage = $node->{$key} * (1 + ($node->{$key . '_overallocate'} / 100));
75+
}
76+
77+
return [
78+
$key => [
79+
'value' => $value,
80+
'max' => $maxUsage,
81+
],
82+
];
83+
})->toArray();
84+
}
85+
5986
/**
6087
* Return all available nodes with a searchable interface.
6188
*

app/Repositories/Eloquent/ServerRepository.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,4 +328,14 @@ private function getUserAccessServers(int $user): array
328328
$this->app->make(SubuserRepository::class)->getBuilder()->select('server_id')->where('user_id', $user)
329329
)->pluck('id')->all();
330330
}
331+
332+
/**
333+
* Get the amount of servers that are suspended
334+
*
335+
* @return int
336+
*/
337+
public function getSuspendedServersCount(): int
338+
{
339+
return $this->getBuilder()->where('suspended', true)->count();
340+
}
331341
}

app/Traits/Controllers/JavascriptStatisticsInjection.php renamed to app/Traits/Controllers/PlainJavascriptInjection.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
use JavaScript;
1212

13-
trait JavascriptStatisticsInjection
13+
trait PlainJavascriptInjection
1414
{
1515

1616
/**

public/themes/pterodactyl/js/admin/statistics.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ let ramChart = new Chart($('#ram_chart'), {
2828
}
2929
});
3030

31-
var activeServers = Pterodactyl.serverCount - Pterodactyl.suspendedServers;
31+
var activeServers = Pterodactyl.servers.length - Pterodactyl.suspendedServers;
3232
let serversChart = new Chart($('#servers_chart'), {
3333
type: 'pie',
3434
data: {

resources/themes/pterodactyl/admin/statistics.blade.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
<span class="info-box-icon"><i class="fa fa-server"></i></span>
3636
<div class="info-box-content number-info-box-content">
3737
<span class="info-box-text">Servers</span>
38-
<span class="info-box-number">{{ $serversCount }}</span>
38+
<span class="info-box-number">{{ count($servers) }}</span>
3939
</div>
4040
</div>
4141
<div class="info-box bg-blue">
@@ -118,7 +118,7 @@
118118
<span class="info-box-icon"><i class="fa fa-server"></i></span>
119119
<div class="info-box-content number-info-box-content">
120120
<span class="info-box-text">Total Nodes</span>
121-
<span class="info-box-number">{{ $nodesCount }}</span>
121+
<span class="info-box-number">{{ count($nodes) }}</span>
122122
</div>
123123
</div>
124124
</div>
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
<?php
2+
/**
3+
* Created by PhpStorm.
4+
* User: Stan
5+
* Date: 26-5-2018
6+
* Time: 21:06
7+
*/
8+
9+
namespace Tests\Unit\Http\Controllers\Admin;
10+
11+
use Illuminate\Database\Eloquent\Builder;
12+
use Illuminate\Routing\Controller;
13+
use Mockery as m;
14+
use Pterodactyl\Contracts\Repository\AllocationRepositoryInterface;
15+
use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface;
16+
use Pterodactyl\Contracts\Repository\EggRepositoryInterface;
17+
use Pterodactyl\Contracts\Repository\NodeRepositoryInterface;
18+
use Pterodactyl\Contracts\Repository\ServerRepositoryInterface;
19+
use Pterodactyl\Contracts\Repository\UserRepositoryInterface;
20+
use Pterodactyl\Http\Controllers\Admin\StatisticsController;
21+
use Pterodactyl\Models\Node;
22+
use Tests\Assertions\ControllerAssertionsTrait;
23+
use Tests\Unit\Http\Controllers\ControllerTestCase;
24+
25+
class StatisticsControllerTest extends ControllerTestCase
26+
{
27+
use ControllerAssertionsTrait;
28+
29+
/**
30+
* @var \Pterodactyl\Contracts\Repository\AllocationRepositoryInterface|\Mockery\Mock
31+
*/
32+
private $allocationRepository;
33+
34+
/**
35+
* @var \Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface|\Mockery\Mock
36+
*/
37+
private $databaseRepository;
38+
39+
/**
40+
* @var \Pterodactyl\Contracts\Repository\EggRepositoryInterface|\Mockery\Mock
41+
*/
42+
private $eggRepository;
43+
44+
/**
45+
* @var \Pterodactyl\Contracts\Repository\NodeRepositoryInterface|\Mockery\Mock
46+
*/
47+
private $nodeRepository;
48+
49+
/**
50+
* @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface|\Mockery\Mock
51+
*/
52+
private $serverRepository;
53+
54+
/**
55+
* @var \Pterodactyl\Contracts\Repository\UserRepositoryInterface|\Mockery\Mock
56+
*/
57+
private $userRepository;
58+
59+
public function setUp()
60+
{
61+
parent::setUp();
62+
63+
$this->allocationRepository = m::mock(AllocationRepositoryInterface::class);
64+
$this->databaseRepository = m::mock(DatabaseRepositoryInterface::class);
65+
$this->eggRepository = m::mock(EggRepositoryInterface::class);
66+
$this->nodeRepository = m::mock(NodeRepositoryInterface::class);
67+
$this->serverRepository = m::mock(ServerRepositoryInterface::class);
68+
$this->userRepository = m::mock(UserRepositoryInterface::class);
69+
}
70+
71+
public function testIndexController()
72+
{
73+
$controller = $this->getController();
74+
75+
$this->serverRepository->shouldReceive('all')->withNoArgs();
76+
$this->nodeRepository->shouldReceive('all')->withNoArgs()->andReturn(collect([factory(Node::class)->make(), factory(Node::class)->make()]));
77+
$this->userRepository->shouldReceive('count')->withNoArgs();
78+
$this->eggRepository->shouldReceive('count')->withNoArgs();
79+
$this->databaseRepository->shouldReceive('count')->withNoArgs();
80+
$this->allocationRepository->shouldReceive('count')->withNoArgs();
81+
$this->serverRepository->shouldReceive('getSuspendedServersCount')->withNoArgs();
82+
83+
$this->nodeRepository->shouldReceive('getUsageStatsRaw')->twice()->andReturn([
84+
'memory' => [
85+
'value' => 1024,
86+
'max' => 512,
87+
],
88+
'disk' => [
89+
'value' => 1024,
90+
'max' => 512,
91+
]
92+
]);
93+
94+
$controller->shouldReceive('injectJavascript')->once();
95+
96+
$response = $controller->index();
97+
98+
$this->assertIsViewResponse($response);
99+
$this->assertViewNameEquals('admin.statistics', $response);
100+
}
101+
102+
private function getController()
103+
{
104+
return $this->buildMockedController(StatisticsController::class, [$this->allocationRepository,
105+
$this->databaseRepository,
106+
$this->eggRepository,
107+
$this->nodeRepository,
108+
$this->serverRepository,
109+
$this->userRepository]
110+
);
111+
}
112+
113+
}

0 commit comments

Comments
 (0)