Fix all currently failing tests

This commit is contained in:
Dane Everitt 2017-09-24 22:28:16 -05:00
parent 3a8bea9588
commit dd456a4c9c
No known key found for this signature in database
GPG key ID: EEA66103B3D71F53
11 changed files with 175 additions and 315 deletions

View file

@ -54,7 +54,7 @@ class DetailsModificationService
/**
* @var \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService
*/
private $keyDeletionService;
protected $keyDeletionService;
/**
* @var \Pterodactyl\Repositories\Eloquent\ServerRepository

View file

@ -76,27 +76,27 @@ class SubuserCreationService
* SubuserCreationService constructor.
*
* @param \Illuminate\Database\ConnectionInterface $connection
* @param \Pterodactyl\Services\Users\UserCreationService $userCreationService
* @param \Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService $keyCreationService
* @param \Pterodactyl\Services\Subusers\PermissionCreationService $permissionService
* @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $serverRepository
* @param \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface $subuserRepository
* @param \Pterodactyl\Services\Users\UserCreationService $userCreationService
* @param \Pterodactyl\Contracts\Repository\UserRepositoryInterface $userRepository
*/
public function __construct(
ConnectionInterface $connection,
UserCreationService $userCreationService,
DaemonKeyCreationService $keyCreationService,
PermissionCreationService $permissionService,
ServerRepositoryInterface $serverRepository,
SubuserRepositoryInterface $subuserRepository,
UserCreationService $userCreationService,
UserRepositoryInterface $userRepository
) {
$this->connection = $connection;
$this->keyCreationService = $keyCreationService;
$this->permissionService = $permissionService;
$this->subuserRepository = $subuserRepository;
$this->serverRepository = $serverRepository;
$this->subuserRepository = $subuserRepository;
$this->userRepository = $userRepository;
$this->userCreationService = $userCreationService;
}

View file

@ -24,6 +24,7 @@
namespace Pterodactyl\Services\Subusers;
use Pterodactyl\Models\Subuser;
use Illuminate\Database\ConnectionInterface;
use Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService;
use Pterodactyl\Contracts\Repository\SubuserRepositoryInterface;
@ -65,14 +66,16 @@ class SubuserDeletionService
/**
* Delete a subuser and their associated permissions from the Panel and Daemon.
*
* @param int $subuser
* @param int|\Pterodactyl\Models\Subuser $subuser
*
* @throws \Pterodactyl\Exceptions\DisplayException
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
*/
public function handle($subuser)
{
$subuser = $this->repository->getWithServer($subuser);
if (! $subuser instanceof Subuser) {
$subuser = $this->repository->find($subuser);
}
$this->connection->beginTransaction();
$this->keyDeletionService->handle($subuser->server_id, $subuser->user_id);

View file

@ -30,7 +30,6 @@ $factory->define(Pterodactyl\Models\Server::class, function (Faker\Generator $fa
'cpu' => 0,
'oom_disabled' => 0,
'pack_id' => null,
'daemonSecret' => $faker->uuid,
'username' => $faker->userName,
'sftp_password' => null,
'installed' => 1,
@ -153,7 +152,6 @@ $factory->define(Pterodactyl\Models\Subuser::class, function (Faker\Generator $f
'id' => $faker->unique()->randomNumber(),
'user_id' => $faker->randomNumber(),
'server_id' => $faker->randomNumber(),
'daemonSecret' => $faker->unique()->uuid,
];
});
@ -197,3 +195,13 @@ $factory->define(Pterodactyl\Models\Task::class, function (Faker\Generator $fake
'is_queued' => false,
];
});
$factory->define(Pterodactyl\Models\DaemonKey::class, function (Faker\Generator $faker) {
return [
'id' => $faker->unique()->randomNumber(),
'server_id' => $faker->randomNumber(),
'user_id' => $faker->randomNumber(),
'secret' => 'i_' . str_random(40),
'expires_at' => \Carbon\Carbon::now()->addMinutes(10)->toDateTimeString(),
];
});

View file

@ -31,7 +31,7 @@ use Pterodactyl\Models\User;
use Pterodactyl\Models\Server;
use Tests\Assertions\ControllerAssertionsTrait;
use Pterodactyl\Http\Controllers\Base\IndexController;
use Pterodactyl\Services\Servers\ServerAccessHelperService;
use Pterodactyl\Services\DaemonKeys\DaemonKeyProviderService;
use Pterodactyl\Contracts\Repository\ServerRepositoryInterface;
use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface;
@ -39,28 +39,28 @@ class IndexControllerTest extends TestCase
{
use ControllerAssertionsTrait;
/**
* @var \Pterodactyl\Services\Servers\ServerAccessHelperService
*/
protected $access;
/**
* @var \Pterodactyl\Http\Controllers\Base\IndexController
*/
protected $controller;
/**
* @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface
* @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface|\Mockery\Mock
*/
protected $daemonRepository;
/**
* @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface
* @var \Pterodactyl\Services\DaemonKeys\DaemonKeyProviderService|\Mockery\Mock
*/
protected $keyProviderService;
/**
* @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface|\Mockery\Mock
*/
protected $repository;
/**
* @var \Illuminate\Http\Request
* @var \Illuminate\Http\Request|\Mockery\Mock
*/
protected $request;
@ -71,12 +71,12 @@ class IndexControllerTest extends TestCase
{
parent::setUp();
$this->access = m::mock(ServerAccessHelperService::class);
$this->daemonRepository = m::mock(DaemonServerRepositoryInterface::class);
$this->keyProviderService = m::mock(DaemonKeyProviderService::class);
$this->repository = m::mock(ServerRepositoryInterface::class);
$this->request = m::mock(Request::class);
$this->controller = new IndexController($this->daemonRepository, $this->access, $this->repository);
$this->controller = new IndexController($this->keyProviderService, $this->daemonRepository, $this->repository);
}
/**
@ -109,16 +109,17 @@ class IndexControllerTest extends TestCase
$server = factory(Server::class)->make(['suspended' => 0, 'installed' => 1]);
$this->request->shouldReceive('user')->withNoArgs()->once()->andReturn($user);
$this->access->shouldReceive('handle')->with($server->uuid, $user)->once()->andReturn($server);
$this->repository->shouldReceive('findFirstWhere')->with([['uuidShort', '=', $server->uuidShort]])->once()->andReturn($server);
$this->keyProviderService->shouldReceive('handle')->with($server->id, $user->id)->once()->andReturn('test123');
$this->daemonRepository->shouldReceive('setNode')->with($server->node_id)->once()->andReturnSelf()
->shouldReceive('setAccessServer')->with($server->uuid)->once()->andReturnSelf()
->shouldReceive('setAccessToken')->with($server->daemonSecret)->once()->andReturnSelf()
->shouldReceive('setAccessToken')->with('test123')->once()->andReturnSelf()
->shouldReceive('details')->withNoArgs()->once()->andReturnSelf();
$this->daemonRepository->shouldReceive('getBody')->withNoArgs()->once()->andReturn('["test"]');
$response = $this->controller->status($this->request, $server->uuid);
$response = $this->controller->status($this->request, $server->uuidShort);
$this->assertIsJsonResponse($response);
$this->assertResponseJsonEquals(['test'], $response);
}
@ -132,9 +133,10 @@ class IndexControllerTest extends TestCase
$server = factory(Server::class)->make(['suspended' => 0, 'installed' => 0]);
$this->request->shouldReceive('user')->withNoArgs()->once()->andReturn($user);
$this->access->shouldReceive('handle')->with($server->uuid, $user)->once()->andReturn($server);
$this->repository->shouldReceive('findFirstWhere')->with([['uuidShort', '=', $server->uuidShort]])->once()->andReturn($server);
$this->keyProviderService->shouldReceive('handle')->with($server->id, $user->id)->once()->andReturn('test123');
$response = $this->controller->status($this->request, $server->uuid);
$response = $this->controller->status($this->request, $server->uuidShort);
$this->assertIsJsonResponse($response);
$this->assertResponseCodeEquals(200, $response);
$this->assertResponseJsonEquals(['status' => 20], $response);
@ -149,9 +151,10 @@ class IndexControllerTest extends TestCase
$server = factory(Server::class)->make(['suspended' => 1, 'installed' => 1]);
$this->request->shouldReceive('user')->withNoArgs()->once()->andReturn($user);
$this->access->shouldReceive('handle')->with($server->uuid, $user)->once()->andReturn($server);
$this->repository->shouldReceive('findFirstWhere')->with([['uuidShort', '=', $server->uuidShort]])->once()->andReturn($server);
$this->keyProviderService->shouldReceive('handle')->with($server->id, $user->id)->once()->andReturn('test123');
$response = $this->controller->status($this->request, $server->uuid);
$response = $this->controller->status($this->request, $server->uuidShort);
$this->assertIsJsonResponse($response);
$this->assertResponseCodeEquals(200, $response);
$this->assertResponseJsonEquals(['status' => 30], $response);

View file

@ -41,12 +41,12 @@ class NodeUpdateServiceTest extends TestCase
use PHPMock;
/**
* @var \Pterodactyl\Contracts\Repository\Daemon\ConfigurationRepositoryInterface
* @var \Pterodactyl\Contracts\Repository\Daemon\ConfigurationRepositoryInterface|\Mockery\Mock
*/
protected $configRepository;
/**
* @var \GuzzleHttp\Exception\RequestException
* @var \GuzzleHttp\Exception\RequestException|\Mockery\Mock
*/
protected $exception;
@ -56,7 +56,7 @@ class NodeUpdateServiceTest extends TestCase
protected $node;
/**
* @var \Pterodactyl\Contracts\Repository\NodeRepositoryInterface
* @var \Pterodactyl\Contracts\Repository\NodeRepositoryInterface|\Mockery\Mock
*/
protected $repository;
@ -66,7 +66,7 @@ class NodeUpdateServiceTest extends TestCase
protected $service;
/**
* @var \Illuminate\Log\Writer
* @var \Illuminate\Log\Writer|\Mockery\Mock
*/
protected $writer;
@ -106,7 +106,6 @@ class NodeUpdateServiceTest extends TestCase
])->andReturn(true);
$this->configRepository->shouldReceive('setNode')->with($this->node->id)->once()->andReturnSelf()
->shouldReceive('setAccessToken')->with($this->node->daemonSecret)->once()->andReturnSelf()
->shouldReceive('update')->withNoArgs()->once()->andReturnNull();
$this->assertTrue($this->service->handle($this->node, ['name' => 'NewName', 'reset_secret' => true]));
@ -123,7 +122,6 @@ class NodeUpdateServiceTest extends TestCase
])->andReturn(true);
$this->configRepository->shouldReceive('setNode')->with($this->node->id)->once()->andReturnSelf()
->shouldReceive('setAccessToken')->with($this->node->daemonSecret)->once()->andReturnSelf()
->shouldReceive('update')->withNoArgs()->once()->andReturnNull();
$this->assertTrue($this->service->handle($this->node, ['name' => 'NewName']));
@ -167,7 +165,6 @@ class NodeUpdateServiceTest extends TestCase
])->andReturn(true);
$this->configRepository->shouldReceive('setNode')->with($this->node->id)->once()->andReturnSelf()
->shouldReceive('setAccessToken')->with($this->node->daemonSecret)->once()->andReturnSelf()
->shouldReceive('update')->withNoArgs()->once()->andReturnNull();
$this->assertTrue($this->service->handle($this->node->id, ['name' => 'NewName']));

View file

@ -28,36 +28,46 @@ use Exception;
use Mockery as m;
use Tests\TestCase;
use Illuminate\Log\Writer;
use phpmock\phpunit\PHPMock;
use Pterodactyl\Models\Server;
use Illuminate\Database\DatabaseManager;
use GuzzleHttp\Exception\RequestException;
use Illuminate\Database\ConnectionInterface;
use Pterodactyl\Exceptions\DisplayException;
use Pterodactyl\Exceptions\PterodactylException;
use Pterodactyl\Repositories\Eloquent\ServerRepository;
use Pterodactyl\Services\Servers\DetailsModificationService;
use Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService;
use Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService;
use Pterodactyl\Repositories\Daemon\ServerRepository as DaemonServerRepository;
class DetailsModificationServiceTest extends TestCase
{
use PHPMock;
/**
* @var \Illuminate\Database\DatabaseManager
* @var \Illuminate\Database\ConnectionInterface|\Mockery\Mock
*/
protected $database;
protected $connection;
/**
* @var \Pterodactyl\Repositories\Daemon\ServerRepository
* @var \Pterodactyl\Repositories\Daemon\ServerRepository|\Mockery\Mock
*/
protected $daemonServerRepository;
/**
* @var \GuzzleHttp\Exception\RequestException
* @var \GuzzleHttp\Exception\RequestException|\Mockery\Mock
*/
protected $exception;
/**
* @var \Pterodactyl\Repositories\Eloquent\ServerRepository
* @var \Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService|\Mockery\Mock
*/
protected $keyCreationService;
/**
* @var \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService|\Mockery\Mock
*/
protected $keyDeletionService;
/**
* @var \Pterodactyl\Repositories\Eloquent\ServerRepository|\Mockery\Mock
*/
protected $repository;
@ -67,7 +77,7 @@ class DetailsModificationServiceTest extends TestCase
protected $service;
/**
* @var \Illuminate\Log\Writer
* @var \Illuminate\Log\Writer|\Mockery\Mock
*/
protected $writer;
@ -78,17 +88,18 @@ class DetailsModificationServiceTest extends TestCase
{
parent::setUp();
$this->database = m::mock(DatabaseManager::class);
$this->connection = m::mock(ConnectionInterface::class);
$this->exception = m::mock(RequestException::class)->makePartial();
$this->daemonServerRepository = m::mock(DaemonServerRepository::class);
$this->keyCreationService = m::mock(DaemonKeyCreationService::class);
$this->keyDeletionService = m::mock(DaemonKeyDeletionService::class);
$this->repository = m::mock(ServerRepository::class);
$this->writer = m::mock(Writer::class);
$this->getFunctionMock('\\Pterodactyl\\Services\\Servers', 'str_random')
->expects($this->any())->willReturn('random_string');
$this->service = new DetailsModificationService(
$this->database,
$this->connection,
$this->keyCreationService,
$this->keyDeletionService,
$this->daemonServerRepository,
$this->repository,
$this->writer
@ -106,21 +117,18 @@ class DetailsModificationServiceTest extends TestCase
$data = ['owner_id' => 1, 'name' => 'New Name', 'description' => 'New Description'];
$this->repository->shouldNotReceive('find');
$this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf()
->shouldReceive('update')->with($server->id, [
'owner_id' => $data['owner_id'],
'name' => $data['name'],
'description' => $data['description'],
'daemonSecret' => $server->daemonSecret,
], true, true)->once()->andReturnNull();
$this->database->shouldReceive('commit')->withNoArgs()->once()->andReturn(true);
$this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull();
$response = $this->service->edit($server, $data);
$this->assertTrue($response);
$this->service->edit($server, $data);
$this->assertTrue(true);
}
/**
@ -135,20 +143,18 @@ class DetailsModificationServiceTest extends TestCase
$data = ['owner_id' => 1, 'name' => 'New Name', 'description' => 'New Description'];
$this->repository->shouldReceive('find')->with($server->id)->once()->andReturn($server);
$this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf()
->shouldReceive('update')->with($server->id, [
'owner_id' => $data['owner_id'],
'name' => $data['name'],
'description' => $data['description'],
'daemonSecret' => $server->daemonSecret,
], true, true)->once()->andReturnNull();
$this->database->shouldReceive('commit')->withNoArgs()->once()->andReturn(true);
$this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull();
$response = $this->service->edit($server->id, $data);
$this->assertTrue($response);
$this->service->edit($server->id, $data);
$this->assertTrue(true);
}
/**
@ -163,135 +169,20 @@ class DetailsModificationServiceTest extends TestCase
$data = ['owner_id' => 2, 'name' => 'New Name', 'description' => 'New Description'];
$this->repository->shouldNotReceive('find');
$this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf()
->shouldReceive('update')->with($server->id, [
'owner_id' => $data['owner_id'],
'name' => $data['name'],
'description' => $data['description'],
'daemonSecret' => 'random_string',
], true, true)->once()->andReturnNull();
$this->daemonServerRepository->shouldReceive('setNode')->with($server->node_id)->once()->andReturnSelf()
->shouldReceive('setAccessServer')->with($server->uuid)->once()->andReturnSelf()
->shouldReceive('update')->with([
'keys' => [
$server->daemonSecret => [],
'random_string' => DaemonServerRepository::DAEMON_PERMISSIONS,
],
])->once()->andReturnNull();
$this->database->shouldReceive('commit')->withNoArgs()->once()->andReturn(true);
$response = $this->service->edit($server, $data);
$this->assertTrue($response);
}
public function testEditShouldResetDaemonSecretIfBooleanValueIsPassed()
{
$server = factory(Server::class)->make([
'owner_id' => 1,
'node_id' => 1,
]);
$data = ['owner_id' => 1, 'name' => 'New Name', 'description' => 'New Description', 'reset_token' => true];
$this->repository->shouldNotReceive('find');
$this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf()
->shouldReceive('update')->with($server->id, [
'owner_id' => $data['owner_id'],
'name' => $data['name'],
'description' => $data['description'],
'daemonSecret' => 'random_string',
], true, true)->once()->andReturnNull();
$this->daemonServerRepository->shouldReceive('setNode')->with($server->node_id)->once()->andReturnSelf()
->shouldReceive('setAccessServer')->with($server->uuid)->once()->andReturnSelf()
->shouldReceive('update')->with([
'keys' => [
$server->daemonSecret => [],
'random_string' => DaemonServerRepository::DAEMON_PERMISSIONS,
],
])->once()->andReturnNull();
$this->database->shouldReceive('commit')->withNoArgs()->once()->andReturn(true);
$response = $this->service->edit($server, $data);
$this->assertTrue($response);
}
/**
* Test that a displayable exception is thrown if the daemon responds with an error.
*/
public function testEditShouldThrowADisplayableExceptionIfDaemonResponseErrors()
{
$server = factory(Server::class)->make([
'owner_id' => 1,
'node_id' => 1,
]);
$data = ['owner_id' => 2, 'name' => 'New Name', 'description' => 'New Description'];
$this->repository->shouldNotReceive('find');
$this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf()
->shouldReceive('update')->with($server->id, [
'owner_id' => $data['owner_id'],
'name' => $data['name'],
'description' => $data['description'],
'daemonSecret' => 'random_string',
], true, true)->once()->andReturnNull();
$this->daemonServerRepository->shouldReceive('setNode')->andThrow($this->exception);
$this->exception->shouldReceive('getResponse')->withNoArgs()->once()->andReturnSelf()
->shouldReceive('getStatusCode')->withNoArgs()->once()->andReturn(400);
$this->writer->shouldReceive('warning')->with($this->exception)->once()->andReturnNull();
try {
$this->service->edit($server, $data);
} catch (Exception $exception) {
$this->assertInstanceOf(DisplayException::class, $exception);
$this->assertEquals(
trans('admin/server.exceptions.daemon_exception', ['code' => 400]),
$exception->getMessage()
);
}
}
/**
* Test that an exception not stemming from Guzzle is not thrown as a displayable exception.
*
* @expectedException \Exception
*/
public function testEditShouldNotThrowDisplayableExceptionIfExceptionIsNotThrownByGuzzle()
{
$server = factory(Server::class)->make([
'owner_id' => 1,
'node_id' => 1,
]);
$data = ['owner_id' => 2, 'name' => 'New Name', 'description' => 'New Description'];
$this->repository->shouldNotReceive('find');
$this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf()
->shouldReceive('update')->with($server->id, [
'owner_id' => $data['owner_id'],
'name' => $data['name'],
'description' => $data['description'],
'daemonSecret' => 'random_string',
], true, true)->once()->andReturnNull();
$this->daemonServerRepository->shouldReceive('setNode')->andThrow(new Exception());
$this->keyDeletionService->shouldReceive('handle')->with($server, $server->owner_id)->once()->andReturnNull();
$this->keyCreationService->shouldReceive('handle')->with($server->id, $data['owner_id']);
$this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull();
$this->service->edit($server, $data);
$this->assertTrue(true);
}
/**
@ -301,8 +192,7 @@ class DetailsModificationServiceTest extends TestCase
{
$server = factory(Server::class)->make(['node_id' => 1]);
$this->repository->shouldNotReceive('find');
$this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf()
->shouldReceive('update')->with($server->id, [
'image' => 'new/image',
@ -316,9 +206,10 @@ class DetailsModificationServiceTest extends TestCase
],
])->once()->andReturnNull();
$this->database->shouldReceive('commit')->withNoArgs()->once()->andReturn(true);
$this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull();
$this->service->setDockerImage($server, 'new/image');
$this->assertTrue(true);
}
/**
@ -329,7 +220,7 @@ class DetailsModificationServiceTest extends TestCase
$server = factory(Server::class)->make(['node_id' => 1]);
$this->repository->shouldReceive('find')->with($server->id)->once()->andReturn($server);
$this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf()
->shouldReceive('update')->with($server->id, [
'image' => 'new/image',
@ -343,9 +234,10 @@ class DetailsModificationServiceTest extends TestCase
],
])->once()->andReturnNull();
$this->database->shouldReceive('commit')->withNoArgs()->once()->andReturn(true);
$this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull();
$this->service->setDockerImage($server->id, 'new/image');
$this->assertTrue(true);
}
/**
@ -355,13 +247,14 @@ class DetailsModificationServiceTest extends TestCase
{
$server = factory(Server::class)->make(['node_id' => 1]);
$this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf()
->shouldReceive('update')->with($server->id, [
'image' => 'new/image',
])->once()->andReturnNull();
$this->daemonServerRepository->shouldReceive('setNode')->andThrow($this->exception);
$this->connection->shouldReceive('rollBack')->withNoArgs()->once()->andReturnNull();
$this->exception->shouldReceive('getResponse')->withNoArgs()->once()->andReturnSelf()
->shouldReceive('getStatusCode')->withNoArgs()->once()->andReturn(400);
@ -369,7 +262,7 @@ class DetailsModificationServiceTest extends TestCase
try {
$this->service->setDockerImage($server, 'new/image');
} catch (Exception $exception) {
} catch (PterodactylException $exception) {
$this->assertInstanceOf(DisplayException::class, $exception);
$this->assertEquals(
trans('admin/server.exceptions.daemon_exception', ['code' => 400]),

View file

@ -32,7 +32,7 @@ use Pterodactyl\Contracts\Repository\PermissionRepositoryInterface;
class PermissionCreationServiceTest extends TestCase
{
/**
* @var \Pterodactyl\Contracts\Repository\PermissionRepositoryInterface
* @var \Pterodactyl\Contracts\Repository\PermissionRepositoryInterface|\Mockery\Mock
*/
protected $repository;
@ -59,14 +59,13 @@ class PermissionCreationServiceTest extends TestCase
{
$permissions = ['reset-sftp', 'view-sftp'];
$this->repository->shouldReceive('insert')->with([
['subuser_id' => 1, 'permission' => 'reset-sftp'],
['subuser_id' => 1, 'permission' => 'view-sftp'],
]);
$this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf()
->shouldReceive('insert')->with([
['subuser_id' => 1, 'permission' => 'reset-sftp'],
['subuser_id' => 1, 'permission' => 'view-sftp'],
])->once()->andReturnNull();
$response = $this->service->handle(1, $permissions);
$this->assertNotEmpty($response);
$this->assertEquals(['s:get', 's:console', 's:set-password'], $response);
$this->service->handle(1, $permissions);
$this->assertTrue(true);
}
}

View file

@ -26,7 +26,6 @@ namespace Tests\Unit\Services\Subusers;
use Mockery as m;
use Tests\TestCase;
use Illuminate\Log\Writer;
use phpmock\phpunit\PHPMock;
use Pterodactyl\Models\User;
use Pterodactyl\Models\Server;
@ -37,39 +36,39 @@ use Pterodactyl\Services\Users\UserCreationService;
use Pterodactyl\Services\Subusers\SubuserCreationService;
use Pterodactyl\Services\Subusers\PermissionCreationService;
use Pterodactyl\Contracts\Repository\UserRepositoryInterface;
use Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService;
use Pterodactyl\Exceptions\Repository\RecordNotFoundException;
use Pterodactyl\Contracts\Repository\ServerRepositoryInterface;
use Pterodactyl\Contracts\Repository\SubuserRepositoryInterface;
use Pterodactyl\Exceptions\Service\Subuser\UserIsServerOwnerException;
use Pterodactyl\Exceptions\Service\Subuser\ServerSubuserExistsException;
use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface;
class SubuserCreationServiceTest extends TestCase
{
use PHPMock;
/**
* @var \Illuminate\Database\ConnectionInterface
* @var \Illuminate\Database\ConnectionInterface|\Mockery\Mock
*/
protected $connection;
/**
* @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface
* @var \Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService|\Mockery\Mock
*/
protected $daemonRepository;
protected $keyCreationService;
/**
* @var \Pterodactyl\Services\Subusers\PermissionCreationService
* @var \Pterodactyl\Services\Subusers\PermissionCreationService|\Mockery\Mock
*/
protected $permissionService;
/**
* @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface
* @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface|\Mockery\Mock
*/
protected $subuserRepository;
/**
* @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface
* @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface|\Mockery\Mock
*/
protected $serverRepository;
@ -79,20 +78,15 @@ class SubuserCreationServiceTest extends TestCase
protected $service;
/**
* @var \Pterodactyl\Services\Users\UserCreationService
* @var \Pterodactyl\Services\Users\UserCreationService|\Mockery\Mock
*/
protected $userCreationService;
/**
* @var \Pterodactyl\Contracts\Repository\UserRepositoryInterface
* @var \Pterodactyl\Contracts\Repository\UserRepositoryInterface|\Mockery\Mock
*/
protected $userRepository;
/**
* @var \Illuminate\Log\Writer
*/
protected $writer;
/**
* Setup tests.
*/
@ -103,23 +97,21 @@ class SubuserCreationServiceTest extends TestCase
$this->getFunctionMock('\\Pterodactyl\\Services\\Subusers', 'str_random')->expects($this->any())->willReturn('random_string');
$this->connection = m::mock(ConnectionInterface::class);
$this->daemonRepository = m::mock(DaemonServerRepositoryInterface::class);
$this->keyCreationService = m::mock(DaemonKeyCreationService::class);
$this->permissionService = m::mock(PermissionCreationService::class);
$this->subuserRepository = m::mock(SubuserRepositoryInterface::class);
$this->serverRepository = m::mock(ServerRepositoryInterface::class);
$this->userCreationService = m::mock(UserCreationService::class);
$this->userRepository = m::mock(UserRepositoryInterface::class);
$this->writer = m::mock(Writer::class);
$this->service = new SubuserCreationService(
$this->connection,
$this->userCreationService,
$this->daemonRepository,
$this->keyCreationService,
$this->permissionService,
$this->serverRepository,
$this->subuserRepository,
$this->userRepository,
$this->writer
$this->userCreationService,
$this->userRepository
);
}
@ -143,22 +135,13 @@ class SubuserCreationServiceTest extends TestCase
'root_admin' => false,
])->once()->andReturn($user);
$this->subuserRepository->shouldReceive('create')->with([
'user_id' => $user->id,
'server_id' => $server->id,
'daemonSecret' => 'random_string',
])->once()->andReturn($subuser);
$this->permissionService->shouldReceive('handle')->with($subuser->id, array_keys($permissions))->once()
->andReturn(['s:get', 's:console', 'test:1']);
$this->daemonRepository->shouldReceive('setNode')->with($server->node_id)->once()->andReturnSelf()
->shouldReceive('setAccessServer')->with($server->uuid)->once()->andReturnSelf()
->shouldReceive('setSubuserKey')->with($subuser->daemonSecret, ['s:get', 's:console', 'test:1'])->once()->andReturnSelf();
$this->subuserRepository->shouldReceive('create')->with(['user_id' => $user->id, 'server_id' => $server->id])
->once()->andReturn($subuser);
$this->keyCreationService->shouldReceive('handle')->with($server->id, $user->id)->once()->andReturnNull();
$this->permissionService->shouldReceive('handle')->with($subuser->id, array_keys($permissions))->once()->andReturnNull();
$this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull();
$response = $this->service->handle($server, $user->email, array_keys($permissions));
$this->assertInstanceOf(Subuser::class, $response);
$this->assertSame($subuser, $response);
}
@ -180,22 +163,13 @@ class SubuserCreationServiceTest extends TestCase
['server_id', '=', $server->id],
])->once()->andReturn(0);
$this->subuserRepository->shouldReceive('create')->with([
'user_id' => $user->id,
'server_id' => $server->id,
'daemonSecret' => 'random_string',
])->once()->andReturn($subuser);
$this->permissionService->shouldReceive('handle')->with($subuser->id, $permissions)->once()
->andReturn(['s:get', 's:console', 's:set-password']);
$this->daemonRepository->shouldReceive('setNode')->with($server->node_id)->once()->andReturnSelf()
->shouldReceive('setAccessServer')->with($server->uuid)->once()->andReturnSelf()
->shouldReceive('setSubuserKey')->with($subuser->daemonSecret, ['s:get', 's:console', 's:set-password'])->once()->andReturnSelf();
$this->subuserRepository->shouldReceive('create')->with(['user_id' => $user->id, 'server_id' => $server->id])
->once()->andReturn($subuser);
$this->keyCreationService->shouldReceive('handle')->with($server->id, $user->id)->once()->andReturnNull();
$this->permissionService->shouldReceive('handle')->with($subuser->id, $permissions)->once()->andReturnNull();
$this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull();
$response = $this->service->handle($server, $user->email, $permissions);
$this->assertInstanceOf(Subuser::class, $response);
$this->assertSame($subuser, $response);
}

View file

@ -26,35 +26,26 @@ namespace Tests\Unit\Services\Subusers;
use Mockery as m;
use Tests\TestCase;
use Illuminate\Log\Writer;
use Pterodactyl\Models\Server;
use Pterodactyl\Models\Subuser;
use GuzzleHttp\Exception\RequestException;
use Illuminate\Database\ConnectionInterface;
use Pterodactyl\Exceptions\DisplayException;
use Pterodactyl\Services\Subusers\SubuserDeletionService;
use Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService;
use Pterodactyl\Contracts\Repository\SubuserRepositoryInterface;
use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface;
class SubuserDeletionServiceTest extends TestCase
{
/**
* @var \Illuminate\Database\ConnectionInterface
* @var \Illuminate\Database\ConnectionInterface|\Mockery\Mock
*/
protected $connection;
/**
* @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface
* @var \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService|\Mockery\Mock
*/
protected $daemonRepository;
protected $keyDeletionService;
/**
* @var \GuzzleHttp\Exception\RequestException
*/
protected $exception;
/**
* @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface
* @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface|\Mockery\Mock
*/
protected $repository;
@ -63,11 +54,6 @@ class SubuserDeletionServiceTest extends TestCase
*/
protected $service;
/**
* @var \Illuminate\Log\Writer
*/
protected $writer;
/**
* Setup tests.
*/
@ -76,63 +62,46 @@ class SubuserDeletionServiceTest extends TestCase
parent::setUp();
$this->connection = m::mock(ConnectionInterface::class);
$this->daemonRepository = m::mock(DaemonServerRepositoryInterface::class);
$this->exception = m::mock(RequestException::class);
$this->keyDeletionService = m::mock(DaemonKeyDeletionService::class);
$this->repository = m::mock(SubuserRepositoryInterface::class);
$this->writer = m::mock(Writer::class);
$this->service = new SubuserDeletionService(
$this->connection,
$this->daemonRepository,
$this->repository,
$this->writer
$this->keyDeletionService,
$this->repository
);
}
/**
* Test that a subuser is deleted correctly.
*/
public function testSubuserIsDeleted()
public function testSubuserIsDeletedIfModelIsPassed()
{
$subuser = factory(Subuser::class)->make();
$subuser->server = factory(Server::class)->make();
$this->repository->shouldReceive('getWithServer')->with($subuser->id)->once()->andReturn($subuser);
$this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->repository->shouldReceive('delete')->with($subuser->id)->once()->andReturn(1);
$this->daemonRepository->shouldReceive('setNode')->with($subuser->server->node_id)->once()->andReturnSelf()
->shouldReceive('setAccessServer')->with($subuser->server->uuid)->once()->andReturnSelf()
->shouldReceive('setSubuserKey')->with($subuser->daemonSecret, [])->once()->andReturnNull();
$this->keyDeletionService->shouldReceive('handle')->with($subuser->server_id, $subuser->user_id)->once()->andReturnNull();
$this->repository->shouldReceive('delete')->with($subuser->id)->once()->andReturnNull();
$this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull();
$response = $this->service->handle($subuser->id);
$this->assertEquals(1, $response);
$this->service->handle($subuser);
$this->assertTrue(true);
}
/**
* Test that an exception caused by the daemon is properly handled.
* Test that a subuser is deleted correctly if only the subuser ID is passed.
*/
public function testExceptionIsThrownIfDaemonConnectionFails()
public function testSubuserIsDeletedIfIdPassedInPlaceOfModel()
{
$subuser = factory(Subuser::class)->make();
$subuser->server = factory(Server::class)->make();
$this->repository->shouldReceive('getWithServer')->with($subuser->id)->once()->andReturn($subuser);
$this->repository->shouldReceive('find')->with($subuser->id)->once()->andReturn($subuser);
$this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->repository->shouldReceive('delete')->with($subuser->id)->once()->andReturn(1);
$this->keyDeletionService->shouldReceive('handle')->with($subuser->server_id, $subuser->user_id)->once()->andReturnNull();
$this->repository->shouldReceive('delete')->with($subuser->id)->once()->andReturnNull();
$this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull();
$this->daemonRepository->shouldReceive('setNode->setAccessServer->setSubuserKey')->once()->andThrow($this->exception);
$this->connection->shouldReceive('rollBack')->withNoArgs()->once()->andReturnNull();
$this->exception->shouldReceive('getResponse')->withNoArgs()->once()->andReturnNull();
$this->writer->shouldReceive('warning')->with($this->exception)->once()->andReturnNull();
try {
$this->service->handle($subuser->id);
} catch (DisplayException $exception) {
$this->assertEquals(trans('exceptions.daemon_connection_failed', ['code' => 'E_CONN_REFUSED']), $exception->getMessage());
}
$this->service->handle($subuser->id);
$this->assertTrue(true);
}
}

View file

@ -32,8 +32,10 @@ use Pterodactyl\Models\Subuser;
use GuzzleHttp\Exception\RequestException;
use Illuminate\Database\ConnectionInterface;
use Pterodactyl\Exceptions\DisplayException;
use Pterodactyl\Exceptions\PterodactylException;
use Pterodactyl\Services\Subusers\SubuserUpdateService;
use Pterodactyl\Services\Subusers\PermissionCreationService;
use Pterodactyl\Services\DaemonKeys\DaemonKeyProviderService;
use Pterodactyl\Contracts\Repository\SubuserRepositoryInterface;
use Pterodactyl\Contracts\Repository\PermissionRepositoryInterface;
use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface;
@ -41,32 +43,37 @@ use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonS
class SubuserUpdateServiceTest extends TestCase
{
/**
* @var \Illuminate\Database\ConnectionInterface
* @var \Illuminate\Database\ConnectionInterface|\Mockery\Mock
*/
protected $connection;
/**
* @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface
* @var \Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface|\Mockery\Mock
*/
protected $daemonRepository;
/**
* @var \GuzzleHttp\Exception\RequestException
* @var \GuzzleHttp\Exception\RequestException|\Mockery\Mock
*/
protected $exception;
/**
* @var \Pterodactyl\Contracts\Repository\PermissionRepositoryInterface
* @var \Pterodactyl\Services\DaemonKeys\DaemonKeyProviderService|\Mockery\Mock
*/
private $keyProviderService;
/**
* @var \Pterodactyl\Contracts\Repository\PermissionRepositoryInterface|\Mockery\Mock
*/
protected $permissionRepository;
/**
* @var \Pterodactyl\Services\Subusers\PermissionCreationService
* @var \Pterodactyl\Services\Subusers\PermissionCreationService|\Mockery\Mock
*/
protected $permissionService;
/**
* @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface
* @var \Pterodactyl\Contracts\Repository\SubuserRepositoryInterface|\Mockery\Mock
*/
protected $repository;
@ -76,7 +83,7 @@ class SubuserUpdateServiceTest extends TestCase
protected $service;
/**
* @var \Illuminate\Log\Writer
* @var \Illuminate\Log\Writer|\Mockery\Mock
*/
protected $writer;
@ -90,6 +97,7 @@ class SubuserUpdateServiceTest extends TestCase
$this->connection = m::mock(ConnectionInterface::class);
$this->daemonRepository = m::mock(DaemonServerRepositoryInterface::class);
$this->exception = m::mock(RequestException::class);
$this->keyProviderService = m::mock(DaemonKeyProviderService::class);
$this->permissionRepository = m::mock(PermissionRepositoryInterface::class);
$this->permissionService = m::mock(PermissionCreationService::class);
$this->repository = m::mock(SubuserRepositoryInterface::class);
@ -97,6 +105,7 @@ class SubuserUpdateServiceTest extends TestCase
$this->service = new SubuserUpdateService(
$this->connection,
$this->keyProviderService,
$this->daemonRepository,
$this->permissionService,
$this->permissionRepository,
@ -115,18 +124,19 @@ class SubuserUpdateServiceTest extends TestCase
$this->repository->shouldReceive('getWithServer')->with($subuser->id)->once()->andReturn($subuser);
$this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->permissionRepository->shouldReceive('deleteWhere')->with([
['subuser_id', '=', $subuser->id],
])->once()->andReturnNull();
$this->permissionService->shouldReceive('handle')->with($subuser->id, ['some-permission'])->once()->andReturn(['test:1', 'test:2']);
$this->permissionRepository->shouldReceive('deleteWhere')->with([['subuser_id', '=', $subuser->id]])
->once()->andReturnNull();
$this->permissionService->shouldReceive('handle')->with($subuser->id, ['some-permission'])->once()->andReturnNull();
$this->keyProviderService->shouldReceive('handle')->with($subuser->server_id, $subuser->user_id, false)
->once()->andReturn('test123');
$this->daemonRepository->shouldReceive('setNode')->with($subuser->server->node_id)->once()->andReturnSelf()
->shouldReceive('setAccessServer')->with($subuser->server->uuid)->once()->andReturnSelf()
->shouldReceive('setSubuserKey')->with($subuser->daemonSecret, ['test:1', 'test:2'])->once()->andReturnNull();
->shouldReceive('revokeAccessKey')->with('test123')->once()->andReturnNull();
$this->connection->shouldReceive('commit')->withNoArgs()->once()->andReturnNull();
$this->service->handle($subuser->id, ['some-permission']);
$this->assertTrue(true);
}
/**
@ -139,11 +149,12 @@ class SubuserUpdateServiceTest extends TestCase
$this->repository->shouldReceive('getWithServer')->with($subuser->id)->once()->andReturn($subuser);
$this->connection->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
$this->permissionRepository->shouldReceive('deleteWhere')->with([
['subuser_id', '=', $subuser->id],
])->once()->andReturnNull();
$this->permissionService->shouldReceive('handle')->with($subuser->id, [])->once()->andReturn([]);
$this->permissionRepository->shouldReceive('deleteWhere')->with([['subuser_id', '=', $subuser->id]])
->once()->andReturnNull();
$this->permissionService->shouldReceive('handle')->with($subuser->id, [])->once()->andReturnNull();
$this->keyProviderService->shouldReceive('handle')->with($subuser->server_id, $subuser->user_id, false)
->once()->andReturn('test123');
$this->daemonRepository->shouldReceive('setNode')->once()->andThrow($this->exception);
$this->connection->shouldReceive('rollBack')->withNoArgs()->once()->andReturnNull();
$this->writer->shouldReceive('warning')->with($this->exception)->once()->andReturnNull();
@ -151,8 +162,11 @@ class SubuserUpdateServiceTest extends TestCase
try {
$this->service->handle($subuser->id, []);
} catch (DisplayException $exception) {
$this->assertEquals(trans('exceptions.daemon_connection_failed', ['code' => 'E_CONN_REFUSED']), $exception->getMessage());
} catch (PterodactylException $exception) {
$this->assertInstanceOf(DisplayException::class, $exception);
$this->assertEquals(trans('exceptions.daemon_connection_failed', [
'code' => 'E_CONN_REFUSED',
]), $exception->getMessage());
}
}
}