Return the correct server & subuser counts for user listing; closes #2469
This commit is contained in:
parent
1f7fe093ae
commit
7b0f998f0b
2 changed files with 61 additions and 2 deletions
|
@ -86,8 +86,8 @@ class UserController extends Controller
|
||||||
{
|
{
|
||||||
$users = QueryBuilder::for(
|
$users = QueryBuilder::for(
|
||||||
User::query()->select('users.*')
|
User::query()->select('users.*')
|
||||||
->selectRaw('COUNT(subusers.id) as subuser_of_count')
|
->selectRaw('COUNT(DISTINCT(subusers.id)) as subuser_of_count')
|
||||||
->selectRaw('COUNT(servers.id) as servers_count')
|
->selectRaw('COUNT(DISTINCT(servers.id)) as servers_count')
|
||||||
->leftJoin('subusers', 'subusers.user_id', '=', 'users.id')
|
->leftJoin('subusers', 'subusers.user_id', '=', 'users.id')
|
||||||
->leftJoin('servers', 'servers.owner_id', '=', 'users.id')
|
->leftJoin('servers', 'servers.owner_id', '=', 'users.id')
|
||||||
->groupBy('users.id')
|
->groupBy('users.id')
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Pterodactyl\Tests\Integration\Http\Controllers\Admin;
|
||||||
|
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Pterodactyl\Models\User;
|
||||||
|
use Pterodactyl\Models\Subuser;
|
||||||
|
use Illuminate\Pagination\LengthAwarePaginator;
|
||||||
|
use Pterodactyl\Tests\Integration\IntegrationTestCase;
|
||||||
|
use Pterodactyl\Http\Controllers\Admin\UserController;
|
||||||
|
|
||||||
|
class UserControllerTest extends IntegrationTestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Test that the index route controller for the user listing returns the expected user
|
||||||
|
* data with the number of servers they are assigned to, and the number of servers they
|
||||||
|
* are a subuser of.
|
||||||
|
*
|
||||||
|
* @see https://github.com/pterodactyl/panel/issues/2469
|
||||||
|
*/
|
||||||
|
public function testIndexReturnsExpectedData()
|
||||||
|
{
|
||||||
|
$unique = Str::random(16);
|
||||||
|
$users = [
|
||||||
|
factory(User::class)->create(['username' => $unique . '_1']),
|
||||||
|
factory(User::class)->create(['username' => $unique . '_2']),
|
||||||
|
];
|
||||||
|
|
||||||
|
$servers = [
|
||||||
|
$this->createServerModel(['owner_id' => $users[0]->id]),
|
||||||
|
$this->createServerModel(['owner_id' => $users[0]->id]),
|
||||||
|
$this->createServerModel(['owner_id' => $users[0]->id]),
|
||||||
|
$this->createServerModel(['owner_id' => $users[1]->id]),
|
||||||
|
];
|
||||||
|
|
||||||
|
Subuser::query()->forceCreate(['server_id' => $servers[0]->id, 'user_id' => $users[1]->id]);
|
||||||
|
Subuser::query()->forceCreate(['server_id' => $servers[1]->id, 'user_id' => $users[1]->id]);
|
||||||
|
|
||||||
|
/** @var \Pterodactyl\Http\Controllers\Admin\UserController $controller */
|
||||||
|
$controller = $this->app->make(UserController::class);
|
||||||
|
|
||||||
|
$request = Request::create('/admin/users?filter[username]=' . $unique, 'GET');
|
||||||
|
$this->app->instance(Request::class, $request);
|
||||||
|
|
||||||
|
$data = $controller->index($request)->getData();
|
||||||
|
$this->assertArrayHasKey('users', $data);
|
||||||
|
$this->assertInstanceOf(LengthAwarePaginator::class, $data['users']);
|
||||||
|
|
||||||
|
/** @var \Pterodactyl\Models\User[] $response */
|
||||||
|
$response = $data['users']->items();
|
||||||
|
$this->assertCount(2, $response);
|
||||||
|
$this->assertInstanceOf(User::class, $response[0]);
|
||||||
|
$this->assertSame(3, (int)$response[0]->servers_count);
|
||||||
|
$this->assertSame(0, (int)$response[0]->subuser_of_count);
|
||||||
|
$this->assertSame(1, (int)$response[1]->servers_count);
|
||||||
|
$this->assertSame(2, (int)$response[1]->subuser_of_count);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue