mirror of
https://github.com/pelican-dev/panel.git
synced 2025-05-19 17:34:45 +02:00

* Just skip this table because it no longer exists * Add postgresql * This no longer needs to be there * These are the same output in mysql, but different in postgresql * Fix these migrations for postgresql * This table no longer exists * This is expected to be a json column for json operations, required for postgresql * Shoot for the stars * Fix pint * Why was this missing * Updates * Restore this * This needs to be explicit * Don’t like strings * Fix these classes * Use different method to compare dates * Apparently postgresql doesn’t like case insensitivity * Postgresql orders it backwards * Ordered different by postgresql * Unnecessary and breaking * Make sure the order is correct for postresql * Fix this with the order too * Remove this * Force email to be lowercased * Update app/Models/User.php
166 lines
6.3 KiB
PHP
166 lines
6.3 KiB
PHP
<?php
|
|
|
|
namespace App\Tests\Integration\Services\Servers;
|
|
|
|
use App\Models\Egg;
|
|
use App\Models\User;
|
|
use App\Models\Server;
|
|
use App\Models\ServerVariable;
|
|
use Illuminate\Validation\ValidationException;
|
|
use App\Tests\Integration\IntegrationTestCase;
|
|
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
|
use App\Services\Servers\StartupModificationService;
|
|
|
|
class StartupModificationServiceTest extends IntegrationTestCase
|
|
{
|
|
/**
|
|
* Test that a non-admin request to modify the server startup parameters does
|
|
* not perform any egg updates. This also attempts to pass through an
|
|
* egg_id variable which should have no impact if the request is coming from
|
|
* a non-admin entity.
|
|
*/
|
|
public function test_non_admin_can_modify_server_variables(): void
|
|
{
|
|
$server = $this->createServerModel();
|
|
|
|
try {
|
|
$this->app->make(StartupModificationService::class)->handle($server, [
|
|
'egg_id' => $server->egg_id + 1,
|
|
'environment' => [
|
|
'BUNGEE_VERSION' => '$$',
|
|
'SERVER_JARFILE' => 'server.jar',
|
|
],
|
|
]);
|
|
|
|
$this->fail('This assertion should not be called.');
|
|
} catch (\Exception $exception) {
|
|
$this->assertInstanceOf(ValidationException::class, $exception);
|
|
|
|
/** @var \Illuminate\Validation\ValidationException $exception */
|
|
$errors = $exception->validator->errors()->toArray();
|
|
|
|
$this->assertCount(1, $errors);
|
|
$this->assertArrayHasKey('environment.BUNGEE_VERSION', $errors);
|
|
$this->assertCount(1, $errors['environment.BUNGEE_VERSION']);
|
|
$this->assertSame('The Bungeecord Version variable may only contain letters and numbers.', $errors['environment.BUNGEE_VERSION'][0]);
|
|
}
|
|
|
|
ServerVariable::query()->where('variable_id', $server->variables[1]->id)->delete();
|
|
|
|
$result = $this->getService()
|
|
->handle($server, [
|
|
'egg_id' => $server->egg_id + 1,
|
|
'startup' => 'random gibberish',
|
|
'environment' => [
|
|
'BUNGEE_VERSION' => '1234',
|
|
'SERVER_JARFILE' => 'test.jar',
|
|
],
|
|
]);
|
|
|
|
$this->assertInstanceOf(Server::class, $result);
|
|
$this->assertCount(2, $result->variables);
|
|
$this->assertSame($server->startup, $result->startup);
|
|
$this->assertSame('1234', $result->variables[0]->server_value);
|
|
$this->assertSame('test.jar', $result->variables[1]->server_value);
|
|
}
|
|
|
|
/**
|
|
* Test that modifying an egg as an admin properly updates the data for the server.
|
|
*/
|
|
public function test_server_is_properly_modified_as_admin_user(): void
|
|
{
|
|
/** @var \App\Models\Egg $nextEgg */
|
|
$nextEgg = Egg::query()->findOrFail(6);
|
|
|
|
$server = $this->createServerModel(['egg_id' => 1]);
|
|
|
|
$this->assertNotSame($nextEgg->id, $server->egg_id);
|
|
|
|
$response = $this->getService()
|
|
->setUserLevel(User::USER_LEVEL_ADMIN)
|
|
->handle($server, [
|
|
'egg_id' => $nextEgg->id,
|
|
'startup' => 'sample startup',
|
|
'skip_scripts' => true,
|
|
'docker_image' => 'docker/hodor',
|
|
]);
|
|
|
|
$this->assertInstanceOf(Server::class, $response);
|
|
$this->assertSame($nextEgg->id, $response->egg_id);
|
|
$this->assertSame('sample startup', $response->startup);
|
|
$this->assertSame('docker/hodor', $response->image);
|
|
$this->assertTrue($response->skip_scripts);
|
|
// Make sure we don't revert back to a lurking bug that causes servers to get marked
|
|
// as not installed when you modify the startup...
|
|
$this->assertTrue($response->isInstalled());
|
|
}
|
|
|
|
/**
|
|
* Test that hidden variables can be updated by an admin but are not affected by a
|
|
* regular user who attempts to pass them through.
|
|
*/
|
|
public function test_environment_variables_can_be_updated_by_admin(): void
|
|
{
|
|
$server = $this->createServerModel();
|
|
$server->loadMissing(['egg', 'variables']);
|
|
|
|
$clone = $this->cloneEggAndVariables($server->egg);
|
|
// This makes the BUNGEE_VERSION variable not user editable.
|
|
$clone->variables()->firstWhere(['env_variable' => 'BUNGEE_VERSION'])->update([
|
|
'user_editable' => false,
|
|
]);
|
|
|
|
$server->fill(['egg_id' => $clone->id])->saveOrFail();
|
|
$server->refresh();
|
|
|
|
ServerVariable::query()->updateOrCreate([
|
|
'server_id' => $server->id,
|
|
'variable_id' => $server->variables()->firstWhere(['env_variable' => 'BUNGEE_VERSION'])->id,
|
|
], ['variable_value' => 'EXIST']);
|
|
|
|
$response = $this->getService()->handle($server, [
|
|
'environment' => [
|
|
'BUNGEE_VERSION' => '1234',
|
|
'SERVER_JARFILE' => 'test.jar',
|
|
],
|
|
]);
|
|
|
|
$this->assertCount(2, $response->variables);
|
|
$this->assertSame('EXIST', $response->variables()->firstWhere(['env_variable' => 'BUNGEE_VERSION'])->server_value);
|
|
$this->assertSame('test.jar', $response->variables()->firstWhere(['env_variable' => 'SERVER_JARFILE'])->server_value);
|
|
|
|
$response = $this->getService()
|
|
->setUserLevel(User::USER_LEVEL_ADMIN)
|
|
->handle($server, [
|
|
'environment' => [
|
|
'BUNGEE_VERSION' => '1234',
|
|
'SERVER_JARFILE' => 'test.jar',
|
|
],
|
|
]);
|
|
|
|
$this->assertCount(2, $response->variables);
|
|
$this->assertSame('1234', $response->variables()->firstWhere(['env_variable' => 'BUNGEE_VERSION'])->server_value);
|
|
$this->assertSame('test.jar', $response->variables()->firstWhere(['env_variable' => 'SERVER_JARFILE'])->server_value);
|
|
}
|
|
|
|
/**
|
|
* Test that passing an invalid egg ID into the function throws an exception
|
|
* rather than silently failing or skipping.
|
|
*/
|
|
public function test_invalid_egg_id_triggers_exception(): void
|
|
{
|
|
$server = $this->createServerModel();
|
|
|
|
$this->expectException(ModelNotFoundException::class);
|
|
|
|
$this->getService()
|
|
->setUserLevel(User::USER_LEVEL_ADMIN)
|
|
->handle($server, ['egg_id' => 123456789]);
|
|
}
|
|
|
|
private function getService(): StartupModificationService
|
|
{
|
|
return $this->app->make(StartupModificationService::class);
|
|
}
|
|
}
|